深色模式
扩展方向
mini-harness 是起点不是终点。这一章给出 8 个方向,每个都标注了"真实 dsh 怎么做"与"你可以怎么改"。
方向一:持久化会话日志
现状:日志只在内存,重启即失。dsh 的做法:session-persistence-jsonl 插件监听 session/event 追加写盘(原理篇 7.5)。
动手:写一个插件监听 session/event,把事件 append 到 data/<sessionId>.jsonl;启动时读取重建 Session。观察点:你不需要改 Session 一行代码——持久化是日志的消费者。
方向二:作用域(isolate)与 agent preset
现状:工具全局注册。dsh 的做法:isolate 作用域 + agent preset 给每个 agent 独立能力集(原理篇 3.6)。
动手:给 Context 加 isolate(name),服务查找沿作用域链;给 AgentRegistry.create 加 setup 回调,在 agent 作用域里注册专属工具。这是从"教学版"迈向"真实版"最关键的一步。
方向三:审批面(ask 的真实现)
现状:tools/pre-execute 的 ask 降级为 deny。dsh 的做法:user-approval 插件挂起执行、通过事件把问题推给 UI、用户答复后恢复。
动手:管线返回 ask 时 emit 一个 approval/requested 事件(带 callId),SSE 转发给前端弹确认框,用户点击后把决策写回。你会复刻 dsh 权限系统的最小闭环。
方向四:流式取消与超时
现状:cancel 只 abort 当前 turn。dsh 的做法:工具级超时(timeoutMs)、请求级看门狗(源码拆解 5.4)。
动手:在 tools/execute 瀑布里包一层超时(AbortSignal.any + 定时器),超时结果作为 isError 返回模型。注意 signal 合并的写法,与 openai-compat 适配器里的用法一致。
方向五:把你的插件做成可安装的 bundle
现状:插件以源码文件存在。dsh 的做法:bundle = 声明 dsh.bundle.patch 的 npm 包,dsh plugin --profile <name> add <pkg> 安装(原理篇 8.1)。
动手:把 mock 适配器 + echo 工具打成一个 npm 包,发布后任何机器 npx @deepseek-ai/dsh --profile headless --patch your-patch.yml 即可用——你写过的 Demo 8 的完整商业版。
方向六:前端插件化
现状:React SPA,UI 组件写死。dsh 的做法:host 注入 window.__DSH_BOOT__,浏览器侧插件树渲染一切,包括 Chat node 与工具卡片(源码拆解 01.4 与第六步的对照图)。
动手:定义 ToolCardPlugin 接口(match + render),前端从 GET /api/plugins 拉取清单动态注册渲染器。新增工具卡片从此不用改前端主仓库。
方向七:fork 与 subagent
现状:Session.fork 已实现但没被使用。dsh 的做法:subagent = fork 会话 + 新 agent + 委派工具(原理篇 7.4)。
动手:实现 subagent 工具:fork 当前会话、创建子 agent(parentSession 血缘)、驱动它完成子任务、把最终文本作为工具结果返回父会话。这是通往"多 agent 编排"的入口。
方向八:回到真实 dsh
最终极的扩展:把你在 mini-harness 学会的一切带回真实 dsh。 你会发现:Demo 5–8的 overlay、patch、插件写法原封不动地适用于真实产品;而 --dump-config、agent/pre-step、tools/post-execute 这些名词不再陌生。
text
你的学习闭环:
原理篇(为什么)→ 源码拆解(是什么)→ Demo(怎么用)→ mini-harness(怎么实现)
→ 真实 dsh(用得更好 / 贡献插件)毕业设计选题建议
- 给 mini-harness 加一个 web 搜索工具(方向四 + 五的组合:工具 + 超时 + 审批);
- 实现 subagent 委派(方向七),让主 agent 能"派活"给子 agent;
- 把 mini-harness 的 UI 换成 Chat node 注册制(方向六),并写一个
diff卡片插件; - 复刻 dsh 的 profile/patch 机制:把
bootstrap()改造成"读 yml 组装"(方向五的逆向工程)。