본문으로 이동

도구 스키마 카탈로그

출시된 플러그인이 제공하는 모든 모델 대상 도구 ctx.tools입니다. 즉, 시스템 프롬프트 조립을 통해 모델이 받는 name, description 및 JSON-Schema parameters입니다. 이는 하위 시스템 페이지(타입과 각 페이지에서 생성된 Cordis API 영역)를 보완합니다. 이 페이지는 에이전트에 제공되는 도구 입니다.

이 파일은 pnpm run verify-tool-catalog(doc-sync의 일부)에서 새로 생성되고 검증되는 GENERATED 파일이므로 직접 수정하지 마세요. 순수 소스 AST 패스인 cordis 카탈로그와 달리, 이 생성기는 실제 컨텍스트에서 각 도구 플러그인을 BOOT하고 ctx.tools.schemas()를 읽습니다. 도구 스키마는 정적으로 알 수 없기 때문입니다(런타임으로 확장되는 enum, 연결된 설명, 구성 기반 이름, 원시 JSON-Schema MCP 도구). 완전성 가드는 packages/*/tool-*를 glob으로 찾고 생성기의 부트 매니페스트에서 누락된 패키지가 있으면 실패하므로, 새 도구가 문서화되지 않은 채로 남을 수 없습니다. 도구 스키마 카탈로그 Agent Note를 참조하세요.

범위: packages/*/tool-* 아래의 출시 제품 도구이며, 기본값이 없는 필수 Config 필드가 있는 경우를 제외하고 각각 DEFAULT 구성으로 부트됩니다. 이 경우 생성기가 선택해야 하며, 패키지별 참고 사항에 이 페이지에서 표시하는 분기가 기록됩니다. 등록된 도구 NAME은 로드 시 구성일 수 있으므로(예: tool-subagenttoolName), 배포 환경에 따라 패키지가 다른 이름이나 추가 이름으로 노출될 수 있습니다. 존재하는 경우 패키지별 참고 사항에 이러한 출시 별칭이 기록됩니다. cordis 카탈로그의 패키지 전용 범위와 일치하도록 examples/ 데모 도구(예: echo)는 제외됩니다.

도구 패키지 맵

이 표는 모델에 표시되는 도구 이름을 해당 플러그인 패키지 및 그 뒤의 서비스 추상 경계에 연결합니다. 정확한 JSON Schema는 아래 패키지 섹션에 이어집니다.

