commandmate 0.46.0 → 0.47.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 +417 -410
- package/.next/app-path-routes-manifest.json +22 -21
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +4 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_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 +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +9 -9
- 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 -7
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -7
- 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/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +9 -9
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.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 +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +22 -21
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +2 -2
- package/.next/server/chunks/1559.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1836.js +1 -0
- package/.next/server/chunks/1945.js +14 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/{3077.js → 4194.js} +12 -12
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5292.js +3 -3
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5845.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/{2283.js → 6486.js} +7 -7
- package/.next/server/chunks/6722.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +2 -2
- package/.next/server/chunks/7166.js +19 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +12 -12
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +6 -6
- package/.next/server/chunks/9199.js +1 -0
- package/.next/server/chunks/936.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -0
- package/.next/server/chunks/9627.js +3 -2
- 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/{2407-acb644c5487e1720.js → 2407-b2f524f99f7fc353.js} +1 -1
- package/.next/static/chunks/{2717.21abf5b6bbd45520.js → 2717.1583400c272dc1d9.js} +1 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +1 -0
- package/.next/static/chunks/602-1c1488959215e140.js +1 -0
- package/.next/static/chunks/{8407-9a72e6f07c5d5458.js → 8407-155f84e5ba05f1d5.js} +1 -1
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
- package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
- package/.next/static/chunks/{webpack-c0b821f340afdebf.js → webpack-468b7b33030234b3.js} +1 -1
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/auto-yes.d.ts +19 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +45 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -18
- package/dist/cli/commands/ls.d.ts +15 -1
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +39 -3
- package/dist/cli/commands/prompt.d.ts +42 -0
- package/dist/cli/commands/prompt.d.ts.map +1 -0
- package/dist/cli/commands/prompt.js +211 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +13 -1
- package/dist/cli/commands/respond-strict.d.ts +31 -0
- package/dist/cli/commands/respond-strict.d.ts.map +1 -0
- package/dist/cli/commands/respond-strict.js +214 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +38 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +41 -5
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +18 -0
- package/dist/cli/commands/wait.d.ts +21 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +113 -12
- 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 +63 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -2
- package/dist/cli/types/api-responses.d.ts +62 -6
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +30 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +12 -1
- package/dist/cli/utils/api-client.d.ts +13 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +10 -2
- package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
- package/dist/cli/utils/daemon-factory.js +3 -1
- package/dist/cli/utils/daemon.d.ts +38 -1
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +161 -8
- package/dist/cli/utils/paths.d.ts +12 -0
- package/dist/cli/utils/paths.d.ts.map +1 -1
- package/dist/cli/utils/paths.js +17 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +55 -1
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +20 -0
- package/dist/lib/prompt-observation/kinds.d.ts +101 -0
- package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
- package/dist/lib/prompt-observation/kinds.js +123 -0
- package/dist/lib/prompt-observation/types.d.ts +271 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -0
- package/dist/lib/prompt-observation/types.js +14 -0
- package/dist/lib/session/send-attempt-types.d.ts +66 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
- package/dist/lib/session/send-attempt-types.js +17 -0
- package/dist/server/locales/en/worktree.json +4 -0
- package/dist/server/locales/ja/worktree.json +4 -0
- package/dist/server/server.js +20 -1
- package/dist/server/src/config/auto-yes-config.js +11 -0
- package/dist/server/src/lib/assistant-response-saver.js +13 -0
- package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
- package/dist/server/src/lib/auto-yes-poller.js +593 -78
- package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
- package/dist/server/src/lib/auto-yes-state.js +197 -4
- package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
- package/dist/server/src/lib/cli-tools/command-code.js +10 -2
- package/dist/server/src/lib/cli-tools/copilot.js +21 -10
- package/dist/server/src/lib/cli-tools/gemini.js +60 -13
- package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
- package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
- package/dist/server/src/lib/conversation-logger.js +14 -2
- package/dist/server/src/lib/db/chat-db.js +2 -1
- package/dist/server/src/lib/detection/selection-shape.js +35 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
- package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
- package/dist/server/src/lib/history/user-turn-recorder.js +14 -0
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +28 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/codex/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/command-code/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
- package/dist/server/src/lib/hooks/sources/transcript-history.js +34 -0
- package/dist/server/src/lib/log-manager.js +7 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +22 -3
- package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +234 -0
- package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +20 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
- package/dist/server/src/lib/polling/pending-scraped-response.js +119 -3
- package/dist/server/src/lib/polling/poller-owner.js +110 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
- package/dist/server/src/lib/polling/response-checker.js +211 -39
- package/dist/server/src/lib/polling/response-dedup.js +8 -0
- package/dist/server/src/lib/polling/response-poller-core.js +226 -75
- package/dist/server/src/lib/polling/structured-history-gate.js +20 -1
- package/dist/server/src/lib/prompt-answer-sender.js +59 -12
- package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
- package/dist/server/src/lib/prompt-observation/types.js +14 -0
- package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
- package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
- package/dist/server/src/lib/realtime/terminal-broadcast.js +14 -0
- package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
- package/dist/server/src/lib/relay/relay-delivery.js +76 -30
- package/dist/server/src/lib/schedule-manager.js +28 -0
- package/dist/server/src/lib/session/chat-turn-progress.js +57 -6
- package/dist/server/src/lib/session/cli-session.js +38 -3
- package/dist/server/src/lib/session/current-output-builder.js +19 -0
- package/dist/server/src/lib/session/send-attempt-state.js +155 -0
- package/dist/server/src/lib/session/send-attempt-types.js +17 -0
- package/dist/server/src/lib/session/send-user-message.js +46 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +85 -11
- package/dist/server/src/lib/timer-manager.js +7 -0
- package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
- package/dist/server/src/lib/tmux/tmux.js +28 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +30 -2
- package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
- package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
- package/dist/server/src/lib/verification/scope-gate.js +19 -271
- package/dist/server/src/lib/ws-server.js +48 -6
- package/docs/en/user-guide/cli-setup-guide.md +12 -1
- package/docs/en/user-guide/webapp-guide.md +2 -0
- package/package.json +1 -1
- package/release-notes/0.46.1.json +40 -0
- package/release-notes/0.47.0.json +118 -0
- package/.next/server/chunks/1789.js +0 -1
- package/.next/server/chunks/2908.js +0 -1
- package/.next/server/chunks/3718.js +0 -1
- package/.next/server/chunks/4837.js +0 -14
- package/.next/server/chunks/5625.js +0 -25
- package/.next/server/chunks/611.js +0 -1
- package/.next/server/chunks/850.js +0 -1
- package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
- package/.next/static/chunks/5371-a94ed618148287a0.js +0 -1
- package/.next/static/chunks/5794-947fb4934d8be193.js +0 -1
- package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/layout-ae30ce63569c22be.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2eb1d0fd0a077b7e.js +0 -1
- /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
- /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
|
@@ -9,13 +9,17 @@ exports.stopPolling = stopPolling;
|
|
|
9
9
|
exports.stopAllPolling = stopAllPolling;
|
|
10
10
|
exports.getActivePollers = getActivePollers;
|
|
11
11
|
exports.migrateResponsePollerWorktreeIds = migrateResponsePollerWorktreeIds;
|
|
12
|
-
const async_hooks_1 = require("async_hooks");
|
|
13
12
|
const logger_1 = require("../../lib/logger");
|
|
14
13
|
const tui_accumulator_1 = require("../tui-accumulator");
|
|
15
14
|
const prompt_dedup_1 = require("./prompt-dedup");
|
|
16
15
|
const response_dedup_1 = require("./response-dedup");
|
|
17
16
|
const prompt_dedup_state_1 = require("./prompt-dedup-state");
|
|
18
17
|
const response_checker_1 = require("./response-checker");
|
|
18
|
+
// Issue #3663: the migration's own entry points into the held-scrape store,
|
|
19
|
+
// imported from the store itself rather than through `./response-checker`'s
|
|
20
|
+
// re-export (suites that replace the checker by path keep working unchanged).
|
|
21
|
+
const pending_scraped_response_1 = require("./pending-scraped-response");
|
|
22
|
+
const poller_owner_1 = require("./poller-owner");
|
|
19
23
|
const terminal_broadcast_1 = require("../../lib/realtime/terminal-broadcast");
|
|
20
24
|
const terminal_session_ownership_1 = require("../../lib/realtime/terminal-session-ownership");
|
|
21
25
|
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
@@ -58,7 +62,7 @@ const coordinator = (0, global_state_1.getOrInitGlobal)('__responsePollerCoordin
|
|
|
58
62
|
owners: new Map(),
|
|
59
63
|
running: new Map(),
|
|
60
64
|
pendingRestart: new Map(),
|
|
61
|
-
|
|
65
|
+
latestOwners: new Map(),
|
|
62
66
|
generationCounter: 0,
|
|
63
67
|
pausedOnPrompt: new Set(),
|
|
64
68
|
}));
|
|
@@ -68,6 +72,7 @@ const coordinator = (0, global_state_1.getOrInitGlobal)('__responsePollerCoordin
|
|
|
68
72
|
// `globalThis` across HMR, and a poller started before the reload would
|
|
69
73
|
// otherwise crash the first tick after it.
|
|
70
74
|
coordinator.pausedOnPrompt ??= new Set();
|
|
75
|
+
coordinator.latestOwners ??= new Map();
|
|
71
76
|
/**
|
|
72
77
|
* Active pollers map: "worktreeId:instanceId" -> NodeJS.Timeout
|
|
73
78
|
*
|
|
@@ -101,11 +106,17 @@ exports.pollingStartTimes = coordinator.pollingStartTimes;
|
|
|
101
106
|
* @param instanceId - Optional agent instance ID (defaults to cliToolId)
|
|
102
107
|
*/
|
|
103
108
|
function getPollerKey(worktreeId, cliToolId, instanceId) {
|
|
104
|
-
|
|
109
|
+
// Issue #3705: spelled in `./poller-owner`, so the writers that ask whether a
|
|
110
|
+
// tick may still act for this key name it the same way without importing here.
|
|
111
|
+
return (0, poller_owner_1.pollerKeyOf)(worktreeId, cliToolId, instanceId);
|
|
105
112
|
}
|
|
106
113
|
/** Hand `pollerKey` to a brand-new chain, retiring whichever chain held it. */
|
|
107
114
|
function takeOwnership(pollerKey) {
|
|
108
|
-
|
|
115
|
+
// Issue #3705: the newest chain the key ever had, not only the one holding it
|
|
116
|
+
// now. A chain that was stopped (a route, a migration that displaced it) has
|
|
117
|
+
// left `owners`, but a tick of it may still be in flight, and it has a
|
|
118
|
+
// successor from this moment on.
|
|
119
|
+
const previous = coordinator.owners.get(pollerKey) ?? coordinator.latestOwners.get(pollerKey);
|
|
109
120
|
if (previous)
|
|
110
121
|
previous.superseded = true;
|
|
111
122
|
const owner = {
|
|
@@ -116,6 +127,7 @@ function takeOwnership(pollerKey) {
|
|
|
116
127
|
selfStopped: false,
|
|
117
128
|
};
|
|
118
129
|
coordinator.owners.set(pollerKey, owner);
|
|
130
|
+
coordinator.latestOwners.set(pollerKey, owner);
|
|
119
131
|
return owner;
|
|
120
132
|
}
|
|
121
133
|
/**
|
|
@@ -171,7 +183,7 @@ function startPolling(worktreeId, cliToolId, instanceId) {
|
|
|
171
183
|
// previous turn.
|
|
172
184
|
inFlight.owner.superseded = true;
|
|
173
185
|
if (Date.now() - inFlight.since < exports.STALLED_TICK_TIMEOUT) {
|
|
174
|
-
coordinator.pendingRestart.set(pollerKey, target);
|
|
186
|
+
coordinator.pendingRestart.set(pollerKey, { target, behind: inFlight.owner });
|
|
175
187
|
return;
|
|
176
188
|
}
|
|
177
189
|
logger.warn('poller:restart-past-stalled-tick', {
|
|
@@ -293,7 +305,11 @@ async function runPollTick(target, owner) {
|
|
|
293
305
|
// Check for response
|
|
294
306
|
let recorded = false;
|
|
295
307
|
try {
|
|
296
|
-
|
|
308
|
+
// The token rides through `checkForResponse()` (`./poller-owner`), so a
|
|
309
|
+
// `stopPolling()` raised inside a superseded tick can be told apart from
|
|
310
|
+
// one raised by a route, `session-cleanup` or `kill-session` (#2223), and
|
|
311
|
+
// the held-scrape store can turn away a tick that was retired (#3663).
|
|
312
|
+
recorded = await poller_owner_1.pollerOwnerStorage.run(owner, () => (0, response_checker_1.checkForResponse)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
297
313
|
}
|
|
298
314
|
catch (error) {
|
|
299
315
|
logger.error('error:', { error: error instanceof Error ? error.message : String(error) });
|
|
@@ -310,8 +326,14 @@ async function runPollTick(target, owner) {
|
|
|
310
326
|
// Issue #2223: skipped once another chain owns the key — a superseded tick
|
|
311
327
|
// would push the previous turn's screen on top of the live one, and its
|
|
312
328
|
// `version` counter would make the client drop the real frame that follows.
|
|
329
|
+
//
|
|
330
|
+
// Issue #3705: and the snapshot carries the owner explicitly
|
|
331
|
+
// (`snapshotOwnerStorage`), because this is only where it starts. Its
|
|
332
|
+
// capture and the writers inside `buildCurrentOutput` resume after awaits,
|
|
333
|
+
// and they ask again then (`maySnapshotPublish`): a successor that took the
|
|
334
|
+
// key in the meantime is not overwritten by the turn that ended.
|
|
313
335
|
if (!owner.superseded) {
|
|
314
|
-
void (0, terminal_broadcast_1.broadcastTerminalSnapshot)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
336
|
+
void poller_owner_1.snapshotOwnerStorage.run(owner, () => (0, terminal_broadcast_1.broadcastTerminalSnapshot)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
315
337
|
}
|
|
316
338
|
// Schedule next poll ONLY after current one completes
|
|
317
339
|
// Guard: only if THIS chain is still the poller for the key (Issue #2223)
|
|
@@ -326,10 +348,15 @@ async function runPollTick(target, owner) {
|
|
|
326
348
|
// Apply a restart that arrived while this tick was in flight. Doing it here
|
|
327
349
|
// rather than in startPolling() is what keeps the old and new chains from
|
|
328
350
|
// polling the same pane at the same time.
|
|
351
|
+
//
|
|
352
|
+
// Issue #3705: only the restart handed to THIS tick. One queued behind a
|
|
353
|
+
// later chain's tick belongs to that tick: applied here, by a tick that was
|
|
354
|
+
// cut loose past STALLED_TICK_TIMEOUT and came back, it would stop the chain
|
|
355
|
+
// whose tick is still running and start the next one beside it.
|
|
329
356
|
const pending = coordinator.pendingRestart.get(pollerKey);
|
|
330
|
-
if (pending) {
|
|
357
|
+
if (pending && pending.behind === owner) {
|
|
331
358
|
coordinator.pendingRestart.delete(pollerKey);
|
|
332
|
-
restartChain(pollerKey, pending);
|
|
359
|
+
restartChain(pollerKey, pending.target);
|
|
333
360
|
}
|
|
334
361
|
}
|
|
335
362
|
}
|
|
@@ -391,7 +418,7 @@ function stopPollingByKey(pollerKey, options = {}) {
|
|
|
391
418
|
// (worktree gone, session not running, prompt detected, TUI reply saved).
|
|
392
419
|
// Honouring that verdict would kill the chain that replaced it — the old
|
|
393
420
|
// tick is describing a turn that is already over.
|
|
394
|
-
const caller =
|
|
421
|
+
const caller = poller_owner_1.pollerOwnerStorage.getStore();
|
|
395
422
|
if (caller && caller.pollerKey === pollerKey && (caller.superseded || caller.stopped)) {
|
|
396
423
|
logger.info('poller:stale-stop-ignored', {
|
|
397
424
|
pollerKey,
|
|
@@ -506,54 +533,18 @@ function splitPollerKey(pollerKey) {
|
|
|
506
533
|
instanceId: pollerKey.slice(separatorIndex + 1),
|
|
507
534
|
};
|
|
508
535
|
}
|
|
509
|
-
/**
|
|
510
|
-
|
|
511
|
-
* (Issue #1621 Phase 3).
|
|
512
|
-
*
|
|
513
|
-
* Re-keying the maps alone is **not** enough, and this is the subtle part: the
|
|
514
|
-
* `setTimeout` chain in {@link scheduleNextResponsePoll} closes over
|
|
515
|
-
* `worktreeId` and recomputes its key on every tick. A poller left running
|
|
516
|
-
* would go on capturing `mcbd-<cli>-<OLD id>` (a session that no longer exists
|
|
517
|
-
* after the rename), writing its messages against an ID no row carries, and
|
|
518
|
-
* re-registering the old key the moment it fired. So each poller is torn down
|
|
519
|
-
* and restarted under the new ID — ownership token included (Issue #2223), so a
|
|
520
|
-
* tick already inside `checkForResponse()` cannot come back and act on the old
|
|
521
|
-
* ID — with everything that represents *progress* carried across:
|
|
522
|
-
*
|
|
523
|
-
* - `pollingStartTimes`, so MAX_POLLING_DURATION still measures from when the
|
|
524
|
-
* turn actually began rather than restarting the 30-minute budget;
|
|
525
|
-
* - the prompt and response dedup hashes, so the screen currently on display is
|
|
526
|
-
* not saved a second time as a new message, together with the prompt-skip
|
|
527
|
-
* tally that explains those suppressions to `capture --json` (Issue #1695).
|
|
528
|
-
*
|
|
529
|
-
* The TUI accumulator (opencode / copilot only) is re-initialised empty at the
|
|
530
|
-
* new key instead of carried over: `tui-accumulator.ts` exposes no way to write
|
|
531
|
-
* a buffer back, and it is outside this Issue's allowed scope. The cost is that
|
|
532
|
-
* one in-flight TUI response may be truncated at the rename boundary; the next
|
|
533
|
-
* turn accumulates normally.
|
|
534
|
-
*
|
|
535
|
-
* Takes the whole batch because IDs can swap (A→B, B→A) or chain (A→B→C):
|
|
536
|
-
* every source key is removed before any destination key is written. That
|
|
537
|
-
* includes the dedup state (Issue #3553) — of running pollers and paused chains
|
|
538
|
-
* alike — which is lifted off every source key in one pass and only then
|
|
539
|
-
* written, so a pair handled early cannot overwrite a source handled later.
|
|
540
|
-
*
|
|
541
|
-
* @param renames - Worktree ID pairs being applied
|
|
542
|
-
* @param resolveCliToolId - Maps a poller's (worktree, instance) back to its CLI
|
|
543
|
-
* tool, which the poller key does not encode for alias instances. Callers pass
|
|
544
|
-
* a roster-backed lookup; returning null skips that poller (it is stopped
|
|
545
|
-
* rather than left pointing at a dead ID).
|
|
546
|
-
* @returns One entry per poller that was moved
|
|
547
|
-
*/
|
|
548
|
-
function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
536
|
+
/** Old worktree ID -> new worktree ID, skipping empty and no-op pairs. */
|
|
537
|
+
function collectRenameTargets(renames) {
|
|
549
538
|
const targets = new Map();
|
|
550
539
|
for (const { oldId, newId } of renames) {
|
|
551
540
|
if (!oldId || !newId || oldId === newId)
|
|
552
541
|
continue;
|
|
553
542
|
targets.set(oldId, newId);
|
|
554
543
|
}
|
|
555
|
-
|
|
556
|
-
|
|
544
|
+
return targets;
|
|
545
|
+
}
|
|
546
|
+
/** Sort every running poller under a renamed ID into a move or an abandoned stop. */
|
|
547
|
+
function planRunningPollerMoves(targets, resolveCliToolId) {
|
|
557
548
|
const moves = [];
|
|
558
549
|
const abandoned = [];
|
|
559
550
|
for (const pollerKey of Array.from(exports.activePollers.keys())) {
|
|
@@ -565,7 +556,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
565
556
|
continue;
|
|
566
557
|
const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
|
|
567
558
|
if (!cliToolId) {
|
|
568
|
-
abandoned.push(pollerKey);
|
|
559
|
+
abandoned.push({ pollerKey, newWorktreeId });
|
|
569
560
|
continue;
|
|
570
561
|
}
|
|
571
562
|
moves.push({
|
|
@@ -576,9 +567,10 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
576
567
|
instanceId: parts.instanceId,
|
|
577
568
|
});
|
|
578
569
|
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
570
|
+
return { moves, abandoned };
|
|
571
|
+
}
|
|
572
|
+
/** Phase 1 of the migration for the moved pollers (see the caller). */
|
|
573
|
+
function liftMovedPollers(moves, carried) {
|
|
582
574
|
for (const move of moves) {
|
|
583
575
|
const timerId = exports.activePollers.get(move.oldKey);
|
|
584
576
|
if (timerId)
|
|
@@ -601,6 +593,145 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
601
593
|
exports.pollingStartTimes.delete(move.oldKey);
|
|
602
594
|
(0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
|
|
603
595
|
}
|
|
596
|
+
}
|
|
597
|
+
/** The paused chains under a renamed ID, keyed old -> new (see the caller). */
|
|
598
|
+
function collectPausedMoves(targets) {
|
|
599
|
+
const pausedMoves = [];
|
|
600
|
+
for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
|
|
601
|
+
const parts = splitPollerKey(pollerKey);
|
|
602
|
+
if (!parts)
|
|
603
|
+
continue;
|
|
604
|
+
const newWorktreeId = targets.get(parts.worktreeId);
|
|
605
|
+
if (!newWorktreeId)
|
|
606
|
+
continue;
|
|
607
|
+
pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
|
|
608
|
+
}
|
|
609
|
+
return pausedMoves;
|
|
610
|
+
}
|
|
611
|
+
/** The held scrapes under a renamed ID, keyed old -> new (see the caller). */
|
|
612
|
+
function collectPendingMoves(targets, abandonedKeys) {
|
|
613
|
+
const pendingMoves = [];
|
|
614
|
+
for (const pollerKey of (0, pending_scraped_response_1.listPendingScrapedResponseKeys)()) {
|
|
615
|
+
if (abandonedKeys.has(pollerKey))
|
|
616
|
+
continue;
|
|
617
|
+
const parts = splitPollerKey(pollerKey);
|
|
618
|
+
if (!parts)
|
|
619
|
+
continue;
|
|
620
|
+
const newWorktreeId = targets.get(parts.worktreeId);
|
|
621
|
+
if (!newWorktreeId)
|
|
622
|
+
continue;
|
|
623
|
+
pendingMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}`, newWorktreeId });
|
|
624
|
+
}
|
|
625
|
+
return pendingMoves;
|
|
626
|
+
}
|
|
627
|
+
/** Stop the chains on destinations that no source vacates (see the caller). */
|
|
628
|
+
function stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys) {
|
|
629
|
+
const vacated = new Set([
|
|
630
|
+
...moves.map((move) => move.oldKey),
|
|
631
|
+
...pausedMoves.map((move) => move.oldKey),
|
|
632
|
+
...pendingMoves.map((move) => move.oldKey),
|
|
633
|
+
]);
|
|
634
|
+
// A held scrape moved on its own (no chain, no pause) changes the key's
|
|
635
|
+
// owner just the same, so its destination is handled alike (#3663 review).
|
|
636
|
+
const occupied = new Set([
|
|
637
|
+
...moves.map((move) => move.newKey),
|
|
638
|
+
...pausedMoves.map((move) => move.newKey),
|
|
639
|
+
...pendingMoves.map((move) => move.newKey),
|
|
640
|
+
]);
|
|
641
|
+
for (const pollerKey of occupied) {
|
|
642
|
+
if (vacated.has(pollerKey) || abandonedKeys.has(pollerKey))
|
|
643
|
+
continue;
|
|
644
|
+
const held = coordinator.owners.has(pollerKey) ||
|
|
645
|
+
exports.activePollers.has(pollerKey) ||
|
|
646
|
+
coordinator.pausedOnPrompt.has(pollerKey) ||
|
|
647
|
+
(0, pending_scraped_response_1.hasPendingScrapedResponse)(pollerKey);
|
|
648
|
+
if (!held)
|
|
649
|
+
continue;
|
|
650
|
+
stopPollingByKey(pollerKey);
|
|
651
|
+
logger.warn('poller:migrate-displaced', { pollerKey });
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
/** Phase 2 of the migration: restart each moved poller (see the caller). */
|
|
655
|
+
function restartMovedPollers(moves, carried) {
|
|
656
|
+
for (const move of moves) {
|
|
657
|
+
const startedAt = carried.get(move.newKey)?.startedAt;
|
|
658
|
+
exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
|
|
659
|
+
if (isFullScreenTui(move.cliToolId)) {
|
|
660
|
+
(0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
|
|
661
|
+
}
|
|
662
|
+
scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Move every running response poller from a renamed worktree ID to the new one
|
|
667
|
+
* (Issue #1621 Phase 3).
|
|
668
|
+
*
|
|
669
|
+
* Re-keying the maps alone is **not** enough, and this is the subtle part: the
|
|
670
|
+
* `setTimeout` chain in {@link scheduleNextResponsePoll} closes over
|
|
671
|
+
* `worktreeId` and recomputes its key on every tick. A poller left running
|
|
672
|
+
* would go on capturing `mcbd-<cli>-<OLD id>` (a session that no longer exists
|
|
673
|
+
* after the rename), writing its messages against an ID no row carries, and
|
|
674
|
+
* re-registering the old key the moment it fired. So each poller is torn down
|
|
675
|
+
* and restarted under the new ID — ownership token included (Issue #2223), so a
|
|
676
|
+
* tick already inside `checkForResponse()` cannot come back and act on the old
|
|
677
|
+
* ID — with everything that represents *progress* carried across:
|
|
678
|
+
*
|
|
679
|
+
* - `pollingStartTimes`, so MAX_POLLING_DURATION still measures from when the
|
|
680
|
+
* turn actually began rather than restarting the 30-minute budget;
|
|
681
|
+
* - the prompt and response dedup hashes, so the screen currently on display is
|
|
682
|
+
* not saved a second time as a new message, together with the prompt-skip
|
|
683
|
+
* tally that explains those suppressions to `capture --json` (Issue #1695).
|
|
684
|
+
*
|
|
685
|
+
* The TUI accumulator (opencode / copilot only) is re-initialised empty at the
|
|
686
|
+
* new key instead of carried over: `tui-accumulator.ts` exposes no way to write
|
|
687
|
+
* a buffer back, and it is outside this Issue's allowed scope. The cost is that
|
|
688
|
+
* one in-flight TUI response may be truncated at the rename boundary; the next
|
|
689
|
+
* turn accumulates normally.
|
|
690
|
+
*
|
|
691
|
+
* Takes the whole batch because IDs can swap (A→B, B→A) or chain (A→B→C):
|
|
692
|
+
* every source key is removed before any destination key is written. That
|
|
693
|
+
* includes the dedup state (Issue #3553) — of running pollers and paused chains
|
|
694
|
+
* alike — which is lifted off every source key in one pass and only then
|
|
695
|
+
* written, so a pair handled early cannot overwrite a source handled later.
|
|
696
|
+
*
|
|
697
|
+
* Issue #3663: the held scrapes (#2436) move too, by the same lift-then-place
|
|
698
|
+
* rule, keeping everything but their worktree ID, which becomes the new one.
|
|
699
|
+
* Every chain whose key changes hands is retired (`stopped`), so a tick still
|
|
700
|
+
* awaiting the transcript reader cannot come back and hold, drop or write
|
|
701
|
+
* under it: the moved chains' old owners, and a chain already running on a
|
|
702
|
+
* destination key that no source vacates — that one is stopped like any
|
|
703
|
+
* other, which writes its held scrape under the ID it carries before the moved
|
|
704
|
+
* one arrives. A chain that cannot be resolved has its held scrape written
|
|
705
|
+
* under the NEW ID: the old one is gone from the table, and a row for it fails
|
|
706
|
+
* the foreign key and is lost. A chain with a tick running at the moment of
|
|
707
|
+
* the migration does not hand its response hash on (see the dedup move below).
|
|
708
|
+
*
|
|
709
|
+
* @param renames - Worktree ID pairs being applied
|
|
710
|
+
* @param resolveCliToolId - Maps a poller's (worktree, instance) back to its CLI
|
|
711
|
+
* tool, which the poller key does not encode for alias instances. Callers pass
|
|
712
|
+
* a roster-backed lookup; returning null skips that poller (it is stopped
|
|
713
|
+
* rather than left pointing at a dead ID).
|
|
714
|
+
* @returns One entry per poller that was moved
|
|
715
|
+
*/
|
|
716
|
+
function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
717
|
+
const targets = collectRenameTargets(renames);
|
|
718
|
+
if (targets.size === 0)
|
|
719
|
+
return [];
|
|
720
|
+
const { moves, abandoned } = planRunningPollerMoves(targets, resolveCliToolId);
|
|
721
|
+
// Phase 1: stop every affected timer and lift the state off the old keys.
|
|
722
|
+
// Done for the whole batch before any write so a swap cannot self-collide.
|
|
723
|
+
const carried = new Map();
|
|
724
|
+
// Issue #3663: the moves whose chain has a tick running right now — read
|
|
725
|
+
// before anything below touches the coordinator. See the response hash below.
|
|
726
|
+
// The chain that holds the key now, not merely some tick under the key: a
|
|
727
|
+
// chain retired earlier leaves its `running` entry until its own tick
|
|
728
|
+
// returns (the epilogue removes it by owner), and the chain that replaced it
|
|
729
|
+
// may not have started a tick yet.
|
|
730
|
+
const midTick = moves.filter((move) => {
|
|
731
|
+
const inFlight = coordinator.running.get(move.oldKey);
|
|
732
|
+
return inFlight !== undefined && inFlight.owner === coordinator.owners.get(move.oldKey);
|
|
733
|
+
});
|
|
734
|
+
liftMovedPollers(moves, carried);
|
|
604
735
|
// Stop the abandoned pollers before any dedup state is written: the stop
|
|
605
736
|
// clears every cache under its key, and that key can be the destination of
|
|
606
737
|
// another move in this batch (A:x paused → B:x while B:x is abandoned).
|
|
@@ -608,29 +739,56 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
608
739
|
// An abandoned key is never a move source, so nothing still to be moved is
|
|
609
740
|
// lost here; and the paused chains are collected after it, as before, so a
|
|
610
741
|
// pause the stop ends is not carried.
|
|
611
|
-
|
|
742
|
+
//
|
|
743
|
+
// Issue #3663: its held scrape is pointed at the new ID first, so the stop
|
|
744
|
+
// writes it there — the old ID is no longer in the table.
|
|
745
|
+
for (const { pollerKey, newWorktreeId } of abandoned) {
|
|
746
|
+
(0, pending_scraped_response_1.retargetPendingScrapedResponse)(pollerKey, newWorktreeId);
|
|
612
747
|
stopPollingByKey(pollerKey);
|
|
613
748
|
logger.warn('poller:migrate-abandoned', { pollerKey });
|
|
614
749
|
}
|
|
750
|
+
const abandonedKeys = new Set(abandoned.map(({ pollerKey }) => pollerKey));
|
|
615
751
|
// Issue #2230: a chain paused on a prompt has no timer, so the loops here
|
|
616
752
|
// never see it — but it is holding the response hash for the turn it paused
|
|
617
753
|
// on, and `/respond` will resume it under the NEW ID. Move the hash and the
|
|
618
754
|
// pause mark with it; the chain itself stays paused until that resume.
|
|
619
|
-
const pausedMoves =
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
755
|
+
const pausedMoves = collectPausedMoves(targets);
|
|
756
|
+
// Issue #3663: every held scrape under a renamed worktree ID moves — a
|
|
757
|
+
// running chain's, a paused chain's, and one whose chain is already gone.
|
|
758
|
+
// The abandoned ones were written above and are no longer held.
|
|
759
|
+
const pendingMoves = collectPendingMoves(targets, abandonedKeys);
|
|
760
|
+
// Issue #3663: a destination a chain (running or paused) moves onto, that no
|
|
761
|
+
// source of this batch vacates, may already be held by another chain — B:x
|
|
762
|
+
// running while A:x moves to B:x. That chain loses the key, so it is stopped
|
|
763
|
+
// here like any other stop: its held scrape is written under the ID it
|
|
764
|
+
// carries (the current one), its owner is retired so its in-flight tick can
|
|
765
|
+
// no longer hold or drop anything, and its caches are cleared before the
|
|
766
|
+
// moved state is written. A destination nothing is on is left alone, and so
|
|
767
|
+
// is every other instance of the destination worktree.
|
|
768
|
+
stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys);
|
|
629
769
|
// Issue #3553: the dedup state of the whole batch moves in one call per map
|
|
630
770
|
// family, each lifting every source before writing any destination. Re-keyed
|
|
631
771
|
// pair by pair, a swap left A with its own state and B empty.
|
|
772
|
+
//
|
|
773
|
+
// Issue #3663: except the response hash of a chain whose tick is running.
|
|
774
|
+
// That tick may have registered the hash of a reply it has not yet saved or
|
|
775
|
+
// held — it is awaiting the transcript reader, and the hold it comes back
|
|
776
|
+
// with is refused (its owner is retired above). Handed on, the hash would
|
|
777
|
+
// make the successor skip a reply nobody wrote. Dropped, the successor judges
|
|
778
|
+
// the screen itself and holds or saves it. The price, taken knowingly: a
|
|
779
|
+
// reply that tick HAD already saved may be saved once more by the successor
|
|
780
|
+
// — a duplicate row rather than a lost one, the trade #2436 makes. Deciding
|
|
781
|
+
// here, once, replaces marking the hash and taking it back later, whose
|
|
782
|
+
// lifetime every later move, resume and restart would have to carry.
|
|
783
|
+
// The prompt hash and the prompt-skip tally move as before.
|
|
784
|
+
// Dropped on the source key only, before the batch moves: the destination is
|
|
785
|
+
// left as the batch leaves it, so what another source of a many-to-one move
|
|
786
|
+
// brings there (a chain that saved its reply and is waiting) still stands.
|
|
787
|
+
for (const move of midTick)
|
|
788
|
+
(0, response_dedup_1.clearResponseHashCache)(move.oldKey);
|
|
632
789
|
(0, prompt_dedup_1.renamePromptHashCacheKeys)(moves);
|
|
633
790
|
(0, response_dedup_1.renameResponseHashCacheKeys)([...moves, ...pausedMoves]);
|
|
791
|
+
(0, pending_scraped_response_1.movePendingScrapedResponses)(pendingMoves);
|
|
634
792
|
// Issue #1695: the prompt hash moved above, so the guard keeps suppressing
|
|
635
793
|
// the prompt on screen under the new ID. Its tally has to move with it, or
|
|
636
794
|
// `capture --json` reports zero skips for a session that is still skipping.
|
|
@@ -647,14 +805,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
647
805
|
: [];
|
|
648
806
|
}));
|
|
649
807
|
// Phase 2: restart each poller under its new identity.
|
|
650
|
-
|
|
651
|
-
const startedAt = carried.get(move.newKey)?.startedAt;
|
|
652
|
-
exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
|
|
653
|
-
if (isFullScreenTui(move.cliToolId)) {
|
|
654
|
-
(0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
|
|
655
|
-
}
|
|
656
|
-
scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
657
|
-
}
|
|
808
|
+
restartMovedPollers(moves, carried);
|
|
658
809
|
// Issue #2230: the pause marks of the chains collected above follow their
|
|
659
810
|
// hashes (moved with the batch). All removed before any is added, for the
|
|
660
811
|
// same swap reason.
|
|
@@ -84,6 +84,7 @@ const tool_id_4 = require("../../lib/hooks/sources/command-code/tool-id");
|
|
|
84
84
|
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
85
85
|
const relay_triggers_1 = require("../../lib/relay/relay-triggers");
|
|
86
86
|
const global_state_1 = require("../global-state");
|
|
87
|
+
const poller_owner_1 = require("./poller-owner");
|
|
87
88
|
const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate');
|
|
88
89
|
/**
|
|
89
90
|
* One in-flight capture per instance (Issue #2246).
|
|
@@ -382,7 +383,25 @@ async function captureStructuredHistoryTurn(worktreeId, cliToolId, instanceId, c
|
|
|
382
383
|
// back. So a provisional capture announces nothing at all; the relay
|
|
383
384
|
// keeps waiting on the deadline it already has, and the settled capture
|
|
384
385
|
// that follows announces the finished body.
|
|
385
|
-
|
|
386
|
+
//
|
|
387
|
+
// Issue #3701: a poller tick retired while it awaited the reader
|
|
388
|
+
// announces nothing under the key it lost, and claims nothing, so its
|
|
389
|
+
// successor still announces this completion. Asked by the poller key
|
|
390
|
+
// (`getPollerKey`'s `worktreeId:instanceId`), not `captureKey`. The
|
|
391
|
+
// Stop hook runs outside any tick and is never refused. Issue #3705:
|
|
392
|
+
// what the reader itself writes during the `await` (rows, user rows,
|
|
393
|
+
// the cursor, agy's follow list) is asked the same question by the
|
|
394
|
+
// reader, after its own last `await` (`mayReaderWrite`).
|
|
395
|
+
const pollerKey = (0, poller_owner_1.pollerKeyOf)(worktreeId, cliToolId, resolvedInstanceId);
|
|
396
|
+
if (captured && completion === 'settled' && !(0, poller_owner_1.mayActForPollerKey)(pollerKey)) {
|
|
397
|
+
logger.info('structured-history-completion-refused', {
|
|
398
|
+
worktreeId,
|
|
399
|
+
cliToolId,
|
|
400
|
+
instanceId: resolvedInstanceId,
|
|
401
|
+
generation: (0, poller_owner_1.currentPollerOwner)()?.generation,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
else if (captured && completion === 'settled') {
|
|
386
405
|
if (claimCompletionAnnouncement(captureKey, readerReport.completionKey)) {
|
|
387
406
|
(0, relay_triggers_1.onRelayTurnCompleted)(worktreeId, cliToolId, resolvedInstanceId, true);
|
|
388
407
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* the promptType/defaultOptionNumber fallback introduced in Bug1).
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.PromptAnswerRejectedError = exports.ANSWER_MODE_KEYS_REASON = void 0;
|
|
10
|
+
exports.PromptAnswerAbortedError = exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.PromptAnswerRejectedError = exports.ANSWER_MODE_KEYS_REASON = void 0;
|
|
11
11
|
exports.sendPromptAnswer = sendPromptAnswer;
|
|
12
12
|
const tmux_1 = require("./tmux/tmux");
|
|
13
13
|
const frame_1 = require("../lib/detection/tools/frame");
|
|
@@ -665,7 +665,7 @@ async function recaptureAfterKeys(sessionName) {
|
|
|
665
665
|
* @throws {MultiSelectAnswerRejectedError} whenever the question was not
|
|
666
666
|
* committed; `keysSent` says whether the pane was touched.
|
|
667
667
|
*/
|
|
668
|
-
async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted) {
|
|
668
|
+
async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent) {
|
|
669
669
|
const cursor = promptData.options.find((option) => option.isDefault === true);
|
|
670
670
|
if (cursor === undefined) {
|
|
671
671
|
throw new MultiSelectAnswerRejectedError('cursor-unknown', false, wanted);
|
|
@@ -679,12 +679,13 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
|
|
|
679
679
|
...current.filter((n) => !wanted.includes(n)),
|
|
680
680
|
].sort((a, b) => a - b);
|
|
681
681
|
if (toggles.length > 0) {
|
|
682
|
-
await (
|
|
682
|
+
await sendSpecialKeysWhileCurrent(sessionName, toggles.map(String), stillCurrent);
|
|
683
683
|
}
|
|
684
684
|
const keysSent = toggles.length > 0;
|
|
685
685
|
// 2. Read the screen back and refuse unless it is the same question with
|
|
686
686
|
// exactly the requested boxes ticked.
|
|
687
687
|
const afterToggle = await recaptureAfterKeys(sessionName);
|
|
688
|
+
assertStillCurrent(stillCurrent, keysSent);
|
|
688
689
|
if (afterToggle === null) {
|
|
689
690
|
throw new MultiSelectAnswerRejectedError('recapture-failed', keysSent, wanted);
|
|
690
691
|
}
|
|
@@ -711,14 +712,12 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
|
|
|
711
712
|
if (cursorNow === undefined) {
|
|
712
713
|
throw new MultiSelectAnswerRejectedError('cursor-unknown', keysSent, wanted);
|
|
713
714
|
}
|
|
714
|
-
await (
|
|
715
|
-
...downKeys(verified.options.length - cursorNow.number + 1),
|
|
716
|
-
'Enter',
|
|
717
|
-
]);
|
|
715
|
+
await sendSpecialKeysWhileCurrent(sessionName, [...downKeys(verified.options.length - cursorNow.number + 1), 'Enter'], stillCurrent);
|
|
718
716
|
// 4. The second stage. `Submit` opens the Review page and the answer is sent
|
|
719
717
|
// from there; `Next` advances to the following question, which IS the
|
|
720
718
|
// commit for this one (its tab turns `✔`).
|
|
721
719
|
const afterConfirm = await recaptureAfterKeys(sessionName);
|
|
720
|
+
assertStillCurrent(stillCurrent, true);
|
|
722
721
|
if (afterConfirm === null) {
|
|
723
722
|
throw new MultiSelectAnswerRejectedError('recapture-failed', true, wanted);
|
|
724
723
|
}
|
|
@@ -729,7 +728,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
|
|
|
729
728
|
if (review.hasUnansweredWarning) {
|
|
730
729
|
throw new MultiSelectAnswerRejectedError('review-unanswered', true, wanted);
|
|
731
730
|
}
|
|
732
|
-
await (
|
|
731
|
+
await sendSpecialKeysWhileCurrent(sessionName, ['Enter'], stillCurrent);
|
|
733
732
|
return;
|
|
734
733
|
}
|
|
735
734
|
const next = (0, dialog_1.readCommandCodeQuestionDialog)(afterConfirm);
|
|
@@ -740,6 +739,50 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
|
|
|
740
739
|
throw new MultiSelectAnswerRejectedError('not-committed', true, wanted);
|
|
741
740
|
}
|
|
742
741
|
}
|
|
742
|
+
/**
|
|
743
|
+
* The caller's `stillCurrent` said no after one of the send's waits
|
|
744
|
+
* (Issue #3706): the keys not yet sent were not sent. Keys already typed cannot
|
|
745
|
+
* be taken back, so {@link keysSent} says whether the pane was touched; either
|
|
746
|
+
* way the answer was NOT completed and must not be recorded as one.
|
|
747
|
+
*/
|
|
748
|
+
class PromptAnswerAbortedError extends Error {
|
|
749
|
+
keysSent;
|
|
750
|
+
constructor(
|
|
751
|
+
/** Whether any key reached the pane before the stop. */
|
|
752
|
+
keysSent) {
|
|
753
|
+
super(`Prompt answer stopped by its caller (${keysSent ? 'some keys were sent' : 'no key was sent'})`);
|
|
754
|
+
this.keysSent = keysSent;
|
|
755
|
+
this.name = 'PromptAnswerAbortedError';
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
exports.PromptAnswerAbortedError = PromptAnswerAbortedError;
|
|
759
|
+
/** Stop here when the caller's `stillCurrent` says no (Issue #3706). */
|
|
760
|
+
function assertStillCurrent(stillCurrent, keysSent) {
|
|
761
|
+
if (stillCurrent && !stillCurrent())
|
|
762
|
+
throw new PromptAnswerAbortedError(keysSent);
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* `sendSpecialKeys`, asking `stillCurrent` between the keys when the caller
|
|
766
|
+
* gave one (Issue #3706). Without it the call is exactly the old two-argument
|
|
767
|
+
* one, so manual answers and every other caller send as before.
|
|
768
|
+
*/
|
|
769
|
+
async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent) {
|
|
770
|
+
if (!stillCurrent) {
|
|
771
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
try {
|
|
775
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, keys, { shouldContinue: stillCurrent });
|
|
776
|
+
}
|
|
777
|
+
catch (error) {
|
|
778
|
+
// By name rather than `instanceof`: test doubles of `./tmux/tmux` need not
|
|
779
|
+
// export the class.
|
|
780
|
+
if (error instanceof Error && error.name === 'SpecialKeysAbortedError') {
|
|
781
|
+
throw new PromptAnswerAbortedError(true);
|
|
782
|
+
}
|
|
783
|
+
throw error;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
743
786
|
/**
|
|
744
787
|
* Send an answer to a tmux session, using cursor-key navigation for
|
|
745
788
|
* Claude Code / Antigravity multiple-choice prompts and text input for
|
|
@@ -750,7 +793,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
|
|
|
750
793
|
* - src/lib/auto-yes-manager.ts (L340-399)
|
|
751
794
|
*/
|
|
752
795
|
async function sendPromptAnswer(params) {
|
|
753
|
-
const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber } = params;
|
|
796
|
+
const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber, stillCurrent } = params;
|
|
754
797
|
// Issue #2755: Command Code's checkbox question, before every guard below.
|
|
755
798
|
// Its answer is a SET (`"1,3"`), which none of them can read — `/^\d+$/` is
|
|
756
799
|
// how all three ask "is this a number?", so a set would be judged as free
|
|
@@ -760,7 +803,7 @@ async function sendPromptAnswer(params) {
|
|
|
760
803
|
// a two-stage confirm, not a digit and an Enter.
|
|
761
804
|
const multiSelect = readMultiSelectRequest(params);
|
|
762
805
|
if (multiSelect !== null) {
|
|
763
|
-
await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted);
|
|
806
|
+
await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted, stillCurrent);
|
|
764
807
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
765
808
|
return;
|
|
766
809
|
}
|
|
@@ -781,6 +824,8 @@ async function sendPromptAnswer(params) {
|
|
|
781
824
|
// the Enter after them confirms that row — so the cursor has to be checked
|
|
782
825
|
// here too, before the branch.
|
|
783
826
|
assertFreeTextCursorIsOnTheField(params);
|
|
827
|
+
// Issue #3706: the guard above may have read the pane; nothing is typed yet.
|
|
828
|
+
assertStillCurrent(stillCurrent, false);
|
|
784
829
|
// Determine if this is an arrow-key-navigated multiple-choice prompt.
|
|
785
830
|
// Claude Code and Antigravity (agy) both render selection menus that only
|
|
786
831
|
// respond to cursor navigation + Enter, not to typed option numbers
|
|
@@ -829,7 +874,7 @@ async function sendPromptAnswer(params) {
|
|
|
829
874
|
keys.push(...buildNavigationKeys(downToNext));
|
|
830
875
|
// 4. Enter to submit
|
|
831
876
|
keys.push('Enter');
|
|
832
|
-
await (
|
|
877
|
+
await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
|
|
833
878
|
}
|
|
834
879
|
else {
|
|
835
880
|
// Single-select: navigate and Enter to select
|
|
@@ -847,7 +892,7 @@ async function sendPromptAnswer(params) {
|
|
|
847
892
|
const keys = (isAskUserQuestionPicker && offset === 0)
|
|
848
893
|
? ['Down', 'Up', 'Enter']
|
|
849
894
|
: [...navigationKeys, 'Enter'];
|
|
850
|
-
await (
|
|
895
|
+
await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
|
|
851
896
|
}
|
|
852
897
|
}
|
|
853
898
|
else {
|
|
@@ -858,6 +903,8 @@ async function sendPromptAnswer(params) {
|
|
|
858
903
|
if (!shouldSuppressEnter(params, resolvedSubmitMode, dialog)) {
|
|
859
904
|
// Wait a moment for the input to be processed
|
|
860
905
|
await new Promise(resolve => setTimeout(resolve, cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS));
|
|
906
|
+
// Issue #3706: the text is typed; the Enter that submits it is not.
|
|
907
|
+
assertStillCurrent(stillCurrent, true);
|
|
861
908
|
// Send Enter
|
|
862
909
|
await (0, tmux_1.sendKeys)(sessionName, '', true);
|
|
863
910
|
}
|