第 2 章 安装运行与 Profile 组装
2.1 获取 dsh
dsh 是 TypeScript 生态的项目,用 pnpm 管理:
前置条件(Node.js、pnpm 版本等)见仓库 docs/development.zh.md 的 Setup 一节。学习教程不需要 API 密钥。
2.2 应用启动器:一切从 dsh CLI 开始
所有受支持的 Node 应用都从统一的 dsh CLI 与具名 profile 启动:
| 命令 | 说明 |
|---|---|
dsh web(= --profile web) | 带 Web 浏览器界面的完整应用 |
dsh --profile headless | 无服务器的一次性运行器 |
dsh --profile sdk | SDK JSON-RPC 服务器(TypeScript SDK 使用) |
dsh --profile sdk-minimal | 最小显式 SDK 组合 |
dsh --profile acp | 仅用于自动化的 ACP(stdio)服务器 |
Python SDK 遵循相同架构:其运行时 wheel 打包了普通 dsh CLI,客户端默认以显式 Harness home 启动 dsh --profile sdk。
2.3 Profile 与组合包(Bundle)
运行中的 dsh 是一棵插件树,由启动时按序叠加的各层组合而成:
Profile(具名组装):存放在 Harness home(
$DSH_HOME)中。它列出自己叠放的组合包、存放树外插件,并保存用户自己的cordis.patch.yml。web、headless、sdk、sdk-minimal、acp作为模板随发行版交付。组合包(Bundle):Cordis 配置项及其挂载代码的分发格式。两者都在
package.json中通过dsh字段声明:dsh.profile列出组合包,dsh.bundle指向 patch 文件。
组合包是分层叠加的:
| 组合包 | 增加的内容 |
|---|---|
dsh-base | 共享第一层:模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测 |
dsh-web-app | 浏览器应用 |
dsh-headless | 无服务器一次性运行器 |
dsh-sdk-app | SDK JSON-RPC 服务器 |
dsh-acp-app | ACP 服务器 |
dsh-sdk-minimal | 例外:完整显式 SDK 配置树,不应用 dsh-base |
配置层叠顺序
各层依次应用在空条目列表之上:
按 profile 列出的顺序,逐个应用组合包;
profile 自己的
cordis.patch.yml;home 级的那份
cordis.patch.yml;任意
--patchoverlay。
一条 patch 按 id 定位某个配置条目并替换其整个 config,或插入新条目。
热重载行为:自定义 profile 默认实时重载 patch;随附的 web profile 支持实时重载;headless、sdk、sdk-minimal、acp 只在启动时应用一次所有配置层——因为一次性/stdio 应用开始工作后再替换依赖会破坏生命周期。
查看你的配置树
它打印出的任何条目,都可以由你自己的 patch 替换——这是理解"哪个插件在跑"的最直接手段。
2.4 Harness home 与桌面应用
$DSH_HOME是 profile、会话数据等产品数据的家目录。Electron 桌面应用持有保留的
$DSH_HOME/profiles/desktopnpm 项目:每个签名发行版绑定一个确切的 dsh 版本并携带离线 seed,启动时用内置 pnpm 安装进可写 profile。CLI profile 与 Desktop 共享$DSH_HOME下的产品数据,但绝不共享可执行包、插件激活、lockfile 或node_modules。桌面组合不开放 Web server 或 loopback 端口,RPC 走带版本的分帧字节管道,渲染进程经安全的
dsh-app://协议访问资源。
2.5 核心包地图
以下是向 Cordis 树贡献内容的部分核心包(详情见官方子系统页面):
| 包 | 职责 | ctx 键 |
|---|---|---|
core/session | 仅追加的 SessionEvent 日志和内存存储 | ctx.sessions |
core/system-prompt | 提示词片段与工具 schema 的组装 | ctx.systemPrompt |
core/tools | 作用域化的工具注册表和带把关的执行流水线 | ctx.tools |
core/agent | Agent 接口、活跃 agent 注册表和 agent/* 事件 | ctx.agents |
core/agent-loop | 实现该接口的默认驱动器 | ctx.agentLoop |
core/scope | 按 agent 划分作用域的注册原语库 | 无 ctx 键 |
llm/llm | 消息与流式词汇表、适配器 seam | ctx.llm |
webhook/webhook | 已认证 delivery 的分派与 Workspace Session 创建 | ctx.webhookRuntime |
2.6 学习者的第一条命令
对初学者最有用的一条命令:
它会打印完整的插件配置树。看懂这棵树,就看懂了 dsh 是如何被"组装"出来的;而下一章开始的 Cordis 教程会教你读懂(并编写)这些配置项。
依据官方文档 Architecture → Profile 与组合包 整理。