도구 패키지모델에 표시되는 이름필요 사항기록 / 영향 대상제공되는 별칭배포 참고 사항
@deepseek-ai/dsh-tool-ask-userask_user_questionctx.tools, ctx.userQuestionstool/call, tool/result after a UI/provider answers the question-ask_user_question은 활성 UI 제공자가 사람의 답변을 반환할 때까지 도구 호출을 일시 중지합니다.
@deepseek-ai/dsh-toolsrun_codectx.tools, ctx.codeRuntime (execution time), ctx.systemPrompttool/call, one tool/code-dispatch-start + tool/code-dispatch pair per bridged sub-call, tool/result-도구 레지스트리가 mode: code / mode: both 아래의 필터링 가능한 기능 계층 외부에 있는 예약된 전송 수단으로 소유합니다(Code Mode Agent Note 참조). code에서는 레지스트리의 유일한 와이어 기여입니다. 다른 표시 기능은 로드된 런타임 언어의 생성된 SDK 섹션에 선언되며, 프로그램은 네이티브 동시성 계약(제출 순서대로 시작 및 정책, 동시성 안전한 본문은 최대 maxParallelSubCalls까지 겹쳐 실행)을 따르는 바인딩을 통해 이를 호출합니다. 이 바인딩은 완전한 보호 도구 파이프라인에 다시 진입하고 각 중첩 실행을 이 외부 결과에 연결합니다.
@deepseek-ai/dsh-plan-modeexit_plan_modectx.tools, ctx.systemPrompt, ctx.userQuestions (execution time, opportunistic)tool/call, plan/mode inactive on an approved review, tool/result-exit_plan_mode는 계획이 비활성 상태일 때도 모델 대상 스키마에 남아 있으므로, 전환 시 계획 정책 변경에 더해 도구 카탈로그 변동이 추가되지 않습니다. 실행 경로는 계획 모드 밖의 호출을 거부합니다. 계획 모드에서는 사용자 질문 접점을 통해 계획을 제시하며(승인 / 피드백과 함께 계획 계속), 승인되면 단계 경계에서 계획 모드 비활성 상태를 기록합니다.
@deepseek-ai/dsh-tool-bashbashctx.tools, ctx.shell, ctx.systemPrompt, ctx.shellEnv, ctx.jobs at call time for run_in_backgroundtool/call, tool/result-bash 도구는 bash 실행기 접점의 모델 대상 소비자입니다. run_in_background 실행은 일반 ctx.jobs 런타임에 등록되고 @deepseek-ai/dsh-tool-jobsjob_* 도구를 통해 수집/중지됩니다. enableRunInBackground 설정(기본값 true)은 비활성화되면 매개변수 자체를 완전히 제거합니다.
@deepseek-ai/dsh-tool-pwshpwshctx.tools, ctx.shell, ctx.systemPrompt, ctx.shellEnv, ctx.jobs at call time for run_in_backgroundtool/call, tool/result-pwsh 도구는 Windows 구성용 bash 실행기 접점의 PowerShell 방언 소비자입니다(@deepseek-ai/dsh-pwsh-local 같은 PowerShell 실행기가 ctx.shell를 지원함). 샌드박스 제어를 제외하고 bash 도구와 호출 단위로 동일합니다. run_in_background 실행은 일반 ctx.jobs 런타임에 등록되고 job_* 도구로 수집/중지되며, 관리되는 DSH_* 환경은 @deepseek-ai/dsh-shell-env에서 가져옵니다. 각 호출은 새 프로세스에서 실행되며(영구 PTY 세션 없음), 네이티브 C:\... 경로와 $env:NAME 변수를 사용합니다.
@deepseek-ai/dsh-tool-cordiscordis_define, cordis_inspect_list, cordis_inspect_query, cordis_inspect_self, cordis_run, cordis_stop, cordis_undefinectx.tools, ctx.dynamicCordisRunnertool/call, tool/result, process-local dynamic package lifecycle-제공되는 어떤 트리에도 포함되지 않습니다(의도적인 옵트인 방식이며 동적 패키지 코드는 실제 런타임에 도달합니다. .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md 참조). 도구 집합은 정의 레지스트리와 vm 샌드박스를 소유하는 @deepseek-ai/dsh-cordis-host-runner에서 ctx.dynamicCordisRunner를 주입합니다. 이것이 없는 구성에서는 도구가 절대 활성화되지 않습니다. 실행 중인 패키지는 중지되거나 정의 해제되거나 DSH가 다시 시작될 때까지 추가 모델 표시 도구를 등록할 수 있습니다. 완전히 변경된 요청 헤더는 해당 도구 집합 변경을 기록합니다.
@deepseek-ai/dsh-tool-bash-persistentbashctx.tools, ctx.terminals, an owning Agent at execution timetool/call, PTY shell state, tool/result-소유자 격리 영구 bash 도구 하나입니다. 배포 구성에서 PTY 백엔드를 제공하며 모델 대상 환경 설명을 재정의할 수 있습니다.
@deepseek-ai/dsh-tool-str-replace-editorstr_replace_editorctx.tools, ctx.fstool/call, fs/observed after view presence/absence, edit absence, or successful mutation, tool/result-파일 시스템 접점에서 작동하는 독립형 view/create/unique 리터럴 대체/줄 삽입 도구입니다. 모든 셸 또는 터미널 API와 조합할 수 있습니다.
@deepseek-ai/dsh-tool-fsedit, read, read_image, writectx.tools, ctx.fs, ctx.systemPrompt, ctx.attachments (read_image registration), ctx.llm + an image-capable route (read_image execution)tool/call, fs/write-intent or fs/edit-intent for mutations, fs/observed after read presence/absence or successful file operation, durable attachment (read_image), tool/result-읽기 전 쓰기/편집 정책은 @deepseek-ai/dsh-fs-observation-policy(스키마 변경이 없는 fs/* 이벤트 게이트 플러그인)로 추가됩니다. 이 도구를 로드하는 배포는 이를 함께 로드해야 합니다. read_imagectx.attachments 없이는 등록되지 않습니다. 스키마는 경로와 무관하며, 실행은 정확히 라우팅된 모델이 이미지 입력을 선언한 경우에만 허용합니다.
@deepseek-ai/dsh-tool-fs-searchglob, grepctx.tools, ctx.subprocess, ctx.systemPrompttool/call, tool/result-glob 및 grep은 ctx.subprocess를 통해 패키지된 ripgrep 바이너리(@vscode/ripgrep)를 일반 포그라운드 호출(백그라운드 작업 아님)로 생성하는 무조건적 탐색 도구입니다. 호스트 rg 설치나 셸 계층은 필요하지 않습니다. 카탈로그는 sampleOverCapGlobResults: true를 사용하므로 배포에서 해당 동작을 명시적으로 선택해야 합니다. 결과가 제한되면 선택적 ctx.spillStore 백엔드를 통해 전체 형식화 목록을 저장합니다. 공동 배치된 배포에서 백엔드가 로컬 경로를 노출하면 반환된 위치 지정자는 후속 읽기/검색이 가능합니다.
@deepseek-ai/dsh-tool-terminalterminal_close, terminal_list, terminal_open, terminal_read, terminal_send, terminal_signalctx.tools, ctx.terminals, ctx.systemPrompt, ctx.jobs at call time for run_in_backgroundtool/call, tool/result-6개의 터미널 도구는 옵트인 방식이며 일회성 셸/파일 시스템 도구를 보완합니다. terminal_send(run_in_background: true)ctx.jobs에 등록됩니다. TUI, 이름이 지정된 키 시퀀스, BEL, 크기 조정, 자동 시작 및 에이전트 간 공유는 스키마에 없습니다.
@deepseek-ai/dsh-tool-goalcreate_goal, get_goal, update_goalctx.tools, ctx.agents, ctx.goals, ctx.systemPrompt, a calling Agent in an authorized open turntool/call, goal/change for mutations, tool/result-create, edit, pause 및 resume에는 직접적인 사람 루트 권한이 필요합니다. complete 및 blocked는 정확한 현재 목표 라운드도 허용합니다. blocked의 기본 하한은 승인된 라운드 3회입니다.
@deepseek-ai/dsh-scheduleschedule_create, schedule_delete, schedule_listctx.tools, ctx.sessions, Session persistence, a future live root Agenttool/call, schedule/change create or delete, tool/result-옵트인 Schedule 플러그인이 로드된 후 생성된 활성 루트 Agent 범위 내에서만 등록됩니다. 버전 1은 after_seconds, 명시적 절대 at 및 제한된 고정 주기 every_seconds를 허용하고 세션 로컬 전달을 공개합니다. 관리 읽기와 변경에는 공유 Session 영속성 장벽이 필요합니다.
@deepseek-ai/dsh-tool-lsplspctx.tools, ctx.lsp, ctx.systemPrompttool/call, tool/result-lsp 도구는 제공자 선택과 언어 서버 하위 프로세스를 ctx.lsp 뒤에 유지하므로 모델 표시 스키마가 제공자 전반에서 안정적으로 유지됩니다. 런타임에 등록된 제공자(예: @deepseek-ai/dsh-lsp-stdio)가 필요합니다. 제공자가 없으면 스키마를 변경하지 않고 쿼리가 구조화된 LSP_UNAVAILABLE 오류를 반환합니다.
@deepseek-ai/dsh-tool-ralphralphctx.tools, ctx.workflowEngine, ctx.subagents, ctx.systemPrompt, a calling Agent (exec.agent parents every fresh round)tool/call, tool/result, workflow and child session events during execution-고정된 포그라운드 워크플로는 라운드마다 새 구조화된 자식 하나를 시작합니다. 모델은 불변 목표와 선택적 라운드 한도만 선택합니다.
@deepseek-ai/dsh-tool-skillskillctx.tools, ctx.agents, ctx.skillstool/call, tool/result, user/message replacement catalogs via agent.inject()--
@deepseek-ai/dsh-tool-session-querysession_event_read, session_event_search, session_event_trace, session_search, session_tracectx.tools, ctx.systemPrompt, ctx.sessionQuery, a calling Agent for workspace authoritytool/call, tool/result-5개의 읽기 전용 도구는 제공자 커서를 숨기고 불변 호출 에이전트 세션에서 모든 결과를 권한 부여합니다. 이 패키지는 옵트인 방식입니다. 강제된 기한 또는 제한된 인라인 출력이 필요한 구성은 일반 timeout 또는 spill 정책도 마운트합니다.
@deepseek-ai/dsh-tool-subagentsubagentctx.tools, ctx.subagents, ctx.systemPrompttool/call, tool/result, child session events through the chosen providersubagent, subagent_fork등록된 도구 이름은 로드 시 toolName 설정(기본값 subagent)이며, 위 스키마는 해당 기본값입니다. 제공되는 구성은 하위 에이전트 백엔드마다 이 패키지를 한 번 로드하므로 모델에는 포크 백엔드에 바인딩된 subagent_fork도 추가로 표시됩니다. 각 인스턴스의 설명, run_in_background 매개변수 및 시스템 프롬프트 정책은 자체 backgroundModeenableRunInBackground를 따릅니다. 따라서 제공되는 두 스키마는 동일하지 않습니다. subagentcontinuable이며 생략된 호출의 기본값을 자동 정산 전달이 포함된 백그라운드로 설정합니다. 반면 subagent_forkone-shot로 유지되며 기본값을 포그라운드로 설정합니다. packages/bundle/base/cordis.patch.ymlexamples/acp-agent/cordis.yml을 참조하세요.
@deepseek-ai/dsh-tool-subagent-controlinterrupt_agent, list_agents, send_messagectx.tools, ctx.subagents, ctx.agents and ctx.sessionProjections (list_agents only)tool/call, tool/result, child session events through ctx.subagents-계속 가능한 백그라운드 하위 에이전트에 대한 전역 이름 제어 도구입니다. 제공자 바인딩 tool-subagent 인스턴스는 각각의 위임 도구를 등록하는 반면, 이 패키지는 send_messageinterrupt_agent를 한 번 등록하고, 별도로 로드된 /list-agents 플러그인에서 list_agents도 등록합니다(이 플러그인의 카탈로그 행은 sessionProjections 및 활성 Agent 레지스트리를 사용함).
@deepseek-ai/dsh-tool-subagent-reportreportctx.subagents, ctx.systemPrompt, a live continuable in-process child Agenttool/call, tool/result, a user-role message in the direct parent session-전역이 아니라 계속 가능한 프로세스 내 자식마다 등록되므로 이 스키마는 그러한 자식 내부에서만 표시되고 해당 자식의 전역 toolFilter을 지나서도 유지됩니다. 같은 기여는 이 카탈로그에서 렌더링하지 않는 자식 범위 tool:report 프롬프트 섹션을 설치합니다. 부모 대상 send_message 도구는 독립적으로 설치됩니다.
@deepseek-ai/dsh-tool-jobsjob_kill, job_list, job_outputctx.tools, ctx.jobs, ctx.systemPrompttool/call, tool/result, user/message via agent.inject() for background completion notices-종류와 무관한 백그라운드 작업 컨트롤러입니다. 백그라운드 bash 명령, PTY 전송 및 하위 에이전트는 동일한 세 도구를 통해 읽고, 나열하고, 종료합니다. 플러그인을 로드하면 생산자의 ctx.jobs.start()를 준비하는 컨트롤러가 연결됩니다.
@deepseek-ai/dsh-tool-todotodo_writectx.tools, owning Agent sessiontool/call, todo/write, tool/result-todo_write는 세션 소유 상태입니다. UI는 최신 todo/write 이벤트를 체크리스트로 렌더링합니다. allowParallelInProgress는 기본값 없이 필요하므로 카탈로그에는 선택값이 표시됩니다. 즉, 여러 in_progress 항목을 유도하는 설명을 가진 true입니다. false를 선택하는 배포는 정확히 하나의 활성 작업을 요청하는 설명과 함께 동일한 도구를 받습니다.
@deepseek-ai/dsh-tool-workflowworkflowctx.tools, ctx.workflowEngine, ctx.systemPrompt, a calling Agent (exec.agent parents the script children)tool/call, tool/result--
@deepseek-ai/dsh-tool-webweb_fetch, web_searchctx.tools, ctx.web, ctx.systemPrompttool/call, tool/result-web_search 및 web_fetch는 제공자 선택을 ctx.web 뒤에 유지하므로 모델 표시 스키마가 백엔드 교체 전반에서 안정적으로 유지됩니다.

@deepseek-ai/dsh-tool-ask-user

ask_user_question

진행하기 전에 확인, 선택 또는 누락된 정보가 필요한 경우 사용자에게 간결한 질문을 합니다. 각 질문에는 응답에서 다시 전달되는 안정적인 id를 하나 이상 포함합니다.

json
{
  "type": "object",
  "properties": {
    "questions": {
      "type": "array",
      "description": "Questions to ask the user before continuing.",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable id for this question; echoed in the answer."
          },
          "question": {
            "type": "string",
            "description": "The specific question to ask the user."
          },
          "header": {
            "type": "string",
            "description": "Optional short heading for the question, such as \"Confirm\" or \"Choose Mode\"."
          },
          "options": {
            "type": "array",
            "description": "Optional choices to show the user. If you recommend one, put it first and append \"(Recommended)\" to that label.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Short user-facing option label."
                },
                "description": {
                  "type": "string",
                  "description": "One sentence explaining the tradeoff or impact."
                }
              },
              "required": [
                "label"
              ]
            }
          },
          "multi_select": {
            "type": "boolean",
            "description": "Whether the user may select more than one option. Defaults to false."
          }
        },
        "required": [
          "id",
          "question"
        ]
      }
    }
  },
  "required": [
    "questions"
  ]
}

출처: packages/interaction/tool-ask-user/src/index.ts

ask_user_question은 활성 UI 제공자가 사람의 답변을 반환할 때까지 도구 호출을 일시 중지합니다.

@deepseek-ai/dsh-tools

run_code

사용 가능한 도구에 대해 TypeScript 프로그램을 실행합니다. 필수 인수는 두 개입니다. 지워질 수 있는 구문만 사용하는 async 함수의 본문인 code(최상위 awaitreturn 사용 가능)과 프로그램이 수행하는 작업의 짧은 요약인 description입니다. 시스템 프롬프트의 선언에 따라 await tools.name(args)로 도구를 호출합니다. 출력하거나 반환한 내용만 다시 전달되므로 신중하게 선별하십시오.

json
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "The program: the body of an async TypeScript function."
    },
    "description": {
      "type": "string",
      "description": "Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."
    }
  },
  "required": [
    "code",
    "description"
  ]
}

출처: packages/core/tools/src/code-mode.ts

도구 레지스트리가 mode: code / mode: both 아래의 필터링 가능한 기능 계층 외부에 있는 예약된 전송으로 소유합니다(Code Mode Agent Note 참조). code 아래에서 이는 레지스트리의 유일한 와이어 기여입니다. 그 밖의 표시되는 기능은 로드된 런타임 언어의 생성된 SDK 섹션에서 선언되며, 프로그램은 네이티브 동시성 계약(제출 순서에 따른 시작과 정책, 동시성 안전 본문은 최대 maxParallelSubCalls까지 겹쳐 실행됨)에 따라 예약된 바인딩을 통해 이를 호출합니다. 이 바인딩은 완전한 보호 도구 파이프라인으로 다시 진입하며 각 중첩 실행을 이 외부 결과에 연결합니다.

@deepseek-ai/dsh-plan-mode

exit_plan_mode

계획 모드에서만 사용하십시오. 사용자 검토를 위해 계획을 제시하고, 승인되면 계획 모드를 종료합니다. 계획 전체를 이를 이름으로 하는 # 제목으로 시작하는 Markdown으로 전송하십시오. 사용자는 승인(다음 단계부터 계획 실행)하거나 계속 계획할 수 있으며, 피드백은 도구 결과로 반환됩니다. 수정한 뒤 다시 제시하십시오.

json
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "description": "The complete plan, as markdown, starting with a # heading that names it."
    }
  },
  "required": [
    "plan"
  ]
}

출처: packages/plan/plan-mode/src/index.ts

exit_plan_mode는 계획이 비활성 상태일 때도 모델 대상 스키마에 남아 있으므로, 전환 시 계획 정책 변경에 더해 도구 카탈로그 변경이 발생하지 않습니다. 실행 경로는 계획 모드 외부의 호출을 거부합니다. 계획 모드에서는 사용자 질문 경계를 통해 계획을 제시하고(승인 / 피드백과 함께 계속 계획), 승인이 이루어지면 단계 경계에서 계획 모드가 비활성화되었다고 기록합니다.

@deepseek-ai/dsh-tool-bash

bash

bash 명령(bash -c)을 실행하고 stdout/stderr를 반환합니다. 각 호출은 새 셸에서 실행되므로 호출 간에 상태(cwd, 변수, 함수)가 유지되지 않습니다. cd를 사용하는 대신 workdir를 전달하십시오. 0이 아닌 종료 코드는 [exit code: N]로 보고됩니다. 현재 Harness 환경 정보는 관리되는 $DSH_* 변수로 제공되므로 필요할 때 확인하십시오. 명령은 파일 샌드박스에서 실행될 수 있습니다. 차단된 파일 작업은 [sandbox: file access denied under <mode> mode]로 보고되며, 이는 명령의 버그가 아닌 정책 거부이므로 다른 방법으로 재시도하지 마십시오. 긴 출력은 마지막 부분으로 잘리며, 전체 출력은 가능한 경우 보고되는 경로의 파일에 저장됩니다. 장기 실행 명령에는 run_in_background: true를 설정하십시오. 호출은 즉시 작업 id를 반환하며, job_output로 출력을 읽고 job_kill로 중지합니다.

json
{
  "type": "object",
  "properties": {
    "command": {
      "type": "string",
      "description": "The bash command to execute."
    },
    "description": {
      "type": "string",
      "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\"\"List files in current directory\"; \"git status\"\"Show working tree status\"; \"npm install\"\"Install package dependencies\"."
    },
    "timeoutMs": {
      "type": "number",
      "description": "Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."
    },
    "workdir": {
      "type": "string",
      "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
    },
    "run_in_background": {
      "type": "boolean",
      "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
    }
  },
  "required": [
    "command",
    "description"
  ]
}

출처: packages/shell/tool-bash/src/index.ts

bash 도구는 bash 실행자 경계의 모델 대상 소비자입니다. run_in_background 실행은 일반 ctx.jobs 런타임에 등록되며, @deepseek-ai/dsh-tool-jobsjob_* 도구를 통해 수집/중지됩니다. enableRunInBackground 설정(기본값 true)은 비활성화되면 매개변수 전체를 제거합니다.

@deepseek-ai/dsh-tool-pwsh

pwsh

PowerShell 명령(pwsh -Command)을 실행하고 stdout/stderr를 반환합니다. 각 호출은 새 pwsh 프로세스에서 실행됩니다. 호출 간에 상태(cwd, 변수, 함수)는 유지되지 않으므로 cd를 사용하는 대신 workdir를 전달하세요. 경로는 네이티브 Windows 형식(C:\...)을 사용하며, 환경 변수는 $env:NAME로 읽습니다. 0이 아닌 종료는 [exit code: N]로 보고됩니다. 현재 harness 환경 정보는 관리형 $env:DSH_* 변수로 노출되므로 필요할 때 확인하세요. 명령은 파일 샌드박스에서 실행될 수 있으며, 차단된 파일 작업은 [sandbox: file access denied under <mode> mode]로 보고됩니다. 이는 명령의 버그가 아닌 정책 거부이므로 다른 방법으로 재시도하지 마세요. 긴 출력은 끝부분으로 잘리며, 전체 출력은 사용할 수 있는 경우 보고되는 경로의 파일에 저장됩니다. Windows에서 강제 종료된 명령은 신호 표시 없이 [exit code: 1]로 정리됩니다. 이를 명령 실패가 아닌 중단으로 처리하세요. 장기 실행 명령에는 run_in_background: true를 설정하세요. 호출은 즉시 작업 ID를 반환하며, job_output로 출력을 읽고 job_kill로 중지할 수 있습니다.

json
{
  "type": "object",
  "properties": {
    "command": {
      "type": "string",
      "description": "The PowerShell command to execute."
    },
    "description": {
      "type": "string",
      "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\"\"List files in current directory\"; \"git status\"\"Show working tree status\"; \"Get-Process\"\"List running processes\"."
    },
    "timeoutMs": {
      "type": "number",
      "description": "Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."
    },
    "workdir": {
      "type": "string",
      "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
    },
    "run_in_background": {
      "type": "boolean",
      "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
    }
  },
  "required": [
    "command",
    "description"
  ]
}

출처: packages/shell/tool-pwsh/src/index.ts

pwsh 도구는 Windows 구성용 bash executor 추상 시임의 PowerShell 방언 소비자입니다(PowerShell executor(예: @deepseek-ai/dsh-pwsh-local)가 ctx.shell를 뒷받침함). 이 도구는 샌드박스 제어를 제외하고 bash 도구를 호출 단위로 그대로 반영합니다. run_in_background 실행은 일반 ctx.jobs 런타임에 등록되며, job_* 도구를 통해 수집하거나 중지합니다. 관리형 DSH_* 환경은 @deepseek-ai/dsh-shell-env에서 제공됩니다. 각 호출은 네이티브 C:\... 경로 및 $env:NAME 변수를 사용해 새 프로세스에서 실행되며(영속 PTY 세션 없음) 처리됩니다.

@deepseek-ai/dsh-tool-cordis

cordis_define

변경할 수 없는 Cordis Package를 정의합니다. 새 Plugin의 경우 kind:"new"를 사용하고 3~6개의 소문자 영어 문자로 된 의미론적 접두사만 제공하세요. Host가 최종 pluginId 및 packageId를 반환합니다. 기존 Plugin을 수정하려면 정확한 pluginId와 함께 kind:"existing"을 사용하여 이전 버전을 덮어쓰지 않고 Package를 추가하세요. code.host 및 code.client 중 하나 이상을 제공하세요. 각 값은 Cordis Plugin을 반환하는 일반 JavaScript 함수 본문입니다. TypeScript, JSX 또는 import 변환은 수행되지 않습니다. Service, Event, Builtin, Slot 또는 토큰에 의존하기 전에 Inspect를 쿼리하세요. Define은 매개변수와 구문만 검증하고 소스를 기록합니다. 승인 요청, apply 실행 또는 currentPackageId 변경은 수행하지 않습니다. 성공하면 반환된 ID로 cordis_run을 호출하세요.

json
{
  "type": "object",
  "properties": {
    "plugin": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "kind": {
              "type": "string",
              "const": "new"
            },
            "idPrefix": {
              "type": "string",
              "description": "Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."
            }
          },
          "required": [
            "kind",
            "idPrefix"
          ]
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "kind": {
              "type": "string",
              "const": "existing"
            },
            "pluginId": {
              "type": "string",
              "description": "Exact ID of an existing Plugin; the new Package is appended to that instance."
            }
          },
          "required": [
            "kind",
            "pluginId"
          ]
        }
      ]
    },
    "name": {
      "type": "string",
      "description": "Short, readable Package name."
    },
    "purpose": {
      "type": "string",
      "description": "One-sentence, user-facing description of the Package purpose."
    },
    "code": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "host": {
          "type": "string",
          "description": "Plain JavaScript function body that returns the Host-half Cordis Plugin."
        },
        "client": {
          "type": "string",
          "description": "Plain JavaScript function body that returns the browser Client-half Cordis Plugin."
        }
      }
    }
  },
  "required": [
    "plugin",
    "name",
    "purpose",
    "code"
  ]
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_inspect_list

로컬 Host Provider와 Client에서 동기화된 최신 매니페스트를 포함하여 현재 Host에 알려진 모든 Cordis Inspect Provider를 나열합니다. 각 항목에는 플랫폼, 목적, 읽기 전용 메서드 및 입력/출력 스키마가 포함됩니다. Package를 생성하거나 수정하기 전에 이 Tool을 호출한 다음, 결과에서 cordis_inspect_query에 사용할 provider와 method를 선택하세요. 이름을 추측하거나 Inspect 메서드를 Plugin 코드에서 호출할 수 있는 비즈니스 Service로 취급하지 마세요.

json
{
  "type": "object",
  "properties": {}
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_inspect_query

Inspect Provider가 명시적으로 선언한 읽기 전용 쿼리를 실행합니다. platform, provider, method는 cordis_inspect_list에서 가져와야 하며, input은 해당 method의 스키마를 충족해야 합니다. cordis_define 전에 이 Tool을 사용하여 정확한 Service 메서드, Event 모드, Builtin 시그니처, Tool 스키마, 테마 토큰 또는 활성 Slot 트리와 props를 읽으세요. Host 쿼리는 로컬에서 실행됩니다. Client 쿼리는 첫 번째 유효한 페이지 응답을 기다리며, 페이지가 응답하거나 Tool이 취소될 때까지 대기 상태로 유지됩니다. 이 Tool은 비즈니스 Service 메서드를 호출하거나 런타임을 수정할 수 없습니다. Service.listService 및 Event.listEvents의 경우 input 없이 쿼리하여 간결한 시그니처 디렉터리를 탐색한 후, 정확한 service 또는 event를 쿼리하여 구조화된 계약 및 참조된 types를 확인하세요. Slots.listSubTree의 경우 root 없이 쿼리하여 간결한 트리를 탐색한 후, 정확한 root를 쿼리하여 전체 등록 계약 및 props를 확인하세요.

json
{
  "type": "object",
  "properties": {
    "platform": {
      "type": "string",
      "description": "Runtime platform that owns the Provider.",
      "enum": [
        "host",
        "client"
      ]
    },
    "provider": {
      "type": "string",
      "description": "Exact Provider ID returned by cordis_inspect_list."
    },
    "method": {
      "type": "string",
      "description": "Exact method name declared by the Provider manifest."
    },
    "input": {
      "description": "Optional query input; it must satisfy the method input schema."
    }
  },
  "required": [
    "platform",
    "provider",
    "method"
  ]
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_inspect_self

현재 Session이 소유한 동적 Cordis 객체를 점차 더 자세한 수준으로 검사합니다. ID가 없으면 Plugin 요약만 나열합니다. pluginId만 있으면 버전 포인터, 최신 Run 및 모든 Package 요약을 반환합니다. pluginId와 packageId를 함께 지정한 경우에만 해당 불변 Package의 Host/Client 소스와 런타임 진단을 반환합니다. packageId만 단독으로 제공할 수는 없습니다. @pluginId를 처리하거나, 비동기 실패를 복구하거나, 업데이트된 버전을 정의하기 전에 정확한 Package를 쿼리하세요. 이 Tool은 읽기 전용입니다. 코드를 실행하거나 버전 포인터를 변경하지 않습니다.

json
{
  "type": "object",
  "properties": {
    "pluginId": {
      "type": "string",
      "description": "Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."
    },
    "packageId": {
      "type": "string",
      "description": "Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."
    }
  }
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_run

동적 Plugin의 정확한 Package 하나를 활성화합니다. 최초 활성화, currentPackageId 재시작 또는 롤백에는 mode:"run"을 사용하세요. current가 존재하면 Plugin이 현재 중지되어 있더라도 다른 Package로 전환하려면 mode:"update"를 사용하세요. 권한이 없는 Client Package는 승인 요청을 생성하고 awaiting-approval를 반환하며, 권한이 있는 Package는 starting을 반환하고 브라우저에서 비동기적으로 계속 진행됩니다. 어느 결과도 Tool 내에서 최종 결과를 기다리지 않습니다. currentPackageId는 완전히 성공한 후에만 변경됩니다. 실패하면 기존 current와 대상 next가 유지됩니다. 비동기 성공, 거부 또는 기술적 실패는 state와 steering을 통해 보고됩니다. 기술적 실패 후에는 cordis_inspect_self로 진단을 읽고, 동일한 Plugin을 수정한 뒤 자율적으로 재시도하세요. 사용자가 거부한 후에는 다시 승인을 요청하지 마세요.

json
{
  "type": "object",
  "properties": {
    "pluginId": {
      "type": "string",
      "description": "Stable Plugin ID returned by cordis_define."
    },
    "packageId": {
      "type": "string",
      "description": "Exact immutable Package ID to activate under that Plugin."
    },
    "mode": {
      "type": "string",
      "description": "Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.",
      "enum": [
        "run",
        "update"
      ]
    }
  },
  "required": [
    "pluginId",
    "packageId",
    "mode"
  ]
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_stop

동적 Plugin의 현재 Run을 중지하고 완료되지 않은 승인 또는 활성화 요청을 취소합니다. Plugin, 모든 불변 Package, 권한 부여, currentPackageId 및 nextPackageId를 유지하므로 나중에 직접 실행하거나 업데이트할 수 있습니다. 이미 중지된 Plugin을 중지해도 멱등적으로 성공합니다. 효과를 일시적으로 비활성화하려면 이 Tool을 사용하세요. 영구적으로 제거하려면 cordis_undefine을 사용하세요.

json
{
  "type": "object",
  "properties": {
    "pluginId": {
      "type": "string",
      "description": "Stable dynamic Plugin ID to stop."
    }
  },
  "required": [
    "pluginId"
  ]
}

출처: packages/extensions/tool-cordis/src/index.ts

cordis_undefine

현재 Session이 소유한 동적 Plugin을 영구적으로 제거합니다. 실행 중이거나 승인을 기다리는 경우 먼저 중지하고 요청을 취소한 다음 모든 Package, 권한 부여 및 버전 포인터를 삭제합니다. 반환된 후에는 해당 pluginId, packageId, @ 참조 및 Package 비즈니스 뷰가 무효화됩니다. 기록 카드에는 "Plugin removed" 기록만 남습니다. 재시작이나 롤백을 위해 버전을 계속 사용할 수 있어야 하는 경우에는 이 Tool을 호출하지 마세요. 대신 cordis_stop을 사용하세요.

json
{
  "type": "object",
  "properties": {
    "pluginId": {
      "type": "string",
      "description": "Stable dynamic Plugin ID to remove permanently."
    }
  },
  "required": [
    "pluginId"
  ]
}

출처: packages/extensions/tool-cordis/src/index.ts

어떤 배포 트리에도 포함되지 않습니다(의도적으로 옵트인 방식입니다. 동적 패키지 코드는 실제 런타임에 도달합니다. .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md 참조). 도구 집합은 정의 레지스트리와 vm 샌드박스를 소유하는 ctx.dynamicCordisRunner을(를) @deepseek-ai/dsh-cordis-host-runner에서 주입합니다. 이것이 없는 구성은 도구를 절대 활성화하지 않습니다. 실행 중인 패키지는 중지되거나, 정의 해제되거나, DSH가 다시 시작될 때까지 모델에 표시되는 추가 도구를 등록할 수 있습니다. 변경된 전체 요청 헤더는 이러한 도구 집합 변경 사항을 기록합니다.

@deepseek-ai/dsh-tool-bash-persistent

bash

영속적인 bash 셸에서 명령을 실행합니다. 현재 디렉터리와 내보낸 환경 변수를 포함한 상태는 이 에이전트의 호출 간에 유지됩니다.

json
{
  "type": "object",
  "properties": {
    "command": {
      "type": "string",
      "description": "The bash command to run. Relative path is preferred in the command."
    }
  },
  "required": [
    "command"
  ]
}

출처: packages/shell/tool-bash-persistent/src/index.ts

소유자별로 격리된 영속적 bash 도구 하나입니다. 배포 구성은 PTY 백엔드를 제공하며 모델에 표시되는 환경 설명을 재정의할 수 있습니다.

@deepseek-ai/dsh-tool-str-replace-editor

str_replace_editor

파일을 보고, 만들고, 편집하기 위한 사용자 지정 편집 도구

  • 상태는 명령 호출 및 사용자와의 대화 전반에서 유지됩니다
  • path이(가) 파일이면 view은(는) cat -n 적용 결과를 표시합니다. path이(가) 디렉터리이면 view은(는) 최대 2단계 깊이의 숨김이 아닌 파일과 디렉터리를 나열합니다
  • 지정한 path이(가) 이미 파일로 존재하면 create 명령을 사용할 수 없습니다
  • command에서 긴 출력을 생성하면 잘리고 <response clipped>로 표시됩니다

str_replace 명령 사용 시 참고 사항:

  • old_str 매개변수는 원본 파일에서 정확히 하나 이상의 연속된 줄과 일치해야 합니다. 공백에 유의하세요!
  • 파일에서 old_str 매개변수가 고유하지 않으면 교체가 수행되지 않습니다. 고유하도록 old_str에 충분한 문맥을 포함해야 합니다
  • new_str 매개변수에는 old_str을(를) 대체해야 하는 편집된 줄이 포함되어야 합니다
json
{
  "type": "object",
  "properties": {
    "command": {
      "type": "string",
      "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`.",
      "enum": [
        "view",
        "create",
        "str_replace",
        "insert"
      ]
    },
    "path": {
      "type": "string",
      "description": "Absolute path to file or directory, e.g. `/repo/file.py` or `/repo`."
    },
    "file_text": {
      "type": "string",
      "description": "Required parameter of `create` command, with the content of the file to be created."
    },
    "insert_line": {
      "type": "integer",
      "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`."
    },
    "new_str": {
      "type": "string",
      "description": "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert."
    },
    "old_str": {
      "type": "string",
      "description": "Required parameter of `str_replace` command containing the string in `path` to replace."
    },
    "view_range": {
      "type": "array",
      "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file.",
      "items": {
        "type": "integer"
      }
    }
  },
  "required": [
    "command",
    "path"
  ]
}

소스: packages/fs/tool-str-replace-editor/src/index.ts

파일 시스템 경계에서 독립적으로 작동하는 view/create/unique 리터럴 교체/줄 삽입 도구이며, 모든 셸 또는 터미널 API와 함께 사용할 수 있습니다.

@deepseek-ai/dsh-tool-fs

edit

리터럴 텍스트를 교체하여 기존 UTF-8 텍스트 파일을 편집합니다.

json
{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to edit, resolved by the filesystem backend."
    },
    "old_string": {
      "type": "string",
      "description": "Literal text to replace. Must match exactly."
    },
    "new_string": {
      "type": "string",
      "description": "Literal replacement text. Use an empty string to delete the match."
    },
    "replace_all": {
      "type": "boolean",
      "description": "Replace all matches. Defaults to false; when false, old_string must appear exactly once."
    }
  },
  "required": [
    "file_path",
    "old_string",
    "new_string"
  ]
}

소스: packages/fs/tool-fs/src/index.ts

read

UTF-8 텍스트 파일을 읽고 줄 번호가 포함된 내용을 반환합니다.

json
{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to read, resolved by the filesystem backend."
    },
    "offset": {
      "type": "number",
      "description": "1-based first line to return. Defaults to 1."
    },
    "limit": {
      "type": "number",
      "description": "Maximum number of lines to return. Defaults to 2000."
    }
  },
  "required": [
    "file_path"
  ]
}

소스: packages/fs/tool-fs/src/index.ts

read_image

PNG/JPEG/WebP/GIF 파일을 읽고 이미지 자체를 반환합니다. 현재 모델이 이미지 입력을 허용해야 합니다.

json
{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to the image file, resolved by the filesystem backend."
    }
  },
  "required": [
    "file_path"
  ]
}

소스: packages/fs/tool-fs/src/index.ts

write

UTF-8 텍스트 파일을 생성하거나 완전히 교체합니다.

json
{
  "type": "object",
  "properties": {
    "file_path": {
      "type": "string",
      "description": "Path to write, resolved by the filesystem backend."
    },
    "content": {
      "type": "string",
      "description": "Full UTF-8 text content to write."
    }
  },
  "required": [
    "file_path",
    "content"
  ]
}

소스: packages/fs/tool-fs/src/index.ts

읽기 전 쓰기/편집 정책은 @deepseek-ai/dsh-fs-observation-policy(스키마 변경이 없는 fs/* 이벤트 게이트 플러그인)에서 추가하며, 이러한 도구를 로드하는 배포 환경에서는 이 플러그인도 로드해야 합니다. read_image은(는) ctx.attachments 없이 등록되지 않습니다. 스키마는 라우트와 무관하며, 정확히 라우팅된 모델이 이미지 입력을 선언한 경우에만 실행을 허용합니다.

glob

경로가 glob 패턴과 일치하는 파일을 찾습니다. 숨김 파일과 무시된 파일을 포함하여(버전 관리 시스템 메타데이터 디렉터리는 제외) 일치하는 파일 경로만 반환하며, 디렉터리는 반환하지 않습니다. 최대 100개의 경로가 수정 시간순으로 반환됩니다. 결과가 더 크면 최상위 항목 전반에서 샘플링한 100개의 경로를 대신 반환하고, 이 사실과 전체 정렬 목록의 저장 위치를 알립니다. 이 도구는 디렉터리 항목을 열거하지 않습니다.

json
{
  "type": "object",
  "properties": {
    "pattern": {
      "type": "string",
      "description": "Glob pattern to match file paths against (e.g. \"**/*.ts\", \"src/**/*.test.js\"). A pattern with no \"/\" matches the basename at any depth, so \"*\" and \"*.ts\" both search the whole tree; include a separator to anchor the depth."
    },
    "path": {
      "type": "string",
      "description": "Directory to search in. Defaults to the session workspace; a relative path resolves against it."
    }
  },
  "required": [
    "pattern"
  ]
}

