Skip to content

[功能建议] 支持 DSH(DeepSeek Harness)作为监听来源 #129

Description

@coytus

需求

设置 → 悬浮窗设置 → 「Agent 监听与接入」目前只有 Codex / WorkBuddy / CodeBuddy / Codeg 四家。希望新增 DSH(DeepSeek Harness),让它出现在这个列表里(显示接入状态 + 监听开关),悬浮窗也能显示 dsh 的会话状态(进行中 / 等待确认 / 完成)。

本次只求状态监听,不涉及账号切换、额度或 Token 统计。

环境

  • workbuddy-switch v0.1.55,macOS arm64
  • DSH:dsh CLI 0.1.1-rc.2(npm @deepseek-ai/dsh)、DSH Desktop 0.10.0
  • 数据目录:$DSH_HOME,默认 ~/.dsh

现有实现(已读源码,供参考)

  • vendor/agent-companion/crates/agent-studio-core/src/settings.rs:pub const SOURCES: [&str; 4] = ["codex", "workbuddy", "codebuddy-ide", "codeg"]
  • 内置适配器在 crates/agent-studio-core/src/adapters/{codex,workbuddy,codeg,ide}.rs
  • adapters/custom/ 已有一套声明式模板接入(docs/custom-agent-hooks.md),但设置页入口尚未开放,且需要目标工具支持「事件触发本机命令 + 把 JSON 写到 stdin」。我在 @deepseek-ai/dsh 包里没找到 hook / 事件回调配置,所以走自定义 Hooks 这条路大概率通不了,得靠内置适配器读 dsh 自己的落盘数据。

可行性线索:DSH 的会话是落盘的(我已只读验证)

$DSH_HOME/sessions/--<normalized-cwd>--/<session-id>/session.jsonl.zstd
  • append-only JSONL,默认 zstd 压缩,且是多帧(首帧是可校验 header,后续为追加帧)——按 @deepseek-ai/dsh-session-persistence-jsonl 的说明,解码需要跨帧,不能只解第一帧
  • 每个会话目录第一行是 header:
{"type":"session","version":0,"id":"session-<uuid>","createdAt":1786875482740,"cwd":"/path/to/project","delegationDepth":0,"agentPreset":"standard"}
  • 注意:会话目录名有两种形态,session-<uuid> 和裸 <uuid> 都存在,扫描时不能假设有 session- 前缀
  • 另有 $DSH_HOME/storages/usage-stats-cache.json、$DSH_HOME/.dsh-usage-ledger.json(如果以后要做用量统计可以用,本次不需要)

事件 → 状态映射(从 dsh 包内提取的事件名)

DSH 事件 对应动作
turn/start start
approval/asked wait(reason: permission)
approval/decided resume
turn/end finish
session/disposed、agent/disposed close

辅助字段:项目名可直接取 header 的 cwd 目录名;会话标题可用 session/title;另有 tool/call、tool/result、assistant/chunk、user/message、agent/status 等事件可作辅助判断。

期望

  1. 「Agent 监听与接入」新增 DSH 一行(图标 + 状态 + 监听开关),交互与现有四家一致
  2. 悬浮窗能显示 dsh 会话状态,项目名取 cwd 目录名
  3. dsh 未安装或 $DSH_HOME/sessions 不存在时显示「暂不可用」(与 Codeg 现状一致),不要报错
  4. 读取保持只读,不要写入/修复 dsh 的会话文件

备注

提之前查过 issue 列表,没有 DSH / DeepSeek / Harness 相关的条目(#123「把 豆包 QODER之类的整合起来」已关闭且正文为空),这条不算重复。谢谢!

Activity

  1. changexbc commented on Sep 30, 2026

    @changexbc
    Owner

    感谢反馈。目前我没有使用 deepseek harness,理论上支持 hooks 的话支持起来都很方便,你可以让 ai 实现一下,然后去这个仓库 https://github.com/changexbc/agent-companion 提个 pr。

  2. coytus commented on Sep 30, 2026

    @coytus
    Author

    按你的建议实现了内置适配器,PR 提到 agent-companion:changexbc/agent-companion#3

    要点:

    • DSH 没有 hook 机制,所以走的是轮询会话日志(与 WorkBuddy 的审批日志同类),不需要目标工具侧装任何东西
    • 日志是 append-only 多帧 zstd(只解第一帧只有 header),按帧增量推进
    • 实测 233 个会话日志 / 110,941 条事件;其中 73 个停在非终态但只有 1 个真有活进程持锁,所以叠加了 flock + 静默时长兜底,否则会挂出大量幽灵「进行中」
    • 老配置缺 dsh 项会判为无效配置,一并加了迁移容错

    Node/WebUI 那侧还没做(Node 的 zlib zstd 不支持跨帧),PR 里列了选项等你定。

  3. changexbc commented on Sep 30, 2026

    @changexbc
    Owner

    @coytus 感谢 pr, deepseek harness 是有 hooks 插件的,workbuddy 的读取日志是不得已而为之,在dsh 如此开放的基础上我觉得还是用 hooks 来实现更为合理。我晚点做一下支持吧。

  4. coytus commented on Sep 30, 2026

    @coytus
    Author

    更正我上面那句「DSH 没有 hook 机制」:那是错的——我只检索了本机 ~/.local 里 0.1.1-rc.2 的旧 CLI 就下了结论。按实际安装的桌面端(0.2 线)重查,hook 包确实在,PR #3 已关闭。

    顺手把从桌面端 app.asar 里挖到的细节放这儿,或许省点事:

    • 三个包在 dsh/node_modules/@deepseek-ai/ 下(不在 asar 根):dsh-hook-protocol、dsh-hooks-codex、dsh-hooks-claude-code
    • dsh-hooks-codex 是桥:挂到 profile + configPath 指向你的 hooks.json,DSH 会执行你的命令 hook
    • 支持 5 个事件:SessionStart / UserPromptSubmit / PreToolUse / PostToolUse / Stop;payload 是 Codex 形状(带 session_id / turn_id),写进 hook 的 stdin(不带结尾换行)
    • ⚠️ PermissionRequest、PreCompact、PostCompact、SubagentStart、SubagentStop 不支持,静默丢弃 → 「等待权限确认」用 hook 拿不到,可能要和读日志并存
    • transcript_path 恒为 null,README 还明说「默认 zstd 的会话日志对 hook 脚本不可读」→ 两条路是互补关系

    不再提重复实现;你的版本出来后我可以帮测。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions