commandmate 0.49.0 → 0.49.1
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 +238 -231
- package/.next/app-path-routes-manifest.json +19 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- 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.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
- 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.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.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.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.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_client-reference-manifest.js +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 +144 -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_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 +103 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.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.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_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 +19 -18
- package/.next/server/chunks/1656.js +2 -2
- 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/3773.js +1 -0
- package/.next/server/chunks/3801.js +31 -0
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/{9130.js → 5630.js} +1 -1
- package/.next/server/chunks/5775.js +1 -0
- package/.next/server/chunks/610.js +1 -0
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6808.js +4 -0
- package/.next/server/chunks/7023.js +14 -0
- package/.next/server/chunks/7604.js +1 -1
- 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/8807.js +63 -53
- package/.next/server/chunks/8918.js +103 -1
- package/.next/server/chunks/9198.js +144 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-675ba6b21844dc3b.js} +1 -1
- package/.next/static/chunks/3931-1a1abab16248f14d.js +1 -0
- package/.next/static/chunks/8606-ce17ffa77f39608e.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/layout-8bfac4724277b47f.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/sessions/page-890fd50ec9739973.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +1 -0
- package/.next/static/css/c1e307d05daf93b6.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +178 -13
- package/dist/cli/commands/message-dispatch.d.ts +25 -5
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +92 -6
- package/dist/cli/commands/relays.d.ts +25 -2
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +69 -5
- package/dist/cli/commands/respond.d.ts +12 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +63 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +6 -4
- package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
- package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
- package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
- package/dist/cli/commands/wait-instance.d.ts +21 -0
- package/dist/cli/commands/wait-instance.d.ts.map +1 -0
- package/dist/cli/commands/wait-instance.js +41 -0
- package/dist/cli/commands/wait-notices.d.ts +87 -0
- package/dist/cli/commands/wait-notices.d.ts.map +1 -0
- package/dist/cli/commands/wait-notices.js +301 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
- package/dist/cli/commands/wait-poll-state.d.ts +118 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-state.js +6 -0
- package/dist/cli/commands/wait-timing.d.ts +46 -0
- package/dist/cli/commands/wait-timing.d.ts.map +1 -0
- package/dist/cli/commands/wait-timing.js +99 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
- package/dist/cli/commands/wait-turn-boundary.js +427 -0
- package/dist/cli/commands/wait-verify.d.ts +50 -0
- package/dist/cli/commands/wait-verify.d.ts.map +1 -0
- package/dist/cli/commands/wait-verify.js +124 -0
- package/dist/cli/commands/wait.d.ts +6 -105
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +207 -959
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +23 -1
- package/dist/cli/types/api-responses.d.ts +47 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +15 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +7 -1
- package/dist/cli/utils/reply-ledger.d.ts +79 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +141 -1
- package/dist/lib/session/send-attempt-types.d.ts +23 -1
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +9 -1
- package/dist/server/locales/en/worktree.json +18 -3
- package/dist/server/locales/ja/worktree.json +18 -3
- package/dist/server/src/lib/auto-yes-poller.js +49 -10
- package/dist/server/src/lib/cli-tools/antigravity.js +40 -7
- package/dist/server/src/lib/cli-tools/codex.js +60 -11
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
- package/dist/server/src/lib/cli-tools/copilot.js +120 -30
- package/dist/server/src/lib/cli-tools/gemini.js +28 -9
- package/dist/server/src/lib/cli-tools/opencode.js +55 -13
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +580 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +356 -621
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
- package/dist/server/src/lib/db/migrations/runner.js +37 -4
- package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
- package/dist/server/src/lib/db/relay-bind-db.js +437 -0
- package/dist/server/src/lib/db/relay-db.js +59 -96
- package/dist/server/src/lib/detection/upstream-faults.js +40 -6
- package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
- package/dist/server/src/lib/polling/response-checker.js +7 -5
- package/dist/server/src/lib/prompt-answer-errors.js +288 -0
- package/dist/server/src/lib/prompt-answer-sender.js +264 -288
- package/dist/server/src/lib/push/failure-episode-state.js +4 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
- package/dist/server/src/lib/realtime-snippet.js +54 -0
- package/dist/server/src/lib/relay/relay-bind.js +294 -0
- package/dist/server/src/lib/relay/relay-boot.js +51 -0
- package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
- package/dist/server/src/lib/relay/relay-delivery.js +134 -220
- package/dist/server/src/lib/relay/relay-messages.js +39 -4
- package/dist/server/src/lib/relay/relay-overlap.js +92 -0
- package/dist/server/src/lib/relay/relay-system-line.js +3 -2
- package/dist/server/src/lib/relay/types.js +12 -1
- package/dist/server/src/lib/session/agent-session-lifecycle.js +18 -0
- package/dist/server/src/lib/session/claude-session.js +41 -6
- package/dist/server/src/lib/session/composer-clear.js +54 -1
- package/dist/server/src/lib/session/current-output-builder.js +21 -5
- package/dist/server/src/lib/session/instance-input-lock.js +664 -0
- package/dist/server/src/lib/session/send-attempt-state.js +17 -0
- package/dist/server/src/lib/session/send-attempt-types.js +9 -1
- package/dist/server/src/lib/session/send-user-message.js +82 -13
- package/package.json +1 -1
- package/release-notes/0.49.1.json +66 -0
- package/.next/server/chunks/1210.js +0 -1
- package/.next/server/chunks/1945.js +0 -14
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/4194.js +0 -67
- package/.next/server/chunks/4280.js +0 -1
- package/.next/server/chunks/5845.js +0 -1
- package/.next/server/chunks/720.js +0 -103
- package/.next/server/chunks/936.js +0 -1
- package/.next/server/chunks/9540.js +0 -1
- package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
- package/.next/static/chunks/9079-987939d231704218.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
- package/.next/static/css/db8959555c3d9c96.css +0 -1
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → fqfSDqQMweROeHUzOt_m1}/_buildManifest.js +0 -0
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → fqfSDqQMweROeHUzOt_m1}/_ssgManifest.js +0 -0
|
@@ -21,6 +21,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
|
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
22
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
23
23
|
const errors_1 = require("../../lib/errors");
|
|
24
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
24
25
|
const logger = (0, logger_1.createLogger)('cli-tools/codex');
|
|
25
26
|
/** Wait for Codex CLI to initialize after launch */
|
|
26
27
|
const CODEX_INIT_WAIT_MS = 3000;
|
|
@@ -327,6 +328,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
327
328
|
try {
|
|
328
329
|
for (let i = 0; i < maxAttempts; i++) {
|
|
329
330
|
try {
|
|
331
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
330
332
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
331
333
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
332
334
|
// Issue #2315: the hooks screens are judged BEFORE readiness, and the
|
|
@@ -343,7 +345,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
343
345
|
if (lifecycleScreen === 'hooks-review' ||
|
|
344
346
|
lifecycleScreen === 'hooks-list' ||
|
|
345
347
|
lifecycleScreen === 'hooks-detail') {
|
|
346
|
-
const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, hooksScreenState, trustHooks);
|
|
348
|
+
const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, hooksScreenState, trustHooks, readMark);
|
|
347
349
|
if (sent) {
|
|
348
350
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
349
351
|
continue;
|
|
@@ -499,7 +501,20 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
499
501
|
// stray keypress -- an empty submit on the main prompt, or worst case the
|
|
500
502
|
// default "1. Update now" confirm if the key was dropped during a re-render.
|
|
501
503
|
// Send the digit alone and let the next poll observe the result.
|
|
502
|
-
|
|
504
|
+
//
|
|
505
|
+
// Issue #3952: as the composer's writer, and only while the update
|
|
506
|
+
// dialog is still the active one once a send holding it is over.
|
|
507
|
+
const digit = keyToSend;
|
|
508
|
+
const updateOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'update'), () => (0, tmux_1.sendKeys)(sessionName, digit, false));
|
|
509
|
+
if (!updateOutcome.answered) {
|
|
510
|
+
// Nothing typed: the install this lock covers never started.
|
|
511
|
+
if (updateLockHeld) {
|
|
512
|
+
updateLockHeld = false;
|
|
513
|
+
(0, updates_1.releaseAgentUpdateLock)(CODEX_UPDATE_LOCK_TOOL);
|
|
514
|
+
}
|
|
515
|
+
logger.info('codex-update-dialog-answer-skipped', { sessionName, reason: updateOutcome.reason });
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
503
518
|
updateDialogHandled = true;
|
|
504
519
|
if (keyToSend === codex_update_dialog_config_1.CODEX_UPDATE_DIALOG_KEYS.update) {
|
|
505
520
|
// codex is about to become `npm install`. The prompt this method
|
|
@@ -519,7 +534,11 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
519
534
|
// Numbered selection dialogs are dismissed by the number key above, so this
|
|
520
535
|
// branch is reached only when no number selection is pending.
|
|
521
536
|
if (activeDialog === 'press-enter') {
|
|
522
|
-
await (0, tmux_1.sendSpecialKey)(sessionName, 'Enter');
|
|
537
|
+
const enterOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'press-enter'), () => (0, tmux_1.sendSpecialKey)(sessionName, 'Enter'));
|
|
538
|
+
if (!enterOutcome.answered) {
|
|
539
|
+
logger.info('codex-notification-answer-skipped', { sessionName, reason: enterOutcome.reason });
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
523
542
|
logger.info('dismissed-codex-notification');
|
|
524
543
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
525
544
|
continue;
|
|
@@ -528,7 +547,11 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
528
547
|
// Options: › 1. Yes, continue / 2. No, quit
|
|
529
548
|
if (activeDialog === 'trust' && !trustDialogHandled) {
|
|
530
549
|
// Issue #890: number-key selection confirms instantly; no trailing Enter.
|
|
531
|
-
await (0, tmux_1.sendKeys)(sessionName, '1', false);
|
|
550
|
+
const trustOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'trust'), () => (0, tmux_1.sendKeys)(sessionName, '1', false));
|
|
551
|
+
if (!trustOutcome.answered) {
|
|
552
|
+
logger.info('codex-trust-dialog-answer-skipped', { sessionName, reason: trustOutcome.reason });
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
532
555
|
trustDialogHandled = true;
|
|
533
556
|
logger.info('auto-trusted-folder-for-codex');
|
|
534
557
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
@@ -556,6 +579,14 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
556
579
|
}
|
|
557
580
|
}
|
|
558
581
|
}
|
|
582
|
+
/**
|
|
583
|
+
* Whether `dialog` is still codex's active dialog on a fresh read — the
|
|
584
|
+
* re-check an automatic launch answer makes once it owns the composer after
|
|
585
|
+
* another writer (Issue #3952).
|
|
586
|
+
*/
|
|
587
|
+
async isActiveDialogStill(sessionName, dialog) {
|
|
588
|
+
return (0, cli_patterns_1.getCodexActiveDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))) === dialog;
|
|
589
|
+
}
|
|
559
590
|
/**
|
|
560
591
|
* Send the one key that gets this pane off the hooks screen it is on
|
|
561
592
|
* (Issue #2315).
|
|
@@ -590,9 +621,12 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
590
621
|
* @param screen - The bottom-most active hooks screen, from `getCodexLifecycleDialog`
|
|
591
622
|
* @param state - Per-screen budget, carried across polls by the caller
|
|
592
623
|
* @param trust - Whether trust may be granted, from {@link shouldTrustCodexHooks}
|
|
593
|
-
* @
|
|
624
|
+
* @param readMark - {@link instanceInputReadMark} taken before the frame that showed `screen` was read
|
|
625
|
+
* @returns True when a key was sent, or none was because the composer's writer
|
|
626
|
+
* found the screen gone (Issue #3952) — either way the caller polls again;
|
|
627
|
+
* false when this screen's budget is spent
|
|
594
628
|
*/
|
|
595
|
-
async answerCodexHooksScreen(sessionName, screen, state, trust) {
|
|
629
|
+
async answerCodexHooksScreen(sessionName, screen, state, trust, readMark) {
|
|
596
630
|
if (state.screen !== screen) {
|
|
597
631
|
// Progress. The pane moved, so the previous screen's spent attempts say
|
|
598
632
|
// nothing about this one.
|
|
@@ -603,7 +637,22 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
603
637
|
logger.warn('codex-hooks-screen-unresponsive', { sessionName, screen, trust });
|
|
604
638
|
return false;
|
|
605
639
|
}
|
|
606
|
-
const attempt =
|
|
640
|
+
const attempt = state.attempts + 1;
|
|
641
|
+
// Issue #3952: the key goes to the composer's tmux pane, so it waits for a
|
|
642
|
+
// send that holds it — and is not typed if the hooks screen it was chosen
|
|
643
|
+
// for is gone once that send is over. Inside `sendMessage` under
|
|
644
|
+
// `sendUserMessage`'s lock it joins that lock instead.
|
|
645
|
+
const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => (0, cli_patterns_1.getCodexLifecycleDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))) === screen, () => this.sendCodexHooksScreenKey(sessionName, screen, attempt, trust));
|
|
646
|
+
if (!outcome.answered) {
|
|
647
|
+
// Nothing was typed, so this screen's budget is not spent; poll again.
|
|
648
|
+
logger.info('codex-hooks-screen-answer-skipped', { sessionName, screen, reason: outcome.reason });
|
|
649
|
+
return true;
|
|
650
|
+
}
|
|
651
|
+
state.attempts = attempt;
|
|
652
|
+
return true;
|
|
653
|
+
}
|
|
654
|
+
/** The key {@link answerCodexHooksScreen} chose, typed as the composer's writer. */
|
|
655
|
+
async sendCodexHooksScreenKey(sessionName, screen, attempt, trust) {
|
|
607
656
|
if (screen === 'hooks-review') {
|
|
608
657
|
const key = attempt === 1
|
|
609
658
|
? trust
|
|
@@ -614,18 +663,17 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
614
663
|
// on the screen this key just opened.
|
|
615
664
|
await (0, tmux_1.sendKeys)(sessionName, key, false);
|
|
616
665
|
logger.info('codex-hooks-review-answered', { sessionName, key, attempt, trust });
|
|
617
|
-
return
|
|
666
|
+
return;
|
|
618
667
|
}
|
|
619
668
|
if (trust) {
|
|
620
669
|
// `t`, the key screens 2 and 3 print in their own footers. Literal, so
|
|
621
670
|
// tmux sends the character rather than resolving it as a key name.
|
|
622
671
|
await (0, tmux_1.sendKeys)(sessionName, CODEX_HOOKS_TRUST_KEY, false, { literal: true });
|
|
623
672
|
logger.info('codex-hooks-screen-trusted', { sessionName, screen, attempt });
|
|
624
|
-
return
|
|
673
|
+
return;
|
|
625
674
|
}
|
|
626
675
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'Escape');
|
|
627
676
|
logger.info('codex-hooks-screen-escaped', { sessionName, screen, attempt });
|
|
628
|
-
return true;
|
|
629
677
|
}
|
|
630
678
|
/**
|
|
631
679
|
* Wait for Codex prompt before sending a message.
|
|
@@ -653,6 +701,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
653
701
|
let trustHooks = null;
|
|
654
702
|
while (Date.now() - startTime < CODEX_PROMPT_WAIT_TIMEOUT_MS) {
|
|
655
703
|
try {
|
|
704
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
656
705
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
657
706
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
658
707
|
// Before readiness, for the reason `waitForReady` gives: a review screen
|
|
@@ -667,7 +716,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
667
716
|
const worktreePath = await (0, tmux_1.getSessionWorkingDirectory)(sessionName);
|
|
668
717
|
trustHooks = worktreePath !== null && (0, hooks_config_1.shouldTrustCodexHooks)(worktreePath);
|
|
669
718
|
}
|
|
670
|
-
await this.answerCodexHooksScreen(sessionName, screen, hooksScreenState, trustHooks);
|
|
719
|
+
await this.answerCodexHooksScreen(sessionName, screen, hooksScreenState, trustHooks, readMark);
|
|
671
720
|
}
|
|
672
721
|
else if ((0, cli_patterns_1.isCodexPromptReady)(output)) {
|
|
673
722
|
// Issue #890/#892: position-based guard so a residual update/trust dialog
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* @module lib/cli-tools/command-code-plan-review
|
|
35
35
|
*/
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
|
|
37
|
+
exports.PlanReviewInputLostError = exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
|
|
38
38
|
exports.isPlanReviewAction = isPlanReviewAction;
|
|
39
39
|
exports.planCommandCodePlanReviewKeys = planCommandCodePlanReviewKeys;
|
|
40
40
|
exports.sendCommandCodePlanReviewKeys = sendCommandCodePlanReviewKeys;
|
|
@@ -153,15 +153,37 @@ function planCommandCodePlanReviewKeys(state, request) {
|
|
|
153
153
|
}
|
|
154
154
|
/** Pause between steps, so the TUI handles each one as its own input event. */
|
|
155
155
|
exports.PLAN_REVIEW_STEP_DELAY_MS = 300;
|
|
156
|
+
/**
|
|
157
|
+
* The plan review's keys stopped part-way (Issue #3952 review P2-3): the
|
|
158
|
+
* session's input was taken from the answer — the session was replaced — after
|
|
159
|
+
* `stepsSent` of its steps had gone out. The rest were not sent.
|
|
160
|
+
*/
|
|
161
|
+
class PlanReviewInputLostError extends Error {
|
|
162
|
+
stepsSent;
|
|
163
|
+
constructor(sessionName, stepsSent) {
|
|
164
|
+
super(`Session ${sessionName} was replaced while the plan review answer held its input; ` +
|
|
165
|
+
`${stepsSent} step(s) had been sent, the rest were not (Issue #3952).`);
|
|
166
|
+
this.stepsSent = stepsSent;
|
|
167
|
+
this.name = 'PlanReviewInputLostError';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.PlanReviewInputLostError = PlanReviewInputLostError;
|
|
156
171
|
/**
|
|
157
172
|
* Send the planned steps, one tmux invocation each.
|
|
158
173
|
*
|
|
159
174
|
* Key steps (including `C-r`) go through `sendSpecialKeys`; the comment text
|
|
160
175
|
* goes through `-l` so it is never resolved as a key name.
|
|
176
|
+
*
|
|
177
|
+
* Issue #3952 review P2-3: given `isCurrent` (the input ticket the answer holds),
|
|
178
|
+
* it is asked before every step — after each wait — and a ticket that is no
|
|
179
|
+
* longer current stops the steps there ({@link PlanReviewInputLostError}), as
|
|
180
|
+
* the strict respond's keys stop.
|
|
161
181
|
*/
|
|
162
|
-
async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
|
|
182
|
+
async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), isCurrent) {
|
|
163
183
|
for (let i = 0; i < steps.length; i++) {
|
|
164
184
|
const step = steps[i];
|
|
185
|
+
if (isCurrent !== undefined && !isCurrent())
|
|
186
|
+
throw new PlanReviewInputLostError(sessionName, i);
|
|
165
187
|
if (step.kind === 'text') {
|
|
166
188
|
await (0, tmux_1.sendKeys)(sessionName, step.text, false, { literal: true });
|
|
167
189
|
}
|
|
@@ -24,6 +24,7 @@ exports.judgeCopilotModelSwitch = judgeCopilotModelSwitch;
|
|
|
24
24
|
const base_1 = require("./base");
|
|
25
25
|
const tmux_1 = require("../tmux/tmux");
|
|
26
26
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
27
|
+
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
27
28
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
28
29
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
29
30
|
const copilot_executable_1 = require("./copilot-executable");
|
|
@@ -37,6 +38,7 @@ const logger_1 = require("../../lib/logger");
|
|
|
37
38
|
const install_hints_1 = require("./install-hints");
|
|
38
39
|
const launch_window_1 = require("./launch-window");
|
|
39
40
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
41
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
40
42
|
const logger = (0, logger_1.createLogger)('cli-tools/copilot');
|
|
41
43
|
/** Interval for polling prompt detection */
|
|
42
44
|
const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
@@ -224,6 +226,33 @@ function judgeCopilotModelSwitch(before, output, modelName) {
|
|
|
224
226
|
return { kind: 'pending' };
|
|
225
227
|
}
|
|
226
228
|
/** The pane's bottom non-blank row, squeezed, for an error message a person reads. */
|
|
229
|
+
/**
|
|
230
|
+
* Throw unless `ticket` still owns the composer (Issue #3945): right before a
|
|
231
|
+
* key this module types itself, so a send whose session was replaced while it
|
|
232
|
+
* waited cannot type into the new one.
|
|
233
|
+
*/
|
|
234
|
+
function assertCopilotInputOwner(ticket, step) {
|
|
235
|
+
if (ticket.isCurrent())
|
|
236
|
+
return;
|
|
237
|
+
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Type `text` + Enter as the composer's owner. A failure that may have put part
|
|
241
|
+
* of it on the pane (anything but a `send-keys` tmux never started,
|
|
242
|
+
* `TmuxSendError.delivery`) leaves the carried paste mark, as the shared
|
|
243
|
+
* sender's typed body does (review-2): the next send waits out what may still
|
|
244
|
+
* be drawn.
|
|
245
|
+
*/
|
|
246
|
+
async function typeLeavingMarkOnFailure(sessionName, text, ticket) {
|
|
247
|
+
try {
|
|
248
|
+
await (0, tmux_1.sendKeys)(sessionName, text, true);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (error?.delivery !== 'not-started')
|
|
252
|
+
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
227
256
|
function describeBottomRow(output) {
|
|
228
257
|
const lines = (0, cli_patterns_1.stripAnsi)(output).split('\n');
|
|
229
258
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
@@ -397,15 +426,25 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
397
426
|
* `waiting`, and the send guard refuses a `waiting` session for as long as
|
|
398
427
|
* that entry lives.
|
|
399
428
|
*
|
|
429
|
+
* Issue #3952: the digit is typed as the composer's writer. A send that holds
|
|
430
|
+
* the composer is waited out, and the dialog is read again after it: when it
|
|
431
|
+
* is gone nothing is typed and false comes back, so the caller looks again on
|
|
432
|
+
* its next poll. Inside the selection-list branch's lock it joins that lock.
|
|
433
|
+
*
|
|
400
434
|
* @param sessionName - tmux session name
|
|
401
435
|
* @param output - ANSI-stripped pane capture
|
|
436
|
+
* @param readMark - {@link instanceInputReadMark} taken before `output` was read
|
|
402
437
|
* @returns True when the dialog was found and answered
|
|
403
438
|
*/
|
|
404
|
-
async answerFolderTrustDialog(sessionName, output) {
|
|
439
|
+
async answerFolderTrustDialog(sessionName, output, readMark) {
|
|
405
440
|
if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
|
|
406
441
|
return false;
|
|
407
442
|
}
|
|
408
|
-
await (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false);
|
|
443
|
+
const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => (0, cli_patterns_1.isCopilotFolderTrustDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))), () => (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false));
|
|
444
|
+
if (!outcome.answered) {
|
|
445
|
+
logger.info('copilot-folder-trust-answer-skipped', { reason: outcome.reason });
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
409
448
|
(0, launch_window_1.recordLaunchDialogPress)(sessionName);
|
|
410
449
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
411
450
|
logger.info('copilot-folder-trust-answered');
|
|
@@ -477,6 +516,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
477
516
|
let trustDialogHandled = false;
|
|
478
517
|
for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
|
|
479
518
|
try {
|
|
519
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
480
520
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
481
521
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
482
522
|
// Check if copilot's own composer is on screen
|
|
@@ -484,7 +524,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
484
524
|
logger.info('copilot-prompt-detected');
|
|
485
525
|
return;
|
|
486
526
|
}
|
|
487
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
527
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
488
528
|
trustDialogHandled = true;
|
|
489
529
|
}
|
|
490
530
|
}
|
|
@@ -541,6 +581,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
541
581
|
let output = '';
|
|
542
582
|
while (Date.now() - startTime < timeoutMs) {
|
|
543
583
|
try {
|
|
584
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
544
585
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
545
586
|
output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
546
587
|
if (this.isReadyFor(until, output)) {
|
|
@@ -555,7 +596,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
555
596
|
// "Yes, and remember this folder" and writes the operator's
|
|
556
597
|
// machine-global ~/.copilot/config.json. Answer it here for the same
|
|
557
598
|
// reason the launch path does, rather than leaving the worse outcome.
|
|
558
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
599
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
559
600
|
trustDialogHandled = true;
|
|
560
601
|
}
|
|
561
602
|
}
|
|
@@ -641,19 +682,48 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
641
682
|
// same pane when the tool is gone; costs one `capture-pane` when it is not.
|
|
642
683
|
await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: true });
|
|
643
684
|
try {
|
|
644
|
-
// Verify Copilot is at prompt state before sending
|
|
645
|
-
await this.waitForPrompt(sessionName);
|
|
646
685
|
// Check if this is a slash command that triggers a selection list
|
|
647
686
|
const slashCmd = this.extractSlashCommand(message);
|
|
648
687
|
if (slashCmd && SELECTION_LIST_COMMANDS.has(slashCmd)) {
|
|
649
688
|
// For selection list commands: send text + Enter, then wait for
|
|
650
689
|
// the selection list to appear. Do NOT send additional input after.
|
|
651
|
-
|
|
652
|
-
|
|
690
|
+
//
|
|
691
|
+
// Issue #3945: this types into the composer without the shared sender,
|
|
692
|
+
// so it takes the instance's input lock itself — from the readiness
|
|
693
|
+
// read (fresh, under the lock) to the picker that answers it — and
|
|
694
|
+
// waits out a carried paste mark first, as a normal send does.
|
|
695
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async (ticket) => {
|
|
696
|
+
await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
|
|
697
|
+
// review-2: a composer that never came up (a dialog, an unreadable
|
|
698
|
+
// pane, a time-out) is not typed into. The shared sender's re-check
|
|
699
|
+
// then refuses on the same terms right before the keys: a dialog is
|
|
700
|
+
// `prompt-waiting`, a pane that cannot be read `recheck-failed`.
|
|
701
|
+
const prompt = await this.waitForPrompt(sessionName);
|
|
702
|
+
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
703
|
+
if (!prompt.ready) {
|
|
704
|
+
// review-3: neither the request nor the pane goes into the message.
|
|
705
|
+
// `classifySendFailure` reads the wording, and its "may have been
|
|
706
|
+
// typed" rules come first — a body or a screen saying `submit could
|
|
707
|
+
// not be confirmed` would turn this refusal into `indeterminate`.
|
|
708
|
+
logger.warn('copilot-selection-list-not-sent:prompt-not-ready', {
|
|
709
|
+
command: slashCmd,
|
|
710
|
+
bottomRow: describeBottomRow(prompt.output),
|
|
711
|
+
});
|
|
712
|
+
throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
|
|
713
|
+
'so the selection-list command was not sent; nothing was typed');
|
|
714
|
+
}
|
|
715
|
+
assertCopilotInputOwner(ticket, 'the selection-list command');
|
|
716
|
+
// Issue #3953: the send's stamp, as the shared sender takes it.
|
|
717
|
+
(0, instance_input_lock_1.noteInputStart)();
|
|
718
|
+
await typeLeavingMarkOnFailure(sessionName, message, ticket);
|
|
719
|
+
await this.waitForSelectionList(sessionName);
|
|
720
|
+
});
|
|
653
721
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
654
722
|
logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
|
|
655
723
|
return;
|
|
656
724
|
}
|
|
725
|
+
// Verify Copilot is at prompt state before sending
|
|
726
|
+
await this.waitForPrompt(sessionName);
|
|
657
727
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
658
728
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
659
729
|
// Copilot's own text-input / post-Enter delays are preserved. The selection
|
|
@@ -731,32 +801,52 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
731
801
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
732
802
|
await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: false });
|
|
733
803
|
try {
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
`(bottom row: ${describeBottomRow(idle.output)})`);
|
|
738
|
-
}
|
|
739
|
-
const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
|
|
740
|
-
// Send /model <modelName> command with Enter. An argument means an
|
|
741
|
-
// in-place switch, never a picker (Issue #1895).
|
|
742
|
-
await (0, tmux_1.sendKeys)(sessionName, `/model ${modelName}`, true);
|
|
743
|
-
const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
|
|
744
|
-
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
745
|
-
if (verdict.kind === 'rejected') {
|
|
746
|
-
logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
|
|
747
|
-
throw new Error(`copilot refused it: ${verdict.reason}`);
|
|
748
|
-
}
|
|
749
|
-
if (verdict.kind === 'pending') {
|
|
750
|
-
logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
|
|
751
|
-
throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms ` +
|
|
752
|
-
`(bottom row: ${verdict.bottomRow}); the switch may still take effect, and nothing further was typed`);
|
|
753
|
-
}
|
|
754
|
-
logger.info('copilot-model-switched', { model: modelName });
|
|
804
|
+
// Issue #3945: `/model` is typed into the composer, so it is one writer's
|
|
805
|
+
// turn like the selection-list branch — from the idle read to the answer.
|
|
806
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, (ticket) => this.switchModelUnderInputLock(sessionName, modelName, ticket));
|
|
755
807
|
}
|
|
756
808
|
catch (error) {
|
|
757
809
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
758
|
-
|
|
810
|
+
// Issue #3952: the re-check's `code` is kept, so the caller records a
|
|
811
|
+
// dialog or an unreadable pane as such rather than as a refused model.
|
|
812
|
+
const code = error?.code;
|
|
813
|
+
throw Object.assign(new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`), typeof code === 'string' ? { code } : {});
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
/** {@link sendModelCommand}'s keys and waits, as the composer's only writer (Issue #3945). */
|
|
817
|
+
async switchModelUnderInputLock(sessionName, modelName, ticket) {
|
|
818
|
+
// A previous send's body may still arrive (review-1 #5): `/model` waits it
|
|
819
|
+
// out like a normal send, and the idle read below is the one after the wait.
|
|
820
|
+
await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
|
|
821
|
+
const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
|
|
822
|
+
if (!idle.ready) {
|
|
823
|
+
// The pane's text goes to the log, not the message: the message is read by
|
|
824
|
+
// `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
|
|
825
|
+
logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
|
|
826
|
+
throw new Error(`copilot did not become idle within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms, so /model was not sent`);
|
|
827
|
+
}
|
|
828
|
+
const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
|
|
829
|
+
// Issue #3952: "idle, so no dialog" holds for the frame that was read, not
|
|
830
|
+
// for the moment the keys go out. The pane is read once more right before
|
|
831
|
+
// them, as every send is: a dialog is `prompt-waiting`, a pane that cannot
|
|
832
|
+
// be read `recheck-failed`, and nothing is typed in either case.
|
|
833
|
+
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
834
|
+
// Send /model <modelName> command with Enter. An argument means an
|
|
835
|
+
// in-place switch, never a picker (Issue #1895).
|
|
836
|
+
assertCopilotInputOwner(ticket, '/model');
|
|
837
|
+
await typeLeavingMarkOnFailure(sessionName, `/model ${modelName}`, ticket);
|
|
838
|
+
const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
|
|
839
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
840
|
+
if (verdict.kind === 'rejected') {
|
|
841
|
+
logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
|
|
842
|
+
throw new Error(`copilot refused it: ${verdict.reason}`);
|
|
843
|
+
}
|
|
844
|
+
if (verdict.kind === 'pending') {
|
|
845
|
+
logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
|
|
846
|
+
throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms; ` +
|
|
847
|
+
'the switch may still take effect, and nothing further was typed');
|
|
759
848
|
}
|
|
849
|
+
logger.info('copilot-model-switched', { model: modelName });
|
|
760
850
|
}
|
|
761
851
|
/**
|
|
762
852
|
* Poll until `/model <modelName>` has answered (Issue #2623).
|
|
@@ -25,6 +25,7 @@ const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
|
25
25
|
const errors_1 = require("../../lib/errors");
|
|
26
26
|
const launch_dialog_1 = require("./launch-dialog");
|
|
27
27
|
const launch_window_1 = require("./launch-window");
|
|
28
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
28
29
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
29
30
|
/** Wait for Gemini CLI to initialize after launch (banner + auth + dialog) */
|
|
30
31
|
const GEMINI_INIT_WAIT_MS = 6000;
|
|
@@ -106,7 +107,11 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
106
107
|
// trust dialog is this launch's to answer; the Auto-Yes poller leaves it.
|
|
107
108
|
(0, launch_window_1.beginLaunchWindow)(sessionName);
|
|
108
109
|
try {
|
|
109
|
-
|
|
110
|
+
// Issue #3975: the launch line is one writer's turn, so a send's body
|
|
111
|
+
// already in the pane is not run as part of it. Only the keys: the
|
|
112
|
+
// waits below stay outside the lock, where a send waiting for the
|
|
113
|
+
// prompt cannot be held behind them.
|
|
114
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, () => (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true));
|
|
110
115
|
// Wait for Gemini to initialize (minimum wait for banner/auth)
|
|
111
116
|
await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
|
|
112
117
|
// Poll until Gemini interactive prompt is ready
|
|
@@ -139,6 +144,8 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
139
144
|
const loggedDecisions = new Set();
|
|
140
145
|
for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
|
|
141
146
|
try {
|
|
147
|
+
// Issue #3975: taken before the read the trust Enter is decided on.
|
|
148
|
+
const readMark = (0, instance_input_lock_1.instanceInputLaunchReadMark)();
|
|
142
149
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
|
|
143
150
|
// Strip ANSI escape codes before pattern matching
|
|
144
151
|
// (Gemini TUI uses 24-bit color codes that break regex matching)
|
|
@@ -152,14 +159,26 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
152
159
|
if (!trustDialogHandled) {
|
|
153
160
|
const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, output);
|
|
154
161
|
if (decision.action === 'press') {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
// Issue #3975: the Enter as an `exclusive` writer, so it never lands
|
|
163
|
+
// inside a send's body, paste or Enter; a send that came between
|
|
164
|
+
// the read and the lock makes the dialog be read again first.
|
|
165
|
+
const pressed = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
|
|
166
|
+
const again = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT)));
|
|
167
|
+
return again.action === 'press' && again.key === decision.key;
|
|
168
|
+
}, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key), { mode: 'exclusive' });
|
|
169
|
+
if (pressed.answered) {
|
|
170
|
+
trustDialogHandled = true;
|
|
171
|
+
trustPressedAt = Date.now();
|
|
172
|
+
// Issue #3790: the poller leaves the answered dialog alone even if
|
|
173
|
+
// the window closes before gemini redraws it.
|
|
174
|
+
(0, launch_window_1.recordLaunchDialogPress)(sessionName, trustPressedAt);
|
|
175
|
+
logger.info('auto-trusted-folder-for-gemini');
|
|
176
|
+
// Continue polling for prompt after trust dialog
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Not answered this poll; the next one reads the screen again.
|
|
180
|
+
logger.info('gemini-trust-answer-skipped', { sessionName, reason: pressed.reason });
|
|
181
|
+
}
|
|
163
182
|
}
|
|
164
183
|
else {
|
|
165
184
|
const warning = (0, launch_dialog_1.launchDialogWarning)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, decision);
|