description: "面向开发者与维护者的 shell 执行器 seam 说明,用于选择、组合或实现基于 ctx.shell 的命令执行。"
English | 中文
使用 ctx.shell 运行输出有界的前台 shell 命令,或异步准备后台进程后取得句柄。配置文件可选择本地或沙箱化的 Bash 或 PowerShell 执行方式,而无需更改调用方。执行前解析每个请求,以显式确定工作目录、超时和输出上限。命令完成、非零退出、超时和调用方中止都会作为结果返回;只有基础设施故障才会 reject,而模型可见的渲染与沙箱指引由 bash 和 pwsh 工具负责。
当 agent(智能体)或进程内插件需要运行 shell 命令并读取输出,或启动后台进程并轮询它时,使用 ctx.shell。它是每个 shell 执行器与面向模型的 bash/pwsh 工具共同依赖的约定,因此基于它编写的代码可以运行在任意执行器实现之上。
用已解析的 spec 调用 run 即可在前台执行命令。promise 在命令结束时 resolve:非零退出、执行器超时终止或调用方中止终止都是结果,绝不是 rejection。run 只在基础设施失败时 reject,例如工作目录不可用或缺少 shell。结果携带退出码或信号、是超时还是中止截断了运行,以及收集到的 stdout/stderr;流超出预算时还附带 spill 文件路径。
const result = await ctx.shell.run(ctx.shell.resolve({ command: 'ls -la' }))
console.log(result.exitCode, result.stdout.text)
用已解析的 spec 等待 start 即可启动后台进程;它在准备完成后发布句柄,不应用后台执行超时。取消或准备失败会在发布前拒绝调用。用 readOutput() 增量读取输出——连续读取绝不会重复交付,有损读取会指向完整流的 spill 文件。用 kill() 终止由提供方管理的进程范围(直接命令结束后返回 false),并等待 done 完成直接命令结算。job id、所有权、轮询与通知属于通用 ctx.jobs 运行时,工具层会把句柄注册进去。
每次执行都从带可选字段的 ShellExecRequest 开始;执行器的 resolve() 在任何东西运行之前,把它变成默认值与上限都已显式填好的 ShellExecSpec。这一请求/spec 拆分正是仓库在包边界显式解析的模板:调用方绝不依赖 run 或 start 内部隐藏的默认值。resolve() 从执行器配置填充工作目录与超时、对每次调用的覆盖值设上限,并按原样携带可选输入——stdin、普通 env 与受信任的 DSH_* 快照。
seam 本身不是执行器:每个组合只挂载一个提供方,工具即可不加改动地工作。在 POSIX 上,dsh-bash-local 以全新的 bash -c 进程运行命令,dsh-bash-sandbox 则通过沙箱能力限制每条命令;在 Windows 上,对应实现是 dsh-pwsh-local 与 dsh-pwsh-sandbox。bash 与 pwsh 工具只在挂载沙箱执行器时公布升权字段。最小的组合只需执行器本身:
- id: bash
name: '@deepseek-ai/dsh-bash-local'
config:
cwd: /path/to/workspace
工具结果以机器可读的退出标记结尾——[exit code: N] 或 [killed by signal: X]——模型因此总能知道命令如何结束。seam 拥有该标记格式,以及把渲染结果拆回输出正文与结构化退出状态的 parseExitStatus 辅助函数,使 bash 与 pwsh 两个工具永远不会在此漂移。
当 seam 约定不够用时阅读以下页面。它们从共享子系统参考逐步进入具体执行器与面向模型的工具。
bash -c 进程、预算与 deadline。bash 工具。通过 dsh-tool-bash 间接影响;该工具会将执行器输出与沙箱事实转为指引和保留的工具结果 token。
不会直接导致 KV Cache 失效;请求前缀的任何变更由具名消费方负责。
这些限制说明该 seam 不提供什么。它们是当前包约束,不是路线图。
stdin 只在 spawn 时写入一次并关闭;seam 没有向运行中任务继续输入的通道,也没有 PTY 会话概念。