소스: packages/fs/tool-fs-search/src/index.ts

grep

ripgrep 정규 표현식으로 파일 내용을 검색합니다. 파일별로 그룹화된 줄 번호 포함 일치 줄을 반환합니다. 처음 250개의 일치를 인라인으로 반환하며, 결과가 제한되면 전체 일치 목록의 저장 위치를 알립니다. 주변 문맥은 일치한 파일에 read를 사용하여 확인하세요.

json
{
  "type": "object",
  "properties": {
    "pattern": {
      "type": "string",
      "description": "Regular expression to search for (ripgrep syntax)."
    },
    "path": {
      "type": "string",
      "description": "File or directory to search. Defaults to the session workspace; a relative path resolves against it."
    },
    "include": {
      "type": "string",
      "description": "One glob filter for which files to search (e.g. \"*.ts\", \"*.{js,jsx}\"). Not a list; negation is not supported."
    }
  },
  "required": [
    "pattern"
  ]
}

소스: packages/fs/tool-fs-search/src/index.ts

glob 및 grep은 일반 포그라운드 호출(백그라운드 작업은 사용하지 않음)로 ctx.subprocess를 통해 패키지된 ripgrep 바이너리(@vscode/ripgrep)를 생성하는 무조건적인 검색 도구입니다. 호스트 rg 설치나 셸 계층은 사용하지 않습니다. 카탈로그는 sampleOverCapGlobResults: true을 사용하며, 배포 환경에서는 이 동작을 명시적으로 선택해야 합니다. 결과가 제한되면 선택적 ctx.spillStore 백엔드를 통해 전체 형식화 목록을 저장합니다. 동일 위치 배포에서 백엔드가 로컬 경로를 노출하면 반환된 로케이터를 후속으로 읽거나 검색할 수 있습니다.

