commandmate 0.44.1 → 0.44.3
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 +169 -169
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +0 -6
- 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.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.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.js +2 -2
- 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.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.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.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.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 +2 -2
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.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.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.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_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.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- 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.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 -3
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- 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.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_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_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_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_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_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.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_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.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.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.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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
- 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 -2
- 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 -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 +2 -2
- 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 +2 -2
- 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 -3
- 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 -1
- 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.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.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_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_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_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_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_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_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.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +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 +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- 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 +35 -35
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -0
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -0
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/5845.js +1 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -0
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -5
- package/.next/server/chunks/9390.js +2 -3
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +10 -13
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +608 -416
- package/dist/cli/types/api-responses.d.ts +174 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +228 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +290 -0
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/server.js +5 -3
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
- package/dist/server/src/lib/auto-yes-poller.js +465 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
- package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
- package/dist/server/src/lib/detection/tools/live-region.js +204 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +666 -1162
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +6 -5
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +6 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/relay/relay-triggers.js +9 -0
- package/dist/server/src/lib/resource-cleanup.js +6 -4
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +454 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +290 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +6 -8
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.2.json +33 -0
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/650.js +0 -1
- package/.next/server/chunks/6661.js +0 -1
- package/.next/server/chunks/8583.js +0 -1
- package/.next/server/chunks/964.js +0 -1
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-308072f285c34787.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -35,6 +35,7 @@ const auto_yes_config_1 = require("../config/auto-yes-config");
|
|
|
35
35
|
const path_validator_1 = require("./security/path-validator");
|
|
36
36
|
const types_1 = require("./cli-tools/types");
|
|
37
37
|
const logger_1 = require("../lib/logger");
|
|
38
|
+
const global_state_1 = require("./global-state");
|
|
38
39
|
const logger = (0, logger_1.createLogger)('auto-yes-state');
|
|
39
40
|
// =============================================================================
|
|
40
41
|
// Composite Key Helpers (Issue #525: per-agent auto-yes)
|
|
@@ -117,8 +118,7 @@ function extractInstanceId(compositeKey) {
|
|
|
117
118
|
return parts[2] ?? parts[1] ?? null;
|
|
118
119
|
}
|
|
119
120
|
/** In-memory storage for auto-yes states (globalThis for hot reload persistence) */
|
|
120
|
-
const autoYesStates =
|
|
121
|
-
(globalThis.__autoYesStates = new Map());
|
|
121
|
+
const autoYesStates = (0, global_state_1.getOrInitGlobal)('__autoYesStates', () => new Map());
|
|
122
122
|
// =============================================================================
|
|
123
123
|
// Utility Functions
|
|
124
124
|
// =============================================================================
|
|
@@ -25,16 +25,9 @@ const sources_1 = require("../../lib/hooks/sources");
|
|
|
25
25
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
26
26
|
const logger_1 = require("../../lib/logger");
|
|
27
27
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
28
|
-
const install_hints_1 = require("./install-hints");
|
|
29
28
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
29
|
+
const errors_1 = require("../../lib/errors");
|
|
30
30
|
const logger = (0, logger_1.createLogger)('cli-tools/antigravity');
|
|
31
|
-
/**
|
|
32
|
-
* Extract error message from unknown error type (DRY).
|
|
33
|
-
* Same pattern as codex.ts / claude-session.ts getErrorMessage().
|
|
34
|
-
*/
|
|
35
|
-
function getErrorMessage(error) {
|
|
36
|
-
return error instanceof Error ? error.message : String(error);
|
|
37
|
-
}
|
|
38
31
|
/**
|
|
39
32
|
* Single-quote a value for safe embedding in a shell command typed into a
|
|
40
33
|
* tmux pane (Issue #989). Unlike other CLI tools, agy's `--model` is a
|
|
@@ -150,7 +143,7 @@ function readInputBoxStatusRow(contentLines) {
|
|
|
150
143
|
* @returns True when the input box is live and agy is idle
|
|
151
144
|
*/
|
|
152
145
|
function isAntigravityReady(output) {
|
|
153
|
-
const frame = (0, frame_1.normalizeFrame)(output);
|
|
146
|
+
const frame = (0, frame_1.normalizeFrame)(output, 'antigravity');
|
|
154
147
|
if (cli_patterns_1.ANTIGRAVITY_SELECTION_LIST_PATTERN.test(frame.lastLines))
|
|
155
148
|
return false;
|
|
156
149
|
if (ANTIGRAVITY_TRUST_DIALOG_PATTERN.test(frame.lastLines))
|
|
@@ -170,16 +163,6 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
170
163
|
id = 'antigravity';
|
|
171
164
|
name = 'Antigravity CLI';
|
|
172
165
|
command = 'agy';
|
|
173
|
-
/**
|
|
174
|
-
* Check if an Antigravity session is running for a worktree.
|
|
175
|
-
*
|
|
176
|
-
* @param worktreeId - Worktree ID
|
|
177
|
-
* @returns True if session is running
|
|
178
|
-
*/
|
|
179
|
-
async isRunning(worktreeId, instanceId) {
|
|
180
|
-
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
181
|
-
return await (0, tmux_1.hasSession)(sessionName);
|
|
182
|
-
}
|
|
183
166
|
/**
|
|
184
167
|
* Start a new Antigravity session for a worktree.
|
|
185
168
|
*
|
|
@@ -193,27 +176,14 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
193
176
|
*/
|
|
194
177
|
async launchSession(worktreeId, worktreePath, instanceId, model) {
|
|
195
178
|
// Check if agy is installed
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
await this.reconcileExistingSession(sessionName, worktreePath);
|
|
205
|
-
// Issue #2070: this branch used to return unconditionally. A tmux session
|
|
206
|
-
// outlives the agent that was launched into it — a quit, a self-update, a
|
|
207
|
-
// crash — and the launch was then skipped for a pane holding nothing but a
|
|
208
|
-
// shell prompt, which left `kill-session` by hand as the only recovery.
|
|
209
|
-
// When the tool is gone we fall THROUGH and re-send the launch command
|
|
210
|
-
// into the same pane.
|
|
211
|
-
if (await this.isToolLive(sessionName, { confirm: true })) {
|
|
212
|
-
logger.info('antigravity-session-exists');
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
logger.warn('antigravity-session-relaunch', { sessionName });
|
|
216
|
-
}
|
|
179
|
+
await this.requireInstalled();
|
|
180
|
+
const { sessionName, exists, live } = await this.resolveLaunchPane(worktreeId, worktreePath, instanceId, {
|
|
181
|
+
logger,
|
|
182
|
+
liveAction: 'antigravity-session-exists',
|
|
183
|
+
relaunchAction: 'antigravity-session-relaunch',
|
|
184
|
+
});
|
|
185
|
+
if (live)
|
|
186
|
+
return;
|
|
217
187
|
// Issue #1762: fence this instance's structured events off from the process
|
|
218
188
|
// that used to hold the same (worktree, tool, instance) key. Creation path
|
|
219
189
|
// only — the reuse branch above has already returned — and before the pane
|
|
@@ -224,21 +194,6 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
224
194
|
// the new one's.
|
|
225
195
|
(0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: sources_1.ANTIGRAVITY_CLI_TOOL_ID, instanceId });
|
|
226
196
|
try {
|
|
227
|
-
// Issue #2070: creation only. On the relaunch path the pane already
|
|
228
|
-
// exists and holds the transcript of the process that died in it; the
|
|
229
|
-
// launch command is re-sent into that same pane.
|
|
230
|
-
if (!exists) {
|
|
231
|
-
// Create tmux session with large history buffer for agy output
|
|
232
|
-
// (agy is inline-rendered and retains scrollback, like Codex)
|
|
233
|
-
// Scrollback depth comes from the shared TMUX_HISTORY_LIMIT default
|
|
234
|
-
// (Issue #1624) — do not re-hardcode it here.
|
|
235
|
-
await (0, tmux_1.createSession)({
|
|
236
|
-
sessionName,
|
|
237
|
-
workingDirectory: worktreePath,
|
|
238
|
-
});
|
|
239
|
-
// Wait a moment for the session to be created
|
|
240
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
241
|
-
}
|
|
242
197
|
// Start agy in interactive mode, optionally pinned to a model.
|
|
243
198
|
//
|
|
244
199
|
// Issue #1762: the launch merges CommandMate's named hook into
|
|
@@ -249,12 +204,28 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
249
204
|
// one file serves every worktree on the machine. `--model` is appended
|
|
250
205
|
// after the rendered line, so the env assignments stay in front of the
|
|
251
206
|
// command. `CM_AGENT_HOOKS_INJECT=0` returns bare `agy`, unchanged.
|
|
207
|
+
// Under UAT isolation (Issue #3360) a shared file this build did not
|
|
208
|
+
// produce makes the plan throw.
|
|
252
209
|
const base = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({
|
|
253
210
|
target: { worktreeId, cliToolId: sources_1.ANTIGRAVITY_CLI_TOOL_ID, instanceId },
|
|
254
211
|
executablePath: this.command,
|
|
255
212
|
worktreePath,
|
|
256
213
|
});
|
|
257
214
|
const launchCommand = model ? `${base} --model ${shellSingleQuote(model)}` : base;
|
|
215
|
+
// Issue #3360: the plan above is built BEFORE the tmux session, because
|
|
216
|
+
// under UAT isolation it throws instead of launching — and a refused
|
|
217
|
+
// launch must not leave an empty pane that `isRunning()` reports as a
|
|
218
|
+
// started agy (the next send would then be refused a model change).
|
|
219
|
+
// Issue #2070: creation only. On the relaunch path the pane already
|
|
220
|
+
// exists and holds the transcript of the process that died in it; the
|
|
221
|
+
// launch command is re-sent into that same pane.
|
|
222
|
+
if (!exists) {
|
|
223
|
+
// Create tmux session with large history buffer for agy output
|
|
224
|
+
// (agy is inline-rendered and retains scrollback, like Codex)
|
|
225
|
+
// Scrollback depth comes from the shared TMUX_HISTORY_LIMIT default
|
|
226
|
+
// (Issue #1624) — do not re-hardcode it here.
|
|
227
|
+
await this.createLaunchPane(sessionName, worktreePath);
|
|
228
|
+
}
|
|
258
229
|
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
259
230
|
// Wait for agy to initialize
|
|
260
231
|
await new Promise((resolve) => setTimeout(resolve, ANTIGRAVITY_INIT_WAIT_MS));
|
|
@@ -263,7 +234,7 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
263
234
|
logger.info('started-antigravity-session');
|
|
264
235
|
}
|
|
265
236
|
catch (error) {
|
|
266
|
-
const errorMessage = getErrorMessage(error);
|
|
237
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
267
238
|
throw new Error(`Failed to start Antigravity session: ${errorMessage}`);
|
|
268
239
|
}
|
|
269
240
|
}
|
|
@@ -336,17 +307,12 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
336
307
|
*/
|
|
337
308
|
async sendMessage(worktreeId, message, instanceId) {
|
|
338
309
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
339
|
-
// Check if session exists
|
|
340
|
-
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
341
|
-
if (!exists) {
|
|
342
|
-
throw new Error(`Antigravity session ${sessionName} does not exist. Start the session first.`);
|
|
343
|
-
}
|
|
344
310
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
345
311
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
346
312
|
// that followed used to sit in the readiness wait until it timed out —
|
|
347
313
|
// leaving `kill-session` by hand as the only recovery. Relaunches into the
|
|
348
314
|
// same pane when the tool is gone; costs one `capture-pane` when it is not.
|
|
349
|
-
await this.
|
|
315
|
+
await this.requireSession('Antigravity', worktreeId, instanceId, { relaunch: true });
|
|
350
316
|
try {
|
|
351
317
|
// Verify agy is at a ready prompt before sending
|
|
352
318
|
await this.waitForPrompt(sessionName);
|
|
@@ -363,7 +329,7 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
363
329
|
logger.info('sent-message-to-antigravity-session');
|
|
364
330
|
}
|
|
365
331
|
catch (error) {
|
|
366
|
-
const errorMessage = getErrorMessage(error);
|
|
332
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
367
333
|
throw new Error(`Failed to send message to Antigravity: ${errorMessage}`);
|
|
368
334
|
}
|
|
369
335
|
}
|
|
@@ -373,27 +339,20 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
373
339
|
* @param worktreeId - Worktree ID
|
|
374
340
|
*/
|
|
375
341
|
async killSession(worktreeId, instanceId) {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
342
|
+
await this.requestExitAndKill(worktreeId, instanceId, {
|
|
343
|
+
logger,
|
|
344
|
+
stoppedAction: 'stopped-antigravity-session',
|
|
345
|
+
requestExit: async (sessionName) => {
|
|
380
346
|
// Send Ctrl+D to exit agy gracefully
|
|
381
347
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-d');
|
|
382
348
|
// Wait a moment for agy to exit
|
|
383
349
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_EXIT_WAIT_MS));
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
logger.info('stopped-antigravity-session');
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
catch (error) {
|
|
394
|
-
logger.error('session:stop-failed', { error: getErrorMessage(error) });
|
|
395
|
-
throw error;
|
|
396
|
-
}
|
|
350
|
+
},
|
|
351
|
+
afterKill: (sessionName) => {
|
|
352
|
+
// Invalidate cache so a later session reusing the name starts clean
|
|
353
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
354
|
+
},
|
|
355
|
+
});
|
|
397
356
|
}
|
|
398
357
|
}
|
|
399
358
|
exports.AntigravityTool = AntigravityTool;
|
|
@@ -21,10 +21,12 @@ const graceful_exit_1 = require("./graceful-exit");
|
|
|
21
21
|
const liveness_spec_1 = require("./liveness-spec");
|
|
22
22
|
const session_liveness_1 = require("./session-liveness");
|
|
23
23
|
const start_availability_1 = require("./start-availability");
|
|
24
|
+
const install_hints_1 = require("./install-hints");
|
|
24
25
|
const ansi_1 = require("../detection/ansi");
|
|
25
26
|
const env_1 = require("../env");
|
|
26
27
|
const launch_command_1 = require("../hooks/sources/launch-command");
|
|
27
28
|
const logger_1 = require("../logger");
|
|
29
|
+
const errors_1 = require("../errors");
|
|
28
30
|
const terminal_keys_1 = require("../../types/terminal-keys");
|
|
29
31
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
30
32
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
@@ -177,6 +179,11 @@ class BaseCLITool {
|
|
|
177
179
|
getSessionName(worktreeId, instanceId) {
|
|
178
180
|
return (0, session_name_1.resolveSessionName)(this.id, worktreeId, instanceId);
|
|
179
181
|
}
|
|
182
|
+
// Abstract methods that must be implemented by subclasses
|
|
183
|
+
async isRunning(worktreeId, instanceId) {
|
|
184
|
+
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
185
|
+
return await (0, tmux_1.hasSession)(sessionName);
|
|
186
|
+
}
|
|
180
187
|
/**
|
|
181
188
|
* Start this tool's session, reporting a failure exactly once (Issue #2009).
|
|
182
189
|
*
|
|
@@ -595,6 +602,150 @@ class BaseCLITool {
|
|
|
595
602
|
logger.info('session:relaunch-before-send', { cliToolId: this.id, sessionName });
|
|
596
603
|
await this.startSession(worktreeId, worktreePath, instanceId);
|
|
597
604
|
}
|
|
605
|
+
/**
|
|
606
|
+
* The pre-send guard every driver's `sendMessage` opened with: the session
|
|
607
|
+
* must exist, else throw `<label> session <name> does not exist. Start the
|
|
608
|
+
* session first.`; with `relaunch`, a pane whose tool has exited is then
|
|
609
|
+
* relaunched ({@link relaunchIfToolExited}) before the caller goes on.
|
|
610
|
+
*
|
|
611
|
+
* @param label - Tool name as it appears in the error text (e.g. `Command Code`)
|
|
612
|
+
* @param worktreeId - Worktree ID
|
|
613
|
+
* @param instanceId - Agent instance ID (defaults to the primary instance)
|
|
614
|
+
* @param options.relaunch - Also relaunch a tool that exited inside a live pane
|
|
615
|
+
*/
|
|
616
|
+
async requireSession(label, worktreeId, instanceId, options) {
|
|
617
|
+
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
618
|
+
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
619
|
+
if (!exists) {
|
|
620
|
+
throw new Error(`${label} session ${sessionName} does not exist. Start the session first.`);
|
|
621
|
+
}
|
|
622
|
+
if (options.relaunch) {
|
|
623
|
+
await this.relaunchIfToolExited(worktreeId, instanceId);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* The install check a driver's `launchSession` opens with: a tool that is not
|
|
628
|
+
* installed stops the launch with {@link missingToolError}.
|
|
629
|
+
*
|
|
630
|
+
* copilot, opencode and OpenCode V2 do not call this. Each resolves the
|
|
631
|
+
* executable its launch line then names, so there the check and the line come
|
|
632
|
+
* from one measurement.
|
|
633
|
+
*
|
|
634
|
+
* @throws SessionStartUnavailableError when {@link isInstalled} answers false
|
|
635
|
+
*/
|
|
636
|
+
async requireInstalled() {
|
|
637
|
+
const available = await this.isInstalled();
|
|
638
|
+
if (!available) {
|
|
639
|
+
throw (0, install_hints_1.missingToolError)(this);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* The reuse decision a driver's `launchSession` makes before it types
|
|
644
|
+
* anything: name the session and, when its pane already exists, reconcile it
|
|
645
|
+
* ({@link reconcileExistingSession}) and ask whether the tool is still the
|
|
646
|
+
* thing drawing it ({@link isToolLive}, confirmed).
|
|
647
|
+
*
|
|
648
|
+
* Both log lines go through the caller's logger under the caller's action
|
|
649
|
+
* names, so each driver's log reads as it did when this sequence was written
|
|
650
|
+
* out in every one of them.
|
|
651
|
+
*
|
|
652
|
+
* opencode and OpenCode V2 keep their own copy: they hand the reconcile their
|
|
653
|
+
* pane geometry, resume their event stream on the live branch and release it
|
|
654
|
+
* on the relaunch branch.
|
|
655
|
+
*
|
|
656
|
+
* @param worktreeId - Worktree ID
|
|
657
|
+
* @param worktreePath - Worktree path
|
|
658
|
+
* @param instanceId - Agent instance ID (defaults to the primary instance)
|
|
659
|
+
* @param log.logger - The driver's logger
|
|
660
|
+
* @param log.liveAction - Logged when a live tool already holds the pane
|
|
661
|
+
* @param log.relaunchAction - Logged when the pane exists and its tool has exited
|
|
662
|
+
* @returns The session name; `exists` when its pane was already there; `live`
|
|
663
|
+
* when the tool is still in it, so the caller has nothing to launch
|
|
664
|
+
* @throws {ForeignSessionError} From {@link reconcileExistingSession}
|
|
665
|
+
*/
|
|
666
|
+
async resolveLaunchPane(worktreeId, worktreePath, instanceId, log) {
|
|
667
|
+
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
668
|
+
// Check if session already exists
|
|
669
|
+
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
670
|
+
if (exists) {
|
|
671
|
+
await this.reconcileExistingSession(sessionName, worktreePath);
|
|
672
|
+
// Issue #2070: this branch used to return unconditionally. A tmux session
|
|
673
|
+
// outlives the agent that was launched into it — a quit, a self-update, a
|
|
674
|
+
// crash — and the launch was then skipped for a pane holding nothing but a
|
|
675
|
+
// shell prompt, which left `kill-session` by hand as the only recovery.
|
|
676
|
+
// When the tool is gone we fall THROUGH and re-send the launch command
|
|
677
|
+
// into the same pane.
|
|
678
|
+
if (await this.isToolLive(sessionName, { confirm: true })) {
|
|
679
|
+
log.logger.info(log.liveAction);
|
|
680
|
+
return { sessionName, exists, live: true };
|
|
681
|
+
}
|
|
682
|
+
log.logger.warn(log.relaunchAction, { sessionName });
|
|
683
|
+
}
|
|
684
|
+
return { sessionName, exists, live: false };
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Create the tmux session a launch types into, then wait
|
|
688
|
+
* {@link TUI_SESSION_CREATE_WAIT_MS} for it. Creation path only: on the #2070
|
|
689
|
+
* relaunch path the pane already exists and the caller does not come here.
|
|
690
|
+
*
|
|
691
|
+
* @param sessionName - tmux session name
|
|
692
|
+
* @param worktreePath - Worktree path, the session's working directory
|
|
693
|
+
*/
|
|
694
|
+
async createLaunchPane(sessionName, worktreePath) {
|
|
695
|
+
// Create tmux session. Scrollback depth comes from the shared
|
|
696
|
+
// TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
|
|
697
|
+
await (0, tmux_1.createSession)({
|
|
698
|
+
sessionName,
|
|
699
|
+
workingDirectory: worktreePath,
|
|
700
|
+
});
|
|
701
|
+
// Wait a moment for the session to be created
|
|
702
|
+
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* The stop sequence a driver's `killSession` runs: name the session, ask the
|
|
706
|
+
* tool to quit when its pane exists, kill the tmux session, run the driver's
|
|
707
|
+
* cleanup and log.
|
|
708
|
+
*
|
|
709
|
+
* The keys and waits that ask the tool to quit stay in each driver, as
|
|
710
|
+
* `requestExit`: they are measured per tool, and {@link gracefulExitSequence}
|
|
711
|
+
* describes them without sending them. Both log lines go through the caller's
|
|
712
|
+
* logger, the stop line under the caller's action name, so each driver's log
|
|
713
|
+
* reads as it did when this sequence was written out in every one of them.
|
|
714
|
+
*
|
|
715
|
+
* `afterKill` runs after the tmux kill and before the stop line, inside the
|
|
716
|
+
* same `try`, whether or not tmux had a session to kill.
|
|
717
|
+
*
|
|
718
|
+
* claude, opencode and OpenCode V2 keep their own `killSession`: claude hands
|
|
719
|
+
* the stop to `stopClaudeSession`, and the other two check the exit's
|
|
720
|
+
* postcondition and release what the instance held.
|
|
721
|
+
*
|
|
722
|
+
* @param worktreeId - Worktree ID
|
|
723
|
+
* @param instanceId - Agent instance ID (defaults to the primary instance)
|
|
724
|
+
* @param stop.logger - The driver's logger
|
|
725
|
+
* @param stop.stoppedAction - Logged when tmux reports it killed the session
|
|
726
|
+
* @param stop.requestExit - The driver's exit keys and the waits between them
|
|
727
|
+
* @param stop.afterKill - The driver's cleanup once the tmux kill has run
|
|
728
|
+
* @throws Whatever the sequence threw, unchanged, after logging `session:stop-failed`
|
|
729
|
+
*/
|
|
730
|
+
async requestExitAndKill(worktreeId, instanceId, stop) {
|
|
731
|
+
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
732
|
+
try {
|
|
733
|
+
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
734
|
+
if (exists) {
|
|
735
|
+
await stop.requestExit(sessionName);
|
|
736
|
+
}
|
|
737
|
+
// Kill the tmux session
|
|
738
|
+
const killed = await (0, tmux_1.killSession)(sessionName);
|
|
739
|
+
stop.afterKill?.(sessionName);
|
|
740
|
+
if (killed) {
|
|
741
|
+
stop.logger.info(stop.stoppedAction);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
catch (error) {
|
|
745
|
+
stop.logger.error('session:stop-failed', { error: (0, errors_1.getErrorMessage)(error) });
|
|
746
|
+
throw error;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
598
749
|
/**
|
|
599
750
|
* Declare the keys this tool's terminal UI may send (Issue #2046).
|
|
600
751
|
*
|
|
@@ -19,16 +19,9 @@ const sources_1 = require("../../lib/hooks/sources");
|
|
|
19
19
|
const hooks_config_1 = require("../../lib/hooks/sources/codex/hooks-config");
|
|
20
20
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
|
-
const install_hints_1 = require("./install-hints");
|
|
23
22
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
23
|
+
const errors_1 = require("../../lib/errors");
|
|
24
24
|
const logger = (0, logger_1.createLogger)('cli-tools/codex');
|
|
25
|
-
/**
|
|
26
|
-
* Extract error message from unknown error type (DRY)
|
|
27
|
-
* Same pattern as claude-session.ts getErrorMessage()
|
|
28
|
-
*/
|
|
29
|
-
function getErrorMessage(error) {
|
|
30
|
-
return error instanceof Error ? error.message : String(error);
|
|
31
|
-
}
|
|
32
25
|
/** Wait for Codex CLI to initialize after launch */
|
|
33
26
|
const CODEX_INIT_WAIT_MS = 3000;
|
|
34
27
|
/** Interval for polling trust dialog / prompt detection */
|
|
@@ -179,16 +172,6 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
179
172
|
id = 'codex';
|
|
180
173
|
name = 'Codex CLI';
|
|
181
174
|
command = 'codex';
|
|
182
|
-
/**
|
|
183
|
-
* Check if Codex session is running for a worktree
|
|
184
|
-
*
|
|
185
|
-
* @param worktreeId - Worktree ID
|
|
186
|
-
* @returns True if session is running
|
|
187
|
-
*/
|
|
188
|
-
async isRunning(worktreeId, instanceId) {
|
|
189
|
-
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
190
|
-
return await (0, tmux_1.hasSession)(sessionName);
|
|
191
|
-
}
|
|
192
175
|
/**
|
|
193
176
|
* Start a new Codex session for a worktree
|
|
194
177
|
*
|
|
@@ -197,29 +180,22 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
197
180
|
*/
|
|
198
181
|
async launchSession(worktreeId, worktreePath, instanceId) {
|
|
199
182
|
// Check if Codex is installed
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
//
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
// command into the same pane.
|
|
217
|
-
if (await this.isToolLive(sessionName, { confirm: true })) {
|
|
218
|
-
logger.info('codex-session-sessionname');
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
logger.warn('codex-session-relaunch', { sessionName });
|
|
222
|
-
}
|
|
183
|
+
await this.requireInstalled();
|
|
184
|
+
// Issue #2070: this branch used to return unconditionally, and that is
|
|
185
|
+
// the second half of the reported bug. codex's own "1. Update now"
|
|
186
|
+
// replaces codex with `npm install` and exits; `Ctrl+C` twice quits it; a
|
|
187
|
+
// crash does the same. The tmux session survives all three, so `exists`
|
|
188
|
+
// stays true and the launch was skipped for a pane that had nothing but a
|
|
189
|
+
// shell prompt in it — leaving `kill-session` by hand as the only
|
|
190
|
+
// recovery. When the tool is gone we fall THROUGH and re-send the launch
|
|
191
|
+
// command into the same pane.
|
|
192
|
+
const { sessionName, exists, live } = await this.resolveLaunchPane(worktreeId, worktreePath, instanceId, {
|
|
193
|
+
logger,
|
|
194
|
+
liveAction: 'codex-session-exists',
|
|
195
|
+
relaunchAction: 'codex-session-relaunch',
|
|
196
|
+
});
|
|
197
|
+
if (live)
|
|
198
|
+
return;
|
|
223
199
|
// Issue #1760: everything the previous codex process reported through this
|
|
224
200
|
// (worktreeId, instanceId) belongs to a session that no longer exists, and
|
|
225
201
|
// the key is reused verbatim by the one about to be created. Without this
|
|
@@ -234,17 +210,6 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
234
210
|
// NOT fence: there the process is the same one.)
|
|
235
211
|
(0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: sources_1.CODEX_CLI_TOOL_ID, instanceId });
|
|
236
212
|
try {
|
|
237
|
-
if (!exists) {
|
|
238
|
-
// Create tmux session. Codex is inline-rendered, so its transcript lives in
|
|
239
|
-
// the pane scrollback — depth comes from the shared TMUX_HISTORY_LIMIT
|
|
240
|
-
// default (Issue #1624), do not re-hardcode it here.
|
|
241
|
-
await (0, tmux_1.createSession)({
|
|
242
|
-
sessionName,
|
|
243
|
-
workingDirectory: worktreePath,
|
|
244
|
-
});
|
|
245
|
-
// Wait a moment for the session to be created
|
|
246
|
-
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
247
|
-
}
|
|
248
213
|
// Issue #1760: hand this session its correlation keys, writing codex's
|
|
249
214
|
// hooks config first if it is not already there. codex has no
|
|
250
215
|
// `--settings`, so the keys ride in environment assignments on the launch
|
|
@@ -253,12 +218,21 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
253
218
|
//
|
|
254
219
|
// Falls back to the bare command on any failure and when
|
|
255
220
|
// `CM_AGENT_HOOKS_INJECT=0`; a session that starts without hooks is the
|
|
256
|
-
// pre-#1760 status quo, and a session that fails to start is not.
|
|
221
|
+
// pre-#1760 status quo, and a session that fails to start is not. The one
|
|
222
|
+
// exception is UAT isolation (Issue #3360), where the plan throws instead —
|
|
223
|
+
// which is why it is built BEFORE the tmux session: a refused launch must
|
|
224
|
+
// not leave an empty pane that `isRunning()` reports as a started codex.
|
|
257
225
|
const launchCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({
|
|
258
226
|
target: { worktreeId, cliToolId: sources_1.CODEX_CLI_TOOL_ID, instanceId },
|
|
259
227
|
executablePath: this.command,
|
|
260
228
|
worktreePath,
|
|
261
229
|
});
|
|
230
|
+
if (!exists) {
|
|
231
|
+
// Create tmux session. Codex is inline-rendered, so its transcript lives in
|
|
232
|
+
// the pane scrollback — depth comes from the shared TMUX_HISTORY_LIMIT
|
|
233
|
+
// default (Issue #1624), do not re-hardcode it here.
|
|
234
|
+
await this.createLaunchPane(sessionName, worktreePath);
|
|
235
|
+
}
|
|
262
236
|
// Issue #2068: re-send the SAME launch line into the SAME pane, for the
|
|
263
237
|
// one case where a launch legitimately has to happen twice — codex's own
|
|
264
238
|
// `1. Update now` replaces codex with `npm install -g @openai/codex` and
|
|
@@ -286,10 +260,10 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
286
260
|
relaunch: relaunchIntoSamePane,
|
|
287
261
|
trustHooks: (0, hooks_config_1.shouldTrustCodexHooks)(worktreePath),
|
|
288
262
|
});
|
|
289
|
-
logger.info('started-codex-session
|
|
263
|
+
logger.info('started-codex-session');
|
|
290
264
|
}
|
|
291
265
|
catch (error) {
|
|
292
|
-
const errorMessage = getErrorMessage(error);
|
|
266
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
293
267
|
throw new Error(`Failed to start Codex session: ${errorMessage}`);
|
|
294
268
|
}
|
|
295
269
|
}
|
|
@@ -556,7 +530,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
556
530
|
// Issue #890: number-key selection confirms instantly; no trailing Enter.
|
|
557
531
|
await (0, tmux_1.sendKeys)(sessionName, '1', false);
|
|
558
532
|
trustDialogHandled = true;
|
|
559
|
-
logger.info('auto-trusted-folder-for');
|
|
533
|
+
logger.info('auto-trusted-folder-for-codex');
|
|
560
534
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
561
535
|
continue;
|
|
562
536
|
}
|
|
@@ -707,7 +681,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
707
681
|
}
|
|
708
682
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
709
683
|
}
|
|
710
|
-
logger.info('codex-prompt-not');
|
|
684
|
+
logger.info('codex-prompt-not-detected');
|
|
711
685
|
throw new Error('Codex prompt not ready: timed out waiting for the input prompt before sending');
|
|
712
686
|
}
|
|
713
687
|
/**
|
|
@@ -718,18 +692,13 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
718
692
|
*/
|
|
719
693
|
async sendMessage(worktreeId, message, instanceId) {
|
|
720
694
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
721
|
-
// Check if session exists
|
|
722
|
-
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
723
|
-
if (!exists) {
|
|
724
|
-
throw new Error(`Codex session ${sessionName} does not exist. Start the session first.`);
|
|
725
|
-
}
|
|
726
695
|
// Issue #2070: the pane exists, but does the AGENT? codex's "1. Update now"
|
|
727
696
|
// replaces it with `npm install` and exits, `Ctrl+C` twice quits it, a crash
|
|
728
697
|
// does the same — and the send that follows used to sit in the readiness
|
|
729
698
|
// wait until it timed out, leaving `kill-session` by hand as the only
|
|
730
699
|
// recovery. Relaunches into the same pane when the tool is gone; costs one
|
|
731
700
|
// `capture-pane` when it is not.
|
|
732
|
-
await this.
|
|
701
|
+
await this.requireSession('Codex', worktreeId, instanceId, { relaunch: true });
|
|
733
702
|
try {
|
|
734
703
|
// Verify Codex is at prompt state before sending
|
|
735
704
|
await this.waitForPrompt(sessionName);
|
|
@@ -742,13 +711,17 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
742
711
|
// Issue #1933: the tool describes its own composer; the sender no
|
|
743
712
|
// longer keys three module-level tables on the id.
|
|
744
713
|
composer: this.describeComposer(),
|
|
714
|
+
// Issue #3366: codex draws fast keystrokes only when the burst ends and
|
|
715
|
+
// turns an Enter that arrives before that into a newline, so Enter
|
|
716
|
+
// waits until the composer shows the body.
|
|
717
|
+
awaitTypedBody: true,
|
|
745
718
|
});
|
|
746
719
|
// Issue #405: Invalidate cache after sending message
|
|
747
720
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
748
|
-
logger.info('sent-message-to-codex-session
|
|
721
|
+
logger.info('sent-message-to-codex-session');
|
|
749
722
|
}
|
|
750
723
|
catch (error) {
|
|
751
|
-
const errorMessage = getErrorMessage(error);
|
|
724
|
+
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
752
725
|
throw new Error(`Failed to send message to Codex: ${errorMessage}`);
|
|
753
726
|
}
|
|
754
727
|
}
|
|
@@ -758,26 +731,17 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
758
731
|
* @param worktreeId - Worktree ID
|
|
759
732
|
*/
|
|
760
733
|
async killSession(worktreeId, instanceId) {
|
|
761
|
-
|
|
762
|
-
|
|
734
|
+
await this.requestExitAndKill(worktreeId, instanceId, {
|
|
735
|
+
logger,
|
|
736
|
+
stoppedAction: 'stopped-codex-session',
|
|
763
737
|
// Send Ctrl+D to exit Codex gracefully
|
|
764
|
-
|
|
765
|
-
if (exists) {
|
|
738
|
+
requestExit: async (sessionName) => {
|
|
766
739
|
// Send Ctrl+D (ASCII 4)
|
|
767
740
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-d');
|
|
768
741
|
// Wait a moment for Codex to exit
|
|
769
742
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_EXIT_WAIT_MS));
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
const killed = await (0, tmux_1.killSession)(sessionName);
|
|
773
|
-
if (killed) {
|
|
774
|
-
logger.info('stopped-codex-session:sessionname');
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
catch (error) {
|
|
778
|
-
logger.error('session:stop-failed', { error: getErrorMessage(error) });
|
|
779
|
-
throw error;
|
|
780
|
-
}
|
|
743
|
+
},
|
|
744
|
+
});
|
|
781
745
|
}
|
|
782
746
|
}
|
|
783
747
|
exports.CodexTool = CodexTool;
|