dsh-codex-orchestrate
Đã xác minh@sakki_chin/dsh-codex-orchestrate · v1.0.1 · MIT · Giao diện web
DSH 插件:把 Codex 任务按 YAML schema 编排成 DAG 工作流,并在 DSH 右侧边栏以原生 React tab 呈现 DAG 进度与逐节点会话。
Cài đặt
dsh plugin add @sakki_chin/dsh-codex-orchestrate Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.
Thẻ
Tác giả
Readme
@sakki_chin/dsh-codex-orchestrate
把 Codex 任务按 YAML schema 编排成 DAG 工作流的 DSH 插件。每个节点是一个独立的 codex session,下游首轮会自动拿到直接依赖节点的终态结果;进度在 DSH 右侧边栏以原生 React tab 呈现(DAG 连线 + 逐轮 conversation)。
- 派发方式:DSH agent 调用
codex_orchestratetool(异步 + 可查进度),或直接调 HTTP API - 每个节点独立 codex session,终态后可在工作台里继续对话(
resumeThread,不重跑下游) - 运行中也能改 DAG:
kind: nodePatch原子化新增 / 修改 / 删除尚未执行的节点 - 工作流状态 append-only 落盘,进程重启后历史仍可查
环境要求
| 项 | 要求 |
|---|---|
| DSH | Desktop 或 dsh CLI |
| codex CLI | 已安装并 codex login(订阅登录)或设置 OPENAI_API_KEY |
| Node | ≥ 20 |
插件完全复用本机 codex 登录态(~/.codex/auth.json):不代管、不刷新、不转发 token。派发前会做一次只读探测,没有登录态就直接报错,不会烧掉一个必然失败的 turn。
安装
dsh plugin add --profile web @sakki_chin/dsh-codex-orchestrate
--profile 换成你的 profile 名(真源:~/Library/Application Support/DSH Desktop/profile-selection/state.json,一般是 web)。
安装后需要完全重启 DSH:包元数据(含"是不是客户端包"的判定)按 Loader specifier 缓存到进程重启,刷新页面不够。
从本地目录安装(开发用)
cd <插件源码目录>
npm install
npm run build:client
dsh plugin add --profile web "$PWD"
pnpm 会写成 link: 软链,所以之后改源码 → npm run build:client → 宿主 HMR(约 500ms 轮询)会原地重挂载,无需重启或刷新。
打开工作台
右侧边栏 → 点标签条的 **+(「新标签页」)**打开引导页 → 选「Codex Orchestrate」。
也可以右键任意 tab,从 tab 菜单里进入。
使用
由 DSH agent 派发
codex_orchestrate(yaml: "...")
kind: workflow创建kind: workflowQuery查询(省略workflowId返回清单)kind: nodePatch对尚未执行的节点做原子化增删改
tool 立即返回 { workflowId, nodes, progress, progressUrl, instance }。
用
progressUrl(绝对地址,可直接 GET),不要用progress(相对路径,需你自己知道 host:port——曾因此把跨实例查询误判成「workflow 不存在」)。instance.instanceId用于确认「我查的是不是派发我的那个实例」。
YAML schema 见包内 schema/workflow.schema.md(规范说明 + 回传契约),校验真源是 schema/workflow.schema.json。
调度语义
- 节点按
dependsOn调度,无依赖(或依赖已满足)的节点并发执行,受concurrency上限约束(默认 3) - 下游节点首轮 prompt 自动注入所有直接依赖节点的终态结果
- 节点未显式写
cwd时,继承发起 DSH 会话的工作目录 - 单节点
timeoutS默认 600;onFailure: fail(默认)阻塞下游,continue照常调度
直接 HTTP
POST /codex-orchestrate/api/dispatch { "yaml": "..." }
GET /codex-orchestrate/api/workflows
GET /codex-orchestrate/api/state?workflowId=wf_xxx
POST /codex-orchestrate/api/message { workflowId, nodeId, text, clientMessageId }
POST /codex-orchestrate/api/cancel { workflowId, nodeId }
GET /codex-orchestrate/api/events?workflowId=wf_xxx # SSE
状态持久化
workflow 状态 append-only 落盘到 $DSH_HOME/workflows.jsonl。
- 进程重启后历史仍可查:
/api/state未命中内存时自动从磁盘回读 - 重启前处于
running/queued的节点会被照实标成cancelled,而不是永远停在running骗查询方 - 文件尾部半行 / 损坏行会被跳过,不影响其余历史
- 落盘失败(磁盘满 / 权限)只记一条警告,不打断正在跑的工作流
配置
| 环境变量 | 作用 |
|---|---|
DSH_CODEX_MODEL |
节点缺省模型(默认 gpt-5.6-sol) |
DSH_CODEX_CLI |
指定 codex CLI 可执行文件路径 |
DSH_CODEX_MODULES |
额外的 node_modules 目录(用于找 @openai/codex-sdk、YAML 解析器) |
DSH_CODEX_STATE_DIR |
覆盖状态落盘目录 |
DSH_CODEX_DEBUG_EVENTS |
打印原始 codex 事件流 |
CODEX_HOME |
codex 登录态目录(默认 ~/.codex) |
也可在节点上写 model: 覆盖全局缺省。不要用 gpt-5-codex——该 slug 在 ChatGPT 订阅登录下会被服务端拒绝(not supported when using Codex with a ChatGPT account);订阅可用 gpt-5.6-sol / gpt-5.6-terra / gpt-5.6-luna / gpt-5.5。
排查
http://127.0.0.1:43120 返回 403 —— 这是 DSH Desktop 的 Electron 门禁,对所有非渲染器请求一律拒绝,不是插件故障。无头脚本穿不透它。
节点报「未找到 @openai/codex-sdk」 —— 设置 DSH_CODEX_MODULES 指向含该包的 node_modules;或在本插件目录执行 npm install。
Tab 菜单里没有「Codex Orchestrate」 —— 依次确认:右侧边栏已展开;包已装进 profile(dsh plugin ls --profile web);DSH 已完全重启。若右栏当前是引导页且尚无扩展条目,右键不会弹菜单,点 + 打开引导页即可看到入口。
开发
npm install
npm run build:client # 产出 lib/client.js(lazy-CJS 包装,宿主冻结模块全部 external)
npm run verify:edges # DAG 连线几何自证:采样每条路径,逐点判定是否覆盖节点卡片
node server/orchestrator.test.cjs
node server/plugin.test.cjs
npm publish 会通过 prepublishOnly 自动构建并跑一遍几何自证。
边界
- 运行句柄在内存中:进程重启时未完成的节点/轮次标为
cancelled,已完成历史从 JSONL 恢复 - 只呈现当前进程派发的工作流
file_change事件只有路径与 add/delete/update,无 diff 正文(SDK 限制)
License
MIT