@deepseek-ai/dsh-tool-terminal

terminal_close

영구 터미널 하나를 종료하고 캡처된 소유 프로세스 트리가 사라질 때까지 기다립니다.

json
{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Terminal session id."
    }
  },
  "required": [
    "sessionId"
  ]
}

소스: packages/terminal/tool-terminal/src/index.ts

terminal_list

현재 에이전트가 소유한 영구 터미널 세션을 나열합니다.

json
{
  "type": "object",
  "properties": {}
}

출처: packages/terminal/tool-terminal/src/index.ts

terminal_open

등록된 백엔드 유형에서 영속적이고 소유자 격리된 터미널 세션을 생성합니다. 도구 호출 간에도 유지되어야 하는 셸 또는 REPL 상태에 사용합니다.

json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "Registered terminal backend type, usually \"shell\"."
    },
    "name": {
      "type": "string",
      "description": "Optional owner-local display name such as \"main\" or \"gdb\"."
    },
    "cwd": {
      "type": "string",
      "description": "Initial working directory. Defaults to the deployment workspace root."
    }
  },
  "required": [
    "type"
  ]
}

출처: packages/terminal/tool-terminal/src/index.ts

terminal_read

입력을 전송하지 않고 영속적 터미널에 보존된 출력의 범위가 제한된 페이지를 읽습니다.

