commandmate 0.49.3 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +454 -408
- package/.next/app-path-routes-manifest.json +19 -13
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +32 -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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -103
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +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]/resolve/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route_client-reference-manifest.js +1 -0
- 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.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roles/[id]/route.js +1 -0
- package/.next/server/app/api/roles/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roles/route.js +1 -0
- package/.next/server/app/api/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route_client-reference-manifest.js +1 -0
- 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.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 +3 -3
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.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 +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/roles/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -104
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.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.js +2 -2
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- 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 -13
- package/.next/server/chunks/1184.js +5 -0
- package/.next/server/chunks/1501.js +5 -5
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -2
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2819.js +1 -0
- package/.next/server/chunks/2897.js +1 -1
- package/.next/server/chunks/3042.js +2 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3294.js +3 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3505.js +2 -6
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3801.js +2 -2
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/454.js +1 -0
- package/.next/server/chunks/4645.js +1 -0
- package/.next/server/chunks/4911.js +1 -1
- package/.next/server/chunks/5350.js +6 -2
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6009.js +12 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +2 -2
- package/.next/server/chunks/6569.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +4 -4
- package/.next/server/chunks/696.js +3 -0
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/{9702.js → 7083.js} +1 -1
- package/.next/server/chunks/741.js +1 -0
- package/.next/server/chunks/7662.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8143.js +33 -0
- package/.next/server/chunks/8581.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +97 -10
- package/.next/server/chunks/8918.js +3 -105
- package/.next/server/chunks/8955.js +1 -0
- package/.next/server/chunks/923.js +1 -0
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/973.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2314-2c9d587a27e8f731.js +1 -0
- package/.next/static/chunks/2407-ee881c99e218975b.js +1 -0
- package/.next/static/chunks/3931-24d7e245a93feb25.js +1 -0
- package/.next/static/chunks/4548-9afa02fd18afa6c7.js +1 -0
- package/.next/static/chunks/{5794-7975b8e51e731b19.js → 5794-38b3b504b3d97e04.js} +1 -1
- package/.next/static/chunks/{6966-d8dc6032410ffaba.js → 6966-dbfa4a43397f8c6d.js} +1 -1
- package/.next/static/chunks/7090-28e83f5a0efdb3b4.js +1 -0
- package/.next/static/chunks/7229.016d007c467a3600.js +1 -0
- package/.next/static/chunks/{8407-35bbfc84793d7004.js → 8407-dd6a8062fc449899.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/agent-role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/settle/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/layout-7bf800fcc5e025b1.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/more/{page-ff5af5ca48774c89.js → page-e8f5780f6e4fb657.js} +1 -1
- package/.next/static/chunks/app/{page-b4863bfe0452e09d.js → page-869f353a4ac4e15b.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/repositories/page-bedb505687010f18.js +1 -0
- package/.next/static/chunks/app/review/page-87c4a9b0de50fa80.js +1 -0
- package/.next/static/chunks/app/sessions/{page-c6eb7c02db2f4c80.js → page-82ca46793789fce4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-570eb79fbbd1a934.js +1 -0
- package/.next/static/chunks/{webpack-838df0273b03af19.js → webpack-16b1a3143fa42ca0.js} +1 -1
- package/.next/static/css/d4f2c9522cf1b449.css +1 -0
- package/.next/static/z4d8-5MaLkoD-4EhueZwk/_buildManifest.js +1 -0
- package/.next/trace +14 -13
- package/.next/types/app/api/repositories/[id]/role-defaults/route.ts +347 -0
- package/.next/types/app/api/roles/[id]/route.ts +347 -0
- package/.next/types/app/api/roles/route.ts +347 -0
- package/.next/types/app/api/settings/agent-role-defaults/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/settle/route.ts +347 -0
- package/.next/types/routes.d.ts +7 -1
- package/.next/types/validator.ts +54 -0
- package/dist/cli/commands/instances.d.ts +1 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +290 -33
- package/dist/cli/commands/message-dispatch.d.ts +25 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +26 -6
- package/dist/cli/commands/relays.d.ts +5 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +37 -1
- package/dist/cli/commands/roles.d.ts +11 -0
- package/dist/cli/commands/roles.d.ts.map +1 -0
- package/dist/cli/commands/roles.js +392 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +526 -38
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +91 -3
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/types/api-responses.d.ts +54 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +38 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +15 -1
- package/dist/cli/utils/agent-instances.d.ts +29 -1
- package/dist/cli/utils/agent-instances.d.ts.map +1 -1
- package/dist/cli/utils/agent-instances.js +67 -7
- package/dist/cli/utils/agent-roles.d.ts +75 -0
- package/dist/cli/utils/agent-roles.d.ts.map +1 -0
- package/dist/cli/utils/agent-roles.js +238 -0
- package/dist/cli/utils/api-client-errors.d.ts +23 -1
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -1
- package/dist/cli/utils/api-client-errors.js +14 -2
- package/dist/cli/utils/api-client.d.ts +8 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +13 -1
- package/dist/cli/utils/role-failure.d.ts +31 -0
- package/dist/cli/utils/role-failure.d.ts.map +1 -0
- package/dist/cli/utils/role-failure.js +90 -0
- package/dist/cli/utils/role-input.d.ts +16 -0
- package/dist/cli/utils/role-input.d.ts.map +1 -0
- package/dist/cli/utils/role-input.js +78 -0
- package/dist/cli/utils/security-logger.d.ts +17 -0
- package/dist/cli/utils/security-logger.d.ts.map +1 -1
- package/dist/cli/utils/security-logger.js +44 -5
- package/dist/lib/detection/tools/verified-against.d.ts +16 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +16 -0
- package/dist/lib/session/send-attempt-types.d.ts +4 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.d.ts +22 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.js +32 -2
- package/dist/server/locales/en/worktree.json +25 -6
- package/dist/server/locales/ja/worktree.json +25 -6
- package/dist/server/src/config/safe-directory.js +30 -0
- package/dist/server/src/lib/agent-roles/adapters.js +174 -0
- package/dist/server/src/lib/agent-roles/artifacts.js +638 -0
- package/dist/server/src/lib/agent-roles/composition.js +222 -0
- package/dist/server/src/lib/agent-roles/fingerprint.js +21 -0
- package/dist/server/src/lib/agent-roles/jsonc.js +85 -0
- package/dist/server/src/lib/agent-roles/launch-errors.js +58 -0
- package/dist/server/src/lib/agent-roles/pane-env.js +63 -0
- package/dist/server/src/lib/agent-roles/resolve.js +375 -0
- package/dist/server/src/lib/agent-roles/toml-basic.js +140 -0
- package/dist/server/src/lib/agent-roles/unicode.js +16 -0
- package/dist/server/src/lib/agent-roles/validation.js +61 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -6
- package/dist/server/src/lib/cli-tools/base.js +63 -5
- package/dist/server/src/lib/cli-tools/claude-auto-default-nudge.js +141 -0
- package/dist/server/src/lib/cli-tools/claude.js +7 -1
- package/dist/server/src/lib/cli-tools/codex.js +134 -21
- package/dist/server/src/lib/cli-tools/command-code.js +24 -1
- package/dist/server/src/lib/cli-tools/copilot.js +36 -7
- package/dist/server/src/lib/cli-tools/gemini.js +37 -3
- package/dist/server/src/lib/cli-tools/launch-answer-skips.js +76 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +10 -0
- package/dist/server/src/lib/cli-tools/opencode.js +58 -7
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +24 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +25 -1
- package/dist/server/src/lib/db/agent-instances-db.js +53 -0
- package/dist/server/src/lib/db/agent-roles-db.js +409 -0
- package/dist/server/src/lib/db/agent-session-cost-sampler.js +3 -2
- package/dist/server/src/lib/db/db-instance.js +7 -37
- package/dist/server/src/lib/db/migrations/index.js +4 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v64-agent-roles.js +123 -0
- package/dist/server/src/lib/db/migrations/v65-agent-instance-creation-keys.js +42 -0
- package/dist/server/src/lib/db/relay-db.js +35 -0
- package/dist/server/src/lib/detection/cli-patterns.js +13 -3
- package/dist/server/src/lib/detection/model-info-extractor.js +1 -1
- package/dist/server/src/lib/detection/tools/claude/patterns.js +76 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +5 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +5 -1
- package/dist/server/src/lib/detection/tools/codex/patterns.js +52 -2
- package/dist/server/src/lib/detection/tools/codex/prompt.js +23 -3
- package/dist/server/src/lib/detection/tools/opencode/detect.js +30 -15
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +268 -7
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +16 -7
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +51 -15
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +195 -11
- package/dist/server/src/lib/detection/tools/run-detection.js +5 -2
- package/dist/server/src/lib/detection/tools/verified-against.js +16 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +22 -0
- package/dist/server/src/lib/git/git-common-dir.js +192 -0
- package/dist/server/src/lib/hooks/hook-settings-generator.js +8 -2
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +31 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +31 -8
- package/dist/server/src/lib/hooks/sources/opencode/client.js +20 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +208 -35
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +117 -2
- package/dist/server/src/lib/job-executor.js +18 -1
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +58 -4
- package/dist/server/src/lib/polling/response-checker.js +32 -7
- package/dist/server/src/lib/relay/relay-delivery-block.js +150 -0
- package/dist/server/src/lib/relay/relay-delivery.js +59 -2
- package/dist/server/src/lib/response-cleaner.js +13 -3
- package/dist/server/src/lib/response-extractor.js +38 -3
- package/dist/server/src/lib/session/agent-session-lifecycle.js +9 -1
- package/dist/server/src/lib/session/claude-executor.js +13 -1
- package/dist/server/src/lib/session/claude-session.js +109 -13
- package/dist/server/src/lib/session/instance-input-lock.js +93 -4
- package/dist/server/src/lib/session/role-launch.js +722 -0
- package/dist/server/src/lib/session/send-attempt-state.js +7 -0
- package/dist/server/src/lib/session/send-user-message.js +6 -0
- package/dist/server/src/lib/session/session-generation-archive.js +7 -8
- package/dist/server/src/lib/session/session-launch-flight.js +33 -1
- package/dist/server/src/lib/session/worktree-session-reconcile.js +5 -0
- package/dist/server/src/lib/test-run-detection.js +53 -0
- package/dist/server/src/lib/tmux/read-mode.js +4 -0
- package/dist/server/src/lib/tmux/session-hook-scripts.js +36 -4
- package/dist/server/src/lib/tui-accumulator.js +14 -5
- package/dist/server/src/lib/verification/env-clean-gate.js +117 -12
- package/dist/server/src/lib/verification/gate-runner.js +9 -8
- package/dist/server/src/lib/verification/verify-config.js +32 -2
- package/dist/server/src/types/agent-roles.js +56 -0
- package/dist/types/agent-roles.d.ts +351 -0
- package/dist/types/agent-roles.d.ts.map +1 -0
- package/dist/types/agent-roles.js +56 -0
- package/docs/en/user-guide/webapp-guide.md +16 -0
- package/package.json +2 -1
- package/release-notes/0.50.0.json +113 -0
- package/.next/server/chunks/1308.js +0 -1
- package/.next/server/chunks/4490.js +0 -1
- package/.next/server/chunks/4936.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6119.js +0 -1
- package/.next/server/chunks/7491.js +0 -3
- package/.next/server/chunks/7926.js +0 -1
- package/.next/server/chunks/9360.js +0 -2
- package/.next/server/chunks/9584.js +0 -1
- package/.next/static/LNfVZiq6FZwKsV7L9Mi6M/_buildManifest.js +0 -1
- package/.next/static/chunks/2407-87ec01332344ec2b.js +0 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +0 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.js +0 -1
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +0 -1
- package/.next/static/chunks/8165-263172c17ae8e8c3.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/repositories/page-71f5a5ac29b0370d.js +0 -1
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +0 -1
- package/.next/static/css/c1e307d05daf93b6.css +0 -1
- /package/.next/static/{LNfVZiq6FZwKsV7L9Mi6M → z4d8-5MaLkoD-4EhueZwk}/_ssgManifest.js +0 -0
|
@@ -15,6 +15,7 @@ const tool_liveness_1 = require("../detection/tool-liveness");
|
|
|
15
15
|
const codex_update_dialog_config_1 = require("../../config/codex-update-dialog-config");
|
|
16
16
|
const updates_1 = require("../../lib/updates");
|
|
17
17
|
const logger_1 = require("../../lib/logger");
|
|
18
|
+
const launch_answer_skips_1 = require("./launch-answer-skips");
|
|
18
19
|
const sources_1 = require("../../lib/hooks/sources");
|
|
19
20
|
const hooks_config_1 = require("../../lib/hooks/sources/codex/hooks-config");
|
|
20
21
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
@@ -29,6 +30,16 @@ const CODEX_INIT_WAIT_MS = 3000;
|
|
|
29
30
|
const CODEX_POLL_INTERVAL_MS = 1000;
|
|
30
31
|
/** Max attempts for initialization polling (30 * 1000ms = 30s total window) */
|
|
31
32
|
const CODEX_INIT_MAX_ATTEMPTS = 30;
|
|
33
|
+
/**
|
|
34
|
+
* Issue #4175: the pause after a launch answer the input lock declined. It is
|
|
35
|
+
* the poll's own, {@link CODEX_POLL_INTERVAL_MS}: a skip used to `continue` past
|
|
36
|
+
* it, and a lock that declines at once (`recheck-failed`, `session-replaced`,
|
|
37
|
+
* `input-lock-lost`) then spent all {@link CODEX_INIT_MAX_ATTEMPTS} in no time.
|
|
38
|
+
* An answer that went out waits `CODEX_DIALOG_SETTLE_MS` instead, never both.
|
|
39
|
+
*/
|
|
40
|
+
function pauseAfterLaunchAnswerSkip() {
|
|
41
|
+
return new Promise((resolve) => setTimeout(resolve, CODEX_POLL_INTERVAL_MS));
|
|
42
|
+
}
|
|
32
43
|
/**
|
|
33
44
|
* Extra polls `waitForReady` may spend waiting out `npm install -g
|
|
34
45
|
* @openai/codex` under the `update` policy (Issue #2068).
|
|
@@ -75,6 +86,10 @@ const CODEX_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
|
75
86
|
* a trailing Enter is so costly here — the number having already advanced the
|
|
76
87
|
* screen, the Enter lands on the NEXT one, which is precisely how a pane ends up
|
|
77
88
|
* two screens deep in the hooks review UI.
|
|
89
|
+
*
|
|
90
|
+
* Not so on 0.166.0 (Issue #4134): the footer reads `enter confirm · esc skip`
|
|
91
|
+
* and the number only moves the cursor. {@link readCodexEnterConfirmedCursor}
|
|
92
|
+
* tells the two apart; see `sendCodexHooksScreenKey`.
|
|
78
93
|
*/
|
|
79
94
|
const CODEX_HOOKS_REVIEW_DECLINE_KEY = '3';
|
|
80
95
|
/**
|
|
@@ -124,13 +139,21 @@ const CODEX_HOOKS_TRUST_KEY = 't';
|
|
|
124
139
|
* more attempts, and only a screen that will not respond at all runs out.
|
|
125
140
|
*
|
|
126
141
|
* Three per screen, because each screen has at most two keys worth trying
|
|
127
|
-
* (`2` then `1` on the review dialog; `t` or `esc`
|
|
128
|
-
* a redraw landing between the capture and the send.
|
|
142
|
+
* (`2` then `1` on the review dialog, `2` then Enter on 0.166.0; `t` or `esc`
|
|
143
|
+
* below it) plus one spare for a redraw landing between the capture and the send.
|
|
129
144
|
*/
|
|
130
145
|
const CODEX_HOOKS_SCREEN_MAX_ATTEMPTS = 3;
|
|
146
|
+
/**
|
|
147
|
+
* Enter presses a launch may spend on the folder trust screen of 0.166.0, where
|
|
148
|
+
* the digit only moves the cursor (Issue #4134). One poll apart.
|
|
149
|
+
*/
|
|
150
|
+
const CODEX_TRUST_ENTER_MAX_PRESSES = 3;
|
|
151
|
+
function isCodexHooksScreen(screen) {
|
|
152
|
+
return screen === 'hooks-review' || screen === 'hooks-list' || screen === 'hooks-detail' || screen === 'hooks-settled';
|
|
153
|
+
}
|
|
131
154
|
/** A fresh {@link CodexHooksScreenState}. */
|
|
132
155
|
function newHooksScreenState() {
|
|
133
|
-
return { screen: null, attempts: 0 };
|
|
156
|
+
return { screen: null, attempts: 0, skips: (0, launch_answer_skips_1.newLaunchAnswerSkips)() };
|
|
134
157
|
}
|
|
135
158
|
/**
|
|
136
159
|
* Whether the pane is sitting on the hooks review dialog.
|
|
@@ -293,9 +316,12 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
293
316
|
// update branch re-sends "2" every poll and the live prompt gets "222...".
|
|
294
317
|
let updateDialogHandled = false;
|
|
295
318
|
let trustDialogHandled = false;
|
|
319
|
+
/** Issue #4134: Enter presses spent on a trust screen whose digit only moves the cursor. */
|
|
320
|
+
let trustEnterPresses = 0;
|
|
296
321
|
// Issue #2315: one budget per hooks screen, reset whenever the screen
|
|
297
322
|
// changes, in place of #1829's single launch-wide escape count.
|
|
298
323
|
const hooksScreenState = newHooksScreenState();
|
|
324
|
+
const answerSkips = (0, launch_answer_skips_1.newLaunchAnswerSkips)();
|
|
299
325
|
// Issue #2068. Resolved once per launch rather than per poll: the operator
|
|
300
326
|
// does not get to change their mind halfway through one session start, and
|
|
301
327
|
// one reading is one fewer thing that can differ between the frame that saw
|
|
@@ -344,10 +370,8 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
344
370
|
// line, so it names a hooks screen only when that screen is what the
|
|
345
371
|
// pane is actually showing.
|
|
346
372
|
const lifecycleScreen = (0, cli_patterns_1.getCodexLifecycleDialog)(output);
|
|
347
|
-
if (lifecycleScreen
|
|
348
|
-
lifecycleScreen
|
|
349
|
-
lifecycleScreen === 'hooks-detail') {
|
|
350
|
-
const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, hooksScreenState, trustHooks, readMark);
|
|
373
|
+
if (isCodexHooksScreen(lifecycleScreen)) {
|
|
374
|
+
const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, output, hooksScreenState, trustHooks, readMark);
|
|
351
375
|
if (sent) {
|
|
352
376
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
353
377
|
continue;
|
|
@@ -507,16 +531,21 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
507
531
|
// Issue #3952: as the composer's writer, and only while the update
|
|
508
532
|
// dialog is still the active one once a send holding it is over.
|
|
509
533
|
const digit = keyToSend;
|
|
510
|
-
|
|
534
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
535
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
536
|
+
const updateOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'update'), () => (0, tmux_1.sendKeys)(sessionName, digit, false), { repeatScope: answerSkips });
|
|
511
537
|
if (!updateOutcome.answered) {
|
|
512
538
|
// Nothing typed: the install this lock covers never started.
|
|
513
539
|
if (updateLockHeld) {
|
|
514
540
|
updateLockHeld = false;
|
|
515
541
|
(0, updates_1.releaseAgentUpdateLock)(CODEX_UPDATE_LOCK_TOOL);
|
|
516
542
|
}
|
|
517
|
-
|
|
543
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, answerSkips, 'codex-update-dialog-answer-skipped', { sessionName, reason: updateOutcome.reason }, answerLife);
|
|
544
|
+
// Issue #4175: the poll's own pause, which `continue` would skip.
|
|
545
|
+
await pauseAfterLaunchAnswerSkip();
|
|
518
546
|
continue;
|
|
519
547
|
}
|
|
548
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(answerSkips, 'codex-update-dialog-answer-skipped');
|
|
520
549
|
updateDialogHandled = true;
|
|
521
550
|
if (keyToSend === codex_update_dialog_config_1.CODEX_UPDATE_DIALOG_KEYS.update) {
|
|
522
551
|
// codex is about to become `npm install`. The prompt this method
|
|
@@ -536,11 +565,16 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
536
565
|
// Numbered selection dialogs are dismissed by the number key above, so this
|
|
537
566
|
// branch is reached only when no number selection is pending.
|
|
538
567
|
if (activeDialog === 'press-enter') {
|
|
539
|
-
|
|
568
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
569
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
570
|
+
const enterOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'press-enter'), () => (0, tmux_1.sendSpecialKey)(sessionName, 'Enter'), { repeatScope: answerSkips });
|
|
540
571
|
if (!enterOutcome.answered) {
|
|
541
|
-
|
|
572
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, answerSkips, 'codex-notification-answer-skipped', { sessionName, reason: enterOutcome.reason }, answerLife);
|
|
573
|
+
// Issue #4175: the poll's own pause, which `continue` would skip.
|
|
574
|
+
await pauseAfterLaunchAnswerSkip();
|
|
542
575
|
continue;
|
|
543
576
|
}
|
|
577
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(answerSkips, 'codex-notification-answer-skipped');
|
|
544
578
|
logger.info('dismissed-codex-notification');
|
|
545
579
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
546
580
|
continue;
|
|
@@ -549,16 +583,47 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
549
583
|
// Options: › 1. Yes, continue / 2. No, quit
|
|
550
584
|
if (activeDialog === 'trust' && !trustDialogHandled) {
|
|
551
585
|
// Issue #890: number-key selection confirms instantly; no trailing Enter.
|
|
552
|
-
|
|
586
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
587
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
588
|
+
const trustOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'trust'), () => (0, tmux_1.sendKeys)(sessionName, '1', false), { repeatScope: answerSkips });
|
|
553
589
|
if (!trustOutcome.answered) {
|
|
554
|
-
|
|
590
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, answerSkips, 'codex-trust-dialog-answer-skipped', { sessionName, reason: trustOutcome.reason }, answerLife);
|
|
591
|
+
// Issue #4175: the poll's own pause, which `continue` would skip.
|
|
592
|
+
await pauseAfterLaunchAnswerSkip();
|
|
555
593
|
continue;
|
|
556
594
|
}
|
|
595
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(answerSkips, 'codex-trust-dialog-answer-skipped');
|
|
557
596
|
trustDialogHandled = true;
|
|
558
597
|
logger.info('auto-trusted-folder-for-codex');
|
|
559
598
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
560
599
|
continue;
|
|
561
600
|
}
|
|
601
|
+
// Issue #4134: on 0.166.0 the digit above only put the cursor on the
|
|
602
|
+
// option, and the screen is still up. Enter, while THIS frame shows the
|
|
603
|
+
// cursor on `1. Trust and continue`: Enter on the row below it leaves the
|
|
604
|
+
// session (`Back to Agent Command Center`, `Quit`). The second read asks
|
|
605
|
+
// for the screen as well as the row: `1. Review hooks` is a row 1 too.
|
|
606
|
+
if (activeDialog === 'trust' &&
|
|
607
|
+
trustEnterPresses < CODEX_TRUST_ENTER_MAX_PRESSES &&
|
|
608
|
+
(0, cli_patterns_1.readCodexEnterConfirmedCursor)(output) === 1) {
|
|
609
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
610
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
611
|
+
const enterOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
|
|
612
|
+
const again = (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50));
|
|
613
|
+
return (0, cli_patterns_1.getCodexActiveDialog)(again) === 'trust' && (0, cli_patterns_1.readCodexEnterConfirmedCursor)(again) === 1;
|
|
614
|
+
}, () => (0, tmux_1.sendSpecialKey)(sessionName, 'Enter'), { repeatScope: answerSkips });
|
|
615
|
+
if (!enterOutcome.answered) {
|
|
616
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, answerSkips, 'codex-trust-dialog-answer-skipped', { sessionName, reason: enterOutcome.reason }, answerLife);
|
|
617
|
+
// Issue #4175: the poll's own pause, which `continue` would skip.
|
|
618
|
+
await pauseAfterLaunchAnswerSkip();
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(answerSkips, 'codex-trust-dialog-answer-skipped');
|
|
622
|
+
trustEnterPresses++;
|
|
623
|
+
logger.info('auto-trusted-folder-for-codex', { confirmedWith: 'Enter', attempt: trustEnterPresses });
|
|
624
|
+
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
562
627
|
}
|
|
563
628
|
catch {
|
|
564
629
|
// Capture may fail during initialization - continue polling
|
|
@@ -613,6 +678,11 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
613
678
|
* When it is withheld — `CM_CODEX_HOOK_TRUST=never`, or a worktree carrying
|
|
614
679
|
* its own `.codex/hooks.json` — it is the pre-#2315 path: `3`, then `esc`.
|
|
615
680
|
*
|
|
681
|
+
* On 0.166.0 (Issue #4134) the launch dialog's digit only moves the cursor, so
|
|
682
|
+
* the answer there is the digit and then Enter, read off the frame each time;
|
|
683
|
+
* and `t` leaves the list or detail open with nothing to review
|
|
684
|
+
* (`hooks-settled`), which takes `esc` either way.
|
|
685
|
+
*
|
|
616
686
|
* The launch dialog gets a second, different key on its second attempt.
|
|
617
687
|
* Numbered options are a menu position codex is free to renumber (this method
|
|
618
688
|
* has been re-pinned for that twice already), so if `2`/`3` did not move the
|
|
@@ -621,6 +691,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
621
691
|
*
|
|
622
692
|
* @param sessionName - tmux session name
|
|
623
693
|
* @param screen - The bottom-most active hooks screen, from `getCodexLifecycleDialog`
|
|
694
|
+
* @param frame - ANSI-stripped capture that showed `screen`
|
|
624
695
|
* @param state - Per-screen budget, carried across polls by the caller
|
|
625
696
|
* @param trust - Whether trust may be granted, from {@link shouldTrustCodexHooks}
|
|
626
697
|
* @param readMark - {@link instanceInputReadMark} taken before the frame that showed `screen` was read
|
|
@@ -628,12 +699,13 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
628
699
|
* found the screen gone (Issue #3952) — either way the caller polls again;
|
|
629
700
|
* false when this screen's budget is spent
|
|
630
701
|
*/
|
|
631
|
-
async answerCodexHooksScreen(sessionName, screen, state, trust, readMark) {
|
|
702
|
+
async answerCodexHooksScreen(sessionName, screen, frame, state, trust, readMark) {
|
|
632
703
|
if (state.screen !== screen) {
|
|
633
704
|
// Progress. The pane moved, so the previous screen's spent attempts say
|
|
634
705
|
// nothing about this one.
|
|
635
706
|
state.screen = screen;
|
|
636
707
|
state.attempts = 0;
|
|
708
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(state.skips, 'codex-hooks-screen-answer-skipped');
|
|
637
709
|
}
|
|
638
710
|
if (state.attempts >= CODEX_HOOKS_SCREEN_MAX_ATTEMPTS) {
|
|
639
711
|
logger.warn('codex-hooks-screen-unresponsive', { sessionName, screen, trust });
|
|
@@ -644,18 +716,42 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
644
716
|
// send that holds it — and is not typed if the hooks screen it was chosen
|
|
645
717
|
// for is gone once that send is over. Inside `sendMessage` under
|
|
646
718
|
// `sendUserMessage`'s lock it joins that lock instead.
|
|
647
|
-
|
|
719
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
720
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
721
|
+
const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
|
|
722
|
+
const again = (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50));
|
|
723
|
+
// The cursor too: on 0.166.0 the key is chosen from where it stands.
|
|
724
|
+
return ((0, cli_patterns_1.getCodexLifecycleDialog)(again) === screen &&
|
|
725
|
+
(0, cli_patterns_1.readCodexEnterConfirmedCursor)(again) === (0, cli_patterns_1.readCodexEnterConfirmedCursor)(frame));
|
|
726
|
+
}, () => this.sendCodexHooksScreenKey(sessionName, screen, frame, attempt, trust), { repeatScope: state.skips });
|
|
648
727
|
if (!outcome.answered) {
|
|
649
728
|
// Nothing was typed, so this screen's budget is not spent; poll again.
|
|
650
|
-
logger.
|
|
729
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, state.skips, 'codex-hooks-screen-answer-skipped', { sessionName, screen, reason: outcome.reason }, answerLife);
|
|
651
730
|
return true;
|
|
652
731
|
}
|
|
653
732
|
state.attempts = attempt;
|
|
733
|
+
(0, launch_answer_skips_1.forgetLaunchAnswerSkip)(state.skips, 'codex-hooks-screen-answer-skipped');
|
|
654
734
|
return true;
|
|
655
735
|
}
|
|
656
736
|
/** The key {@link answerCodexHooksScreen} chose, typed as the composer's writer. */
|
|
657
|
-
async sendCodexHooksScreenKey(sessionName, screen, attempt, trust) {
|
|
737
|
+
async sendCodexHooksScreenKey(sessionName, screen, frame, attempt, trust) {
|
|
658
738
|
if (screen === 'hooks-review') {
|
|
739
|
+
// Issue #4134: a digit that only moves the cursor. Enter goes out only when
|
|
740
|
+
// this frame shows the cursor on the answer: row 1 opens the list and row 3
|
|
741
|
+
// turns the hooks off, and neither may be confirmed by accident.
|
|
742
|
+
const cursor = (0, cli_patterns_1.readCodexEnterConfirmedCursor)(frame);
|
|
743
|
+
if (cursor !== null) {
|
|
744
|
+
const answer = trust ? CODEX_HOOKS_REVIEW_TRUST_KEY : CODEX_HOOKS_REVIEW_DECLINE_KEY;
|
|
745
|
+
if (String(cursor) === answer) {
|
|
746
|
+
await (0, tmux_1.sendSpecialKey)(sessionName, 'Enter');
|
|
747
|
+
logger.info('codex-hooks-review-confirmed', { sessionName, key: answer, attempt, trust });
|
|
748
|
+
}
|
|
749
|
+
else {
|
|
750
|
+
await (0, tmux_1.sendKeys)(sessionName, answer, false);
|
|
751
|
+
logger.info('codex-hooks-review-cursor-moved', { sessionName, key: answer, attempt, trust });
|
|
752
|
+
}
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
659
755
|
const key = attempt === 1
|
|
660
756
|
? trust
|
|
661
757
|
? CODEX_HOOKS_REVIEW_TRUST_KEY
|
|
@@ -667,7 +763,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
667
763
|
logger.info('codex-hooks-review-answered', { sessionName, key, attempt, trust });
|
|
668
764
|
return;
|
|
669
765
|
}
|
|
670
|
-
if (trust) {
|
|
766
|
+
if (trust && screen !== 'hooks-settled') {
|
|
671
767
|
// `t`, the key screens 2 and 3 print in their own footers. Literal, so
|
|
672
768
|
// tmux sends the character rather than resolving it as a key name.
|
|
673
769
|
await (0, tmux_1.sendKeys)(sessionName, CODEX_HOOKS_TRUST_KEY, false, { literal: true });
|
|
@@ -701,6 +797,10 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
701
797
|
const hooksScreenState = newHooksScreenState();
|
|
702
798
|
/** Resolved lazily — one tmux call, and only if a hooks screen shows up. */
|
|
703
799
|
let trustHooks = null;
|
|
800
|
+
/** The hooks screen the last read showed, for the error (Issue #4134). */
|
|
801
|
+
let lastHooksScreen = null;
|
|
802
|
+
/** The dialog the last read showed; a send does not answer these (Issue #4134). */
|
|
803
|
+
let lastDialog = null;
|
|
704
804
|
while (Date.now() - startTime < CODEX_PROMPT_WAIT_TIMEOUT_MS) {
|
|
705
805
|
try {
|
|
706
806
|
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
@@ -710,7 +810,9 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
710
810
|
// painted OVER a live composer leaves `isCodexPromptReady` true, and
|
|
711
811
|
// returning there types the user's message into the review UI.
|
|
712
812
|
const screen = (0, cli_patterns_1.getCodexLifecycleDialog)(output);
|
|
713
|
-
|
|
813
|
+
lastHooksScreen = isCodexHooksScreen(screen) ? screen : null;
|
|
814
|
+
lastDialog = (0, cli_patterns_1.getCodexActiveDialog)(output);
|
|
815
|
+
if (isCodexHooksScreen(screen)) {
|
|
714
816
|
if (trustHooks === null) {
|
|
715
817
|
// The pane's own directory, for the same reason `relaunchIfToolExited`
|
|
716
818
|
// asks tmux for it: `sendMessage` is handed a worktree id, not a path,
|
|
@@ -718,7 +820,7 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
718
820
|
const worktreePath = await (0, tmux_1.getSessionWorkingDirectory)(sessionName);
|
|
719
821
|
trustHooks = worktreePath !== null && (0, hooks_config_1.shouldTrustCodexHooks)(worktreePath);
|
|
720
822
|
}
|
|
721
|
-
await this.answerCodexHooksScreen(sessionName, screen, hooksScreenState, trustHooks, readMark);
|
|
823
|
+
await this.answerCodexHooksScreen(sessionName, screen, output, hooksScreenState, trustHooks, readMark);
|
|
722
824
|
}
|
|
723
825
|
else if ((0, cli_patterns_1.isCodexPromptReady)(output)) {
|
|
724
826
|
// Issue #890/#892: position-based guard so a residual update/trust dialog
|
|
@@ -733,7 +835,18 @@ class CodexTool extends base_1.BaseCLITool {
|
|
|
733
835
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
734
836
|
}
|
|
735
837
|
logger.info('codex-prompt-not-detected');
|
|
736
|
-
|
|
838
|
+
if (lastHooksScreen !== null) {
|
|
839
|
+
// Issue #4134: the reason, in the message `send` reports. Names only the
|
|
840
|
+
// screen and the setting, nothing captured.
|
|
841
|
+
// Issue #4161: "did not respond" is untrue of a screen no key reached.
|
|
842
|
+
const fate = hooksScreenState.attempts === 0 && hooksScreenState.skips.last !== null
|
|
843
|
+
? `got no key (${hooksScreenState.skips.last})`
|
|
844
|
+
: 'did not respond to its keys';
|
|
845
|
+
throw new Error(`Codex prompt not ready: codex's hook review (${lastHooksScreen}) ${fate}. ` +
|
|
846
|
+
'Answer it in the terminal, or set CM_CODEX_HOOK_TRUST=bypass');
|
|
847
|
+
}
|
|
848
|
+
throw new Error('Codex prompt not ready: timed out waiting for the input prompt before sending' +
|
|
849
|
+
(lastDialog === null ? '' : ` (the ${lastDialog} dialog is open: answer it in the terminal)`));
|
|
737
850
|
}
|
|
738
851
|
/**
|
|
739
852
|
* Send a message to Codex session
|
|
@@ -47,6 +47,7 @@ const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
|
47
47
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
48
48
|
const errors_1 = require("../../lib/errors");
|
|
49
49
|
const logger_1 = require("../../lib/logger");
|
|
50
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
50
51
|
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
51
52
|
const respond_target_1 = require("../../lib/session/respond-target");
|
|
52
53
|
Object.defineProperty(exports, "commandCodePlanReviewSendMessage", { enumerable: true, get: function () { return respond_target_1.commandCodePlanReviewSendMessage; } });
|
|
@@ -148,6 +149,25 @@ function isCommandCodeReady(rawOutput) {
|
|
|
148
149
|
return false;
|
|
149
150
|
return !cli_patterns_1.COMMAND_CODE_THINKING_PATTERN.test((0, cli_patterns_1.stripAnsi)(rawOutput));
|
|
150
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* What held the pane when the wait for the composer ran out (Issue #4161), for the
|
|
154
|
+
* refusal `send` reports. Names the screen only: nothing captured goes into it.
|
|
155
|
+
*
|
|
156
|
+
* @param output - The last capture, ANSI intact; null when the last read failed
|
|
157
|
+
*/
|
|
158
|
+
function describeCommandCodePaneHold(output) {
|
|
159
|
+
if (output === null)
|
|
160
|
+
return 'the pane could not be read';
|
|
161
|
+
if ((0, plan_review_state_1.readCommandCodePlanReviewState)(output) !== null)
|
|
162
|
+
return 'the plan review is open: answer it in the terminal';
|
|
163
|
+
const status = (0, status_detector_1.detectSessionStatus)(output, 'command-code');
|
|
164
|
+
if ((0, status_detector_1.isGeneratingStatus)(status) || cli_patterns_1.COMMAND_CODE_THINKING_PATTERN.test((0, cli_patterns_1.stripAnsi)(output))) {
|
|
165
|
+
return 'a turn is still being generated';
|
|
166
|
+
}
|
|
167
|
+
if (status.hasActivePrompt || status.status === 'waiting')
|
|
168
|
+
return 'a dialog is open: answer it in the terminal';
|
|
169
|
+
return 'no composer on the pane: command code may still be starting';
|
|
170
|
+
}
|
|
151
171
|
/**
|
|
152
172
|
* Command Code CLI tool implementation.
|
|
153
173
|
* Manages `commandcode` sessions using tmux.
|
|
@@ -295,10 +315,12 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
295
315
|
const startTime = Date.now();
|
|
296
316
|
const pollInterval = 500;
|
|
297
317
|
let planReviewPolls = 0;
|
|
318
|
+
let lastOutput = null;
|
|
298
319
|
while (Date.now() - startTime < COMMAND_CODE_PROMPT_WAIT_TIMEOUT_MS) {
|
|
299
320
|
let planReviewUp = false;
|
|
300
321
|
try {
|
|
301
322
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, COMMAND_CODE_READINESS_CAPTURE_LINES);
|
|
323
|
+
lastOutput = rawOutput;
|
|
302
324
|
// Read first: a focused action row (`❯ Approve ctrl+a`) is a `❯` row.
|
|
303
325
|
planReviewUp = (0, plan_review_state_1.readCommandCodePlanReviewState)(rawOutput) !== null;
|
|
304
326
|
if (!planReviewUp && isCommandCodeReady(rawOutput)) {
|
|
@@ -308,6 +330,7 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
308
330
|
}
|
|
309
331
|
catch {
|
|
310
332
|
// Capture may fail - continue polling
|
|
333
|
+
lastOutput = null;
|
|
311
334
|
}
|
|
312
335
|
// Issue #3125: no composer comes back until a human answers the review.
|
|
313
336
|
// Two polls in a row, because the frame redrawn just after `Esc` can
|
|
@@ -332,7 +355,7 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
332
355
|
this.composerPendingSince.delete(sessionName);
|
|
333
356
|
}
|
|
334
357
|
logger.info('command-code-prompt-not-ready');
|
|
335
|
-
throw new Error(
|
|
358
|
+
throw new Error(`Command Code prompt not ready: timed out waiting for the composer before sending (${describeCommandCodePaneHold(lastOutput)})`);
|
|
336
359
|
}
|
|
337
360
|
/**
|
|
338
361
|
* Send a message to the Command Code session.
|
|
@@ -38,6 +38,7 @@ const hook_settings_1 = require("../../lib/hooks/sources/copilot/hook-settings")
|
|
|
38
38
|
const tool_id_1 = require("../../lib/hooks/sources/copilot/tool-id");
|
|
39
39
|
const errors_1 = require("../../lib/errors");
|
|
40
40
|
const logger_1 = require("../../lib/logger");
|
|
41
|
+
const launch_answer_skips_1 = require("./launch-answer-skips");
|
|
41
42
|
const install_hints_1 = require("./install-hints");
|
|
42
43
|
const launch_window_1 = require("./launch-window");
|
|
43
44
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
@@ -279,6 +280,20 @@ function describeBottomRow(output) {
|
|
|
279
280
|
}
|
|
280
281
|
return 'an empty pane';
|
|
281
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* What held the pane when the wait for the composer ran out (Issue #4161), for the
|
|
285
|
+
* refusal `send` reports. Names the screen only: nothing captured goes into it, and
|
|
286
|
+
* `classifySendFailure` reads the result (see the refusals below).
|
|
287
|
+
*
|
|
288
|
+
* A dialog does not get here: the re-read before each refusal answers `prompt-waiting`.
|
|
289
|
+
*
|
|
290
|
+
* @param output - The last capture with ANSI stripped; empty when the last read failed
|
|
291
|
+
*/
|
|
292
|
+
function describeCopilotPaneHold(output) {
|
|
293
|
+
if (output === '')
|
|
294
|
+
return 'the pane could not be read';
|
|
295
|
+
return 'no composer on the pane: copilot may still be starting';
|
|
296
|
+
}
|
|
282
297
|
/**
|
|
283
298
|
* Re-read the pane and throw `recheckComposerBeforeInput`'s `prompt-waiting`
|
|
284
299
|
* refusal when a dialog is open (Issue #4040). Any other outcome — no dialog,
|
|
@@ -481,15 +496,21 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
481
496
|
* @param sessionName - tmux session name
|
|
482
497
|
* @param output - ANSI-stripped pane capture
|
|
483
498
|
* @param readMark - {@link instanceInputReadMark} taken before `output` was read
|
|
499
|
+
* @param skips - The calling wait's record of answers that did not go out (Issue #4161)
|
|
484
500
|
* @returns True when the dialog was found and answered
|
|
485
501
|
*/
|
|
486
|
-
async answerFolderTrustDialog(sessionName, output, readMark) {
|
|
502
|
+
async answerFolderTrustDialog(sessionName, output, readMark, skips) {
|
|
487
503
|
if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
|
|
488
504
|
return false;
|
|
489
505
|
}
|
|
490
|
-
|
|
506
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
507
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
508
|
+
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),
|
|
509
|
+
// Issue #4189: the lock's warn of a decline, once per streak in the calling wait.
|
|
510
|
+
{ repeatScope: skips });
|
|
491
511
|
if (!outcome.answered) {
|
|
492
|
-
|
|
512
|
+
// Issue #4189: the session, so a decline after it was made again is a new one.
|
|
513
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, skips, 'copilot-folder-trust-answer-skipped', { sessionName, reason: outcome.reason }, answerLife);
|
|
493
514
|
return false;
|
|
494
515
|
}
|
|
495
516
|
(0, launch_window_1.recordLaunchDialogPress)(sessionName);
|
|
@@ -561,6 +582,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
561
582
|
*/
|
|
562
583
|
async waitForReady(sessionName) {
|
|
563
584
|
let trustDialogHandled = false;
|
|
585
|
+
const answerSkips = (0, launch_answer_skips_1.newLaunchAnswerSkips)();
|
|
564
586
|
for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
|
|
565
587
|
try {
|
|
566
588
|
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
@@ -571,7 +593,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
571
593
|
logger.info('copilot-prompt-detected');
|
|
572
594
|
return;
|
|
573
595
|
}
|
|
574
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
596
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark, answerSkips))) {
|
|
575
597
|
trustDialogHandled = true;
|
|
576
598
|
}
|
|
577
599
|
}
|
|
@@ -643,15 +665,20 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
643
665
|
const pollInterval = 500;
|
|
644
666
|
let trustDialogHandled = false;
|
|
645
667
|
let output = '';
|
|
668
|
+
// Issue #4161: the last read failed, so `output` says nothing about the pane now.
|
|
669
|
+
let lastReadFailed = false;
|
|
670
|
+
const answerSkips = (0, launch_answer_skips_1.newLaunchAnswerSkips)();
|
|
646
671
|
// Issue #4067: the current run of reads that showed a dialog (counted by
|
|
647
672
|
// the helper opencode and vibe-local share, Issue #4084).
|
|
648
673
|
const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
649
674
|
while (Date.now() < deadline) {
|
|
650
675
|
try {
|
|
651
676
|
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
677
|
+
lastReadFailed = true;
|
|
652
678
|
const rawOutput = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, 50), deadline);
|
|
653
679
|
if (rawOutput === null)
|
|
654
680
|
break;
|
|
681
|
+
lastReadFailed = false;
|
|
655
682
|
output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
656
683
|
if (this.isReadyFor(until, output)) {
|
|
657
684
|
return { ready: true, output };
|
|
@@ -665,7 +692,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
665
692
|
// remember this folder" and writes the operator's machine-global
|
|
666
693
|
// ~/.copilot/config.json. The send now refuses instead, but answering
|
|
667
694
|
// it here (as the launch path does) is what lets that send go through.
|
|
668
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
695
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark, answerSkips))) {
|
|
669
696
|
trustDialogHandled = true;
|
|
670
697
|
}
|
|
671
698
|
if (dialog.observe(this.isRefusableDialog(rawOutput, output))) {
|
|
@@ -682,6 +709,8 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
682
709
|
break;
|
|
683
710
|
await new Promise((resolve) => setTimeout(resolve, Math.min(pollInterval, remaining)));
|
|
684
711
|
}
|
|
712
|
+
if (lastReadFailed)
|
|
713
|
+
output = '';
|
|
685
714
|
logger.info('copilot-prompt-not-detected', { until, bottomRow: describeBottomRow(output) });
|
|
686
715
|
return { ready: false, output };
|
|
687
716
|
}
|
|
@@ -817,7 +846,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
817
846
|
bottomRow: describeBottomRow(prompt.output),
|
|
818
847
|
});
|
|
819
848
|
throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
|
|
820
|
-
|
|
849
|
+
`so the selection-list command was not sent; nothing was typed (${describeCopilotPaneHold(prompt.output)})`);
|
|
821
850
|
}
|
|
822
851
|
assertCopilotInputOwner(ticket, 'the selection-list command');
|
|
823
852
|
// Issue #3953: the send's stamp, as the shared sender takes it.
|
|
@@ -846,7 +875,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
846
875
|
await rethrowIfDialogOpen(sessionName);
|
|
847
876
|
logger.warn('copilot-message-not-sent:prompt-not-ready', { bottomRow: describeBottomRow(prompt.output) });
|
|
848
877
|
throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
|
|
849
|
-
|
|
878
|
+
`so the message was not sent; nothing was typed (${describeCopilotPaneHold(prompt.output)})`);
|
|
850
879
|
}
|
|
851
880
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
852
881
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
@@ -20,10 +20,12 @@ const cli_patterns_1 = require("../detection/cli-patterns");
|
|
|
20
20
|
const sources_1 = require("../../lib/hooks/sources");
|
|
21
21
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
22
22
|
const logger_1 = require("../../lib/logger");
|
|
23
|
+
const launch_answer_skips_1 = require("./launch-answer-skips");
|
|
23
24
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
24
25
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
25
26
|
const errors_1 = require("../../lib/errors");
|
|
26
27
|
const launch_dialog_1 = require("./launch-dialog");
|
|
28
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
27
29
|
const launch_window_1 = require("./launch-window");
|
|
28
30
|
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
29
31
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
@@ -42,6 +44,30 @@ const GEMINI_INIT_MAX_ATTEMPTS = 30;
|
|
|
42
44
|
const GEMINI_TRUST_SETTLE_MS = 5000;
|
|
43
45
|
/** Timeout for waiting for prompt before sending a message */
|
|
44
46
|
const GEMINI_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
47
|
+
/** The sign-in picker a new HOME gets after the trust restart (`tests/fixtures/gemini-live-3776/after-enter-auth.txt`). */
|
|
48
|
+
const GEMINI_AUTH_PICKER_ROW = /^[\s│]*How would you like to authenticate\b/m;
|
|
49
|
+
/**
|
|
50
|
+
* What held the pane when the wait for the prompt ran out (Issue #4146), for the
|
|
51
|
+
* refusal `send` reports. Names the screen only: nothing captured goes into it.
|
|
52
|
+
*
|
|
53
|
+
* @param output - The last capture with ANSI stripped; null when the last read failed
|
|
54
|
+
*/
|
|
55
|
+
function describeGeminiPaneHold(output) {
|
|
56
|
+
if (output === null)
|
|
57
|
+
return 'the pane could not be read';
|
|
58
|
+
if ((0, launch_dialog_1.isLaunchDialogOpen)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, output)) {
|
|
59
|
+
return 'the folder-trust dialog is open: answer it in the terminal';
|
|
60
|
+
}
|
|
61
|
+
if (GEMINI_AUTH_PICKER_ROW.test(output)) {
|
|
62
|
+
return 'the sign-in picker is open: answer it in the terminal';
|
|
63
|
+
}
|
|
64
|
+
const status = (0, status_detector_1.detectSessionStatus)(output, 'gemini');
|
|
65
|
+
if (status.hasActivePrompt)
|
|
66
|
+
return 'a prompt dialog is open: answer it in the terminal';
|
|
67
|
+
if ((0, status_detector_1.isGeneratingStatus)(status))
|
|
68
|
+
return 'a turn is still being generated';
|
|
69
|
+
return 'no input prompt on the pane: gemini may still be starting';
|
|
70
|
+
}
|
|
45
71
|
/**
|
|
46
72
|
* Gemini CLI tool implementation
|
|
47
73
|
* Manages Gemini interactive sessions using tmux
|
|
@@ -143,6 +169,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
143
169
|
let trustDialogHandled = false;
|
|
144
170
|
let trustPressedAt = null;
|
|
145
171
|
const loggedDecisions = new Set();
|
|
172
|
+
const answerSkips = (0, launch_answer_skips_1.newLaunchAnswerSkips)();
|
|
146
173
|
for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
|
|
147
174
|
try {
|
|
148
175
|
// Issue #3975: taken before the read the trust Enter is decided on.
|
|
@@ -163,10 +190,14 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
163
190
|
// Issue #3975: the Enter as an `exclusive` writer, so it never lands
|
|
164
191
|
// inside a send's body, paste or Enter; a send that came between
|
|
165
192
|
// the read and the lock makes the dialog be read again first.
|
|
193
|
+
// Issue #4189: the session's life before the answer's await; a decline of an older life writes no record for the new one.
|
|
194
|
+
const answerLife = (0, instance_input_lock_1.instanceInputAnswerSkipLife)(sessionName);
|
|
166
195
|
const pressed = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
|
|
167
196
|
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)));
|
|
168
197
|
return again.action === 'press' && again.key === decision.key;
|
|
169
|
-
}, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key),
|
|
198
|
+
}, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key),
|
|
199
|
+
// Issue #4189: the lock's warn of a decline, once per streak in this wait.
|
|
200
|
+
{ mode: 'exclusive', repeatScope: answerSkips });
|
|
170
201
|
if (pressed.answered) {
|
|
171
202
|
trustDialogHandled = true;
|
|
172
203
|
trustPressedAt = Date.now();
|
|
@@ -178,7 +209,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
178
209
|
}
|
|
179
210
|
else {
|
|
180
211
|
// Not answered this poll; the next one reads the screen again.
|
|
181
|
-
|
|
212
|
+
(0, launch_answer_skips_1.noteLaunchAnswerSkipped)(logger, answerSkips, 'gemini-trust-answer-skipped', { sessionName, reason: pressed.reason }, answerLife);
|
|
182
213
|
}
|
|
183
214
|
}
|
|
184
215
|
else {
|
|
@@ -215,16 +246,19 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
215
246
|
async waitForPrompt(sessionName) {
|
|
216
247
|
const startTime = Date.now();
|
|
217
248
|
const pollInterval = 500;
|
|
249
|
+
let lastOutput = null;
|
|
218
250
|
while (Date.now() - startTime < GEMINI_PROMPT_WAIT_TIMEOUT_MS) {
|
|
219
251
|
try {
|
|
220
252
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
|
|
221
253
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
254
|
+
lastOutput = output;
|
|
222
255
|
if (cli_patterns_1.GEMINI_PROMPT_PATTERN.test(output)) {
|
|
223
256
|
return;
|
|
224
257
|
}
|
|
225
258
|
}
|
|
226
259
|
catch (error) {
|
|
227
260
|
// Capture may fail - continue polling
|
|
261
|
+
lastOutput = null;
|
|
228
262
|
logger.debug('gemini-prompt-capture-failed', { sessionName, error: (0, errors_1.getErrorMessage)(error) });
|
|
229
263
|
}
|
|
230
264
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
@@ -232,7 +266,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
232
266
|
// Issue #3981: give up without typing, as codex does. Sending anyway put the
|
|
233
267
|
// body into whatever held the pane (a dialog, a slow start, a shell).
|
|
234
268
|
logger.info('gemini-prompt-not-detected');
|
|
235
|
-
throw new Error(
|
|
269
|
+
throw new Error(`Gemini prompt not ready: timed out waiting for the input prompt before sending (${describeGeminiPaneHold(lastOutput)})`);
|
|
236
270
|
}
|
|
237
271
|
/**
|
|
238
272
|
* Send a message to Gemini interactive session
|