Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ORCHESTRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ In `auto`/`eager`, tell the user after the fact. In `manual`, their explicit req
- Devin CLI: advertised ids (`devin models list`; level is in the id, e.g. `swe-1-7-medium`). Unknown id fails; `effort` warns and is ignored. Mode forced to `bypass`. Revive via `session/load` (replays into `get_transcript`; `get_result` stays clean).
- ZCode: `provider\model` or a unique bare id. Thought: `off`→`low`, `medium`→`high`. Unknown or ambiguous model fails; unmappable effort warns. Mode `yolo`. Revive via `session/resume`.
- MiniMax Code: `provider/model` or `provider/model#variant`. `thinkingEffort` (`off`→`default`). Unknown model fails; unmappable effort warns. Permission `bypassPermissions`. Revive via `session/resume`.
3. Loop `wait_task` until terminal. A timeout is **not** failure — call it again. `silent_for_sec` is time since the last output. Silence past `stall_timeout_sec` (default 1800, per worker, 0 disables) ends `failed` / `stalled`: raise that worker's limit or resume the `session_id` with a narrower task. Stall counts only worker output — a chatty turn never stalls; `turn_timeout_sec` (per worker, 0 = off) caps a turn's wall-clock and ends `failed` / `timed_out`. Terminal `wait_task` carries `persisted`; `false` means `state.json` was not written — the result stays valid but may not survive a restart. `files_changed` lists only paths inside the task `cwd`; outside paths go to `files_outside_cwd` (absolute, capped alike, `files_outside_cwd_total`). A `session/load`-failed warning means the worker started a fresh native session — re-supply context next message. Size `timeout_sec` under the host MCP tool timeout:
3. Loop `wait_task` until terminal. A timeout is **not** failure — call it again. `silent_for_sec` is time since the last output. Silence past `stall_timeout_sec` (default 1800, per worker, 0 disables) ends `failed` / `stalled`: raise that worker's limit or resume the `session_id` with a narrower task. Stall counts only worker output — a chatty turn never stalls; `turn_timeout_sec` (per worker, 0 = off) caps a turn's wall-clock and ends `failed` / `timed_out`. `dispatch_task` and every terminal task answer (`wait_task` / `check_task` / `get_result` / `cancel_task`) carry `persisted`; `false` means `state.json` was not written — the answer stays valid but may not survive a restart. `files_changed` lists only paths inside the task `cwd`; outside paths go to `files_outside_cwd` (absolute, capped alike, `files_outside_cwd_total`). A `session/load`-failed warning means the worker started a fresh native session — re-supply context next message. Size `timeout_sec` under the host MCP tool timeout:
- Codex: `tool_timeout_sec` 600; default 180 is fine.
- Cursor: host ~45–60 s; pass ~30 and loop.
- Kimi Code: configure `toolTimeoutMs` 600000; otherwise ~45 s polls.
Expand Down
2 changes: 1 addition & 1 deletion ORCHESTRATION.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Claude 的 `quota.status` 只汇总通用的 `5h` / `weekly` 额度。派发前
1. 先调 `list_agents`,选一个可用的 Worker。看返回里的 `coordinator.mode` / `coordinator.instructions` / `coordinator.dispatch_enabled`(用户偏好优先于第二步的默认分工),以及 `env.proxy` / `env.warnings`。`dispatch_enabled` 为 false 时立刻停止派发。直连网络上 proxy 为 null 是正常的;若机器需要代理而 Worker 报网络/连接错误,去改代理配置(仓库 `agents.toml` 或 `~/.agent-bridge/agents.toml` 里的 `[env.proxy]`),不要对同一次失败反复重试。
2. `dispatch_task` 的 `cwd` 必须是 **本次对话的项目目录**(绝对路径)。也就是你被启动时所在的文件夹——和用户自己 `cd` 再运行 `grok` / `kimi` / `agy` / `opencode` / `claude` 是同一个地方。Worker 的会话历史按 cwd 存放,换目录就是对方 UI 里的另一场对话,之后也更难看、更难续。**不要**把 Agent Bridge 的安装目录当作 cwd,除非用户正在改 Bridge 本身。不要自造临时目录。`message` 必须自洽:背景、绝对路径、验收标准、不要做什么。model 和 effort:没有特别理由就都不传,用 Worker 默认值——Antigravity 默认的 `gemini-3.7-flash` 就够了(要换才用 `agy models` 里的 slug)。确要指定时:Grok 的 `model` 是 `grok models` 里的 slug(用账号目录里有的,不要编),`effort` 为 `off` / `low` / `medium` / `high` / `max`(`off` → Grok `none`,`max` → Grok `xhigh`)。Grok 的 `/new` 总会落在活动默认模型上(目前是 grok-4.6 xhigh);Bridge 在会话建立后再 `session/setModel`。Kimi 的 `model` 取会话自己声明的那几个 slug(`kimi-code/k3`、`kimi-code/k3-256k`、`kimi-code/kimi-for-coding` 等),`effort` 还是那五个词,由 Bridge 映射到该模型声明的思考档位——k3 只声明 `low` / `high` / `max`,所以 `medium` 落到 `high`,`off` 落到 `low`。传了会话没声明的 slug 会让这一轮失败,错误里会列出真正可用的;`effort` 映射不上则只出 warning,不算失败。OpenCode 的 `model` 是会话声明的 `provider/model`(官方 OpenCode Zen / Go,或用 `opencode auth` 以 API key 接上的其它提供商——没有产品级登录)。`effort` 还是那五个词,映射到该模型的 variant(常见是 `default|low|medium|high`,`max` 通常落到 `high`)。未声明的 slug 会让这一轮失败;没有 effort 选项或映射不上只出 warning。`get_result.observed_model` / `observed_effort` 是 Bridge 映射后成功设上的最后值(例如 `max` → `high`),不是实时采样器转储。同一会话换模型会重新设 effort,因为 OpenCode 会把 variant 重置成新模型的默认。Bridge 用 `session/resume` 复活 OpenCode,不用 `session/load`。Claude Code 的 `model` 取会话声明的 slug(`sonnet` / `opus` / `haiku` 或完整 id),`effort` 还是那五个词(`off` → `default`,`max` → `xhigh`,除非会话列出了 `max`)。未声明的 slug 会让这一轮失败;没有 effort 选项或映射不上只出 warning。Bridge 在 `session/new` 后把模式切到 `bypassPermissions`,并用 `session/resume` 复活(`session/load` 会回放整段历史)。
Cursor 的 `model` 必须是 `cursor-agent --list-models` 当前列出的完整 ID;Bridge 会校验并固定首次启动,再把完整 ID 映射到 Cursor 会话声明的 ACP `model` 和参数选项。同一个 `session_id` 可以切换模型和变体;若所选模型声明了思考档位,单独传入的 `effort` 会覆盖 ID 中编码的档位。`observed_model` 是 Cursor 确认映射结果后的请求 ID,`observed_effort` 是 Cursor 确认的思考档位;两者都不是实时采样器。Codex CLI 的 `model` 是 Codex 自己的 slug(如 `gpt-5.6-sol`),`effort` 为 `off` / `low` / `medium` / `high` / `max`(`off` → `none`);默认 `--approve-for-me`,提示词走 stdin,用 `exec resume` 续会话;JSONL 建立前的启动失败会进入 `get_result.error`。Devin CLI 的 `model` 取会话声明的模型 id(`devin models list`;档位就在 id 里,如 `swe-1-7-medium`、`claude-opus-5-high`),未声明的 id 会让这一轮失败;`effort` 会被忽略并出 warning。Bridge 在 `session/new` 后把模式切到 `bypass`;续会话走 `session/load`,旧历史会被回放进 `get_transcript`(新一轮的 `get_result` 不受影响)。ZCode 的 `model` 是 `provider\model`,或在只对应一个选项时用裸模型 id(如 `GLM-5.3`);`effort` 映射到该模型的 thought 档(常见 `low|high|max`,`off` → `low`,`medium` → `high`)。未声明或有歧义的模型会让这一轮失败;映射不上只出 warning。Bridge 把模式切到 `yolo`,并用 `session/resume` 复活。MiniMax Code 的 `model` 是 `provider/model` 或 `provider/model#variant`;`effort` 映射到 `thinkingEffort`(`off` → `default`)。未声明的模型会让这一轮失败;映射不上只出 warning。Bridge 把 `permissionMode` 切到 `bypassPermissions`,并用 `session/resume` 复活。DSH 的 `model` 是 `provider/model` 或模型 id,`effort` 为 `off` / `low` / `high` / `max`。新版 `dsh --profile acp` 通过 `session/set_config_option` 在同一会话内切换——传了会话没声明的 model 会让这一轮失败,`effort` 映射不上只出 warning;旧版 `dsh-acp-demo` 走启动环境变量,改 model/effort 会重启进程(进程内不能切换),失败后换模型同样靠下次 `dispatch_task` 重启进程。
3. 循环调用 `wait_task` 直到 `status` 为终态。超时不是失败,再调一次即可。`wait_task` / `check_task` 还会返回 `silent_for_sec`(Worker 最近一次输出到现在的秒数)。Worker 持续静默超过 `stall_timeout_sec`(默认 1800,可在 `agents.toml` 按 Worker 设置,0 关闭)时 Bridge 会取消这一轮,任务以 `status=failed`、`stop_reason="stalled"` 结束。静默判定只看 Worker 输出——一直在产生事件的回合永远不会 stall。`turn_timeout_sec`(按 Worker 设置,默认 0 关闭)则给整轮设墙钟上限,超时以 `failed` / `timed_out` 结束。终态 `wait_task` 还带 `persisted`;为 `false` 表示 `state.json` 没写成功——结果仍然有效,但 Bridge 重启后可能丢失。`files_changed` 只列任务 `cwd` 内的路径;Worker 上报的 cwd 外路径进 `files_outside_cwd`(绝对路径,与 `files_changed` 同样截断,总数见 `files_outside_cwd_total`)。任务 warnings 里说 `session/load` 失败、先前上下文已丢失,表示 Worker 开了一个新的原生会话——下一条消息要重新带上上下文。长时间静默的构建和挂死的 Worker 看起来一样:如果那一步确实需要那么久,就调高该 Worker 的上限;否则在同一个 `session_id` 上派一个更小的任务。`timeout_sec` 必须低于宿主的 MCP 工具超时:Codex 配置 `tool_timeout_sec` 600,默认 180 即可;Cursor 宿主大约 45–60 秒,传约 30 并循环;Kimi Code 把 `toolTimeoutMs` 配到 600000,未配置则约 45 秒短轮询;ZCode 把 `timeoutMs` 配到 600000,未配置则约 15–20 秒短轮询;Grok Build 官方默认 `tool_timeout_sec` 是 6000,建议显式写成 600,拿不准或调用被掐掉时用约 30–45 秒短轮询;Claude Code 在 `.mcp.json` 里把每服务器 `timeout` 配成 600000(毫秒),CLI 默认很长,桌面端历史上大约 60 秒会掐掉,拿不准时用约 45 秒短轮询。等待期间可以并行做别的事。
3. 循环调用 `wait_task` 直到 `status` 为终态。超时不是失败,再调一次即可。`wait_task` / `check_task` 还会返回 `silent_for_sec`(Worker 最近一次输出到现在的秒数)。Worker 持续静默超过 `stall_timeout_sec`(默认 1800,可在 `agents.toml` 按 Worker 设置,0 关闭)时 Bridge 会取消这一轮,任务以 `status=failed`、`stop_reason="stalled"` 结束。静默判定只看 Worker 输出——一直在产生事件的回合永远不会 stall。`turn_timeout_sec`(按 Worker 设置,默认 0 关闭)则给整轮设墙钟上限,超时以 `failed` / `timed_out` 结束。`dispatch_task` 和终态任务响应(`wait_task` / `check_task` / `get_result` / `cancel_task`)都带 `persisted`;为 `false` 表示 `state.json` 没写成功——结果仍然有效,但 Bridge 重启后可能丢失。`files_changed` 只列任务 `cwd` 内的路径;Worker 上报的 cwd 外路径进 `files_outside_cwd`(绝对路径,与 `files_changed` 同样截断,总数见 `files_outside_cwd_total`)。任务 warnings 里说 `session/load` 失败、先前上下文已丢失,表示 Worker 开了一个新的原生会话——下一条消息要重新带上上下文。长时间静默的构建和挂死的 Worker 看起来一样:如果那一步确实需要那么久,就调高该 Worker 的上限;否则在同一个 `session_id` 上派一个更小的任务。`timeout_sec` 必须低于宿主的 MCP 工具超时:Codex 配置 `tool_timeout_sec` 600,默认 180 即可;Cursor 宿主大约 45–60 秒,传约 30 并循环;Kimi Code 把 `toolTimeoutMs` 配到 600000,未配置则约 45 秒短轮询;ZCode 把 `timeoutMs` 配到 600000,未配置则约 15–20 秒短轮询;Grok Build 官方默认 `tool_timeout_sec` 是 6000,建议显式写成 600,拿不准或调用被掐掉时用约 30–45 秒短轮询;Claude Code 在 `.mcp.json` 里把每服务器 `timeout` 配成 600000(毫秒),CLI 默认很长,桌面端历史上大约 60 秒会掐掉,拿不准时用约 45 秒短轮询。等待期间可以并行做别的事。
4. 调 `get_result`;若 `has_more` 为 true,就继续用 `cursor=next_cursor` 读取并拼接所有分页。然后自己看 `git status` / `git diff`。该编的、该测的你来跑。不要只信 Worker 的自我汇报。Grok 的模型和 effort 以 `get_result.model` / `get_result.observed_model`(以及对应的 effort 字段)为准。`observed_model` 来自 Grok `events.jsonl` 的 `turn_started.model_id`。不要因为 Worker 说「I am Grok 4.6」或引用了 `You are Grok 4.6` 就判定切模型成败——那句横幅是 `/new` 写进系统提示的,`session/setModel` 换采样器时不会改它。Kimi 从不把失败的回合报成失败:它的 ACP 宿主会把失败回合映射成空文本的 `end_turn`,于是配额或服务端报错看起来和干净的空转一模一样。Kimi 交回空回合就要当可疑对待,去看 `get_result.warnings`——Bridge 每轮结束都会读 Kimi 的 `wire.jsonl`,把真实原因放在那里,旁边就是 `observed_model` / `observed_effort`。
5. 验收不通过时,用同一个 `session_id` 再 `dispatch_task`,并列出具体问题。最多跟进三轮。之后你自己改,并告诉用户。
6. 结束后总结 diff、剩余风险、用了哪个 Worker。不再需要时调用 `end_session`。
Expand Down
2 changes: 1 addition & 1 deletion skills/agent-bridge/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Examples: "fix the README typo" → yourself. "Add a None check at line 120" →
## The dispatch loop