json
{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Terminal session id."
    },
    "offset": {
      "type": "number",
      "description": "Newest-relative line offset (default 0)."
    },
    "count": {
      "type": "number",
      "description": "Requested line count (default 500; backend caps apply)."
    }
  },
  "required": [
    "sessionId"
  ]
}

출처: packages/terminal/tool-terminal/src/index.ts

terminal_send

영속적 터미널에 텍스트를 전송합니다. 기본적으로 Enter가 제출되고 호출은 프롬프트, stdin 대기, 출력 무음, 시간 초과 또는 세션 종료까지 대기합니다. 백그라운드 모드는 job_output/job_kill용 작업 ID를 반환합니다.

json
{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Terminal session id returned by terminal_open or terminal_list."
    },
    "text": {
      "type": "string",
      "description": "UTF-8 text to write to the terminal."
    },
    "submit": {
      "type": "boolean",
      "description": "Submit Enter after text (default true). Set false for control characters or incomplete REPL input."
    },
    "run_in_background": {
      "type": "boolean",
      "description": "Return a job id immediately; collect with job_output or stop with job_kill."
    }
  },
  "required": [
    "sessionId",
    "text"
  ]
}

출처: packages/terminal/tool-terminal/src/index.ts

terminal_signal

영속적 터미널의 현재 포그라운드 프로세스 그룹에 허용된 신호를 전송합니다.

json
{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Terminal session id."
    },
    "signal": {
      "type": "string",
      "description": "Signal to deliver. Shell-targeted SIGKILL is rejected; use terminal_close.",
      "enum": [
        "SIGINT",
        "SIGTERM",
        "SIGKILL",
        "SIGTSTP",
        "SIGHUP"
      ]
    }
  },
  "required": [
    "sessionId",
    "signal"
  ]
}

출처: packages/terminal/tool-terminal/src/index.ts

6개의 터미널 도구는 선택적으로 사용할 수 있으며 일회성 셸/파일 시스템 도구를 보완합니다. terminal_send(run_in_background: true)ctx.jobs에 등록합니다. TUI, 이름 지정 키 시퀀스, BEL, 크기 조정, 자동 시작 및 에이전트 간 공유는 스키마에 없습니다.

@deepseek-ai/dsh-tool-goal

create_goal

현재 직접적인 인간 요청이 자율 목표 라운드 전반에 걸쳐 계속되어야 하는 장기 실행 목표인 경우, 동일 세션에서 유지되는 완료 목표 하나를 생성합니다. 사용자가 "목표 생성"이라고 말하지 않아도 그 의도를 추론할 수 있습니다. 사소한 단일 턴 작업에는 사용하지 마세요. 실행은 인간이 아닌 권한과 하위 에이전트 권한을 거부합니다.

json
{
  "type": "object",
  "properties": {
    "objective": {
      "type": "string",
      "description": "The concrete completion objective inferred from the direct human request."
    },
    "max_goal_rounds": {
      "type": "number",
      "description": "Optional positive safe-integer limit on automatic continuation rounds."
    }
  },
  "required": [
    "objective"
  ]
}

출처: packages/goal/tool-goal/src/index.ts

get_goal

정확한 ID/개정, 목표, 단계, 완료된 연속 라운드, 라운드 제한, 있는 경우 차단 사유 및 다른 연속 실행이 준비되었는지를 포함하여 현재 동일 세션 목표를 읽습니다. 목표를 업데이트하기 전에 이를 호출하세요.

json
{
  "type": "object",
  "properties": {}
}

출처: packages/goal/tool-goal/src/index.ts

