DSHarness 系统拆解 固定基线 47f943859b · 36 已复核 / 0 撰写中 / 36 章
English
工具系统·第 17 章

工具全集与能力分类

每一个模型可见工具的输入、输出、策略与 UI 意图

已复核上游 47f943859b范围: 从生成 catalog 与源码逐项枚举工具名、提供包、schema、并行模式、危险面和后端 seam。

结论:DeepSeek Harness 没有一张固定的“默认工具表”,只有可证明完整的工具包上界和由 composition 解出的运行时视图

固定基线上,上游生成目录覆盖 24 个 shipped tool package、52 个 schema 条目和 51 个唯一生成名称;唯一重名是一次性 shell 与持久 PTY 两种实现都注册为 bash。生成器还记录了未单独生成 schema heading 的 shipped 配置别名 subagent_fork,所以被目录代表的 distinct shipped names 是 52 个。这些名字绝不会默认同时出现:标准 Web 预设在 Linux/有 attachment service 的基线组合中是 25 个 root 工具,minimal 预设只有 2 个,Code/Cordis/自定义 preset、scope restriction、动态插件和子 Agent 身份还会继续改变集合。

可复现口径

本章的“全集”从生成目录的 package headings 与 tool headings 计数,并逐行核对 package map;“实际集合”则从 shipped preset 与 host service 条件重新求值。生成器对每个工具包启动独立真实 Context、读取 ctx.tools.schemas(),并用磁盘 glob 阻止漏列新工具包。TOOLCAT-GENERATEDTOOLCAT-GENERATOR

1. 三个不能混为一谈的集合

集合固定基线结论回答的问题不能推出什么
生成目录上界24 package sections;52 schema 条目;51 唯一生成名称;另记 1 个 shipped alias所有 shipped packages/*/tool-* 在选定配置下能贡献什么不表示一个 Agent 同时看见全部
Composition 集合preset + host services + platform + feature flags某一部署装载了哪些 definition不表示每个 scope 都有权看见
Request 集合scope view + restriction + native/code/both projection本次模型请求实际收到哪些 schema不表示调用一定获批或后端可用

还有第四个时间维度:definitions 是 live Cordis effects。排队后、真正 start 前的热装载/卸载可改变 visibility 或并行分类;因此审计必须保存 request header 与 durable call/result,不能只拿进程当前 catalog 反推历史。

2. 生成目录为何比静态 grep 更可信、又为何仍不是运行时真相

glob packages/*/tool-* → completeness guard
for each manifest entry:
  fresh Context → SystemPrompt → ToolRuntime → package-specific seams
  → mount plugin → ctx.tools.schemas(scope) → sort → dispose
render package map + name + description + JSON-Schema + source link
双重失败保护

Manifest 漏掉磁盘上的工具包会直接失败;已列工具包因缺 service 而 pending、最终一个 schema 都没注册也会失败。每个 package 独立 boot,避免前一个包的注册被错误归因到后一个包。TOOLCAT-GENERATOR

3. 完整 package/name 地图(24 包,51 个生成名称 + 1 个 shipped 配置别名)