1. `dispatch_task` with `cwd` = **this conversation's project folder** (absolute) — never the Agent Bridge install path, never a temp dir. The `message` must be self-contained: background, absolute paths, acceptance criteria, things not to do. Leave `model`/`effort` unset unless you have a reason; slugs and effort mappings per worker are documented in ORCHESTRATION.md in the Agent-Bridge repo.
2. Loop `wait_task` until terminal. A timeout is **not** failure — call it again. `silent_for_sec` in the payload is the time since the worker's last output; a turn silent past `stall_timeout_sec` (default 1800) ends `failed` / `stop_reason="stalled"` — raise that worker's limit in `agents.toml` if the step was legitimately long. Stall counts only worker output; `turn_timeout_sec` (default 0 = off) instead caps a turn's wall-clock and ends `failed` / `timed_out`. A terminal `wait_task` carries `persisted`; `false` means `state.json` could not be written — the result is still valid but may not survive a restart. `files_changed` lists only paths inside the task `cwd`; outside-cwd paths land in `files_outside_cwd` (absolute, capped the same way, `files_outside_cwd_total`). A warning that `session/load` failed and prior context is lost means a fresh native session — re-supply context next message. Size `timeout_sec` under the host MCP tool timeout:
2. Loop `wait_task` until terminal. A timeout is **not** failure — call it again. `silent_for_sec` in the payload is the time since the worker's last output; a turn silent past `stall_timeout_sec` (default 1800) ends `failed` / `stop_reason="stalled"` — raise that worker's limit in `agents.toml` if the step was legitimately long. Stall counts only worker output; `turn_timeout_sec` (default 0 = off) instead caps a turn's wall-clock and ends `failed` / `timed_out`. `dispatch_task` and every terminal task answer (`wait_task` / `check_task` / `get_result` / `cancel_task`) carry `persisted`; `false` means `state.json` could not be written — the answer is still valid but may not survive a restart. `files_changed` lists only paths inside the task `cwd`; outside-cwd paths land in `files_outside_cwd` (absolute, capped the same way, `files_outside_cwd_total`). A warning that `session/load` failed and prior context is lost means a fresh native session — re-supply context next message. Size `timeout_sec` under the host MCP tool timeout:
- Codex: `tool_timeout_sec` 600; default 180 is fine.
- Cursor: host ~45–60 s; pass ~30 and loop.
- Kimi Code: configure `toolTimeoutMs` 600000; otherwise ~45 s polls.
Expand Down
Loading
Loading