commandmate 0.49.1 → 0.49.2
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 +128 -132
- package/.next/app-path-routes-manifest.json +22 -22
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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_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_client-reference-manifest.js +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 +2 -2
- 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.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/[relayId]/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_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_client-reference-manifest.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.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.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.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.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.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 +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.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 +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 +2 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +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.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.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.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +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]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.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 -1
- 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 +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 +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 +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 +2 -2
- 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 +3 -3
- 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.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_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.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 +2 -2
- 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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +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.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.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.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.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 +2 -2
- 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 +22 -22
- package/.next/server/chunks/1062.js +1 -0
- package/.next/server/chunks/110.js +1 -0
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/3756.js +1 -0
- package/.next/server/chunks/3801.js +3 -3
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7023.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +15 -15
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9731.js +2 -2
- 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/{2407-675ba6b21844dc3b.js → 2407-07a237575e1ceb9e.js} +1 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/{page-f6d3ab8185d93aae.js → page-33afc6aa96289fb0.js} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +56 -5
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +17 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +14 -8
- package/dist/cli/commands/relays.d.ts +2 -1
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +4 -3
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +22 -5
- package/dist/cli/commands/respond.d.ts +2 -2
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +40 -37
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +8 -4
- package/dist/cli/commands/wait-instance.d.ts +9 -1
- package/dist/cli/commands/wait-instance.d.ts.map +1 -1
- package/dist/cli/commands/wait-instance.js +15 -0
- package/dist/cli/commands/wait-poll-state.d.ts +18 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.d.ts +2 -1
- package/dist/cli/commands/wait-verify.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.js +5 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +37 -13
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +1 -0
- package/dist/cli/types/api-responses.d.ts +3 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +55 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +220 -18
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +1 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +7 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/session/send-attempt-types.d.ts +25 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +10 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +2 -0
- package/dist/server/locales/ja/worktree.json +2 -0
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +5 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/codex.js +7 -4
- package/dist/server/src/lib/cli-tools/command-code.js +7 -3
- package/dist/server/src/lib/cli-tools/copilot.js +5 -3
- package/dist/server/src/lib/cli-tools/gemini.js +10 -2
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +5 -2
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +16 -6
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +164 -7
- package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/prompt-answer-errors.js +76 -2
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
- package/dist/server/src/lib/session/claude-session.js +22 -6
- package/dist/server/src/lib/session/current-output-builder.js +5 -3
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
- package/dist/server/src/lib/session/send-attempt-state.js +48 -0
- package/dist/server/src/lib/session/send-attempt-types.js +10 -1
- package/dist/server/src/lib/session/send-user-message.js +5 -4
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +12 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +0 -27
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.2.json +49 -0
- package/.next/server/chunks/3773.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/7604.js +0 -2
- package/.next/static/chunks/3931-1a1abab16248f14d.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-ce17ffa77f39608e.js +0 -1
- package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
|
@@ -9,12 +9,14 @@
|
|
|
9
9
|
* - ApiClient: HTTP get/post with base URL and auth headers
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ApiError = exports.ApiClient = exports.FOREIGN_SESSION_ERROR_CODE = exports.MAX_STOP_PATTERN_LENGTH = void 0;
|
|
12
|
+
exports.DeadlineExceededError = exports.ApiError = exports.ApiClient = exports.FOREIGN_SESSION_ERROR_CODE = exports.MAX_STOP_PATTERN_LENGTH = void 0;
|
|
13
13
|
exports.isValidWorktreeId = isValidWorktreeId;
|
|
14
14
|
exports.isValidInstanceId = isValidInstanceId;
|
|
15
15
|
exports.resolveAuthToken = resolveAuthToken;
|
|
16
16
|
exports.foreignSessionMessage = foreignSessionMessage;
|
|
17
17
|
exports.handleApiError = handleApiError;
|
|
18
|
+
exports.isDeadlineExceeded = isDeadlineExceeded;
|
|
19
|
+
exports.rethrowIfDeadlineExceeded = rethrowIfDeadlineExceeded;
|
|
18
20
|
exports.assertResponseShape = assertResponseShape;
|
|
19
21
|
exports.fetchDaemonVersion = fetchDaemonVersion;
|
|
20
22
|
exports.warnIfVersionSkew = warnIfVersionSkew;
|
|
@@ -255,6 +257,8 @@ function isLocalhost(url) {
|
|
|
255
257
|
class ApiClient {
|
|
256
258
|
baseUrl;
|
|
257
259
|
token;
|
|
260
|
+
/** Epoch ms after which every request of this client fails (Issue #3983). */
|
|
261
|
+
deadlineAt;
|
|
258
262
|
constructor(options) {
|
|
259
263
|
// Issue #1743: resolve through loadClientEnv() rather than `process.env.CM_PORT || '3000'`.
|
|
260
264
|
// Reading process.env alone ignored ~/.commandmate/.env, so with two servers running,
|
|
@@ -289,6 +293,51 @@ class ApiClient {
|
|
|
289
293
|
get serverUrl() {
|
|
290
294
|
return this.baseUrl;
|
|
291
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* This client with every request bounded by `deadlineAt` (Issue #3983).
|
|
298
|
+
*
|
|
299
|
+
* `wait` / `ask` / `verify` take `--timeout` as the deadline of the whole
|
|
300
|
+
* command, but only the poll's own reads were bounded by it: a task-ledger
|
|
301
|
+
* read, an `--instance` resolution or a capability probe before the poll had
|
|
302
|
+
* no deadline at all, so a server that stopped answering held the command for
|
|
303
|
+
* as long as undici's own timeouts (minutes) and then, swallowed into a
|
|
304
|
+
* degraded path, kept it going. The derived client carries one deadline for
|
|
305
|
+
* every method (`get` / `post` / `patch` / `rawGet`), and a request it ends
|
|
306
|
+
* fails with {@link DeadlineExceededError} — exit 124 — which the
|
|
307
|
+
* degrade-on-failure catches rethrow ({@link isDeadlineExceeded}).
|
|
308
|
+
*
|
|
309
|
+
* One request lasts until its body has been read (`json()` / `text()`), the
|
|
310
|
+
* body of a {@link rawGet} response included: a server that sends headers and
|
|
311
|
+
* then stalls the body is not an answer.
|
|
312
|
+
*
|
|
313
|
+
* @param deadlineAt - Epoch ms; undefined returns this client unchanged
|
|
314
|
+
* @returns A client sharing this one's server and token
|
|
315
|
+
*/
|
|
316
|
+
withDeadline(deadlineAt) {
|
|
317
|
+
if (deadlineAt === undefined || !Number.isFinite(deadlineAt))
|
|
318
|
+
return this;
|
|
319
|
+
// Not `new ApiClient(...)`: the constructor re-resolves the endpoint and
|
|
320
|
+
// re-prints the --token warning, and the derived client must dial the very
|
|
321
|
+
// server this one does.
|
|
322
|
+
const derived = Object.create(Object.getPrototypeOf(this));
|
|
323
|
+
derived.baseUrl = this.baseUrl;
|
|
324
|
+
derived.token = this.token;
|
|
325
|
+
derived.deadlineAt = deadlineAt;
|
|
326
|
+
return derived;
|
|
327
|
+
}
|
|
328
|
+
/** The deadline this client carries, if any (Issue #3983). */
|
|
329
|
+
get deadline() {
|
|
330
|
+
return this.deadlineAt;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* The bound of one request: a signal that fires at the deadline (combined
|
|
334
|
+
* with the caller's own, when it gave one), or null without a deadline.
|
|
335
|
+
*/
|
|
336
|
+
startDeadline(callerSignal) {
|
|
337
|
+
if (this.deadlineAt === undefined)
|
|
338
|
+
return null;
|
|
339
|
+
return startRequestDeadline(this.deadlineAt, this.baseUrl, callerSignal);
|
|
340
|
+
}
|
|
292
341
|
getHeaders() {
|
|
293
342
|
const headers = {
|
|
294
343
|
'Content-Type': 'application/json',
|
|
@@ -314,11 +363,28 @@ class ApiClient {
|
|
|
314
363
|
* @returns The raw Response, whatever its status
|
|
315
364
|
*/
|
|
316
365
|
async rawGet(path, init) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
366
|
+
const deadline = this.startDeadline();
|
|
367
|
+
if (!deadline) {
|
|
368
|
+
return fetch(`${this.baseUrl}${path}`, {
|
|
369
|
+
method: 'GET',
|
|
370
|
+
headers: { ...this.getHeaders(), ...(init?.headers ?? {}) },
|
|
371
|
+
redirect: 'manual',
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Issue #3983: the caller reads the body, so the deadline is not released
|
|
375
|
+
// here — it stays armed (unref'd) for the body read, which it also bounds.
|
|
376
|
+
try {
|
|
377
|
+
const response = await deadline.run(fetch(`${this.baseUrl}${path}`, {
|
|
378
|
+
method: 'GET',
|
|
379
|
+
headers: { ...this.getHeaders(), ...(init?.headers ?? {}) },
|
|
380
|
+
redirect: 'manual',
|
|
381
|
+
signal: deadline.signal,
|
|
382
|
+
}));
|
|
383
|
+
return boundBodyReads(response, deadline);
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
throw deadline.classify(error);
|
|
387
|
+
}
|
|
322
388
|
}
|
|
323
389
|
/**
|
|
324
390
|
* HTTP GET request
|
|
@@ -330,34 +396,45 @@ class ApiClient {
|
|
|
330
396
|
* before (no `signal` key on the fetch init).
|
|
331
397
|
*/
|
|
332
398
|
async get(path, init) {
|
|
399
|
+
// Issue #3983: a client with a deadline bounds the request and its body.
|
|
400
|
+
const deadline = this.startDeadline(init?.signal);
|
|
401
|
+
const signal = deadline ? deadline.signal : init?.signal;
|
|
333
402
|
try {
|
|
334
|
-
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
403
|
+
const response = await bounded(deadline, fetch(`${this.baseUrl}${path}`, {
|
|
335
404
|
method: 'GET',
|
|
336
405
|
headers: this.getHeaders(),
|
|
337
|
-
...(
|
|
338
|
-
});
|
|
406
|
+
...(signal ? { signal } : {}),
|
|
407
|
+
}));
|
|
339
408
|
if (!response.ok) {
|
|
340
409
|
// Issue #1637: read the body first — handleApiError needs it to surface
|
|
341
410
|
// the server's reason for a 5xx instead of "check the logs".
|
|
342
|
-
const payload = await readErrorPayload(response);
|
|
411
|
+
const payload = await bounded(deadline, readErrorPayload(response));
|
|
343
412
|
const errResult = handleApiError(null, response.status, payload, { serverUrl: this.baseUrl });
|
|
344
413
|
throw new ApiError(errResult.message, errResult.exitCode, response.status, payload);
|
|
345
414
|
}
|
|
346
|
-
return (await response.json());
|
|
415
|
+
return (await bounded(deadline, response.json()));
|
|
347
416
|
}
|
|
348
417
|
catch (error) {
|
|
418
|
+
if (deadline) {
|
|
419
|
+
const classified = deadline.classify(error);
|
|
420
|
+
if (classified instanceof DeadlineExceededError)
|
|
421
|
+
throw classified;
|
|
422
|
+
}
|
|
349
423
|
if (error instanceof ApiError)
|
|
350
424
|
throw error;
|
|
351
425
|
const errResult = handleApiError(error);
|
|
352
426
|
throw new ApiError(errResult.message, errResult.exitCode);
|
|
353
427
|
}
|
|
428
|
+
finally {
|
|
429
|
+
deadline?.release();
|
|
430
|
+
}
|
|
354
431
|
}
|
|
355
432
|
/**
|
|
356
433
|
* HTTP POST request
|
|
357
434
|
* [DR1-05] Generic type parameter specified at call site
|
|
358
435
|
*/
|
|
359
436
|
async post(path, body) {
|
|
360
|
-
return sendWithBody(this.baseUrl, 'POST', this.getHeaders(), path, body);
|
|
437
|
+
return sendWithBody(this.baseUrl, 'POST', this.getHeaders(), path, body, this.startDeadline());
|
|
361
438
|
}
|
|
362
439
|
/**
|
|
363
440
|
* HTTP PATCH request (Issue #1000: agent-instance roster mutations via
|
|
@@ -365,37 +442,46 @@ class ApiClient {
|
|
|
365
442
|
* [DR1-05] Generic type parameter specified at call site
|
|
366
443
|
*/
|
|
367
444
|
async patch(path, body) {
|
|
368
|
-
return sendWithBody(this.baseUrl, 'PATCH', this.getHeaders(), path, body);
|
|
445
|
+
return sendWithBody(this.baseUrl, 'PATCH', this.getHeaders(), path, body, this.startDeadline());
|
|
369
446
|
}
|
|
370
447
|
}
|
|
371
448
|
exports.ApiClient = ApiClient;
|
|
372
449
|
/** POST / PATCH share everything but the method; an empty body (204) is `undefined`. */
|
|
373
|
-
async function sendWithBody(baseUrl, method, headers, path, body) {
|
|
450
|
+
async function sendWithBody(baseUrl, method, headers, path, body, deadline) {
|
|
374
451
|
try {
|
|
375
|
-
const response = await fetch(`${baseUrl}${path}`, {
|
|
452
|
+
const response = await bounded(deadline, fetch(`${baseUrl}${path}`, {
|
|
376
453
|
method,
|
|
377
454
|
headers,
|
|
378
455
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
379
|
-
|
|
456
|
+
...(deadline ? { signal: deadline.signal } : {}),
|
|
457
|
+
}));
|
|
380
458
|
if (!response.ok) {
|
|
381
459
|
// Issue #1637: read the body first — handleApiError needs it to surface
|
|
382
460
|
// the server's reason for a 5xx instead of "check the logs".
|
|
383
|
-
const payload = await readErrorPayload(response);
|
|
461
|
+
const payload = await bounded(deadline, readErrorPayload(response));
|
|
384
462
|
const errResult = handleApiError(null, response.status, payload, { serverUrl: baseUrl });
|
|
385
463
|
throw new ApiError(errResult.message, errResult.exitCode, response.status, payload);
|
|
386
464
|
}
|
|
387
465
|
// Handle 204 No Content
|
|
388
|
-
const text = await response.text();
|
|
466
|
+
const text = await bounded(deadline, response.text());
|
|
389
467
|
if (!text)
|
|
390
468
|
return undefined;
|
|
391
469
|
return JSON.parse(text);
|
|
392
470
|
}
|
|
393
471
|
catch (error) {
|
|
472
|
+
if (deadline) {
|
|
473
|
+
const classified = deadline.classify(error);
|
|
474
|
+
if (classified instanceof DeadlineExceededError)
|
|
475
|
+
throw classified;
|
|
476
|
+
}
|
|
394
477
|
if (error instanceof ApiError)
|
|
395
478
|
throw error;
|
|
396
479
|
const errResult = handleApiError(error);
|
|
397
480
|
throw new ApiError(errResult.message, errResult.exitCode, undefined, undefined, error);
|
|
398
481
|
}
|
|
482
|
+
finally {
|
|
483
|
+
deadline?.release();
|
|
484
|
+
}
|
|
399
485
|
}
|
|
400
486
|
/**
|
|
401
487
|
* Read the typed error body of a failed response.
|
|
@@ -454,6 +540,122 @@ class ApiError extends Error {
|
|
|
454
540
|
}
|
|
455
541
|
exports.ApiError = ApiError;
|
|
456
542
|
// =============================================================================
|
|
543
|
+
// Command deadline (Issue #3983)
|
|
544
|
+
// =============================================================================
|
|
545
|
+
/** The longest delay `setTimeout` honours (2^31-1 ms, ~24.8 days). */
|
|
546
|
+
const MAX_TIMER_MS = 2 ** 31 - 1;
|
|
547
|
+
/**
|
|
548
|
+
* A request ended by the deadline of a client from {@link ApiClient.withDeadline}
|
|
549
|
+
* (Issue #3983).
|
|
550
|
+
*
|
|
551
|
+
* An `ApiError` with exit 124 so that the commands' own error handling reports
|
|
552
|
+
* it as the timeout it is, and a class of its own so that a catch which turns
|
|
553
|
+
* failures into a degraded result ("verification resolves its own task", "use
|
|
554
|
+
* the selector as an instance id") can tell it apart and rethrow it — see
|
|
555
|
+
* {@link isDeadlineExceeded}. Wrapped into another `ApiError`, it travels as
|
|
556
|
+
* that error's `transportError`.
|
|
557
|
+
*/
|
|
558
|
+
class DeadlineExceededError extends ApiError {
|
|
559
|
+
constructor(serverUrl) {
|
|
560
|
+
super(withServerUrl('--timeout reached before the server answered', { serverUrl }), types_1.WaitExitCode.TIMEOUT);
|
|
561
|
+
this.name = 'DeadlineExceededError';
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
exports.DeadlineExceededError = DeadlineExceededError;
|
|
565
|
+
/**
|
|
566
|
+
* Whether `error` is — or wraps — a request ended by a command deadline
|
|
567
|
+
* (Issue #3983). The catches that degrade on failure ask this first and
|
|
568
|
+
* rethrow: a deadline is the command's answer, not a reason to carry on.
|
|
569
|
+
*/
|
|
570
|
+
function isDeadlineExceeded(error) {
|
|
571
|
+
if (error instanceof DeadlineExceededError)
|
|
572
|
+
return true;
|
|
573
|
+
if (error instanceof ApiError && error.transportError instanceof DeadlineExceededError)
|
|
574
|
+
return true;
|
|
575
|
+
return error instanceof Error && error.cause instanceof DeadlineExceededError;
|
|
576
|
+
}
|
|
577
|
+
/** Rethrow `error` when it is a command deadline; otherwise return (Issue #3983). */
|
|
578
|
+
function rethrowIfDeadlineExceeded(error) {
|
|
579
|
+
if (isDeadlineExceeded(error))
|
|
580
|
+
throw error;
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Arm the deadline of one request. Its signal goes to `fetch` (which then also
|
|
584
|
+
* aborts the body stream), and every await of the request is raced against it
|
|
585
|
+
* as well — so a stalled body or a transport that ignores the signal still ends
|
|
586
|
+
* on time. Past the deadline the signal is already aborted and no request is
|
|
587
|
+
* sent; started exactly at it, the request gets the current tick (a read at the
|
|
588
|
+
* deadline may still bring the answer `verify` reports, Issue #1544). Beyond
|
|
589
|
+
* what a timer can hold the request is left unbounded.
|
|
590
|
+
*/
|
|
591
|
+
function startRequestDeadline(deadlineAt, serverUrl, callerSignal) {
|
|
592
|
+
const controller = new AbortController();
|
|
593
|
+
const fire = () => {
|
|
594
|
+
if (!controller.signal.aborted)
|
|
595
|
+
controller.abort(new DeadlineExceededError(serverUrl));
|
|
596
|
+
};
|
|
597
|
+
const remaining = deadlineAt - Date.now();
|
|
598
|
+
let timer;
|
|
599
|
+
if (remaining < 0) {
|
|
600
|
+
fire();
|
|
601
|
+
}
|
|
602
|
+
else if (remaining <= MAX_TIMER_MS) {
|
|
603
|
+
timer = setTimeout(fire, remaining);
|
|
604
|
+
// A command that is done must not stay alive for a deadline it no longer needs.
|
|
605
|
+
timer.unref?.();
|
|
606
|
+
}
|
|
607
|
+
const signal = callerSignal ? AbortSignal.any([controller.signal, callerSignal]) : controller.signal;
|
|
608
|
+
const deadlineError = () => controller.signal.reason instanceof DeadlineExceededError
|
|
609
|
+
? controller.signal.reason
|
|
610
|
+
: new DeadlineExceededError(serverUrl);
|
|
611
|
+
return {
|
|
612
|
+
signal,
|
|
613
|
+
run(promise) {
|
|
614
|
+
if (controller.signal.aborted) {
|
|
615
|
+
promise.catch(() => { });
|
|
616
|
+
return Promise.reject(deadlineError());
|
|
617
|
+
}
|
|
618
|
+
return new Promise((resolve, reject) => {
|
|
619
|
+
const onAbort = () => reject(deadlineError());
|
|
620
|
+
controller.signal.addEventListener('abort', onAbort, { once: true });
|
|
621
|
+
promise.then((value) => {
|
|
622
|
+
controller.signal.removeEventListener('abort', onAbort);
|
|
623
|
+
resolve(value);
|
|
624
|
+
}, (error) => {
|
|
625
|
+
controller.signal.removeEventListener('abort', onAbort);
|
|
626
|
+
reject(error);
|
|
627
|
+
});
|
|
628
|
+
});
|
|
629
|
+
},
|
|
630
|
+
classify(error) {
|
|
631
|
+
return controller.signal.aborted ? deadlineError() : error;
|
|
632
|
+
},
|
|
633
|
+
release() {
|
|
634
|
+
if (timer !== undefined)
|
|
635
|
+
clearTimeout(timer);
|
|
636
|
+
},
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
/** `promise` raced against `deadline`, or `promise` itself without one. */
|
|
640
|
+
function bounded(deadline, promise) {
|
|
641
|
+
return deadline ? deadline.run(promise) : promise;
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* A {@link ApiClient.rawGet} response whose body reads are raced against the
|
|
645
|
+
* request's deadline (Issue #3983). The caller reads the body, so the bound has
|
|
646
|
+
* to travel with the response.
|
|
647
|
+
*/
|
|
648
|
+
function boundBodyReads(response, deadline) {
|
|
649
|
+
const read = (method) => () => deadline.run(method()).catch((error) => {
|
|
650
|
+
throw deadline.classify(error);
|
|
651
|
+
});
|
|
652
|
+
const json = response.json.bind(response);
|
|
653
|
+
const text = response.text.bind(response);
|
|
654
|
+
Object.defineProperty(response, 'json', { value: read(json), configurable: true });
|
|
655
|
+
Object.defineProperty(response, 'text', { value: read(text), configurable: true });
|
|
656
|
+
return response;
|
|
657
|
+
}
|
|
658
|
+
// =============================================================================
|
|
457
659
|
// Response shape validation & version-skew detection (Issue #1357)
|
|
458
660
|
// =============================================================================
|
|
459
661
|
/**
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The next command a CLI message tells the operator to run, aimed at the
|
|
3
|
+
* target the command actually addressed (Issue #3982).
|
|
4
|
+
*
|
|
5
|
+
* Each hint used to append ` --instance ${options.instance}` itself: the string
|
|
6
|
+
* the user typed (an alias reached `capture` unresolved), and nothing at all for
|
|
7
|
+
* `--agent` (so the hint read the worktree default's pane). One of them was
|
|
8
|
+
* fixed in #3975 and the others were not. These builders take the RESOLVED
|
|
9
|
+
* target — {@link CommandTarget}, what `resolveCommandTarget` returns — so the
|
|
10
|
+
* raw option cannot be passed where the hint's target belongs.
|
|
11
|
+
*/
|
|
12
|
+
import type { CommandTarget } from '../commands/command-target';
|
|
13
|
+
/**
|
|
14
|
+
* The `capture` flags that read a dialog: the pane itself (the stored reply is
|
|
15
|
+
* not what is on screen), and enough of it to hold the dialog and its numbers.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DIALOG_CAPTURE_FLAGS = "--pane --tail 40";
|
|
18
|
+
/**
|
|
19
|
+
* ` --instance <id>` for a resolved instance, else ` --agent <tool>` when one
|
|
20
|
+
* was named, else nothing — a command that named no target keeps naming none.
|
|
21
|
+
*/
|
|
22
|
+
export declare function targetFlags(target: CommandTarget): string;
|
|
23
|
+
/**
|
|
24
|
+
* `commandmate <verb> <worktree-id>[ <args>]<target flags>[ <trailing>]`.
|
|
25
|
+
*
|
|
26
|
+
* @param args - What follows the worktree id, e.g. `<number>` or `"<text>"`
|
|
27
|
+
* @param trailing - Flags that follow the target, e.g. `--pane --tail 40`
|
|
28
|
+
*/
|
|
29
|
+
export declare function followUpCommand(verb: string, worktreeId: string, target: CommandTarget, args?: string, trailing?: string): string;
|
|
30
|
+
/** The `capture` that shows the target's dialog as it is on screen. */
|
|
31
|
+
export declare function dialogCaptureCommand(worktreeId: string, target: CommandTarget): string;
|
|
32
|
+
/**
|
|
33
|
+
* `commandmate capture <id>[ target] --pane`: the pane a message went to, to
|
|
34
|
+
* look at before a resend (Issue #3992). Without a target (a caller that has
|
|
35
|
+
* none to give) it names none.
|
|
36
|
+
*/
|
|
37
|
+
export declare function paneCaptureCommand(worktreeId: string, target: CommandTarget | undefined): string;
|
|
38
|
+
//# sourceMappingURL=follow-up-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow-up-command.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/follow-up-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAER;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAIhG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The next command a CLI message tells the operator to run, aimed at the
|
|
4
|
+
* target the command actually addressed (Issue #3982).
|
|
5
|
+
*
|
|
6
|
+
* Each hint used to append ` --instance ${options.instance}` itself: the string
|
|
7
|
+
* the user typed (an alias reached `capture` unresolved), and nothing at all for
|
|
8
|
+
* `--agent` (so the hint read the worktree default's pane). One of them was
|
|
9
|
+
* fixed in #3975 and the others were not. These builders take the RESOLVED
|
|
10
|
+
* target — {@link CommandTarget}, what `resolveCommandTarget` returns — so the
|
|
11
|
+
* raw option cannot be passed where the hint's target belongs.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.DIALOG_CAPTURE_FLAGS = void 0;
|
|
15
|
+
exports.targetFlags = targetFlags;
|
|
16
|
+
exports.followUpCommand = followUpCommand;
|
|
17
|
+
exports.dialogCaptureCommand = dialogCaptureCommand;
|
|
18
|
+
exports.paneCaptureCommand = paneCaptureCommand;
|
|
19
|
+
/**
|
|
20
|
+
* The `capture` flags that read a dialog: the pane itself (the stored reply is
|
|
21
|
+
* not what is on screen), and enough of it to hold the dialog and its numbers.
|
|
22
|
+
*/
|
|
23
|
+
exports.DIALOG_CAPTURE_FLAGS = '--pane --tail 40';
|
|
24
|
+
/**
|
|
25
|
+
* ` --instance <id>` for a resolved instance, else ` --agent <tool>` when one
|
|
26
|
+
* was named, else nothing — a command that named no target keeps naming none.
|
|
27
|
+
*/
|
|
28
|
+
function targetFlags(target) {
|
|
29
|
+
if (target.instanceId)
|
|
30
|
+
return ` --instance ${target.instanceId}`;
|
|
31
|
+
if (target.agent)
|
|
32
|
+
return ` --agent ${target.agent}`;
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `commandmate <verb> <worktree-id>[ <args>]<target flags>[ <trailing>]`.
|
|
37
|
+
*
|
|
38
|
+
* @param args - What follows the worktree id, e.g. `<number>` or `"<text>"`
|
|
39
|
+
* @param trailing - Flags that follow the target, e.g. `--pane --tail 40`
|
|
40
|
+
*/
|
|
41
|
+
function followUpCommand(verb, worktreeId, target, args, trailing) {
|
|
42
|
+
return `commandmate ${verb} ${worktreeId}${args ? ` ${args}` : ''}${targetFlags(target)}${trailing ? ` ${trailing}` : ''}`;
|
|
43
|
+
}
|
|
44
|
+
/** The `capture` that shows the target's dialog as it is on screen. */
|
|
45
|
+
function dialogCaptureCommand(worktreeId, target) {
|
|
46
|
+
return followUpCommand('capture', worktreeId, target, undefined, exports.DIALOG_CAPTURE_FLAGS);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* `commandmate capture <id>[ target] --pane`: the pane a message went to, to
|
|
50
|
+
* look at before a resend (Issue #3992). Without a target (a caller that has
|
|
51
|
+
* none to give) it names none.
|
|
52
|
+
*/
|
|
53
|
+
function paneCaptureCommand(worktreeId, target) {
|
|
54
|
+
return target
|
|
55
|
+
? followUpCommand('capture', worktreeId, target, undefined, '--pane')
|
|
56
|
+
: `commandmate capture ${worktreeId} --pane`;
|
|
57
|
+
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* and whether an unmarked row may stand in for one — stays with the caller.
|
|
18
18
|
*/
|
|
19
19
|
import type { PromptMessageResponse } from '../types/api-responses';
|
|
20
|
-
import type
|
|
20
|
+
import { type ApiClient } from './api-client';
|
|
21
21
|
/**
|
|
22
22
|
* Chat rows read back per request.
|
|
23
23
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/reply-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"reply-ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/reply-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzE;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AA4B1C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAMtD,CAAC;AAcH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAaD,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE,CAkBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,EAAE,OAAO,GACpB,cAAc,GAAG,IAAI,CAMvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAiC,GACvC,MAAM,GAAG,IAAI,CAWf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAIT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAwBzC;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAUlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAQzC"}
|
|
@@ -28,6 +28,7 @@ exports.mayHaveDroppedRowsSince = mayHaveDroppedRowsSince;
|
|
|
28
28
|
exports.fetchPromptRowsSince = fetchPromptRowsSince;
|
|
29
29
|
exports.requestRecentMessages = requestRecentMessages;
|
|
30
30
|
exports.fetchRecentMessages = fetchRecentMessages;
|
|
31
|
+
const api_client_1 = require("./api-client");
|
|
31
32
|
/**
|
|
32
33
|
* Chat rows read back per request.
|
|
33
34
|
*
|
|
@@ -290,7 +291,9 @@ async function fetchPromptRowsSince(client, worktreeId, instanceId, since) {
|
|
|
290
291
|
before = oldest;
|
|
291
292
|
}
|
|
292
293
|
}
|
|
293
|
-
catch {
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Issue #3983: a deadline is the caller's to handle, not "unreadable".
|
|
296
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
294
297
|
return null;
|
|
295
298
|
}
|
|
296
299
|
}
|
|
@@ -321,7 +324,9 @@ async function fetchRecentMessages(client, worktreeId, instanceId) {
|
|
|
321
324
|
try {
|
|
322
325
|
return await requestRecentMessages(client, worktreeId, instanceId);
|
|
323
326
|
}
|
|
324
|
-
catch {
|
|
327
|
+
catch (error) {
|
|
328
|
+
// Issue #3983: a deadline is the caller's to handle, not "unreadable".
|
|
329
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
325
330
|
return null;
|
|
326
331
|
}
|
|
327
332
|
}
|
|
@@ -53,4 +53,22 @@ export declare function resetServerCapabilityProbe(): void;
|
|
|
53
53
|
* @throws ApiError on 401/403 and on an unclassifiable response
|
|
54
54
|
*/
|
|
55
55
|
export declare function serverResolvesSessionTargets(client: ApiClient): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Capability token of a server whose answer errors all carry `reason` and
|
|
58
|
+
* `keysSent` (Issue #3982). Mirrors SERVER_CAPABILITIES in the route.
|
|
59
|
+
*/
|
|
60
|
+
export declare const PROMPT_ANSWER_REASON_CAPABILITY = "prompt-answer-reason";
|
|
61
|
+
/**
|
|
62
|
+
* Whether this server puts `reason` on every answer error (Issue #3982).
|
|
63
|
+
*
|
|
64
|
+
* Reads the memo `resolveCommandTarget` already filled for this client, so a
|
|
65
|
+
* command that resolved `--instance` asks nothing more. A command that named
|
|
66
|
+
* no instance probes here, once, and only when it is called — on a failed
|
|
67
|
+
* answer, never on the way to sending one.
|
|
68
|
+
*
|
|
69
|
+
* Fail-safe to the old reading: a probe that cannot be completed (auth, a
|
|
70
|
+
* proxy, the network) answers false, which keeps the pre-#3982 behaviour of
|
|
71
|
+
* reading the reason code out of the 500's text.
|
|
72
|
+
*/
|
|
73
|
+
export declare function serverReportsPromptAnswerReason(client: ApiClient): Promise<boolean>;
|
|
56
74
|
//# sourceMappingURL=server-capabilities.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-capabilities.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"server-capabilities.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnG,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,2BAA2B,CAAC;AAE1E,oFAAoF;AACpF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE;AACtE,4DAA4D;GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAyBvB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAazF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAyFD;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAItF;AAED;;;GAGG;AACH,eAAO,MAAM,+BAA+B,yBAAyB,CAAC;AAEtE;;;;;;;;;;;GAWG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzF"}
|
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
* connection is behaving unexpectedly. Those cases end the command instead.
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.RESOLVE_SESSION_TARGET_CAPABILITY = exports.CAPABILITIES_PATH = void 0;
|
|
21
|
+
exports.PROMPT_ANSWER_REASON_CAPABILITY = exports.RESOLVE_SESSION_TARGET_CAPABILITY = exports.CAPABILITIES_PATH = void 0;
|
|
22
22
|
exports.probeServerCapabilities = probeServerCapabilities;
|
|
23
23
|
exports.resetServerCapabilityProbe = resetServerCapabilityProbe;
|
|
24
24
|
exports.serverResolvesSessionTargets = serverResolvesSessionTargets;
|
|
25
|
+
exports.serverReportsPromptAnswerReason = serverReportsPromptAnswerReason;
|
|
25
26
|
const types_1 = require("../types");
|
|
26
27
|
const api_client_1 = require("./api-client");
|
|
27
28
|
/** Path of the capability endpoint (`src/app/api/capabilities/route.ts`). */
|
|
@@ -102,6 +103,8 @@ async function runProbe(client) {
|
|
|
102
103
|
response = await client.rawGet(exports.CAPABILITIES_PATH, { headers: { Accept: 'application/json' } });
|
|
103
104
|
}
|
|
104
105
|
catch (error) {
|
|
106
|
+
// Issue #3983: a command deadline is not "unreachable" — it stays exit 124.
|
|
107
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
105
108
|
const result = (0, api_client_1.handleApiError)(error);
|
|
106
109
|
throw new api_client_1.ApiError(result.message, result.exitCode);
|
|
107
110
|
}
|
|
@@ -119,7 +122,10 @@ async function runProbe(client) {
|
|
|
119
122
|
throw undetermined(response.status);
|
|
120
123
|
}
|
|
121
124
|
if (response.status === 404) {
|
|
122
|
-
const text = await response.text().catch(() =>
|
|
125
|
+
const text = await response.text().catch((error) => {
|
|
126
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
127
|
+
return '';
|
|
128
|
+
});
|
|
123
129
|
if (isRealNotFoundBody(text))
|
|
124
130
|
return { kind: 'legacy' };
|
|
125
131
|
throw undetermined(response.status);
|
|
@@ -136,7 +142,8 @@ async function runProbe(client) {
|
|
|
136
142
|
try {
|
|
137
143
|
parsed = await response.json();
|
|
138
144
|
}
|
|
139
|
-
catch {
|
|
145
|
+
catch (error) {
|
|
146
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
140
147
|
throw undetermined(response.status);
|
|
141
148
|
}
|
|
142
149
|
if (parsed === null || typeof parsed !== 'object') {
|
|
@@ -164,3 +171,29 @@ async function serverResolvesSessionTargets(client) {
|
|
|
164
171
|
return probe.kind === 'supported'
|
|
165
172
|
&& probe.capabilities.includes(exports.RESOLVE_SESSION_TARGET_CAPABILITY);
|
|
166
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Capability token of a server whose answer errors all carry `reason` and
|
|
176
|
+
* `keysSent` (Issue #3982). Mirrors SERVER_CAPABILITIES in the route.
|
|
177
|
+
*/
|
|
178
|
+
exports.PROMPT_ANSWER_REASON_CAPABILITY = 'prompt-answer-reason';
|
|
179
|
+
/**
|
|
180
|
+
* Whether this server puts `reason` on every answer error (Issue #3982).
|
|
181
|
+
*
|
|
182
|
+
* Reads the memo `resolveCommandTarget` already filled for this client, so a
|
|
183
|
+
* command that resolved `--instance` asks nothing more. A command that named
|
|
184
|
+
* no instance probes here, once, and only when it is called — on a failed
|
|
185
|
+
* answer, never on the way to sending one.
|
|
186
|
+
*
|
|
187
|
+
* Fail-safe to the old reading: a probe that cannot be completed (auth, a
|
|
188
|
+
* proxy, the network) answers false, which keeps the pre-#3982 behaviour of
|
|
189
|
+
* reading the reason code out of the 500's text.
|
|
190
|
+
*/
|
|
191
|
+
async function serverReportsPromptAnswerReason(client) {
|
|
192
|
+
try {
|
|
193
|
+
const probe = await probeServerCapabilities(client);
|
|
194
|
+
return probe.kind === 'supported' && probe.capabilities.includes(exports.PROMPT_ANSWER_REASON_CAPABILITY);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* tool-named instance is reported exactly as the server reports it (Issue
|
|
21
21
|
* #2487), because a copy that obeys it sends where the server would refuse to.
|
|
22
22
|
*/
|
|
23
|
-
import type
|
|
23
|
+
import { type ApiClient } from './api-client';
|
|
24
24
|
/**
|
|
25
25
|
* Which stage of the precedence chain produced the answer. Mirrors
|
|
26
26
|
* SessionTargetResolvedBy in `src/lib/session/resolve-session-target.ts`; the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-target.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/session-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session-target.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/session-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzE;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,UAAU,GACV,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,uBAAuB,CAAC;IACpC,gFAAgF;IAChF,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuBD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AA8FD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAcrF"}
|
|
@@ -26,6 +26,7 @@ exports.resolveSessionTarget = resolveSessionTarget;
|
|
|
26
26
|
exports.describeSessionTargetConflict = describeSessionTargetConflict;
|
|
27
27
|
const types_1 = require("../types");
|
|
28
28
|
const cli_tool_ids_1 = require("../config/cli-tool-ids");
|
|
29
|
+
const api_client_1 = require("./api-client");
|
|
29
30
|
const agent_instances_1 = require("./agent-instances");
|
|
30
31
|
const server_capabilities_1 = require("./server-capabilities");
|
|
31
32
|
/**
|
|
@@ -103,6 +104,8 @@ async function resolveLocally(client, worktreeId, options) {
|
|
|
103
104
|
registered = instances.find((inst) => inst.id === instanceId);
|
|
104
105
|
}
|
|
105
106
|
catch (error) {
|
|
107
|
+
// Issue #3983: `--timeout` ran out — not a roster to degrade around.
|
|
108
|
+
(0, api_client_1.rethrowIfDeadlineExceeded)(error);
|
|
106
109
|
console.error(`Warning: could not read the agent-instance roster (${(0, types_1.getErrorMessage)(error)}); using --agent as given.`);
|
|
107
110
|
return degraded(requestedCliTool);
|
|
108
111
|
}
|
|
@@ -14,6 +14,13 @@ import type { VerificationFlakyDetail, VerificationGateTimingView, VerificationR
|
|
|
14
14
|
import { ApiClient } from './api-client';
|
|
15
15
|
/** Matches the wait command's cadence; runs are minutes long, not seconds. */
|
|
16
16
|
export declare const VERIFY_POLL_INTERVAL_MS = 5000;
|
|
17
|
+
/**
|
|
18
|
+
* Issue #3983: how far past `--timeout` the read taken AT the deadline may run.
|
|
19
|
+
* The poll sleeps only up to the deadline and reads once more there, so a run
|
|
20
|
+
* that finished in the last interval still reports its verdict (#1544); this
|
|
21
|
+
* bounds that one read rather than skipping it.
|
|
22
|
+
*/
|
|
23
|
+
export declare const VERIFY_FINAL_READ_GRACE_MS = 2000;
|
|
17
24
|
/** Built-in gate id; mirrors WORK_EVIDENCE_GATE_ID in lib/verification/gate-runner.ts. */
|
|
18
25
|
export declare const WORK_EVIDENCE_GATE_ID = "work-evidence";
|
|
19
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/verify-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"verify-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/verify-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAqD,MAAM,cAAc,CAAC;AAE5F,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAU1C;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAU5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,0BAA0B,GAAG,IAAI,CAInC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,SAAS,SAAO,GAAG,MAAM,CAM7F;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAoBxC;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,uBAAuB,GAAG,IAAI,CAehC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AAQvD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAK7E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B;AAUD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAW1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAOnF;AAwJD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAkF9B"}
|