commandmate 0.42.2 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +148 -148
- package/.next/app-path-routes-manifest.json +25 -25
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +103 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +104 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +25 -25
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/1990.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +4 -3
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/252.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +3 -3
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5742.js +1 -1
- package/.next/server/chunks/5775.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6491.js +103 -0
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +1 -1
- package/.next/server/chunks/7491.js +3 -0
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8673.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +4 -3
- package/.next/server/chunks/8918.js +5 -5
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/{8052.js → 9353.js} +4 -2
- package/.next/server/chunks/9390.js +3 -0
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/967.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-940df9b11fadafc6.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
- package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
- package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-057c850cd0df978e.js} +1 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
- package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +3 -3
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +23 -149
- package/dist/cli/commands/reply.d.ts +40 -0
- package/dist/cli/commands/reply.d.ts.map +1 -0
- package/dist/cli/commands/reply.js +133 -0
- package/dist/cli/commands/wait.d.ts +5 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +10 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +13 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/utils/reply-ledger.d.ts +95 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
- package/dist/cli/utils/reply-ledger.js +187 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
- package/dist/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
- package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +5 -1
- package/dist/lib/detection/tools/verified-against.d.ts +15 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +17 -1
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +14 -1
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/locales/en/worktree.json +44 -14
- package/dist/server/locales/ja/worktree.json +44 -14
- package/dist/server/server.js +23 -0
- package/dist/server/src/config/cli-tool-timing-config.js +19 -1
- package/dist/server/src/config/detection-evidence-config.js +3 -0
- package/dist/server/src/config/schedule-config.js +55 -1
- package/dist/server/src/lib/auto-yes-poller.js +47 -4
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
- package/dist/server/src/lib/cli-tools/base.js +6 -2
- package/dist/server/src/lib/cli-tools/command-code.js +55 -1
- package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
- package/dist/server/src/lib/cli-tools/index.js +3 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
- package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
- package/dist/server/src/lib/cli-tools/opencode.js +29 -5
- package/dist/server/src/lib/cli-tools/types.js +5 -1
- package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/cmate-validator.js +13 -1
- package/dist/server/src/lib/detection/cli-patterns.js +78 -2
- package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
- package/dist/server/src/lib/detection/status-detector.js +10 -1
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
- package/dist/server/src/lib/detection/tools/registry.js +2 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
- package/dist/server/src/lib/detection/upstream-faults.js +8 -0
- package/dist/server/src/lib/detection/version-probes.js +14 -1
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
- package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
- package/dist/server/src/lib/hooks/sources/registry.js +2 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
- package/dist/server/src/lib/job-executor.js +2 -1
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
- package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
- package/dist/server/src/lib/relay/relay-delivery.js +4 -1
- package/dist/server/src/lib/session/agent-event-state.js +24 -0
- package/dist/server/src/lib/session/claude-executor.js +184 -10
- package/dist/server/src/lib/session/current-output-builder.js +27 -3
- package/dist/server/src/lib/session/send-user-message.js +4 -0
- package/dist/server/src/lib/session/structured-prompt.js +54 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
- package/dist/server/src/lib/tmux/tmux.js +48 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +87 -5
- package/dist/server/src/types/cli-tool-contracts.js +10 -2
- package/dist/types/cli-tool-contracts.d.ts +16 -5
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +10 -2
- package/package.json +2 -1
- package/release-notes/0.43.0.json +130 -0
- package/scripts/hooks/cmate-agent-event.sh +14 -0
- package/scripts/opencode-v2/launch.sh +226 -0
- package/.next/server/chunks/4443.js +0 -3
- package/.next/server/chunks/5164.js +0 -1
- package/.next/server/chunks/650.js +0 -1
- package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
- package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
- package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
- package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
- package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -118,7 +118,7 @@ Works on desktop and mobile — monitor and steer sessions from any browser, inc
|
|
|
118
118
|
| **cmate-orchestrate Skill** | Plans several issues at once and hands each one out with its own contract: `plan` → `dispatch` → `merge` → `uat` | Nothing mutates without `--approve`, and a failed gate stops the run |
|
|
119
119
|
| **Delegation between sessions** | `commandmate ask` puts a question to another session and brings the answer back; `ask --async` with `commandmate relays` when you would rather not wait, `commandmate peers` to see who is reachable, and the `cmate-delegate` Skill for the pattern | One session can hand work to another, and it works across agent CLIs |
|
|
120
120
|
| **Git Worktree Sessions** | One session per worktree, parallel execution | Multiple issues progress simultaneously without interference |
|
|
121
|
-
| **Multi-Agent Support** | Choose Claude Code, Codex, Gemini CLI, Copilot, OpenCode, Antigravity, Command Code or local models per worktree | Pick the right agent for each task |
|
|
121
|
+
| **Multi-Agent Support** | Choose Claude Code, Codex, Gemini CLI, Copilot, OpenCode (1.x and V2), Antigravity, Command Code or local models per worktree | Pick the right agent for each task |
|
|
122
122
|
| **Auto Yes Mode** | Agent runs without stopping for confirmations | Optional unattended mode for trusted workflows — review the Security section before enabling |
|
|
123
123
|
|
|
124
124
|
### Verified, not vibe-checked
|
|
@@ -159,7 +159,7 @@ Works on desktop and mobile — monitor and steer sessions from any browser, inc
|
|
|
159
159
|
All eight are first-class. Each one gets the same treatment inside CommandMate — its own launch path, its own hook source and its own status detection — so the worktree session, the task contract, the verification gates and the evidence trail behave the same way whichever agent you pick.
|
|
160
160
|
|
|
161
161
|
- **Claude Code**, **Codex**, **Gemini CLI**, **Copilot**, **Antigravity** — choose per worktree, per task.
|
|
162
|
-
- **OpenCode** — the open-source terminal agent, driven through the same contract-and-gate path as the rest.
|
|
162
|
+
- **OpenCode (1.x and V2)** — the open-source terminal agent, driven through the same contract-and-gate path as the rest. OpenCode V2 (`opencode2`) is counted with 1.x as one agent and can run next to it; see the [OpenCode V2 guide](./docs/en/user-guide/opencode-v2.md).
|
|
163
163
|
- **Command Code** — driven the same way, its hooks and its transcript included.
|
|
164
164
|
- **Local models** (`vibe-local`) — the same worktree session, contract and gates, against a model you host yourself.
|
|
165
165
|
|
|
@@ -594,7 +594,7 @@ The comparison that matters is not against other products; it is against the way
|
|
|
594
594
|
| Evidence | A chat transcript | Commits, gate logs, `verify history`, `report metrics` |
|
|
595
595
|
| Parallel work | Terminal tabs | One worktree and one contract per task |
|
|
596
596
|
| When it stops | You notice, eventually | Waiting is surfaced: badge, toast, tab title, push |
|
|
597
|
-
| Which agent | Locked to one | Claude Code, Codex, Gemini CLI, Copilot, OpenCode, Antigravity, Command Code, local models |
|
|
597
|
+
| Which agent | Locked to one | Claude Code, Codex, Gemini CLI, Copilot, OpenCode (1.x and V2), Antigravity, Command Code, local models |
|
|
598
598
|
|
|
599
599
|
</details>
|
|
600
600
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4LpC,wBAAgB,gBAAgB,IAAI,OAAO,CA0O1C"}
|
package/dist/cli/commands/ask.js
CHANGED
|
@@ -36,6 +36,7 @@ const commander_1 = require("commander");
|
|
|
36
36
|
const types_1 = require("../types");
|
|
37
37
|
const api_client_1 = require("../utils/api-client");
|
|
38
38
|
const command_helpers_1 = require("../utils/command-helpers");
|
|
39
|
+
const reply_ledger_1 = require("../utils/reply-ledger");
|
|
39
40
|
const cli_tool_ids_1 = require("../config/cli-tool-ids");
|
|
40
41
|
const agent_target_options_1 = require("../config/agent-target-options");
|
|
41
42
|
const instances_1 = require("./instances");
|
|
@@ -52,60 +53,8 @@ const relays_1 = require("./relays");
|
|
|
52
53
|
const PROMPT_WAITING_CODE = 'PROMPT_WAITING';
|
|
53
54
|
/** Default `--timeout`, in seconds. Matches the GUI's delegation brief. */
|
|
54
55
|
const DEFAULT_ASK_TIMEOUT_SECONDS = 1800;
|
|
55
|
-
/**
|
|
56
|
-
* Chat rows read back after the turn.
|
|
57
|
-
*
|
|
58
|
-
* Bounded because only the tail matters and an unbounded read of a long-running
|
|
59
|
-
* worktree's history is a large response for one line of answer. Generous
|
|
60
|
-
* enough that a turn which wrote several assistant rows (a tool-use narration
|
|
61
|
-
* followed by the summary) still has its last one inside the window.
|
|
62
|
-
*/
|
|
63
|
-
const REPLY_LOOKBACK_MESSAGES = 30;
|
|
64
56
|
/** Squeezed pane lines kept for the fallback reply. */
|
|
65
57
|
const PANE_FALLBACK_TAIL = 80;
|
|
66
|
-
/**
|
|
67
|
-
* The `request_id` namespace every transcript reader mints for a turn.
|
|
68
|
-
*
|
|
69
|
-
* `codex-turn:<turn_id>`, `claude-turn:<uuid>`, `antigravity-turn:<id>`,
|
|
70
|
-
* `command-code-turn:<id>` and opencode's `oc-turn:<msg id>` — mirrored here as
|
|
71
|
-
* a shape rather than imported, for the reason {@link PROMPT_WAITING_CODE}
|
|
72
|
-
* gives: the CLI bundle keeps its own copies of API strings instead of pulling
|
|
73
|
-
* `src/types/agent-transcript.ts` and its dependents into `build:cli`. Matching
|
|
74
|
-
* the shape rather than a list of five literals is also what stops the sixth
|
|
75
|
-
* reader from silently landing outside the filter.
|
|
76
|
-
*
|
|
77
|
-
* A `:` cannot appear in any of the ids themselves, so this cannot match a row
|
|
78
|
-
* that merely CONTAINS the text.
|
|
79
|
-
*/
|
|
80
|
-
const TURN_REQUEST_ID_PATTERN = /-turn:/;
|
|
81
|
-
/**
|
|
82
|
-
* Request-id namespaces CommandMate writes about a session, not for it.
|
|
83
|
-
*
|
|
84
|
-
* `chat_messages` has no `system` role, so "the model changed" (Issue #2357)
|
|
85
|
-
* and "reply from X" (Issue #2377) are both stored as ASSISTANT rows and told
|
|
86
|
-
* apart by their request id. Neither is anything the other session said, and
|
|
87
|
-
* delivering the relay notice back as an answer is the smallest possible loop —
|
|
88
|
-
* `findWorkerReply` steps over the same rows for the same reason.
|
|
89
|
-
*/
|
|
90
|
-
const SYSTEM_ROW_REQUEST_ID_PREFIXES = ['relay-sys:', 'model-changed:'];
|
|
91
|
-
/**
|
|
92
|
-
* Tools whose reply CommandMate reads out of a transcript rather than a screen.
|
|
93
|
-
*
|
|
94
|
-
* For these five the ledger is authoritative and a row with no turn marker is
|
|
95
|
-
* by definition not the answer, so `ask` may hold out for a marked one. For
|
|
96
|
-
* every other tool (copilot / gemini / vibe-local) the scraper's row is the
|
|
97
|
-
* only record there will ever be, and demanding a marker would throw away a
|
|
98
|
-
* cleaned reply in favour of the raw pane.
|
|
99
|
-
*
|
|
100
|
-
* Mirrors the five readers that live under `src/lib/hooks/sources/`.
|
|
101
|
-
*/
|
|
102
|
-
const TRANSCRIPT_READER_TOOLS = new Set([
|
|
103
|
-
'claude',
|
|
104
|
-
'codex',
|
|
105
|
-
'antigravity',
|
|
106
|
-
'command-code',
|
|
107
|
-
'opencode',
|
|
108
|
-
]);
|
|
109
58
|
/**
|
|
110
59
|
* How long `ask` will hold out for the turn row after the turn ends.
|
|
111
60
|
*
|
|
@@ -123,90 +72,10 @@ const TRANSCRIPT_READER_TOOLS = new Set([
|
|
|
123
72
|
const REPLY_TURN_ROW_GRACE_MS = 15_000;
|
|
124
73
|
/** How often the grace above re-reads the ledger. */
|
|
125
74
|
const REPLY_TURN_ROW_POLL_MS = 1_000;
|
|
126
|
-
/**
|
|
127
|
-
* ANSI escape sequences, as a pattern built from escapes rather than literals.
|
|
128
|
-
*
|
|
129
|
-
* `scripts/check-control-chars.mjs` fails the build on a raw C0 byte in `src/`
|
|
130
|
-
* (Issue #1432), and a raw ESC here would be one.
|
|
131
|
-
*/
|
|
132
|
-
const ANSI_ESCAPE_PATTERN = /[\u001B\u009B][[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PR-TZcf-nqry=><]/g;
|
|
133
|
-
/** Remaining C0/C1 control bytes, once the sequences above are gone. */
|
|
134
|
-
const CONTROL_CHAR_PATTERN = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g;
|
|
135
75
|
/** Sleep, for the grace window above. */
|
|
136
76
|
function sleep(ms) {
|
|
137
77
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
138
78
|
}
|
|
139
|
-
/**
|
|
140
|
-
* A reply body fit to print, or `''` if nothing survived.
|
|
141
|
-
*
|
|
142
|
-
* Issue #2386 asked for this as a belt to the braces: the row the junk came
|
|
143
|
-
* from held RAW ANSI, and a caller that pipes `ask` into a report or a commit
|
|
144
|
-
* message should never have to strip escape codes out of an agent's sentence.
|
|
145
|
-
* Applied to the pane fallback as well as to the ledger, because the pane is
|
|
146
|
-
* the more likely of the two to carry them.
|
|
147
|
-
*
|
|
148
|
-
* @param raw - Reply text as it arrived
|
|
149
|
-
*/
|
|
150
|
-
function sanitizeReply(raw) {
|
|
151
|
-
return raw.replace(ANSI_ESCAPE_PATTERN, '').replace(CONTROL_CHAR_PATTERN, '').trim();
|
|
152
|
-
}
|
|
153
|
-
/** Whether a row's `request_id` says a transcript reader wrote it. */
|
|
154
|
-
function isTurnRow(requestId) {
|
|
155
|
-
return typeof requestId === 'string' && TURN_REQUEST_ID_PATTERN.test(requestId);
|
|
156
|
-
}
|
|
157
|
-
/** Whether a row is CommandMate's own furniture rather than the agent's words. */
|
|
158
|
-
function isSystemRow(requestId) {
|
|
159
|
-
return typeof requestId === 'string'
|
|
160
|
-
&& SYSTEM_ROW_REQUEST_ID_PREFIXES.some((prefix) => requestId.startsWith(prefix));
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* The rows that could be this turn's reply, oldest first.
|
|
164
|
-
*
|
|
165
|
-
* @param messages - Rows as the messages route serialized them
|
|
166
|
-
* @param since - Epoch ms taken immediately before the send
|
|
167
|
-
*/
|
|
168
|
-
function replyCandidates(messages, since) {
|
|
169
|
-
const candidates = [];
|
|
170
|
-
for (const m of messages) {
|
|
171
|
-
if (m.role !== 'assistant')
|
|
172
|
-
continue;
|
|
173
|
-
if (m.messageType === 'prompt')
|
|
174
|
-
continue;
|
|
175
|
-
if (typeof m.content !== 'string')
|
|
176
|
-
continue;
|
|
177
|
-
if (!(Date.parse(m.timestamp) >= since))
|
|
178
|
-
continue;
|
|
179
|
-
if (isSystemRow(m.requestId))
|
|
180
|
-
continue;
|
|
181
|
-
const content = sanitizeReply(m.content);
|
|
182
|
-
if (content === '')
|
|
183
|
-
continue;
|
|
184
|
-
candidates.push({ content, fromTranscript: isTurnRow(m.requestId) });
|
|
185
|
-
}
|
|
186
|
-
return candidates;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* The recent chat rows for this instance, or null if they cannot be read.
|
|
190
|
-
*
|
|
191
|
-
* @param client - API client
|
|
192
|
-
* @param worktreeId - Worktree ID
|
|
193
|
-
* @param instanceId - Resolved instance ID
|
|
194
|
-
*/
|
|
195
|
-
async function fetchRecentMessages(client, worktreeId, instanceId) {
|
|
196
|
-
const query = new URLSearchParams({ limit: String(REPLY_LOOKBACK_MESSAGES) });
|
|
197
|
-
if (instanceId)
|
|
198
|
-
query.set('instance', instanceId);
|
|
199
|
-
try {
|
|
200
|
-
// PromptMessageResponse is the CLI's mirror of a serialized chat row; the
|
|
201
|
-
// `messageType: 'prompt'` filter is the caller's, not the type's, so it is
|
|
202
|
-
// the right shape for reading normal rows too.
|
|
203
|
-
const messages = await client.get(`/api/worktrees/${worktreeId}/messages?${query.toString()}`);
|
|
204
|
-
return Array.isArray(messages) ? messages : null;
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
79
|
/**
|
|
211
80
|
* Parse and validate `--timeout <seconds>`.
|
|
212
81
|
*
|
|
@@ -265,24 +134,16 @@ function parseTimeout(raw) {
|
|
|
265
134
|
* @param cliToolId - Resolved CLI tool, when one is known
|
|
266
135
|
*/
|
|
267
136
|
async function readLatestReply(client, worktreeId, instanceId, since, cliToolId) {
|
|
268
|
-
const requireTurnRow = cliToolId !== undefined && TRANSCRIPT_READER_TOOLS.has(cliToolId);
|
|
137
|
+
const requireTurnRow = cliToolId !== undefined && reply_ledger_1.TRANSCRIPT_READER_TOOLS.has(cliToolId);
|
|
269
138
|
const deadline = Date.now() + (requireTurnRow ? REPLY_TURN_ROW_GRACE_MS : 0);
|
|
270
139
|
for (;;) {
|
|
271
|
-
const messages = await fetchRecentMessages(client, worktreeId, instanceId);
|
|
272
|
-
|
|
273
|
-
//
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
if (!requireTurnRow) {
|
|
280
|
-
// Unchanged behaviour for a tool with no transcript: the newest row after
|
|
281
|
-
// the send, marker or not.
|
|
282
|
-
const newest = candidates[candidates.length - 1];
|
|
283
|
-
return newest ? newest.content : null;
|
|
284
|
-
}
|
|
285
|
-
if (Date.now() >= deadline)
|
|
140
|
+
const messages = await (0, reply_ledger_1.fetchRecentMessages)(client, worktreeId, instanceId);
|
|
141
|
+
// The rules are `reply`'s too (Issue #3039). A tool with no transcript
|
|
142
|
+
// takes the newest row after the send, marker or not, with no wait.
|
|
143
|
+
const reply = (0, reply_ledger_1.pickLatestReply)((0, reply_ledger_1.replyCandidates)(messages ?? [], since), requireTurnRow);
|
|
144
|
+
if (reply)
|
|
145
|
+
return reply.content;
|
|
146
|
+
if (!requireTurnRow || Date.now() >= deadline)
|
|
286
147
|
return null;
|
|
287
148
|
await sleep(REPLY_TURN_ROW_POLL_MS);
|
|
288
149
|
}
|
|
@@ -332,6 +193,9 @@ Exit codes (wait's, unchanged; --async always exits 0 once the relay exists):
|
|
|
332
193
|
(same shape as \`wait --on-prompt agent\`). Report it; do NOT answer it
|
|
333
194
|
with \`respond\` on the other session's behalf — the number that resolves
|
|
334
195
|
a dialog is the dialog's own, and a wrong one picks the default (#1681).
|
|
196
|
+
11 the turn never ran: an upstream fault is on the screen. stderr and --json
|
|
197
|
+
name it (id=...). id=context-limit: the conversation is over the model's
|
|
198
|
+
limit; \`instances <id> kill <instance>\` and ask again in a fresh session
|
|
335
199
|
21 nothing was running to ask
|
|
336
200
|
124 timed out. Look with \`capture <id> --instance <id> --pane --tail 60\`
|
|
337
201
|
|
|
@@ -453,6 +317,8 @@ a decision about that session's guard rails, not part of asking it a question.
|
|
|
453
317
|
timeout,
|
|
454
318
|
instance: instanceId,
|
|
455
319
|
token: options.token,
|
|
320
|
+
// Always on (Issue #3011): a turn that never ran must not read as a reply.
|
|
321
|
+
failOnUpstreamFault: true,
|
|
456
322
|
});
|
|
457
323
|
if (result.exitCode !== types_1.WaitExitCode.SUCCESS) {
|
|
458
324
|
// Same stdout contract as `wait`: the prompt payload, and nothing
|
|
@@ -460,6 +326,14 @@ a decision about that session's guard rails, not part of asking it a question.
|
|
|
460
326
|
if (result.output) {
|
|
461
327
|
console.log(JSON.stringify(result.output));
|
|
462
328
|
}
|
|
329
|
+
if (result.upstreamFault && options.json) {
|
|
330
|
+
console.log(JSON.stringify({
|
|
331
|
+
worktreeId,
|
|
332
|
+
instanceId: instanceId ?? null,
|
|
333
|
+
cliToolId: agent ?? null,
|
|
334
|
+
upstreamFault: result.upstreamFault,
|
|
335
|
+
}, null, 2));
|
|
336
|
+
}
|
|
463
337
|
process.exit(result.exitCode);
|
|
464
338
|
return;
|
|
465
339
|
}
|
|
@@ -468,7 +342,7 @@ a decision about that session's guard rails, not part of asking it a question.
|
|
|
468
342
|
if (reply === null && agent) {
|
|
469
343
|
source = 'pane';
|
|
470
344
|
const pane = await readPaneTail(client, worktreeId, agent, instanceId);
|
|
471
|
-
const cleaned = pane === null ? '' : sanitizeReply(pane);
|
|
345
|
+
const cleaned = pane === null ? '' : (0, reply_ledger_1.sanitizeReply)(pane);
|
|
472
346
|
reply = cleaned === '' ? null : cleaned;
|
|
473
347
|
}
|
|
474
348
|
if (reply === null) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reply Command - read an agent session's latest reply (Issue #3039)
|
|
3
|
+
*
|
|
4
|
+
* commandmate reply <worktree-id> [--instance <id|alias>] [--agent <tool>]
|
|
5
|
+
* [--since <iso8601>] [--json]
|
|
6
|
+
*
|
|
7
|
+
* ## Why this exists next to ask / capture
|
|
8
|
+
*
|
|
9
|
+
* `ask` reads the reply to the turn IT sent. A supervisor that nudged a worker
|
|
10
|
+
* with a plain `send` ("stop and report") had no way to read the answer short
|
|
11
|
+
* of opening the tool's transcript file itself — which works for Claude, whose
|
|
12
|
+
* path is computable from the cwd, and not for Command Code, whose project slug
|
|
13
|
+
* is not. `capture` is no substitute: the pane also holds the nudge's own echo,
|
|
14
|
+
* and a pane line cannot be attributed to a turn.
|
|
15
|
+
*
|
|
16
|
+
* The server already has the reply: the transcript readers write each turn into
|
|
17
|
+
* the chat ledger keyed `<tool>-turn:<id>`, and `ask` reads it from there. This
|
|
18
|
+
* command is that read on its own, through the same shared rules
|
|
19
|
+
* (`utils/reply-ledger`), so the two can never disagree about what a reply is.
|
|
20
|
+
*
|
|
21
|
+
* ## What it deliberately does not do
|
|
22
|
+
*
|
|
23
|
+
* - No pane fallback. A row off the screen is exactly what cannot be attributed
|
|
24
|
+
* to a turn; returning it would re-introduce the problem this command solves.
|
|
25
|
+
* Only transcript-reader rows count, for every tool.
|
|
26
|
+
* - No wait. It is one read; "no reply yet" is an answer (exit 0, empty stdout,
|
|
27
|
+
* `reply: null`), not an error, so a caller can poll or give up on its terms.
|
|
28
|
+
*/
|
|
29
|
+
import { Command } from 'commander';
|
|
30
|
+
/** The `--json` payload. `reply` is null when there is no reply yet. */
|
|
31
|
+
export interface ReplyJsonPayload {
|
|
32
|
+
worktreeId: string;
|
|
33
|
+
instanceId: string | null;
|
|
34
|
+
cliToolId: string | null;
|
|
35
|
+
reply: string | null;
|
|
36
|
+
requestId: string | null;
|
|
37
|
+
at: string | null;
|
|
38
|
+
}
|
|
39
|
+
export declare function createReplyCommand(): Command;
|
|
40
|
+
//# sourceMappingURL=reply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAuBD,wBAAgB,kBAAkB,IAAI,OAAO,CA8E5C"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* reply Command - read an agent session's latest reply (Issue #3039)
|
|
4
|
+
*
|
|
5
|
+
* commandmate reply <worktree-id> [--instance <id|alias>] [--agent <tool>]
|
|
6
|
+
* [--since <iso8601>] [--json]
|
|
7
|
+
*
|
|
8
|
+
* ## Why this exists next to ask / capture
|
|
9
|
+
*
|
|
10
|
+
* `ask` reads the reply to the turn IT sent. A supervisor that nudged a worker
|
|
11
|
+
* with a plain `send` ("stop and report") had no way to read the answer short
|
|
12
|
+
* of opening the tool's transcript file itself — which works for Claude, whose
|
|
13
|
+
* path is computable from the cwd, and not for Command Code, whose project slug
|
|
14
|
+
* is not. `capture` is no substitute: the pane also holds the nudge's own echo,
|
|
15
|
+
* and a pane line cannot be attributed to a turn.
|
|
16
|
+
*
|
|
17
|
+
* The server already has the reply: the transcript readers write each turn into
|
|
18
|
+
* the chat ledger keyed `<tool>-turn:<id>`, and `ask` reads it from there. This
|
|
19
|
+
* command is that read on its own, through the same shared rules
|
|
20
|
+
* (`utils/reply-ledger`), so the two can never disagree about what a reply is.
|
|
21
|
+
*
|
|
22
|
+
* ## What it deliberately does not do
|
|
23
|
+
*
|
|
24
|
+
* - No pane fallback. A row off the screen is exactly what cannot be attributed
|
|
25
|
+
* to a turn; returning it would re-introduce the problem this command solves.
|
|
26
|
+
* Only transcript-reader rows count, for every tool.
|
|
27
|
+
* - No wait. It is one read; "no reply yet" is an answer (exit 0, empty stdout,
|
|
28
|
+
* `reply: null`), not an error, so a caller can poll or give up on its terms.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.createReplyCommand = createReplyCommand;
|
|
32
|
+
const commander_1 = require("commander");
|
|
33
|
+
const types_1 = require("../types");
|
|
34
|
+
const api_client_1 = require("../utils/api-client");
|
|
35
|
+
const command_helpers_1 = require("../utils/command-helpers");
|
|
36
|
+
const cli_tool_ids_1 = require("../config/cli-tool-ids");
|
|
37
|
+
const agent_target_options_1 = require("../config/agent-target-options");
|
|
38
|
+
const instances_1 = require("./instances");
|
|
39
|
+
const reply_ledger_1 = require("../utils/reply-ledger");
|
|
40
|
+
/**
|
|
41
|
+
* A date-time that starts with a calendar date. Date.parse alone would also
|
|
42
|
+
* take "1" or "Sep 30", which is a typo more often than an intent.
|
|
43
|
+
*/
|
|
44
|
+
const ISO_DATE_PREFIX = /^\d{4}-\d{2}-\d{2}/;
|
|
45
|
+
/**
|
|
46
|
+
* Parse `--since <iso8601>` into epoch ms. No value means "any time".
|
|
47
|
+
*
|
|
48
|
+
* @param raw - Raw option value, if the user passed one
|
|
49
|
+
*/
|
|
50
|
+
function parseSince(raw) {
|
|
51
|
+
if (raw === undefined)
|
|
52
|
+
return Number.NEGATIVE_INFINITY;
|
|
53
|
+
const value = Date.parse(raw);
|
|
54
|
+
if (!ISO_DATE_PREFIX.test(raw) || !Number.isFinite(value)) {
|
|
55
|
+
console.error('Error: --since must be an ISO 8601 date-time (e.g. 2026-09-30T12:00:00Z).');
|
|
56
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
function createReplyCommand() {
|
|
61
|
+
const cmd = new commander_1.Command('reply');
|
|
62
|
+
cmd
|
|
63
|
+
.description('Print the latest reply an agent session wrote (from its transcript; '
|
|
64
|
+
+ 'exit 0 with empty stdout when there is none yet)')
|
|
65
|
+
.argument('<worktree-id>', 'Worktree ID')
|
|
66
|
+
.option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
|
|
67
|
+
.option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
|
|
68
|
+
.option('--since <iso8601>', 'Only a reply written at or after this time')
|
|
69
|
+
.option('--json', 'Print { worktreeId, instanceId, cliToolId, reply, requestId, at }')
|
|
70
|
+
.option('--token <token>', command_helpers_1.TOKEN_WARNING)
|
|
71
|
+
.addHelpText('after', `
|
|
72
|
+
Only rows a transcript reader wrote (<tool>-turn:<id>) count as a reply, the
|
|
73
|
+
same rule \`ask\` uses; the pane is never read. Tools with a transcript reader:
|
|
74
|
+
claude, codex, antigravity, command-code, opencode.
|
|
75
|
+
|
|
76
|
+
No reply yet (or none after --since) is not an error: stdout is empty, stderr
|
|
77
|
+
says so in one line, and the exit code is 0. --json prints "reply": null.
|
|
78
|
+
`)
|
|
79
|
+
.action(async (worktreeId, options) => {
|
|
80
|
+
try {
|
|
81
|
+
if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
|
|
82
|
+
console.error('Error: Invalid worktree ID format.');
|
|
83
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
84
|
+
}
|
|
85
|
+
if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
|
|
86
|
+
console.error(`Error: Invalid agent. Must be one of: ${cli_tool_ids_1.CLI_TOOL_IDS.join(', ')}`);
|
|
87
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
88
|
+
}
|
|
89
|
+
if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
|
|
90
|
+
console.error(instances_1.INSTANCE_SELECTOR_ERROR);
|
|
91
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
92
|
+
}
|
|
93
|
+
const since = parseSince(options.since);
|
|
94
|
+
const client = new api_client_1.ApiClient({ token: options.token });
|
|
95
|
+
// Resolved exactly as `ask` resolves it: `--agent` alone names that
|
|
96
|
+
// tool's primary instance (Issue #2479).
|
|
97
|
+
const selector = options.instance ?? options.agent;
|
|
98
|
+
const target = selector
|
|
99
|
+
? await (0, instances_1.resolveInstanceTarget)(client, worktreeId, selector, options.agent)
|
|
100
|
+
: null;
|
|
101
|
+
const cliToolId = target ? target.cliToolId : options.agent;
|
|
102
|
+
const instanceId = target?.instanceId;
|
|
103
|
+
// Unlike `ask`, a failed read is not swallowed: there is no turn this
|
|
104
|
+
// command completed that a fallback would be protecting.
|
|
105
|
+
const messages = await (0, reply_ledger_1.requestRecentMessages)(client, worktreeId, instanceId);
|
|
106
|
+
const latest = (0, reply_ledger_1.pickLatestReply)((0, reply_ledger_1.replyCandidates)(messages, since), true);
|
|
107
|
+
if (options.json) {
|
|
108
|
+
const payload = {
|
|
109
|
+
worktreeId,
|
|
110
|
+
instanceId: instanceId ?? null,
|
|
111
|
+
cliToolId: cliToolId ?? null,
|
|
112
|
+
reply: latest?.content ?? null,
|
|
113
|
+
requestId: latest?.requestId ?? null,
|
|
114
|
+
at: latest?.at ?? null,
|
|
115
|
+
};
|
|
116
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
117
|
+
}
|
|
118
|
+
else if (latest) {
|
|
119
|
+
console.log(latest.content);
|
|
120
|
+
}
|
|
121
|
+
if (!latest) {
|
|
122
|
+
console.error(options.since
|
|
123
|
+
? `No reply since ${options.since} (no transcript row yet).`
|
|
124
|
+
: 'No reply yet (no transcript row yet).');
|
|
125
|
+
}
|
|
126
|
+
process.exit(types_1.ExitCode.SUCCESS);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
(0, command_helpers_1.handleCommandError)(error);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return cmd;
|
|
133
|
+
}
|
|
@@ -124,6 +124,11 @@ export interface PollWorktreeOptions extends WaitOptions {
|
|
|
124
124
|
export declare function pollWorktree(client: ApiClient, worktreeId: string, options: PollWorktreeOptions): Promise<{
|
|
125
125
|
exitCode: number;
|
|
126
126
|
output?: WaitPromptOutput;
|
|
127
|
+
/** Set with exit 11: which upstream fault was on the frame (Issue #3011). */
|
|
128
|
+
upstreamFault?: {
|
|
129
|
+
id: string;
|
|
130
|
+
matchedText: string;
|
|
131
|
+
};
|
|
127
132
|
}>;
|
|
128
133
|
export declare function createWaitCommand(): Command;
|
|
129
134
|
//# sourceMappingURL=wait.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAMV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAA+B,MAAM,qBAAqB,CAAC;AAwD7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAIvD,CAAC;AA2WH;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAEhE;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB,QAAiB,CAAC;AA2JlD;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAMV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAA+B,MAAM,qBAAqB,CAAC;AAwD7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAIvD,CAAC;AA2WH;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAEhE;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB,QAAiB,CAAC;AA2JlD;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,6EAA6E;IAC7E,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD,CAAC,CA2gBD;AAwKD,wBAAgB,iBAAiB,IAAI,OAAO,CAqM3C"}
|
|
@@ -1019,7 +1019,16 @@ async function pollWorktree(client, worktreeId, options) {
|
|
|
1019
1019
|
console.error(`Upstream fault on ${worktreeId}: id=${fault.id} — the agent is back at its ` +
|
|
1020
1020
|
'composer with an upstream API failure on screen, so this turn did not run. ' +
|
|
1021
1021
|
`Matched: ${JSON.stringify(fault.matchedText)}`);
|
|
1022
|
-
|
|
1022
|
+
if (fault.id === 'context-limit') {
|
|
1023
|
+
// A retry into the same session hits the same wall (Issue #3011).
|
|
1024
|
+
console.error('The session\'s conversation is over the model\'s context limit. Start a fresh ' +
|
|
1025
|
+
`session and send again: commandmate instances ${worktreeId} kill ` +
|
|
1026
|
+
`${options.instance ?? '<instance>'}`);
|
|
1027
|
+
}
|
|
1028
|
+
return {
|
|
1029
|
+
exitCode: types_1.WaitExitCode.UPSTREAM_FAULT,
|
|
1030
|
+
upstreamFault: { id: fault.id, matchedText: fault.matchedText },
|
|
1031
|
+
};
|
|
1023
1032
|
}
|
|
1024
1033
|
// Issue #1839: `ready` off the terminal frame is the agent's composer,
|
|
1025
1034
|
// not the agent's verdict. Measured 2026-08-20 against a stub upstream
|