update_goal

정확한 현재 목표 개정을 업데이트합니다. edit, pause 및 resume에는 직접적인 최상위 인간 요청이 필요합니다. 현재 목표의 자동 연속 실행 중에는 complete 및 blocked도 허용됩니다. 구성된 최소 라운드 수에 도달하기 전에는 blocked가 거부됩니다. 모델은 동일한 조건이 해당 라운드 전반에 걸쳐 지속되었는지 판단할 책임이 있으며, 이를 blocked_reason에 설명해야 합니다.

json
{
  "type": "object",
  "properties": {
    "goal_id": {
      "type": "string",
      "description": "Exact id returned by get_goal."
    },
    "revision": {
      "type": "number",
      "description": "Exact positive revision returned by get_goal."
    },
    "action": {
      "type": "string",
      "description": "edit | pause | resume | complete | blocked",
      "enum": [
        "edit",
        "pause",
        "resume",
        "complete",
        "blocked"
      ]
    },
    "objective": {
      "type": "string",
      "description": "Replacement objective; valid only with action edit."
    },
    "max_goal_rounds": {
      "type": "number",
      "description": "Replacement cap; valid only with action edit."
    },
    "blocked_reason": {
      "type": "string",
      "description": "Concrete blocking condition; required only with action blocked."
    }
  },
  "required": [
    "goal_id",
    "revision",
    "action"
  ]
}

출처: packages/goal/tool-goal/src/index.ts

create, edit, pause 및 resume에는 직접적인 인간 루트 권한이 필요하며, complete 및 blocked는 정확한 현재 목표 라운드도 허용합니다. 기본 blocked 하한은 승인된 라운드 3회입니다.

@deepseek-ai/dsh-schedule

schedule_create

현재 세션에 미리 알림 하나를 생성합니다. 비어 있지 않은 프롬프트와 정확히 하나의 선택자를 제공합니다. 즉, 양수 안전 정수 after_seconds 지연, 엄격한 오프셋 날짜-시간 또는 로컬 날짜/시간 객체로 지정하는 at, 또는 최소 300인 안전 정수 every_seconds입니다. 고정 속도 미리 알림은 생성 시점에 맞춰 정렬되고, 놓친 발생은 건너뛰며, 기한이 지난 규칙당 가장 최근 발생 하나를 일괄 처리합니다. 전송은 세션 로컬입니다. 미리 알림은 이 세션이 활성 상태일 때만 정시에 실행되며, 그렇지 않으면 세션이 재개될 때까지 기한 초과 상태가 됩니다.

json
{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "Reminder content to present when the target becomes due."
    },
    "after_seconds": {
      "type": "number",
      "description": "Positive safe-integer delay in seconds."
    },
    "every_seconds": {
      "type": "number",
      "description": "Fixed-rate safe-integer interval in seconds, at least 300."
    },
    "at": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "date": {
              "type": "string"
            },
            "time": {
              "type": "string"
            },
            "time_zone": {
              "type": "string"
            }
          },
          "required": [
            "date",
            "time",
            "time_zone"
          ]
        }
      ],
      "description": "Absolute target as strict offset RFC 3339 or local date/time with an explicit IANA zone."
    }
  },
  "required": [
    "prompt"
  ]
}

출처: packages/schedule/schedule/src/tools.ts

schedule_delete

schedule_create 또는 schedule_list에서 반환된 정확한 id를 사용하여 현재 세션의 활성 미리 알림 하나를 삭제합니다. 알 수 없거나 이미 완료된 id는 deleted false를 반환합니다.

json
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Exact session-local schedule id."
    }
  },
  "required": [
    "id"
  ]
}

출처: packages/schedule/schedule/src/tools.ts

schedule_list

정확한 id, UTC 대상 시각, 예약 또는 기한 초과 상태, 세션 로컬 전달 모드를 포함하여 현재 세션의 모든 활성 미리 알림을 생성 순서대로 나열합니다.

json
{
  "type": "object",
  "properties": {}
}

출처: packages/schedule/schedule/src/tools.ts

Schedule 플러그인을 옵트인으로 로드한 뒤 생성된 라이브 루트 Agent 범위에서만 등록됩니다. 버전 1은 after_seconds, 명시적인 절대 at, 범위가 제한된 고정 비율 every_seconds를 허용하며 세션 로컬 전달을 공개합니다. 관리 읽기 및 변경에는 공유 Session 영속성 장벽이 필요합니다.

@deepseek-ai/dsh-tool-lsp

lsp

정확한 코드 탐색을 위해 언어 서버를 쿼리합니다. operation은 goToDefinition, findReferences, goToImplementation, hover 중 하나입니다. line과 character는 1부터 시작하는 UTF-16 커서 좌표입니다. findReferences에는 선언이 포함됩니다.

json
{
  "type": "object",
  "properties": {
    "operation": {
      "type": "string",
      "description": "goToDefinition, findReferences, goToImplementation, or hover.",
      "enum": [
        "goToDefinition",
        "findReferences",
        "goToImplementation",
        "hover"
      ]
    },
    "file_path": {
      "type": "string",
      "description": "The source file to query, relative to the workspace or absolute."
    },
    "line": {
      "type": "number",
      "description": "One-based line of the cursor."
    },
    "character": {
      "type": "number",
      "description": "One-based UTF-16 column of the cursor."
    }
  },
  "required": [
    "operation",
    "file_path",
    "line",
    "character"
  ]
}

출처: packages/lsp/tool-lsp/src/index.ts

lsp 도구는 공급자 선택과 언어 서버 하위 프로세스를 ctx.lsp 뒤에 유지하므로 모델에 표시되는 스키마가 공급자 전반에서 안정적으로 유지됩니다. 런타임에 등록된 공급자(예: @deepseek-ai/dsh-lsp-stdio)가 필요합니다. 공급자가 없으면 쿼리는 스키마를 변경하는 대신 구조화된 LSP_UNAVAILABLE 오류를 반환합니다.

@deepseek-ai/dsh-tool-ralph

ralph

하나의 불변 목표를 향해 포그라운드 새 에이전트 Ralph 루프를 실행합니다. 직접적인 인간 사용자가 Ralph 또는 새 에이전트 반복을 명시적으로 요청한 경우에만 사용합니다. 각 라운드는 부모 대화나 이전 하위 세션 없이 새 하위를 열며, 공유 워크스페이스는 장기 메모리이고 제한된 구조화 보고서만 라운드 간에 전달됩니다. 워커가 완료 또는 구체적인 차단 요인을 보고하거나 라운드 한도에 도달하면 호출이 반환됩니다. 일반적인 장기 실행 동일 세션 작업에는 goal 도구를 사용합니다.

json
{
  "type": "object",
  "properties": {
    "objective": {
      "type": "string",
      "description": "The immutable completion objective for every fresh Ralph round."
    },
    "maxRounds": {
      "type": "number",
      "description": "Optional positive safe-integer round cap, bounded by the deployment ceiling."
    }
  },
  "required": [
    "objective"
  ]
}

출처: packages/workflow/tool-ralph/src/index.ts

고정된 포그라운드 워크플로는 라운드마다 하나의 새 구조화 하위를 시작합니다. 모델은 불변 목표와 선택적 라운드 상한만 선택합니다.

@deepseek-ai/dsh-tool-skill

skill

사용 가능한 스킬의 전체 지침을 로드합니다. 특정 스킬을 명시하거나 명확히 해당 스킬과 일치하는 작업을 수행하기 전에 세션 스킬 카탈로그의 정확한 스킬 이름으로 이를 호출합니다.

json
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The exact skill name from the available skills list."
    }
  },
  "required": [
    "name"
  ]
}

출처: packages/skill/tool-skill/src/index.ts

@deepseek-ai/dsh-tool-session-query

session_event_read

권한이 부여된 세션에서 하나의 전체 비축약 이벤트와 선택적 인접 원시 이벤트 요약을 읽습니다.

json
{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "Target session id. Omit for the current session."
    },
    "seq": {
      "type": "integer",
      "description": "Target event sequence number."
    },
    "before": {
      "type": "integer",
      "description": "Number of preceding raw events to summarize. Omit for none."
    },
    "after": {
      "type": "integer",
      "description": "Number of following raw events to summarize. Omit for none."
    }
  },
  "required": [
    "seq"
  ]
}

출처: packages/session-query/tool-session-query/src/index.ts

권한이 부여된 하나의 세션에서 이전 이벤트를 검색합니다. 현재 세션은 이 호출을 수행하는 단계를 제외합니다.

json
{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "Target session id. Omit for the current session."
    },
    "query": {
      "type": "string",
      "description": "Literal full-text query over the target session."
    },
    "seq_from": {
      "type": "integer",
      "description": "Inclusive event sequence lower bound."
    },
    "seq_to": {
      "type": "integer",
      "description": "Inclusive event sequence upper bound."
    },
    "time_from": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 event-time lower bound."
    },
    "time_to": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 event-time upper bound."
    },
    "event_types": {
      "type": "array",
      "description": "Event types to include.",
      "items": {
        "type": "string"
      }
    },
    "surfaces": {
      "type": "array",
      "description": "Event surfaces to include.",
      "items": {
        "type": "string",
        "enum": [
          "current",
          "shadowed",
          "log-only"
        ]
      }
    }
  },
  "required": [
    "query"
  ]
}

출처: packages/session-query/tool-session-query/src/index.ts

session_event_trace

권한이 부여된 세션의 한 이벤트에 대해, 해당 이벤트가 인용한 소스 이벤트의 모든 직접 교체 및 관계를 읽습니다.

json
{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "Target session id. Omit for the current session."
    },
    "seq": {
      "type": "integer",
      "description": "Target event sequence number."
    }
  },
  "required": [
    "seq"
  ]
}

소스: packages/session-query/tool-session-query/src/index.ts

