{ "initial": [ { "name": "pwsh", "description": "Execute a PowerShell command (`pwsh -Command`) and return its stdout/stderr. Each call runs in a fresh pwsh process: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Paths use native Windows form (`C:\\...`); read environment variables with `$env:NAME`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$env:DSH_*` variables; inspect them when needed. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. On Windows a force-killed command settles as `[exit code: 1]` without a signal marker — treat it as an interruption, not a command failure. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.", "parameters": { "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" ] } }, { "name": "job_kill", "description": "Request cancellation of a running background job by job id. Returns immediately; the task settles as killed once its work actually stops.", "parameters": { "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 task." } }, "required": [ "job_id" ] } }, { "name": "job_list", "description": "List your background jobs (running and finished) with their ids, kinds, and statuses.", "parameters": { "type": "object", "properties": {} } }, { "name": "job_output", "description": "Read a background job. Stream tasks return only output since the previous read; final-output tasks return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.", "parameters": { "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 task reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the task 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" ] } } ], "changes": [] }