扩展实战:编写第一个插件
系列收尾篇。先给出四种扩展姿势的选型表与树外插件的完整生命周期,然后三次实操:用 cordis.patch.yml 关掉内置行为、写一个最小工具插件、简述 LLM 适配器与 Conversation 节点,最后回到"一切皆插件"的主题。
系列收尾篇。先给出四种扩展姿势的选型表与树外插件的完整生命周期,然后三次实操:用 cordis.patch.yml 关掉内置行为、写一个最小工具插件、简述 LLM 适配器与 Conversation 节点,最后回到"一切皆插件"的主题。
会话状态活在 Host 进程的 Cordis 树里,UI 活在浏览器的 React 树里。本篇解析 dsh 的 host/client 六层所有权、Web 服务端的路由与信任围栏、会话跟踪的分数 seq 与结算暂存,以及桌面壳为什么只是一个薄壳。
解析 dsh 的能力 seam 体系:服务定义、提供方、消费方三角色如何一并设计;fs/shell/sandbox/subprocess 如何共享同一个执行世界;subagent 的六提供方接口,以及 MCP 与 skills 的两种接入方式。
解析 dsh 的 LLM 适配层:可合并扩展的消息与流式词汇表、绑定一代注册的适配器接口、四阶段请求生命周期与三种结局、策略层重试,以及 DeepSeek 官方协议的私有扩展。
一次工具调用要穿过一条十步流水线:预执行把关、审批、单调守卫、执行、后执行结算与物化。本篇逐段拆开 packages/core/tools 的流水线,讲清并发调度、结果防伪造与失败配对补全三个设计。
系统提示词不是请求上的一个字段,而是会话日志里的一组 surface 节点。本篇讲清提示词片段如何组装与渲染,以及 SystemPromptProjection 的准入决策树如何让模型历史与提示词变更保持一致。
事件就是扩展点。本篇给出 dsh 的四张事件分类表,讲清 waterfall 的 next() 委托机制与默认决策,剖析 agent/turn-stopping 的串行 data decides 设计,最后给一张选型决策树。
精读 dsh 默认驱动器 ReactLoopAgent:Phase 三态、turn/step 嵌套状态机、claim 领取语义、取消提交语义与失败步骤的配对补全。
第 5 篇的会话日志活在内存里,本篇看它如何穿越进程存活:磁盘布局与单写者租约、代际选择与"永不返回撕裂尾部"的读契约、相邻迁移链的编译时验证、隔离 worker 全量校验的排他发布,以及崩溃恢复中持久化层与 agent 层的职责划分。
离开内核进入运行时状态。本篇拆解 dsh 的会话事件日志:为什么它是唯一事实源,SessionEvent 的连续性契约与四类事件,append 的写入路径与持久性屏障,以及 deriveMessages 与会话投影如何"从日志派生一切视图"。
前三篇讲完启动链路与 profile 组装,本篇下钻到底层插件框架 Cordis:Context 的作用域原语、插件的三种形态、Service 的注册即副作用规约、五种事件分发模式,以及撑起这一切的 Fiber 状态机。
沿 npx dsh web 的调用链逐站拆解:bin 入口与 argv 解析、runProfile 组装补丁层、boot 驱动 Loader 挂载插件树、启动审计与两层就绪信号,以及配置 HMR 的监视、比对与事务化重载。
一页地图读懂 dsh monorepo 的 54 个包组与 319 个包;讲清 profile 与组合包(bundle)两个组装概念、补丁层的叠加顺序、applyEntryPatches 的两条替换规则,以及 dsh --dump-config 的逐层溯源能力。
专栏开篇。解释什么是 Agent Harness(模型之外的运行时脚手架),为什么 DeepSeek Harness 选择"一切皆插件"架构,它与 Claude Code、OpenAI Agents SDK 的定位差异,以及全系列 14 篇的路线图。