DSH-SUPERAGENT 架构深度解读白皮书
CHAPTER 03 · PRACTICAL DEPLOYMENT & OPERATIONS GUIDE

工程可用性评估与实操指南:现在能用吗?应该怎么用?

全面评估当前开源仓库的工程完备度、外部依赖条件与安全隔离要求,提供从环境准备、账号包装器(CLI Shims)配置、Web 面板与 Management API 调优,到安全渐进式投产(Off → Observe → Auto)的完整落地指南。

现状评估:这个项目现在可以直接用吗?

明确结论:代码本身完整可编译、可运行,但它是 DeepSeek Harness (DSH) 的宿主插件,而非独立 CLI 二进制

1. 源码完备度极高:本仓库绝非“空壳 Demo”或“伪代码”,它包含了完整的 SQLite 状态机(Schema v11)、全套 React 18 监管面板前端、GitHub 与飞书双源轮询/事件实现、完善的退避重试队列,以及多达 52 个单元测试与集成测试文件(tests/*.spec.ts)。
2. 核心运行前提:它是一个打包为 DeepSeek Harness Bundle 的插件(package.json 中声明 "engines": { "dsh": "^0.2.1-alpha.2" },安装指南使用 @deepseek-ai/dsh@0.2.1-rc.3)。这意味着你必须能够安装并运行 DeepSeek Harness (`dsh`) 宿主环境并配置好大模型 Provider,才能启动本系统。

运行环境与账号硬性前置条件清单

类别 具体要求与版本约束 为什么必须满足(底层机制原因)
基础运行环境 • OS:macOS 或 Linux(依赖 POSIX Shell 与 tmux)
• Node.js:^22.19.0 || >=24.0.0
• 包管理器与工具:pnpm (v11+), git >= 2.32, tmux, python3 >= 3.8
git 2.32+ 是为了支持 worker-gitconfig 中的特定凭证辅助配置;tmux 用于承载后台守护会话 dsh-superagent。
宿主框架与模型 • DeepSeek Harness:@deepseek-ai/dsh(满足 ^0.2.1-alpha.2,推荐 0.2.1-rc.3)
• LLM Provider:在 DSH 中配置可用的模型服务商
提供底层的 Cordis 插件容器、Agent Session 管理、tool-bash/tool-fs/tool-jobs 工具链以及 Web UI 渲染插槽。
GitHub 专属账号与 CLI • GitHub CLI:gh >= 2.48
• 独立的 Agent GitHub 用户账号(拥有目标 github.com 仓库的 Write 权限)
严禁使用个人主账号,且不能用 GitHub App!因为系统需要通过 gh api notifications 读取账号的通知流(GitHub App 没有用户级 Notifications API),且所有评论/PR 均以该账号身份发出。
飞书机器人(可选) • Lark CLI:lark-cli(测试版本 1.0.90)
• 飞书自建应用:开启机器人能力,具备读取/发送群消息、读取群成员及订阅消息事件权限
必须配置为 strict-mode bot --global(纯 Bot 身份模式)。若 CLI 允许以普通用户身份行动,Setup 探针会直接拒绝启动以确保安全。

工程成熟度与直接上生产的注意事项

已经达到准生产级(Production-Grade)的部分 Ready
  • 崩溃恢复与幂等性:进程重启后自动对中断的 Assignment 注入恢复提示(要求先检查 git status / git log 与线上 PR 状态,避免重复执行外部副作用);Outbox 保证消息绝不重复发送。
  • 网络抖动自愈:针对 LLM 供应商或网络的 HTTP 408 / 429 / 5xx 及连接重置,内置最多 3 次指数退避自动重试(15s → 30s → 60s)。
  • 全链路可观测性:内置 HealthBoard 监控 13 项子系统健康指标,配合 Web Panel 可精确追溯每一条 Trigger 的过滤、评估、扇出与退回轨迹。
投入生产前必须自行加固的部分 Action Required
  • 操作系统级账号隔离:由于 Worker 运行在 danger-full-access 模式,在团队共享服务器上部署时,强烈建议为其创建专门的 Linux/macOS 系统低权限用户(如 useradd superagent),避免与个人开发机主账号混用。
  • 仓库本地克隆维护:系统默认通过 git worktree add 从本地基准仓库切出工单目录,需要确保磁盘空间充足且基准仓库未配置额外的个人凭证 Header。

这个东西应该怎么用?(两种标准部署与配置方式)

方式 A:极具特色的“Agent 引导式安装(Agent-Assisted Setup)”

因为配置涉及多个 CLI 包装脚本、DSH Profile 隔离、Management API 调用以及策略初始化,作者将“注意力最小化”哲学直接用在了安装流程上——编写了一份专门给 Coding Agent 阅读的 SETUP.md。你只需在当前仓库目录下对你的 AI 编程助手(如 DSH、Claude Code 或 Antigravity)发送一句话:

一键启动交互式向导 Prompt
Read SETUP.md in this repository and set up dsh-superagent with me.

你的 Coding Agent 会严格遵循 SETUP.md 的契约执行以下 5 步:

  1. 静默环境探测(Probe):自动在后台运行一行探测脚本检查 node, pnpm, git, tmux, python3, gh, dsh 版本及当前 GitHub 登录名,已满足的项绝不多问。
  2. 单步极简提问(最多 9 题):每次只问 1 个问题(每条消息控制在 300 词以内,并附带推荐默认值,你只需回复一个词即可确认),依次收集:监听源(仅 GitHub 还是含飞书)、目标仓库 owner/name、Agent 专用账号名、允许派单的白名单成员、本地基准克隆路径、Commit 署名作者、是否开启自动合并。
  3. 生成完整计划并等待一次确认:在真正动手前,汇总展示所有将创建的脚本、配置与默认值。
  4. 分离敏感操作与自动执行:绝不在聊天框索要密码或 Secret!需要人工扫码或输入 Token 的步骤会生成精确的终端命令让你在自己的终端执行;其余包装器创建、编译、服务启动与 HTTP API 配置保存全部由 Agent 自动完成。
  5. 自检与移交:确认 scripts/dsh-superagent status 返回退出码 0,配置每小时自愈巡检任务,并输出面板 URL 与第一条测试指令。

方式 B:五步手工标准部署流程(深入理解底层配置)

如果你希望完全掌控每一个工程细节,可以按照 docs/006-deployment.md 执行以下五个标准步骤:

Step 1:创建隔离的 CLI 账号包装器(Account Wrappers)

为了保证 Agent 只使用它自己的专用凭证,而不触碰你个人的 ~/.config/gh,需在 ~/.local/bin/ 下创建独立的包装脚本:

# 1. 配置 Agent 专用 GitHub CLI 包装器 (gh-agent)
mkdir -p ~/.local/bin
cat > ~/.local/bin/gh-agent <<'EOF'
#!/bin/sh
GH_CONFIG_DIR="$HOME/.config/gh-agent" exec gh "$@"
EOF
chmod +x ~/.local/bin/gh-agent

# 使用 Agent 的专用 GitHub 账号登录并验证
gh-agent auth login
gh-agent api user --jq .login

# 2. (可选) 若启用飞书,配置纯 Bot 模式的 lark-bot 包装器
LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config init --app-id <cli_xxx> --app-secret-stdin
LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent" lark-cli config strict-mode bot --global
cat > ~/.local/bin/lark-bot <<'EOF'
#!/bin/sh
export LARKSUITE_CLI_CONFIG_DIR="$HOME/.lark-cli-dsh-superagent"
exec lark-cli "$@"
EOF
chmod +x ~/.local/bin/lark-bot

Step 2:安装 DSH、编译仓库并创建独立的 superagent Profile

切记:必须将 dsh-superagent 安装在独立的 Profile(如 superagent)中,与你日常交互使用的默认 Profile 分开,因为该插件会改写进程级的 PATH(注入 worker-bin)与全局 Git 配置(注入 worker-gitconfig):

# 1. 安装指定版本的 DeepSeek Harness
npm install -g @deepseek-ai/dsh@0.2.1-rc.3

# 2. 在当前仓库安装依赖并执行类型检查、测试与构建
pnpm install && pnpm build

# 3. 从 Web 模板初始化名为 superagent 的独立 Profile (仅首次安装执行!)
dsh superagent --from-default-profile web --dump-config > /dev/null

# 4. 将当前仓库作为插件链接到 superagent Profile
dsh plugin --profile superagent add "link:$PWD"

Step 3:编写机器级配置 cordis.patch.yml 并启动守护进程

参考 examples/profile.cordis.patch.yml,编辑 ~/.dsh/profiles/superagent/cordis.patch.yml:

- id: webserver
  config:
    host: 127.0.0.1
    port: 3082
- id: dsh-superagent
  config:
    stateDir: /Users/yourname/.dsh/state/superagent
# 若需启用飞书源,取消以下两行注释:
# - id: dsh-superagent-feishu
#   disabled: false

随后使用内置的生命周期脚本启动服务:

scripts/dsh-superagent start
scripts/dsh-superagent status

Step 4:通过 Web 面板或 Management HTTP API 完成四大模块初始化

打开浏览器访问 http://127.0.0.1:3082,点击左侧边栏的 Superagent 进入管理面板(或直接通过带有 x-orchestrator-request: 1 请求头的本地 API 配置):

# 示例:通过 Management API 配置 GitHub Source、Policy 白名单与 Git Worktree Prepare 命令
api=http://127.0.0.1:3082/orchestrator/api

# 1. 设置 GitHub 监听仓库与专属 CLI
rev=$(curl -s -H 'x-orchestrator-request: 1' $api/settings | jq '.sources[] | select(.id == "github") | .revision')
curl -s -X PUT -H 'x-orchestrator-request: 1' -H 'content-type: application/json' $api/settings/source:github \
  -d "{\"value\": {\"enabled\": true, \"config\": {\"repository\": \"owner/repo\", \"cli\": \"$HOME/.local/bin/gh-agent\"}}, \"revision\": $rev}"

# 2. 配置 Executor 的 Git Worktree 自动准备命令 (每个工单自动拉取最新分支并切出独立工作树)
# Prepare 命令模板:
# git -C ~/src/repo fetch --no-tags "https://github.com/$DSH_SUPERAGENT_GITHUB_REPOSITORY.git" "${DSH_SUPERAGENT_GITHUB_PR_HEAD:-HEAD}:refs/dsh-superagent/$DSH_SUPERAGENT_TICKET" &&
# git -C ~/src/repo worktree add -b "agent/$DSH_SUPERAGENT_NAME" "$DSH_SUPERAGENT_DIR" "refs/dsh-superagent/$DSH_SUPERAGENT_TICKET"

Step 5:发起第一个任务验证闭环

使用白名单内的 GitHub 账号,在目标仓库新建一个 Issue 或在任意已有 Issue 下发表一条新评论(注意:直接编辑旧 Issue 的正文不会触发 GitHub 通知,必须发新评论):

@<agent-github-login> 请帮我检查并修复某模块中的拼写错误,并提交 PR。

在 1 分钟(默认轮询间隔)内,Web 面板的 Overview 和 Execution 标签页就会出现新创建的 Ticket,Agent 会在原评论下回复一句简短的接单确认,随后在 ~/.dsh/state/superagent/work/<worktree-name> 中静默完成代码修改、测试验证并提交 PR。

日常运维最佳实践:三阶段渐进式投产与健康监控

推荐的三阶段安全投产路线图(Progressive Rollout)

遵循 docs/000-philosophy.md 中“Start narrow, tune for less noise”的操作员责任准则,严禁在第一天就向全员开放主动模式。推荐按以下三步演进:

三阶段安全渐进式投产路线图 (Three-Stage Progressive Rollout Roadmap) Start Narrow → Observe Shadow Decisions → Autonomous Execution
01 单人显式受控期 (Day 1 - 3)
  • Allowed 白名单:仅添加操作员自己 1 个账号。
  • Accept Mode:保持默认 observe(或 off)。
  • Auto-merge:关闭(所有 PR 由人工审查合入)。
  • 阶段目标:在真实 Issue 中通过 @agent 显式指派任务,验证 Git Worktree 准备命令、测试执行与 PR 质量。
02 团队显式 + 主动影子期 (Week 1 - 2)
  • Allowed 白名单:扩展至核心研发小组成员,或绑定飞书群成员自动同步。
  • 开启全量观察开关:打开 GitHub 观察开关或飞书群“全部消息”,但保持 observe 模式。
  • 阶段目标:在 Web 面板 Eval 页审查标记为 would_accept 的影子决策记录,调优主动规则与团队 Prompt,做到零误报、零噪音。
03 全自治主动协同 (Steady State)
  • Accept Mode:正式切换为 auto(主动接单开启)。
  • 主动修复闭环:针对满足三元语义事实与启用规则的文案、局部样式或默认分支 CI 失败,自动静默提 PR。
  • 受控自动合入:可选配置独立 Merge CLI,对变更 < 200 行且人类 Reviewer 已 Approve 最新 Commit 的 PR 自动开启 Auto-merge。
图 3-1:从单人受控到全团队主动自治的三阶段渐进式落地路径

服务控制脚本(scripts/dsh-superagent)与 4 类退出码契约

运维脚本 scripts/dsh-superagent 提供了严密的进程管理(支持 start, stop, restart, status),其退出码专为外部自动化巡检(Watchdog)设计:

退出码 (Exit Code) 状态含义 重启能否解决? 运维人员 / 巡检 Agent 应对动作
Exit 0 服务运行完全正常,所有已 claims 的健康项均为 ready / starting / paused。 无需操作 保持静默,无需任何干预。
Exit 1 服务未运行、存在重复实例、HTTP 接口无响应,或核心 runtime 报错。 能(可尝试重启恢复) 执行 scripts/dsh-superagent --respect-stop restart(若存在人工 stop 标记则跳过)。
Exit 2 宿主运行正常,但某个外围组件(如 github 连续 3 次轮询失败、evals 超时未决、reply 发送连续失败)处于 error 状态。 不能(重启无效) 不要盲目重启!读取输出 JSON 中的 errors 字段或打开 Web 面板 Overview 查看具体故障原因(如网络断连、权限失效)。
Exit 3 服务正在运行,但正在等待初始设置(Setup Pending)或账号校验未通过。 不能(重启无效) 读取输出中的 setup 详情,前往 Web 面板 Settings → Sources / Deployment 补全仓库或 CLI 认证后点击 Check again。

二次开发指南:如何接入团队内部的自定义事件源(如 Jira / GitLab / Slack / 内部工单)?

得益于 src/sources/kind.ts 的 SourceKind 插件化协议与 docs/008-cookbook.md 的详尽规范,为系统新增一个事件源(例如名为 webhook 或 gitlab)无需修改 src/core 的任何一行代码,只需按以下 5 步实现一个独立模块:

Step 1 - 3:定义 Schema、事件转换与接收范围 Domain Mapping
  1. 声明配置表单(schema & fields):使用 Zod 定义配置结构,声明 fields 数组后,Web 面板会自动生成对应的图形化配置卡片,无需手写 React 代码。
  2. 实现幂等事件转换(Trigger Translation):使用 key('<kind>', nativeId) 生成稳定 ID,丢弃 Agent 自身发出的消息,将外部事件映射为包含 threads, actor, human, addressed, channel 的标准 Trigger。
  3. 实现纯函数范围判断(scope):仅根据 trigger.meta 和当前配置返回 { listened, observed, row },确保历史 Mandate 在重校验(Revalidate)时可随时复算。
Step 4 - 5:实现幂等 Channel、上下文读取与轮询循环 Adapter & Loop
  1. 幂等回复通道(channel.send):利用 message.id 作为幂等键调用外部 CLI/API 发送回复;成功返回 'sent',目标会话永久删除(如 HTTP 410/404)返回 'gone',其余错误直接抛出由 Outbox 自动指数退避重试。
  2. 挂载 Cordis 插件生命周期(apply(ctx)):在 ctx.effect 中注册 SourceKind 并启动带 AbortSignal 的轮询循环。注意必须先完成一批内所有 ctx.receive(trigger) 存储,最后再推进 KV 中的持久化游标(Cursor),从而保证任何时刻断电重启都绝不漏消息。