호출자 워크스페이스에서 이전 세션을 검색하고, 각 세션에서 가장 일치도가 높은 이벤트를 반환합니다.

json
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Literal full-text query over prior session history."
    },
    "session_ids": {
      "type": "array",
      "description": "Optional session ids to include.",
      "items": {
        "type": "string"
      }
    },
    "created_at_from": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 creation-time lower bound."
    },
    "created_at_to": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 creation-time upper bound."
    },
    "parent_session_ids": {
      "type": "array",
      "description": "Optional direct parent session ids.",
      "items": {
        "type": "string"
      }
    },
    "include_root_sessions": {
      "type": "boolean",
      "description": "Include sessions with no parent in the parent filter."
    },
    "availability": {
      "type": "array",
      "description": "Require at least one selected source availability.",
      "items": {
        "type": "string",
        "enum": [
          "live",
          "persisted"
        ]
      }
    },
    "event_seq_from": {
      "type": "integer",
      "description": "Inclusive event sequence lower bound."
    },
    "event_seq_to": {
      "type": "integer",
      "description": "Inclusive event sequence upper bound."
    },
    "event_time_from": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 event-time lower bound."
    },
    "event_time_to": {
      "type": "string",
      "description": "Inclusive timezone-qualified ISO 8601 event-time upper bound."
    },
    "event_types": {
      "type": "array",
      "description": "Event types to include.",
      "items": {
        "type": "string"
      }
    },
    "event_surfaces": {
      "type": "array",
      "description": "Event surfaces to include.",
      "items": {
        "type": "string",
        "enum": [
          "current",
          "shadowed",
          "log-only"
        ]
      }
    }
  },
  "required": [
    "query"
  ]
}

소스: packages/session-query/tool-session-query/src/index.ts

session_trace

하나의 세션 주변에 있는 권한 부여된 세션 계보를 읽으며, 표시 가능한 모든 조상 및 자손 관계를 포함합니다.

json
{
  "type": "object",
  "properties": {
    "session_id": {
      "type": "string",
      "description": "Target session id. Omit for the current session."
    }
  }
}

소스: packages/session-query/tool-session-query/src/index.ts

읽기 전용 도구 다섯 개는 공급자 커서를 숨기고 변경 불가능한 호출 에이전트 세션에서 모든 결과에 권한을 부여합니다. 이 패키지는 옵트인 방식이며, 강제된 마감 시간이나 제한된 인라인 출력을 필요로 하는 조합은 범용 timeout 또는 spill 정책도 마운트합니다.

@deepseek-ai/dsh-tool-subagent

subagent

독립적으로 완결된 작업을 하위 에이전트(자체 컨텍스트에서 작업하는 별도 에이전트)에 위임하여 조사, 범위가 정해진 구현, 분석과 같은 집중적이고 독립적인 작업을 오프로드함으로써 이 대화의 컨텍스트를 소비하지 않도록 합니다. 하위 에이전트는 중간 단계가 아니라 결과를 반환합니다. 완전하고 독립적인 프롬프트를 제공하세요. 하위 에이전트는 이 대화를 볼 수 없습니다. 이 호출은 기본적으로 결과를 기다립니다. run_in_background: true을 설정하면 작업 ID를 반환하며, job_output로 수집하고 job_kill로 중지합니다.

json
{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "description": "A short (3-5 word) description of the delegated task, for display."
    },
    "prompt": {
      "type": "string",
      "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."
    },
    "run_in_background": {
      "type": "boolean",
      "description": "Whether to run as a background job and return its id. Defaults to false; collect with job_output or stop with job_kill."
    }
  },
  "required": [
    "description",
    "prompt"
  ]
}

소스: packages/subagent/tool-subagent/src/index.ts

등록된 도구 이름은 로드 시의 toolName 설정(기본값은 subagent)이며, 위의 스키마는 해당 기본값입니다. 제공되는 조합은 하위 에이전트 백엔드마다 이 패키지를 한 번 로드하므로, 모델에는 포크 백엔드에 바인딩된 subagent_fork도 표시됩니다. 각 인스턴스의 설명, run_in_background 매개변수 및 시스템 프롬프트 정책은 각각의 backgroundModeenableRunInBackground를 따르므로, 제공되는 두 스키마는 동일하지 않습니다. subagentcontinuable이며 호출에서 생략하면 자동 완료 전달이 포함된 백그라운드가 기본값이지만, subagent_forkone-shot로 유지되며 기본값은 포그라운드입니다. packages/bundle/base/cordis.patch.ymlexamples/acp-agent/cordis.yml를 참조하세요.

@deepseek-ai/dsh-tool-subagent-control

interrupt_agent

에이전트 ID로 백그라운드 에이전트의 현재 턴 취소를 요청합니다. 대상은 직접 자식이거나 그 아래에서 생성된 더 깊은 에이전트일 수 있습니다. 현재 턴만 중지됩니다. 에이전트에 이미 대기 중인 메시지는 이후 send_message가 호출될 때까지 보관되고, 해당 에이전트가 시작한 에이전트는 계속 실행되며, 에이전트 자체는 후속 작업에 계속 사용할 수 있습니다. 이 호출은 중지 요청이 수락되는 즉시 반환하므로 대상은 잠시 계속 실행될 수 있습니다. 이미 종료된 에이전트를 중단해도 수락되는 무작업 처리입니다.

json
{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "The agent id of the running agent to interrupt."
    }
  },
  "required": [
    "agent_id"
  ]
}

소스: packages/subagent/tool-subagent-control/src/index.ts

list_agents

지속 가능한 ID와 레이블로 재개 가능한 백그라운드 하위 에이전트를 나열합니다. 완료 여부를 폴링하는 용도가 아니라, 시작한 에이전트를 다시 확인하는 데 사용하세요. 에이전트가 완료되면 알림을 받습니다. 상태는 라이브 레지스트리에서 가져옵니다. running은 에이전트가 현재 작업 중임을, idle은 로드되었으나 턴 사이에 있음을(시작한 에이전트를 기다리는 중일 수 있음), ready는 스토리지에만 존재함을 뜻합니다. ready 상태의 에이전트는 재개할 수 있지만 종료된 상태도 아니고 수집 대기 중인 결과도 아닙니다. send_message은 동일한 대화에서 새 턴을 시작하며, 직접 자식은 모든 상태에서 send_message 후보로 남습니다. 이 스냅샷은 전달을 보장하지 않습니다. send_message이 권위 있는 검사를 수행하며 여전히 실패할 수 있습니다. 읽을 수 없었던 자식은 조용히 누락되는 대신 진단 정보로 보고됩니다. 범위 descendants은 안정적인 사전 순회 방식으로 사용자 아래 전체 트리를 순회하며, 각 항목에 지속 가능한 직접 부모 세션 ID와 깊이를 주석으로 표시합니다. send_message은 깊이 1 항목에만 사용할 수 있으며, 더 깊은 항목은 interrupt_agent의 후보일 뿐입니다.

json
{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "description": "children (default) lists direct children only; descendants walks the complete tree below you.",
      "enum": [
        "children",
        "descendants"
      ]
    }
  }
}

출처: packages/subagent/tool-subagent-control/src/list-agents.ts

send_message

하위 에이전트 ID를 사용하여 백그라운드 하위 에이전트에 메시지를 보내고 동일한 대화를 계속합니다. 이는 하위 에이전트의 다음 턴이 됩니다. 아직 작업 중인 경우 현재 턴이 끝날 때까지 메시지가 대기하므로, 이미 진행 중인 작업의 방향을 바꿀 수는 없습니다. 이 호출은 하위 에이전트의 답변이 아니라 메시지 전달 확인만 반환하므로, 추가 작업을 전달할 때 사용합니다. 실패는 메시지가 전달되지 않았음을 의미합니다.

json
{
  "type": "object",
  "properties": {
    "subagent_id": {
      "type": "string",
      "description": "The subagent id returned when the background subagent was started."
    },
    "message": {
      "type": "string",
      "description": "The message to deliver to the subagent."
    }
  },
  "required": [
    "subagent_id",
    "message"
  ]
}

출처: packages/subagent/tool-subagent-control/src/index.ts

계속 가능한 백그라운드 하위 에이전트를 전역적으로 제어하는 도구입니다. 공급자에 바인딩된 tool-subagent 인스턴스는 각각 별개의 위임 도구를 등록하는 반면, 이 패키지는 send_messageinterrupt_agent을 한 번만 등록하고, 별도로 로드된 /list-agents 플러그인의 list_agents도 등록합니다(이 플러그인의 카탈로그 행은 sessionProjections 및 활성 Agent 레지스트리를 사용합니다).

@deepseek-ai/dsh-tool-subagent-report

report

선택한 콘텐츠를 자신을 시작한 에이전트에 보고합니다. 작업을 마치기 전에 자급자족하는 최종 결과와 함께 한 번 호출하고, 해당 에이전트가 다음에 수행할 작업을 바꾸는 진행 상황이나 발견 사항이 있으면 그보다 먼저 호출합니다. 해당 에이전트는 워크스페이스를 공유하지만, 트랜스크립트, 도구 출력 또는 추론을 자동으로 받지는 않으므로 작업을 마쳤다는 사실 자체는 결과가 아닙니다. 보고해도 턴이 종료되거나 작업이 완료되지는 않으며, 직접 상위 에이전트만 이를 받습니다. 실패한 호출도 도착했을 수 있으므로 무작정 반복하지 마세요.

json
{
  "type": "object",
  "properties": {
    "output": {
      "type": "string",
      "description": "Actionable content for your parent; summarize conclusions and reference relevant shared paths."
    }
  },
  "required": [
    "output"
  ]
}

출처: packages/subagent/tool-subagent-report/src/index.ts

