Skip to content
My Blog
Go back

第 01 课 · 跑起来:三种运行形态与观察窗口

前置:无 | 预计时长:45–60 分钟 | 动手环节:必须完成(不需要 API Key)

你将学会

问题引入

先别管架构图。假设你拿到这个仓库,第一个问题一定是:这东西怎么跑?跑起来之后,状态存在哪? 这一课不读源码,只做三件事:跑起来、看配置、找日志。后面的每一课都会反复用到这些观察窗口。

正文

1.1 一个二进制入口:dsh

dsh 是仓库唯一被支持的 Node 应用启动器(apps/cli/README.md)。SDK、ACP 都不是独立的可执行文件,而是 profile:

命令形态用途
dsh web(即 --profile web本地 Web UI默认 http://127.0.0.1:3080,日常交互
dsh --profile headless "任务"一次性任务新建一个持久会话、打印最终回答、退出
dsh --profile sdkstdio JSON-RPC 服务给 TS/Python SDK 客户端用
dsh --profile sdk-minimal最小 agent 树SDK 的独立最小示例
dsh --profile acpstdio ACP 服务给自动化客户端用

五个内置 profile 都遵循同一个模板:dsh-base + 一个应用层(见第 07 课)。源码运行:

pnpm install
pnpm run build     # 准备仓库产物
pnpm dsh web       # 用已构建产物启动,不重新构建

1.2 profile:你自己的配置目录

首次启动任一内置 profile 时,dsh 会在 $DSH_HOME/profiles/<name>/ 自动初始化目录。目录里有:

dsh plugin --profile <name> <pnpm args> 用于在 profile 目录里管理插件依赖。当前工作目录默认是 workspace 根。

1.3 观察窗口一:组合树(不启动就能看)

pnpm dsh --dump-default-config   # 内置默认组合
pnpm dsh --dump-config           # 实际将要生效的组合(含你 profile 的补丁)

输出是逐层叠加后的插件条目树:每一条插件(有 id、配置、来自哪个补丁层)。它是后续课程里验证「我的补丁生效了吗」的标准手段——不需要启动、不需要 key。

1.4 观察窗口二:会话日志(状态存在哪)

dsh 的会话是事件溯源日志(第 05、06 课详解):每个会话对应一个追加文件(默认 JSONL,可切换 SQLite),位于存储根目录下。你现在不需要理解格式,只需要知道:

1.5 观察窗口三:无 key 回放(最重要的开发闭环)

pnpm run test:snapshot            # 全量回放
pnpm run test:snapshot -t <>   # 按名字过滤

快照测试用录制的会话回放完整流程:启动真实子进程路径,但不调真实 API,所以没有 DEEPSEEK_API_KEY 也能跑。这是后面所有课程的「实验台」:想看某条行为,先找有没有对应快照;改了代码,跑快照看行为差异。

动手环节

  1. 在仓库根执行 pnpm install && pnpm run build(首次约几分钟)。
  2. pnpm dsh --dump-default-config,在输出里找到 dsh-base 补丁插入的行,数一数默认装了多少条插件。
  3. 打开 packages/bundle/base/cordis.patch.yml,对照上一步输出:这份补丁是不是「对空根的一次大规模 insert」?
  4. pnpm run test:snapshot -t <任意一个你猜得到的名字> 跑不通就先跑全量(慢),挑一个通过的用例名记住,后面课程会复用。
  5. (可选,需要 key)pnpm dsh --profile headless "说一句话证明你在工作",然后到 $DSH_HOME/profiles/headless/ 同级的存储目录里找到刚生成的会话文件,用文本编辑器打开看前几行。

自检清单

常见误解

延伸阅读


Share this post:

Previous Post
把 CI 构建从 90 秒降到 12 秒
Next Post
第 02 课 · 一切皆插件:Cordis 骨架二十分钟