dsh-codeisland-bridge:把 DSH 会话与工具状态转发到 CodeIsland 刘海

前言

用 DeepSeek Harness(DSH)跑智能体时,终端或 Web 里能看到会话与工具调用,但 macOS 上若已用 CodeIsland 做「刘海」式状态条,默认只会给各 CLI 读本地日志;DSH 的会话日志是 zstd 压缩格式,CodeIsland 没有对应的 reader。CodeIsland 对 DSH 只内置了来源标签 source: dsh,不会主动拉取 DSH 状态;事件唯一入口是 Unix socket 上的 hook JSON。维护者 LeLiu 的 dsh-codeisland-bridge 插件充当发射器:不拉起面板、不读会话日志,只把 DSH 的会话、工具、审批事件实时推到 CodeIsland。

这是什么

dsh-codeisland-bridge 是 DSH 工作流类插件(Cordis patch),版本 0.1.0,MIT 许可,要求 Node >= 20。它把 Harness 里的 session、tool、approval 等生命周期事件,映射成 CodeIsland notch 协议,经 /tmp/codeisland-<uid>.sock(或环境变量 CODEISLAND_SOCKET_PATH)发出。插件以当前 DSH 进程权限运行;安装前建议自行查看 GitHub 仓库 源码与许可证。

社区目录页:SkillHub - dsh-codeisland-bridge。目录为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本包即其中一条桥接链路。

核心功能

下面介绍插件已文档化的映射关系(冲突时以仓库 README 为准)。

CodeIsland 卡片上的内容 DSH 侧事件
会话出现 / 结束 session/created → SessionStart,session/disposed → SessionEnd
最近一次提问(标题区) agent/pre-step → UserPromptSubmit(含 prompt 文本)
运行中 / 当前工具 tools/pre-execute / tools/post-execute → PreToolUse / PostToolUse(Failure)
最近回复 session/event(assistant/message)→ Stop.last_assistant_message
等待授权,刘海上允许/拒绝 approval/request → PermissionRequest;决策回写 allowed-once / rejected
子代理 subagent/start|end → SubagentStart / SubagentStop

拿不到的:token 用量、完整 transcript、点击跳转到终端——这些 CodeIsland 仍只从各 CLI 本地日志读,本插件不补这类能力。

行为约定(摘自 README):

  • 非审批监听器一律 return next(),发送为 fire-and-forget;CodeIsland 未开时静默跳过,永不阻塞 agent。
  • 审批:刘海返回 allow/always 映射为 allowed-once,deny 为 rejected;超时、断线或未运行则 next() 交给其它 answerer,不在此 fail-closed。
  • 默认不发送 tool_input;last_assistant_message 仅本会话最后一条助手文本,长度受 maxReplyChars 限制。

安装与启用

插件必须装进你实际在跑的 profile;装完需重启对应 DSH 进程或应用。

未发布 npm 前,从 GitHub 源码安装:

dsh plugin --profile web add github:LeLiu/dsh-codeisland-bridge

CLI profile(web / headless / 自建;npm 发布后可用包名):

dsh plugin --profile web add dsh-codeisland-bridge

DSH Desktop 的 profile 由应用独占,CLI 无法写入;在菜单栏「桌面插件…」填写 dsh-codeisland-bridge,或通过桌面插件市场安装。

本地开发可链目录:

dsh plugin --profile headless add /absolute/path/to/dsh-codeisland-bridge

卸载:

dsh plugin --profile <name> remove dsh-codeisland-bridge

配置

所有字段有默认值,可在你自己的 profile patch 层按插件 id 覆盖(不是包内 cordis.patch.yml):

- id: codeisland-bridge
  config:
    socketPath: /tmp/codeisland-501.sock   # 默认 $CODEISLAND_SOCKET_PATH 或 /tmp/codeisland-<uid>.sock
    source: dsh                            # CodeIsland 来源标识,卡片显示为 DeepSeek Harness
    approvals: true                        # 把 approval/request 转发到刘海
    approvalTimeoutMs: 300000              # 等太久交还给其他 answerer
    connectTimeoutMs: 1500                 # 普通事件的连接/回执预算
    subagents: true                        # 上报子代理启停
    toolInput: false                       # 是否把工具参数(命令/文件内容)也发过去
    maxReplyChars: 4000                    # Stop 携带的回复文本上限

payload 字段遵循 CodeIsland hook 协议:hook_event_name、session_id、cwd、tool_name、tool_use_id、_source 等,以仓库实现为准。

验证与典型用法

跑完一轮 DSH 会话后,可检查 CodeIsland 侧是否出现 source: dsh 的记录:

python3 -c "import json;print(json.load(open('$HOME/.codeisland/sessions.json'))[-1])"

插件自带测试(映射、审批决策、超时、无 island 降级等 18 个用例):

node --test test/*.test.mjs

适用场景与注意

适合已在 macOS 使用 CodeIsland、同时用 DSH(web / headless / Desktop)跑 agent,希望在刘海上看到会话起止、当前工具、最近提问与回复、以及(可选)在刘海上点允许/拒绝权限请求的场景。

注意:CodeIsland 未运行时插件会静默跳过普通事件;审批超时同样交还其它 answerer。若需要把完整工具参数发到刘海,需显式将 toolInput 设为 true,会涉及命令与文件内容,请自行评估隐私需求。

结尾

dsh-codeisland-bridge 用一条 Unix socket 转发链路,补上了 CodeIsland 无法直接读 DSH 压缩日志的缺口,且刻意保持轻量、不阻塞 agent。目录与源码:

  • https://www.skillhub.cn/plugins/LeLiu/dsh-codeisland-bridge
  • https://github.com/LeLiu/dsh-codeisland-bridge
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