전역이 아니라 계속 가능한 프로세스 내 자식별로 등록되므로, 이 스키마는 해당 자식 내부에서만 표시되며 전역 toolFilter 이후에도 유지됩니다. 동일한 기여 항목은 이 카탈로그에서 렌더링하지 않는 자식 범위의 tool:report 프롬프트 섹션도 설치합니다. 상위 에이전트용 send_message 도구는 독립적으로 설치됩니다.

@deepseek-ai/dsh-tool-jobs

job_kill

작업 ID로 실행 중인 백그라운드 작업의 취소를 요청합니다. 즉시 반환되며, 작업이 실제로 중지되면 종료됨 상태로 완료됩니다.

json
{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "Job id returned by the tool that started the background work."
    },
    "reason": {
      "type": "string",
      "description": "Optional short reason, recorded in the log and forwarded to the job."
    }
  },
  "required": [
    "job_id"
  ]
}

출처: packages/jobs/tool-jobs/src/index.ts

job_list

실행 중인 작업과 완료된 작업을 포함한 백그라운드 작업을 ID, 종류, 상태와 함께 나열합니다.

json
{
  "type": "object",
  "properties": {}
}

출처: packages/jobs/tool-jobs/src/index.ts

job_output

백그라운드 작업을 읽습니다. 스트림 작업은 이전 읽기 이후의 출력만 반환하며, 최종 출력 작업은 완료된 후 결과를 반환합니다. 모든 응답은 [status: ...]으로 끝납니다. wait: true인 경우를 제외하면 읽기는 차단되지 않으며, 이 경우 구성된 한도까지 대기합니다.

json
{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "Job id returned by the tool that started the background work."
    },
    "wait": {
      "type": "boolean",
      "description": "Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."
    },
    "timeout_ms": {
      "type": "number",
      "description": "Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."
    }
  },
  "required": [
    "job_id"
  ]
}

출처: packages/jobs/tool-jobs/src/index.ts

종류와 무관한 백그라운드 작업 컨트롤러입니다. 백그라운드 bash 명령, PTY 전송, 하위 에이전트는 동일한 세 도구를 통해 읽고, 나열하고, 종료합니다. 플러그인을 로드하면 생성자의 ctx.jobs.start()을 활성화하는 컨트롤러가 연결됩니다.

@deepseek-ai/dsh-tool-todo

todo_write

현재 작업의 구조화된 작업 목록을 기록하고 업데이트합니다. 매 호출마다 전체 목록을 전송하세요. 이전 목록을 대체하므로 부분 업데이트나 항목별 편집은 없습니다. 여러 단계 작업을 계획하고 진행 상황을 표시하는 데 사용하세요. 시작하기 전에 구체적인 단계마다 할 일 하나를 추가합니다. 실제로 병렬 실행되는 경우(예: 동시 하위 에이전트 또는 백그라운드 명령)에는 여러 항목을, 순차 작업에는 하나를 in_progress 상태로 표시합니다. 작업이 남아 있는 동안에는 적어도 하나의 작업이 in_progress 상태여야 합니다. 완료되는 즉시 할 일을 completed 상태로 표시하며(완료 처리를 모아서 하지 마세요), 모든 작업이 완료된 경우에만 in_progress 항목이 없도록 합니다. 사소한 단일 단계 작업에는 목록을 생략합니다. 상태: pending(시작 전), in_progress(현재 작업 중), completed(완료).

json
{
  "type": "object",
  "properties": {
    "todos": {
      "type": "array",
      "description": "The COMPLETE task list, replacing any previous list.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "content": {
            "type": "string",
            "description": "What the task is — a short imperative line."
          },
          "status": {
            "type": "string",
            "description": "pending (not started) | in_progress (now) | completed (done).",
            "enum": [
              "pending",
              "in_progress",
              "completed"
            ]
          }
        },
        "required": [
          "content",
          "status"
        ]
      }
    }
  },
  "required": [
    "todos"
  ]
}

출처: packages/todo/tool-todo/src/index.ts

todo_write는 세션 소유 상태이며 UI는 최신 todo/write 이벤트를 체크리스트로 렌더링합니다. allowParallelInProgress은 기본값 없이 필수이므로 카탈로그는 true이라는 선택을 명시하며, 그 설명은 여러 in_progress 항목을 권장합니다. false을 선택하는 배포는 정확히 하나의 활성 작업을 요청하는 설명과 함께 동일한 도구를 받습니다.

@deepseek-ai/dsh-tool-workflow

workflow

대규모로 하위 에이전트를 조율하는 JavaScript 워크플로 스크립트를 실행합니다. 많은 독립 항목으로 확장되는 작업(여러 파일에 대한 감사, 마이그레이션, 다각도 조사, 발견 사항의 적대적 검증 등)에 사용하며, 턴마다 위임하는 대신 스크립트로 조율을 작성합니다.

워크플로의 식별 정보는 JSON 형식의 meta 매개변수로 전달됩니다. 필수 항목은 name(짧은 kebab-case) 및 description 문자열이며, 선택 항목은 whenToUse 문자열과 phases 배열({title, detail?, provider?, model?})입니다. script 매개변수에는 최상위 수준 await와 함께 실행되는 일반 JavaScript 본문만 작성합니다(TypeScript는 안 되며 export const meta 문도 사용할 수 없습니다. meta는 코드가 아니라 매개변수입니다). 마지막은 return <value>로 끝내야 하며, 값은 JSON 직렬화가 가능해야 하고 이 도구의 결과가 됩니다.

스크립트 본문 훅:

  • agent(prompt, opts?): Promise<any> — 하위 에이전트 하나를 완료될 때까지 실행합니다. opts.schema가 없으면 하위 항목의 최종 텍스트로 확인되며, opts.schema(type/properties/required/additionalProperties/items/enum/const/oneOf만 사용하는 객체 루트 JSON Schema, pattern/format/numeric 범위 없음)가 있으면 검증된 객체로 확인됩니다. 하위 항목이 실패하면 null로 확인됩니다(.filter(Boolean)로 필터링). 다른 옵션은 label(표시), phase(진행 그룹), 그리고 서로 독립적인 provider/model LLM 대상 재정의입니다(둘 중 하나만 제공할 수 있음). 그 외 항목(effort/isolation/agentType)은 명확한 오류와 함께 거부됩니다.
  • pipeline(items, ...stages): Promise<any[]> — 단계 사이에 장벽 없이 각 항목을 각 단계에서 독립적으로 실행합니다(다단계 작업에는 이 방식을 권장함). 각 단계는 (prev, item, index)을 받습니다. 일반 단계에서 throw가 발생하면 해당 항목은 null로 이동하며 나머지 단계를 건너뜁니다.
  • parallel(thunks): Promise<any[]> — 인수가 없는 함수를 동시에 실행하고 모두를 await합니다(장벽이며, 단계가 이전의 모든 결과를 함께 반드시 필요로 할 때만 사용). throw하는 thunk는 null로 확인됩니다.
  • phase(title) — 진행 단계를 시작합니다. log(message) — 진행 상황을 설명합니다. args — 도구 호출의 args 입력을 그대로 사용합니다.

잘못 사용한 훅(잘못된 인수, 알 수 없는 옵션, 지원되지 않는 스키마, 초과된 제한)은 항상 스크립트를 종료하는 오류를 발생시킵니다. 항목별 null로 처리되지 않습니다.

제약: 동시 실행 및 전체 에이전트 제한이 적용됩니다. 파일 시스템, 네트워크, 타이머 또는 Node.js API는 제공되지 않습니다. 에이전트가 작업을 수행하고 스크립트는 이를 조정할 뿐입니다. 실행은 포그라운드에서 이루어지므로 전체 스크립트가 완료되면 이 호출이 반환됩니다.

json
{
  "type": "object",
  "properties": {
    "script": {
      "type": "string",
      "description": "The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return <json-value>`)."
    },
    "meta": {
      "type": "object",
      "description": "The workflow identity block (plain JSON — never code).",
      "additionalProperties": true,
      "properties": {
        "name": {
          "type": "string",
          "description": "Short kebab-case workflow name."
        },
        "description": {
          "type": "string",
          "description": "One-line description of what the workflow does."
        },
        "whenToUse": {
          "type": "string",
          "description": "Optional guidance on when this workflow applies."
        },
        "phases": {
          "type": "array",
          "description": "Optional phase declarations matched by phase() calls.",
          "items": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
              "title": {
                "type": "string",
                "description": "The phase title phase() calls match by exact string."
              },
              "detail": {
                "type": "string",
                "description": "Optional one-line description of the phase."
              },
              "provider": {
                "type": "string",
                "description": "Optional provider override this phase is expected to use."
              },
              "model": {
                "type": "string",
                "description": "Optional model override this phase is expected to use."
              }
            },
            "required": [
              "title"
            ]
          }
        }
      },
      "required": [
        "name",
        "description"
      ]
    },
    "args": {
      "type": "object",
      "description": "Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).",
      "additionalProperties": true
    }
  },
  "required": [
    "script",
    "meta"
  ]
}

출처: packages/workflow/tool-workflow/src/index.ts

@deepseek-ai/dsh-tool-web

web_fetch

특정 HTTP(S) URL의 콘텐츠를 가져와 텍스트로 디코딩하여 반환합니다.

json
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The HTTP(S) URL to fetch."
    }
  },
  "required": [
    "url"
  ]
}

출처: packages/web/tool-web/src/index.ts

최신 정보를 웹에서 검색합니다. 선택적 요약 답변과 소스 URL 목록을 반환합니다.

json
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "The search query."
    }
  },
  "required": [
    "query"
  ]
}

출처: packages/web/tool-web/src/index.ts

web_search 및 web_fetch는 제공자 선택을 ctx.web 뒤에 유지하므로 백엔드를 교체해도 모델에 표시되는 스키마가 안정적으로 유지됩니다.