dsh-kimi-webbridge 工程文档

August 14, 2026 · View on GitHub

面向 DeepSeek Harness(dsh)的第三方插件 bundle:通过 Kimi WebBridge 本地守护进程把用户真实浏览器(含登录态)开放为 15 个原生 kimi_webbridge_* 工具。 适用版本:dsh v0.1.0-rc.6(已实测);WebBridge 守护进程(Windows 实测)。

1. 项目概述

包名dsh-kimi-webbridge
形态Cordis 插件 bundle(dsh.bundle.patch
运行时纯 Node ESM,Node ≥ 18,无构建步骤
依赖零依赖:@deepseek-ai/dsh-tools 运行时经 healed closure 由 dsh 安装解析(声明 peerDependencies 会诱导 pnpm 从 registry 装副本并遮蔽 closure,故不声明)
对外能力15 个 kimi_webbridge_* 工具(见 docs/api-reference.md
不改动deepseek-harness 安装文件、$DSH_HOME 配置(零文件系统访问)

2. 目录结构

DSHKimiWebBridge/
├── package.json          # bundle 清单:dsh.bundle.patch → cordis.patch.yml
├── cordis.patch.yml      # 组合层:插入 {id: kimi-webbridge} 行及默认配置
├── index.js              # 插件模块:name/inject/apply + 15 工具注册 + HTTP 客户端
├── tests/
│   ├── smoke.mjs         # 冒烟测试:真实 dsh-tools 链接 + 离线校验 + 在线端到端
│   └── stub/@deepseek-ai/dsh-tools/   # 离线兜底桩(无 dsh 环境时使用,非发布物)
├── docs/                 # 本文档集
├── README.md / README.zh-CN.md
└── LICENSE / .gitignore  # node_modules/ 与 *.log 忽略

node_modules/ 仅由 tests/smoke.mjs 在运行期创建(指向真实 dsh-tools 的 junction),不提交、不参与运行时解析。

3. 架构与数据流

┌─ deepseek-harness 进程 ─────────────────────────────────────────┐
│  cordis.yml 组合 → loader 解析行 {id: kimi-webbridge}            │
│       │ Node ESM 解析包名 → index.js                              │
│       ▼                                                          │
│  apply(ctx, config)  (inject: ['tools'] 等待服务就绪)            │
│       │ ctx.tools.register(defineTool(def)) × 15                 │
│       ▼                                                          │
│  工具注册表 → system-prompt 组装 schema 注入模型请求              │
│       │                                                          │
│  模型调用工具 → validateArgs(INVALID_ARGS 拒绝)→ execute        │
│       │ exec.signal(取消)+ requestTimeoutMs 超时                │
│       ▼                                                          │
│  POST {baseUrl}/command  {action, args, session}                 │
└───────┬──────────────────────────────────────────────────────────┘
        ▼ 127.0.0.1:10086
┌─ Kimi WebBridge 守护进程 ────────────────────────────────────────┐
│  响应 {ok:true, data} | {ok:false, error:{code,message}}         │
└───────┬──────────────────────────────────────────────────────────┘
        ▼ chrome.debugger 扩展
┌─ 用户真实浏览器(含登录态)───────────────────────────────────────┘

失败路径:

  • 守护进程不可达 → fetch failed → 报错信息附带 kimi_webbridge_start_daemon 提示与帮助 URL;
  • 超时(仅 screenshot / save_as_pdf)→ 自动重试 1 次(新标签首次截图可能卡顿,重试即秒回);
  • 守护进程返回 ok:false → 原样透传 error.message

4. 模块设计(index.js)

职责说明
DEFAULT_CONFIG / normalizeConfig配置默认值与校验非法配置抛带操作指引的错误,符合 harness "配置错误即可操作化" 约定
daemonBinPath守护进程二进制路径Windows %USERPROFILE%\.kimi-webbridge\bin\kimi-webbridge.exe;POSIX ~/.kimi-webbridge/bin/kimi-webbridgedaemonBin 可覆盖
withAbort信号合成exec.signal + requestTimeoutMs 超时 → 单一 AbortSignal;timedOut() 区分超时与取消
requestDaemonHTTP 单次请求解析 {ok,data}/{ok:false,error} 信封;网络错误分类(timeout / unreachable / 非法响应)
callDaemon带重试的请求retryOnTimeout:true 时超时后 sleep 1.5 s 重试 1 次(幂等捕获类工具专用)
cleanArgs参数清洗丢弃 undefined,避免把未传可选参数序列化成显式 null
renderJson渲染[{type:'text', text}],超 maxRenderText 截断
obj/req/optschema 助手req/opt 仅在提供描述时附加 description(见 docs/solutions.md #2)
exec通用 execute 工厂大部分工具共用;参数与 daemon action 一一对应
工具注册15 个 defineTool 调用参数即 daemon 参数名(group_titlenewTabpaper_format…);输出 schema 与实测信封逐键对齐
kimi_webbridge_start_daemon特殊实现spawn 二进制(detached+unref)→ 20 s 轮询就绪 → {started};不走 /command
kimi_webbridge_evaluate特殊实现value ?? null 归一化(见 docs/solutions.md #7)

5. 生命周期

  1. 安装dsh plugin --profile <p> add ./DSHKimiWebBridge(pnpm 在 profile 目录运行,成功后 reconcilePlugins 按"是否声明 dsh.bundle"把包加入层栈)。替代路径:--patch overlay / 手动合并 $DSH_HOME patch(见 README.zh-CN.md)。
  2. 加载:loader 组合各层 → 解析行 → ESM 解析包名(peer 依赖经 $DSH_HOME/profiles/node_modules 的 healed closure 解析到 dsh 安装内副本)。
  3. 注册apply(ctx, config)inject:['tools'] 就绪后执行;defineTool 编译并校验 schema(编译期失败会中止加载并给出 UNSUPPORTED_SCHEMA 明细)。
  4. 调用:模型按注入的 schema 调用;注册表先 validateArgs 再执行;execute 返回 canonical 值经输出 schema 校验后进入会话。
  5. 卸载dsh plugin --profile <p> remove dsh-kimi-webbridge → 依赖移除 → 层栈摘除 → 工具随插件上下文 dispose 注销。模板 bundle 永不被触碰。

6. 配置键(行 config:

默认说明
baseUrlhttp://127.0.0.1:10086守护进程端点
sessiondshWebBridge 侧标签分组名;一个 profile 一个名字
requestTimeoutMs120000单请求超时(截图/导航可能较慢)
startDaemonTooltrue是否暴露 kimi_webbridge_start_daemon
daemonBinnull覆盖守护进程二进制路径
maxRenderText50000渲染文本上限(对齐 dsh spill 默认)

覆盖方式:profile patch / --patch overlay 按 id kimi-webbridge 整行重写。

7. 开发与验证工作流

# 1. 静态检查
node --check index.js

# 2. 冒烟测试(自动链接真实 dsh-tools,回退 tests/stub)
node tests/smoke.mjs
#   part 0  链接真实 @deepseek-ai/dsh-tools(healed closure → npm 全局 dsh)
#   part 1  15 工具注册 / 配置校验 / start_daemon 语义
#   part 1e 真实 defineTool 编译 + 编译产物 raw-schema 边界深遍历
#   part 2  在线端到端(守护进程可达时):navigate→snapshot→evaluate→screenshot→list_tabs→close_session

# 3. 真实 harness 行为测试(headless profile)
dsh --profile headless "…任务…"

# 4. 主 profile 启动复核
dsh --profile web   # 20~30 s 观察日志无 kimi 相关报错

# 5. 卸载验证
dsh plugin --profile headless remove dsh-kimi-webbridge   # 可选,验证可逆

8. 分发与发布

  • npm 发布:package.json 已声明 files(index.js / cordis.patch.yml / README×2 / LICENSE)、dsh.bundle.patchdsh-plugin 关键词与 GitHub topic。
  • git 安装:无 prepare 脚本 → 无需 allowBuilds 授权。
  • 版本兼容:peer 依赖 *;已实测 dsh v0.1.0-rc.6 的 @deepseek-ai/dsh-tools 编译与边界规则。上游 schema DSL 变更时以 tests/smoke.mjs part 1e 作为回归闸门。

9. 相关文档索引

文档内容
docs/glossary.md标准术语表(dsh 生态 + WebBridge 域)
docs/api-reference.md15 工具 API、配置 API、内部函数、WebBridge HTTP API
docs/solutions.md踩坑记录、疑难问题、解决方案与方法论(含出处地址)
README.md / README.zh-CN.md用户向安装/使用/故障排查(默认英文,可切换中文)