dsh-codex-workbench: Turning Each Codex Task Assignment into a Read-Only Checklist

前言

在 DeepSeek Harness(DSH)里把任务交给 Codex,往往是一次「异步投递」:命令已经返回,进程还在后台跑。主界面里不一定有对应会话,想回答「它跑到哪一步、花了多少 token、产出了什么」,常见做法是反复打开 ~/.codex/sessions 看文件时间戳,或在对话里手动汇报三态。下面介绍的 dsh-codex-workbench(界面里叫「派活台」)把 Codex 自己写的 rollout 日志读成一张表,用浮卡和右栏两个入口展示,插件本身只读不写会话目录。

这是什么

dsh-codex-workbench 由社区维护者 accoutmissing 发布,在 DSH 生态里属于客户端类插件(当前目录页星标为 0)。它解决的是「派活清单不可见」:每次派给 Codex 的工作目录、任务原话、已跑时长、token 用量、推断状态,以及可列出的产物文件,汇总成一行;数据全部来自 Codex 写入的 rollout,路径为 %USERPROFILE%\.codex\sessions\<YYYY>\<MM>\<DD>\rollout-*.jsonl(存在 CODEX_HOME 时用该变量)。npm 包名为 @local/dsh-codex-workbench,文档中版本为 0.4.1,许可 MIT。

核心功能

两个入口,同一份数据

入口 挂载点 行为
右下角浮卡 shell.overlay 收起时为药丸「派活台 · N 在跑」,可拖动;有活在跑时可自动展开
右栏标签页 sidebar.right.pane.tab 全量列表(不截断),筛选:全部 / 派活 / 审查 / 子代理

浮卡与右栏读同一份扫描结果。手动收起后状态记在 localStorage,不会反复自动弹开;药丸位置记的是左上角坐标。展开后药丸仍在原位并变为「收起」,从同一位置进出。

列表里每一行表示什么

  • 工作目录:派活所在路径(示例界面中为类似 D:\Fun 的目录)。
  • 任务原话:来自 rollout 里 item_completed 且 item.type === "UserMessage" 的文本,即用户输入,不是系统 base prompt。
  • 时间列:运行中显示已跑时长(activeMs);否则显示距最后事件的闲置时长,不是会话文件创建时间。
  • Token:token_count 事件中的 input / cached / output(界面示例形如 229.8M↓ 223.0Mc 690k↑)。
  • 分类:由 session_meta.thread_source 区分——user(派活)、guardian_review(审查)、subagent(子代理);排序时审查与子代理靠后,避免挤掉真派活。
  • 状态:running(近 10 分钟有事件且最后一轮未结束)、done(已 task_complete)、stale(未完成但静默超过 10 分钟)。状态不只靠颜色:运行中为实心强调色与呼吸环,已结束为灰实心,卡住为空心环。

点击某行可展开详情:任务原文、工作目录、最后一段回复,以及按 mtime 倒序的产物文件列表。

宿主侧读取策略

插件不发起外部网络请求,dependencies 均为空。扫描在后台单飞;按 size + mtime 增量,未变文件不重读。每个 rollout 默认只读文件尾部 512 KB;session_meta 首行可能很长,按 8 KB → 256 KB → 1 MB 逐级放大直到读到行尾并缓存。列表窗口为最近 3 天、最多 24 条,面向「现在在跑什么」而非全历史。README 记载的本机实测:232 个 rollout 文件、3 天窗口留下 24 条;全量扫描约 1.4 s,命中缓存后约 0.2 s。

HTTP 路由(仅 loopback)

路由 方法 说明
/plugins/codex-workbench/state GET 会话列表、扫描统计、client 版本戳、插件版本
/plugins/codex-workbench/files?id=<sessionId> GET 单次派活的产物(BFS 深度 3,跳过 node_modules 等)

非 GET 返回 405。client bundle 若比磁盘旧,界面顶部会出现「界面代码已更新 · 点此刷新」,点一下重载即可。

安装与启用

这是带 dsh.bundle.patch(指向 cordis.patch.yml)的 DSH bundle,装法与本地 bundle 相同。在 DSH 会话里让 Agent 执行:

// 在 DSH 会话里让 Agent 执行
plugin_manager({ action: 'install_bundle',
                 target: 'D:\\路径\\到\\dsh-codex-workbench' })

将 target 换成本机 clone 或解压后的目录绝对路径。返回 application: "applied" 才算生效;failed 时查看 warnings。安装后需刷新页面(Ctrl+R)才会加载新的 client bundle。

改代码后不重启 DSH 也可热切换:

plugin_manager({ action:'set_plugin', target:'include:dsh-codex-workbench', enabled:false })
plugin_manager({ action:'set_plugin', target:'include:dsh-codex-workbench', enabled:true })

注意 entry id 是 include:dsh-codex-workbench,不是包名。自检可请求 GET /plugins/codex-workbench/state:version 应对应 package.json;staleHost 为 false 且 hostStamp 不大于 loadedAt 表示宿主模块一致;clientStamp 与 client.js 的 mtime 一致表示浏览器端已更新。

典型用法

  1. 安装 bundle 并刷新 DSH 页面。
  2. 照常通过 DSH 向 Codex 派活;Codex 会在 ~/.codex/sessions 下写 rollout。
  3. 看右下角浮卡:有进行中的派活时药丸会显示数量,展开即可扫一眼目录、原话、token 与 wait_agent 等状态。
  4. 需要完整列表或按类型筛选时,打开右栏「派活台」标签,在「全部 / 派活 / 审查 / 子代理」间切换;括号内为当前筛选条数。
  5. 某次派活完成后,点开行内详情,在产物区查看本次写入的文件;需要 API 级列表时对 loopback 调用 /plugins/codex-workbench/files?id=<sessionId>。

浮卡药丸可在窗口内拖动,松手后位置持久化;展开态点药丸上的「收起」回到药丸形态。

适用场景与注意

适合谁:在 DSH 桌面版上频繁把长任务交给 Codex、又不想手动翻 sessions 目录的开发者。目标是「一眼区分还在跑、卡住、已完事」,而不是替代 Codex 自带的完整会话 UI。

环境与限制(均来自 README):

  • 仅在 Windows + DSH 桌面版上实测(Electron 自带 Node 24);其他平台未在文档中承诺可用。
  • 只解析 rollout 中的结构化事件;ops_bash 命令字符串里隐含的产物不会猜测。
  • 状态靠事件静默时长推断,无进程级探活:例如 9 分钟无输出仍可能显示 running,文档说明这是为避免把仍在运行的活误判为已死。
  • UI 配色跟随当前皮肤 token(如 --dsh-claude-*、--dsw-alias-*),插件不自带调色板;面板表面不透明,不使用 backdrop-filter。

安全与信任:插件以当前 DSH 进程权限运行,只读本地 Codex 会话目录并通过 loopback 提供两条 GET 路由。安装前应在 GitHub 仓库 查看源码与 MIT 许可证,确认路径与行为符合你的环境。DSH 社区插件目录(SkillHub 条目)由社区维护,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-codex-workbench 把 ~/.codex/sessions 里的 rollout 收成派活台:浮卡盯进行中的活,右栏做全量筛选与详情。无构建步骤,宿主逻辑在 index.js,界面在 client.js;开发自检可执行 node --check index.js && node --check client.js。

  • 目录页:https://www.skillhub.cn/plugins/accoutmissing/dsh-codex-workbench
  • 源码与 README:https://github.com/accoutmissing/dsh-codex-workbench
羽毛球分组比赛记分
小程序二维码

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

Xiaoye