能力族 / package模型可见名称主要 seam / 副作用
Human · tool-ask-userask_user_question等待 UI/provider 人类回答;call 在等待期间保持打开
Code transport · toolsrun_codeCode Mode 保留 transport;嵌套 subcall 重新进入完整 tool pipeline
Plan · plan-modeexit_plan_mode评审计划;批准后写 plan/mode inactive
One-shot shellbash / pwsh新进程、可选后台 job;平台二选一
Runtime self-modification · tool-cordiscordis_define, cordis_inspect_list, cordis_inspect_query, cordis_inspect_self, cordis_run, cordis_stop, cordis_undefine进程内定义、检查、启动和卸载动态 package;shipped tree 默认不装
Persistent shellbashowner-isolated PTY 状态;与 one-shot bash 同名但不是同一 definition
Standalone editorstr_replace_editorview/create/literal replace/insert over ctx.fs
Filesystemread, read_image, write, edit观察事件、写/edit intent、durable attachment;image 注册依赖 attachment service
Filesystem discoveryglob, grep固定 argv 调 packaged ripgrep;可把完整 capped 结果 spill
Terminalterminal_open, terminal_read, terminal_send, terminal_signal, terminal_list, terminal_close持久 PTY 生命周期;send 可注册 background job
Goalcreate_goal, get_goal, update_goalSession-owned durable goal/revision/round 状态与权限检查
Scheduleschedule_create, schedule_delete, schedule_list仅 opt-in live root scope;写 schedule/change
Language serverlsp稳定 schema,provider 不可用时结构化拒绝
Fixed iterationralph每轮创建 fresh structured child,前台执行固定 workflow
Skillskill读取可信 instruction catalog/body;可注入 replacement catalog
Session querysession_search, session_event_search, session_trace, session_event_trace, session_event_read显式授权的词法检索、lineage 与 exact event read;默认标准 preset 不装
Delegationsubagent(shipped alias subagent_forkprovider/name/background mode 都由配置决定;child 有独立 Session
Child controlsend_message, interrupt_agent, list_agentscontinuable child 的 follow-up/interrupt/list
Child return channelreport只注册到 continuable in-process child,向直接 parent 写 user-role message
Background jobsjob_list, job_output, job_kill统一控制 shell、PTY send 与 one-shot subagent jobs
Todotodo_writetodo/write;是否允许多个 in-progress 是必选部署配置
Programmable orchestrationworkflow受限 worker script 编排 Agent;script 本身无 fs/network/timer
Webweb_search, web_fetchprovider-neutral seam;search/fetch 是否存在由 composition 决定
逐包归因

上游 package map 同时记录每个包的 Requires、Writes/Affects、shipped aliases 与 deployment note;其后保留每个 tool 的精确 description、参数 JSON Schema 和生产源码链接。本表是完整索引,不复制 1,800 余行 schema。TOOLCAT-PACKAGE-MAP

4. 标准 Web root 的实际 25 个工具

来源名称数量
平台 shellLinux/macOS bash;Windows pwsh1
Filesystem + searchread, read_image, write, edit, glob, grep6
Jobs + skilljob_list, job_output, job_kill, skill4
Goal + plancreate_goal, get_goal, update_goal, exit_plan_mode4
Delegationsubagent, subagent_fork, send_message, interrupt_agent, list_agents5
Workflowworkflow, ralph2
Interaction/state/webask_user_question, todo_write, web_search3
总计25
条件已写入结论

标准 preset 明确平台 shell 二选一、装载 fs/search/jobs/skill/goal/plan、两个 delegation 名称、三项 control、workflow/Ralph/ask/todo,并把 fetch:false;host 基线装载 local attachment store,所以 read_image 注册。TOOLCAT-STANDARD-BASETOOLCAT-STANDARD-ORCHESTRATIONTOOLCAT-ATTACHMENT

exit_plan_mode 即使 planning inactive 仍留在 schema,以避免模式切换改变 tool catalog、破坏 request-cache prefix;执行时再拒绝不合法状态。Codex/Claude Code delegation rows 在该 preset 中明确 disabled,web_fetch 也不出现。

5. Minimal 预设不是 standard 的“少一点”,而是另一种完整产品假设

精确集合

Minimal 使用 complete persona,关闭 runtime context snapshot,不装 compaction,只暴露 persistent bashstr_replace_editor。它为 PTY 与 bare local filesystem 各自建立 isolated realm。TOOLCAT-MINIMAL

这解释了为什么“Harness 支持 51 个工具”和“这个 Agent 只有 2 个工具”可以同时为真。能力不是二进制产品清单,而是 profile/preset 给 Agent 的可组合语言。

6. 相同名称不等于相同语义:两个 bash

实现进程模型状态典型 composition
dsh-tool-bash每次调用新进程,经 ctx.shellcwd/env 由请求与 executor 决定;无 PTY 连续状态standard/base
dsh-tool-bash-persistent复用 owner-isolated PTY,经 ctx.terminalsshell 状态跨 calls 保留minimal

7. Filesystem 家族:发现、读取、变更与观察被拆开

工具动作关键策略展示意图
glob/greppackaged rg 的 fixed-argv 发现timeout/cap/spill;不经 shell,也不经 ctx.fssearch result groups
read有界 UTF-8 line window记录 present/absent version observationread card + locations
read_image有界 bytes → content-addressed attachment先验 extension/media/model route gatesdurable image block + metadata
write/editcreate/overwrite 与 literal replacement默认 observation policy 要求 unchanged version;sandbox 可升级审批diff intent + durable meta
str_replace_editor把 view/create/replace/insert 合成一 tool用于 minimal 的紧缩接口;依旧走 fs seamgeneric/diff

值得注意:glob/grep 语义上是只读,却没有 opt in 并行;读写语义与 scheduler 分类是两个独立维度。

8. Shell、Terminal 与 Job:执行能力与生命周期控制正交

bash/pwsh --run_in_background--> Job Registry <--terminal_send / one-shot subagent
                                        |
                           job_list / job_output / job_kill

terminal_open/read/send/signal/list/close → persistent PTY registry

Job 工具不是 shell 专属 API,而是跨 producer 的统一后台任务控制面。Terminal 六件套则显式暴露会话建立、I/O、signal 与 close,换取更强状态性;standard 没装它,minimal 甚至不暴露 terminal controls,只把 persistent PTY 包装成同名 bash

9. Plan、Goal、Todo 与 Ask:四种人机/协作状态,不是一张任务表

原语生命周期谁拥有真相工具动作
Plan modeAgent mode,跨 stepsplan/mode 事件 + reviewerexit_plan_mode 提交完整计划
GoalSession 多 round、可继续Goal service/projectioncreate/get/update
TodoSession 内最新 checklist projectiontodo/write整表 replacement write
Question单次 tool call 的 suspensionUserQuestion provider等待并返回回答

第 15 章分析它们的 durable semantics;本章只强调 tool surface 不应按名称相似度合并。

10. Delegation、Workflow 与 Ralph:三种不同的编排自由度

工具模型决定什么Runtime 固定什么结果通道
subagent*一次 child prompt、label、foreground/backgroundprovider、depth、background modetool result、job settlement 或 continuable child
workflow受限 JS 中的 fan-out/control flowworker isolation、agent bridge、并发/总量 cap前台聚合 result
ralphobjective 与可选 rounds每轮 fresh child 的固定迭代脚本前台最终 result

send_message/interrupt_agent/list_agents 管理 continuable child;report 反向存在于 child scope,而不是 root catalog。第 24–26 章继续追踪 Session、activation 与 inbox。

11. Web、LSP、Session Query 与 Skill:schema 稳定,provider 能力可以缺席

这些工具都把模型可见 contract 与后端 provider 分开:web_search/web_fetchctx.weblspctx.lsp,Session Query 走可关闭 FTS 的 ctx.sessionQuery,Skill 走 scope-layered catalog。Schema 可保持 prefix 稳定,但执行可能返回 unavailable/disabled;“模型看见工具”从来不等于“provider 必然成功”。

设计判断

这种稳定 surface 对 KV cache 和替换 provider 很友好;代价是 capability discovery 不能只看 schema。高质量 host 还应把 provider readiness、policy mode 与故障原因呈现在 UI/telemetry,而不是让模型用失败调用探测。

12. Cordis 工具集是刻意 opt-in 的“修改自身运行时”能力

七个 cordis_* 工具能定义、检查、运行、停止和取消定义动态 package。运行中的 package 可继续注册新的模型工具,直到 stop/undefine/restart;因此 51 名上界在启用它后天然不是闭包。

默认安全姿态

生成 package map 明确记载这套工具不在任何 shipped tree 中;缺少 dynamicCordisRunner 时根本不会激活。它不是“隐藏默认超能力”,而是 deployment 必须主动承担的真实 runtime-code trust boundary。TOOLCAT-PACKAGE-MAP

13. 并行分类:只有 8 个唯一名称/定义明确 opt in,其余全部 fail closed 为 exclusive

明确 parallel-safe理由在标准 root 中?
read, read_image只读;观察 race 由后续 mutation 的 in-lock version check 关闭;attachment content-addressed
web_search, web_fetchprovider read,不改 parent Agent state仅 search
session_trace, session_event_trace, session_event_read授权后的 exact/lineage reads否,query package opt-in
subagent definition(含配置别名)child 不改 parent Session;唯一 parent write 是同步可交换 task insertionsubagentsubagent_fork
Fail-closed classifier

仓库生产源码中排除 helper/generated/test 后只有上述 8 处 isConcurrencySafe: () => true。Registry 只有在 classifier 精确返回 true 时给 parallel;缺失、非法参数或 throw 都是 exclusive。glob/grep、goal reads、job list 等看似“读”的工具仍是 barrier。TOOLCAT-PARALLEL-OPTINSTOOL-SCHEMA-PROJECTION

14. “危险性”不是工具名上的一个布尔值

风险轴代表工具真正控制点
文件 mutationwrite/edit/editorfs intent、observed version、sandbox escalation、approval
任意进程bash/pwsh/terminalsandbox provider、shell policy、timeout、signal/job kill
外部数据流web/MCP/LSPprovider URL/credential/SSRF boundary、output retention
跨 Agentsubagent/control/workflowparent authority、depth/caps、workspace effects、continuation ownership
持久状态goal/todo/schedulesession/root authority、event validation、durability barrier
运行时代码run_code/cordis_*VM/worker surface、nested pipeline、opt-in composition

本表是 threat-model 分类,不是源码里的 risk score。Harness 的做法是把风险分散到 provider confinement、pre approval、monotonic guard、tool-specific event gate 与 execution owner;第 19、20、31 章分别验证这些边界。

15. 输入、输出与 UI 意图:目录只承诺模型 schema,执行 contract 还在 ToolDefinition

目录内容

生成器为每项输出 name、description、parameters JSON Schema 和 source;output schema、canonical value、timeout/concurrency metadata、presenters 与 finalizer 不在生成目录页面内。必须把第 16 章 ToolDefinition 分析和本章 package map 合看。TOOLCAT-GENERATORTOOL-DEFINITION

UI 也不按 tool name 硬编码全部卡片。工具返回 provider-neutral generic/terminal/diff/search/read/web render intent;Host 用当前 scope definition 配对 call/result,配对缺失或 presenter throw 时保留原 event 并退回 generic card。TOOL-PRESENTATION-INTENTSTOOL-HOST-PRESENTER

16. 可用性矩阵:注册、可见、可调度、获批、后端就绪是五道门

package mounted?
  → required service satisfied and tool registered?
    → current Agent scope can see it?
      → presentation mode exposes native name or Code SDK?
        → pre-policy + approval + guards allow this call?
          → provider/runtime is ready and body succeeds?

任何一层为否,都可能表现为“没有 schema”“UNKNOWN_TOOL”“需要审批”“provider unavailable”或普通 error result。把它们都叫“权限问题”会让诊断走错层。

17. 已确认的文档/组合漂移与审计陷阱

陷阱正确读法
把生成 catalog 当 standard 默认它是逐包 isolated boot 的上界,standard 要从 preset 重算
按“只读”猜 parallel只有显式 classifier true 才 parallel;其余 exclusive
按 tool name 推断实现bash 有两套 shipped definition;subagent name 也可配置
schema 存在即 provider readyLSP/Web/Query 等可用稳定 schema + execution-time unavailable
用当前 presenter 还原历史 UIHost 确实 live-read 当前 definition;旧 call 跨页时会 generic fallback
认为 Code Mode 删除能力它改变 wire entrance;SDK 中仍保留 end capabilities,subcall 重进 pipeline

18. 设计评价与验证状态

选择收益代价
工具包与 provider seam 分离稳定 schema 可替换后端schema 无法表达 readiness
生成 catalog 通过真实 boot 收集能捕获动态 schema、配置名称与注入条件仍只代表 generator 选择的配置分支
Preset 决定能力语言同一 runtime 支持 2-tool minimal 到 full agent“默认工具数”必须附带 surface/platform/service 条件
并发显式 opt in未知第三方工具默认安全串行纯读工具漏声明会损失吞吐
Provider-neutral presentationWeb/CLI 可共享语义且 replay 有 fallback热更 presenter 可能改变旧事件的当前展示
本章验证范围

本章逐项核对了生成 tool catalog、generator completeness/boot 逻辑、全部 24 package map rows、standard/minimal shipped presets、attachment condition、全仓生产 isConcurrencySafe 声明与 ToolRuntime classifier。计数来自固定基线文本的可复现 heading 统计。上游依赖未安装,因此不声称本机执行了 generator 或 upstream tests;站点自身构建与一致性检查会在提交前运行。

我的学习体会

内容仅自动保存到当前浏览器,不上传、不进入仓库。你可以导出 Markdown 自行归档。