commandmate 0.46.1 → 0.47.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +587 -580
- package/.next/app-path-routes-manifest.json +31 -30
- package/.next/build-manifest.json +8 -8
- package/.next/diagnostics/framework.json +1 -1
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +2 -2
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/app/release-notes/route.js.nft.json +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 +6 -4
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route.js +1 -1
- package/.next/server/app/api/auth/status/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route.js +2 -2
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route.js +1 -1
- package/.next/server/app/api/ollama/models/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +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 +7 -7
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +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 +3 -3
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +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 +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 +5 -5
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +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/apple-icon.png/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/.next/server/app/apple-icon.png.meta +1 -1
- package/.next/server/app/icon.png/route.js +1 -1
- package/.next/server/app/icon.png/route.js.nft.json +1 -1
- package/.next/server/app/icon.png.meta +1 -1
- package/.next/server/app/icon1.png/route.js +1 -1
- package/.next/server/app/icon1.png/route.js.nft.json +1 -1
- package/.next/server/app/icon1.png.meta +1 -1
- package/.next/server/app/icon2.png/route.js +1 -1
- package/.next/server/app/icon2.png/route.js.nft.json +1 -1
- package/.next/server/app/icon2.png.meta +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest.meta +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js +2 -2
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +2 -2
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +2 -2
- 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.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +12 -12
- 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.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +31 -30
- package/.next/server/chunks/{5048.js → 1185.js} +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1656.js +19 -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/255.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3505.js +7 -0
- package/.next/server/chunks/3897.js +22 -0
- package/.next/server/chunks/4072.js +5 -5
- 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/463.js +1 -0
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5611.js +1 -1
- package/.next/server/chunks/5845.js +1 -1
- package/.next/server/chunks/610.js +1 -0
- package/.next/server/chunks/6119.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6345.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/6784.js +1 -0
- package/.next/server/chunks/6793.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +10 -10
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +4 -4
- package/.next/server/chunks/9130.js +1 -1
- 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 +2 -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/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +3 -3
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
- package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
- package/.next/static/chunks/{2407-9703c569370b8a9d.js → 2407-a6533805a86d05bd.js} +1 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
- package/.next/static/chunks/{5794-4eee51ff1e878aa6.js → 5794-80ac3f06f098ea29.js} +1 -1
- package/.next/static/chunks/602-1c1488959215e140.js +1 -0
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
- package/.next/static/chunks/9465-b59bb255b376c813.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-538d8d2746ad1588.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-46aced20b2b1c010.js +1 -0
- package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
- package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.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 +223 -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 +114 -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 +69 -2
- 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 +54 -1
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +21 -1
- 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/auto-yes-lifecycle.js +28 -2
- package/dist/server/src/lib/auto-yes-poller.js +401 -369
- 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/detection/prompt-detect-multiple-choice.js +88 -6
- package/dist/server/src/lib/detection/prompt-detector.js +1 -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 +89 -2
- 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/hooks/permission-adjudication.js +26 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +42 -4
- package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +29 -3
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +301 -0
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +114 -0
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1060 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
- package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +96 -13
- package/dist/server/src/lib/polling/auto-yes-poller-capture.js +50 -0
- package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
- package/dist/server/src/lib/polling/auto-yes-poller-generation.js +151 -0
- package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +287 -0
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +75 -6
- package/dist/server/src/lib/polling/auto-yes-poller-steps.js +109 -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 +231 -5
- package/dist/server/src/lib/polling/auto-yes-resolver.js +21 -1
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +21 -1
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
- package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
- package/dist/server/src/lib/polling/response-checker.js +14 -10
- package/dist/server/src/lib/polling/response-poller-core.js +136 -104
- package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
- 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/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/cli-session.js +38 -3
- 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 +2 -1
- 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 +4 -0
- 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 +2 -2
- package/release-notes/0.47.0.json +118 -0
- package/release-notes/0.47.1.json +20 -0
- package/release-notes/0.47.2.json +20 -0
- package/scripts/hooks/cmate-agent-event.sh +22 -0
- package/.next/server/chunks/1331.js +0 -22
- package/.next/server/chunks/1789.js +0 -1
- package/.next/server/chunks/1944.js +0 -1
- package/.next/server/chunks/2328.js +0 -1
- package/.next/server/chunks/2908.js +0 -1
- package/.next/server/chunks/2984.js +0 -25
- package/.next/server/chunks/3718.js +0 -1
- package/.next/server/chunks/4837.js +0 -14
- package/.next/server/chunks/5292.js +0 -7
- package/.next/server/chunks/611.js +0 -1
- package/.next/server/chunks/850.js +0 -1
- package/.next/server/chunks/9051.js +0 -1
- package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
- package/.next/static/chunks/5371-0dc947683e46e78c.js +0 -1
- package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
- package/.next/static/chunks/9465-e5a351baa941f31b.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-3e357690446cd2da.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-effbf0796881dd5a.js +0 -1
- package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
- /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → etorRtpxbQqqOzdUeXdw2}/_buildManifest.js +0 -0
- /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → etorRtpxbQqqOzdUeXdw2}/_ssgManifest.js +0 -0
|
@@ -45,14 +45,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
45
45
|
};
|
|
46
46
|
})();
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.AUTO_YES_ENTER_FALLBACK_ANSWER = void 0;
|
|
49
|
-
exports.getActivePollerCount = getActivePollerCount;
|
|
48
|
+
exports.capturePollerFrame = exports.captureAndCleanOutput = exports.AUTO_YES_ENTER_FALLBACK_ANSWER = exports.noHookReceiptHint = exports.isPollerActive = exports.getLastServerResponseTimestamp = exports.getActivePollerCount = void 0;
|
|
50
49
|
exports.clearAllPollerStates = clearAllPollerStates;
|
|
51
|
-
exports.getLastServerResponseTimestamp = getLastServerResponseTimestamp;
|
|
52
|
-
exports.isPollerActive = isPollerActive;
|
|
53
50
|
exports.validatePollingContext = validatePollingContext;
|
|
54
|
-
exports.capturePollerFrame = capturePollerFrame;
|
|
55
|
-
exports.captureAndCleanOutput = captureAndCleanOutput;
|
|
56
51
|
exports.processStopConditionDelta = processStopConditionDelta;
|
|
57
52
|
exports.detectAndRespondToPrompt = detectAndRespondToPrompt;
|
|
58
53
|
exports.startAutoYesPolling = startAutoYesPolling;
|
|
@@ -63,11 +58,12 @@ exports.stopAutoYesPollingByWorktree = stopAutoYesPollingByWorktree;
|
|
|
63
58
|
exports.isAnyPollerActiveForWorktree = isAnyPollerActiveForWorktree;
|
|
64
59
|
const cli_session_1 = require("./session/cli-session");
|
|
65
60
|
const response_checker_1 = require("./polling/response-checker");
|
|
66
|
-
const
|
|
61
|
+
const antigravity_receipt_episodes_1 = require("./polling/antigravity-receipt-episodes");
|
|
67
62
|
const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
|
|
68
63
|
const auto_yes_policy_1 = require("./polling/auto-yes-policy");
|
|
69
64
|
const detect_1 = require("./detection/tools/codex/detect");
|
|
70
65
|
const frame_1 = require("./detection/tools/frame");
|
|
66
|
+
const dialog_1 = require("./detection/tools/antigravity/dialog");
|
|
71
67
|
const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
|
|
72
68
|
const auto_yes_enter_fallback_1 = require("./polling/auto-yes-enter-fallback");
|
|
73
69
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
@@ -77,108 +73,49 @@ const worktree_session_ownership_1 = require("./cli-tools/worktree-session-owner
|
|
|
77
73
|
const prompt_answer_sender_1 = require("./prompt-answer-sender");
|
|
78
74
|
const prompt_answer_semantic_1 = require("./prompt-answer-semantic");
|
|
79
75
|
const tmux_1 = require("./tmux/tmux");
|
|
76
|
+
const session_created_signal_1 = require("./tmux/session-created-signal");
|
|
80
77
|
const manager_1 = require("./cli-tools/manager");
|
|
81
78
|
const cli_patterns_1 = require("./detection/cli-patterns");
|
|
82
79
|
const prompt_key_1 = require("./detection/prompt-key");
|
|
83
80
|
const errors_1 = require("./errors");
|
|
84
81
|
const tmux_capture_cache_1 = require("./tmux/tmux-capture-cache");
|
|
85
82
|
const auto_yes_config_1 = require("../config/auto-yes-config");
|
|
83
|
+
const auto_yes_poller_stop_reason_1 = require("./polling/auto-yes-poller-stop-reason");
|
|
86
84
|
const logger_1 = require("../lib/logger");
|
|
87
85
|
const logger = (0, logger_1.createLogger)('auto-yes-poller');
|
|
88
86
|
const path_validator_1 = require("./security/path-validator");
|
|
89
87
|
const auto_yes_state_1 = require("./auto-yes-state");
|
|
90
88
|
const global_state_1 = require("./global-state");
|
|
91
|
-
const auto_yes_suppression_reason_1 = require("./polling/auto-yes-suppression-reason");
|
|
92
89
|
const auto_yes_poller_state_1 = require("./polling/auto-yes-poller-state");
|
|
93
90
|
const auto_yes_prompt_suppression_1 = require("./polling/auto-yes-prompt-suppression");
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
* @returns Poller state or undefined
|
|
113
|
-
*/
|
|
114
|
-
function getPollerState(compositeKey) {
|
|
115
|
-
return autoYesPollerStates.get(compositeKey);
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Get the number of active pollers.
|
|
119
|
-
*/
|
|
120
|
-
function getActivePollerCount() {
|
|
121
|
-
return autoYesPollerStates.size;
|
|
122
|
-
}
|
|
91
|
+
const auto_yes_poller_generation_1 = require("./polling/auto-yes-poller-generation");
|
|
92
|
+
const auto_yes_poller_receipt_log_1 = require("./polling/auto-yes-poller-receipt-log");
|
|
93
|
+
const auto_yes_poller_enter_fallback_1 = require("./polling/auto-yes-poller-enter-fallback");
|
|
94
|
+
const auto_yes_poller_capture_1 = require("./polling/auto-yes-poller-capture");
|
|
95
|
+
const auto_yes_confirmation_ledger_1 = require("./polling/auto-yes-confirmation-ledger");
|
|
96
|
+
const auto_yes_poller_steps_1 = require("./polling/auto-yes-poller-steps");
|
|
97
|
+
// Issue #3783: split out; re-exported so existing importers are unchanged.
|
|
98
|
+
var auto_yes_poller_generation_2 = require("./polling/auto-yes-poller-generation");
|
|
99
|
+
Object.defineProperty(exports, "getActivePollerCount", { enumerable: true, get: function () { return auto_yes_poller_generation_2.getActivePollerCount; } });
|
|
100
|
+
Object.defineProperty(exports, "getLastServerResponseTimestamp", { enumerable: true, get: function () { return auto_yes_poller_generation_2.getLastServerResponseTimestamp; } });
|
|
101
|
+
Object.defineProperty(exports, "isPollerActive", { enumerable: true, get: function () { return auto_yes_poller_generation_2.isPollerActive; } });
|
|
102
|
+
var auto_yes_poller_receipt_log_2 = require("./polling/auto-yes-poller-receipt-log");
|
|
103
|
+
Object.defineProperty(exports, "noHookReceiptHint", { enumerable: true, get: function () { return auto_yes_poller_receipt_log_2.noHookReceiptHint; } });
|
|
104
|
+
var auto_yes_poller_enter_fallback_2 = require("./polling/auto-yes-poller-enter-fallback");
|
|
105
|
+
Object.defineProperty(exports, "AUTO_YES_ENTER_FALLBACK_ANSWER", { enumerable: true, get: function () { return auto_yes_poller_enter_fallback_2.AUTO_YES_ENTER_FALLBACK_ANSWER; } });
|
|
106
|
+
var auto_yes_poller_capture_2 = require("./polling/auto-yes-poller-capture");
|
|
107
|
+
Object.defineProperty(exports, "captureAndCleanOutput", { enumerable: true, get: function () { return auto_yes_poller_capture_2.captureAndCleanOutput; } });
|
|
108
|
+
Object.defineProperty(exports, "capturePollerFrame", { enumerable: true, get: function () { return auto_yes_poller_capture_2.capturePollerFrame; } });
|
|
123
109
|
/**
|
|
124
110
|
* Clear all poller states.
|
|
125
111
|
* Stops all active pollers before clearing state.
|
|
126
112
|
* @internal Exported for testing purposes only.
|
|
127
113
|
*/
|
|
128
114
|
function clearAllPollerStates() {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Get the last server response timestamp for a composite key.
|
|
135
|
-
*
|
|
136
|
-
* Issue #525: Changed from (worktreeId) to (compositeKey).
|
|
137
|
-
*
|
|
138
|
-
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
139
|
-
* @returns Timestamp (Date.now()) of the last server response, or null if none
|
|
140
|
-
*/
|
|
141
|
-
function getLastServerResponseTimestamp(compositeKey) {
|
|
142
|
-
const pollerState = getPollerState(compositeKey);
|
|
143
|
-
return pollerState?.lastServerResponseTimestamp ?? null;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Check if a server-side auto-yes poller is active for a composite key.
|
|
147
|
-
*
|
|
148
|
-
* Issue #525: Changed from (worktreeId) to (compositeKey).
|
|
149
|
-
*
|
|
150
|
-
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
151
|
-
* @returns true if a poller is actively running
|
|
152
|
-
*/
|
|
153
|
-
function isPollerActive(compositeKey) {
|
|
154
|
-
return autoYesPollerStates.has(compositeKey);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Update the last server response timestamp.
|
|
158
|
-
*
|
|
159
|
-
* @param compositeKey - Composite key
|
|
160
|
-
* @param timestamp - Timestamp value (Date.now())
|
|
161
|
-
*/
|
|
162
|
-
function updateLastServerResponseTimestamp(compositeKey, timestamp, owner) {
|
|
163
|
-
const pollerState = ownedPollerState(compositeKey, owner);
|
|
164
|
-
if (pollerState) {
|
|
165
|
-
pollerState.lastServerResponseTimestamp = timestamp;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Reset error count for a poller and restore the default polling interval.
|
|
170
|
-
* Called after every poll that ran to the end without an error (Issue #3329)
|
|
171
|
-
* and after an answer is sent.
|
|
172
|
-
*
|
|
173
|
-
* @param compositeKey - Composite key
|
|
174
|
-
* @param owner - The tick's own poller state (Issue #3706); see {@link ownedPollerState}
|
|
175
|
-
*/
|
|
176
|
-
function resetErrorCount(compositeKey, owner) {
|
|
177
|
-
const pollerState = ownedPollerState(compositeKey, owner);
|
|
178
|
-
if (pollerState) {
|
|
179
|
-
pollerState.consecutiveErrors = 0;
|
|
180
|
-
pollerState.currentInterval = auto_yes_state_1.POLLING_INTERVAL_MS;
|
|
181
|
-
}
|
|
115
|
+
// Issue #3730: a test seam, not a shutdown — logged as such.
|
|
116
|
+
(0, auto_yes_poller_stop_reason_1.withPollerStopReason)('reset', () => stopAllAutoYesPolling());
|
|
117
|
+
auto_yes_poller_generation_1.autoYesPollerStates.clear();
|
|
118
|
+
auto_yes_poller_receipt_log_1.withheldNoReceiptLoggedAt.clear();
|
|
182
119
|
}
|
|
183
120
|
/**
|
|
184
121
|
* Increment error count and apply backoff if the threshold is exceeded.
|
|
@@ -188,7 +125,7 @@ function resetErrorCount(compositeKey, owner) {
|
|
|
188
125
|
* @param owner - The tick's own poller state (Issue #3706); see {@link ownedPollerState}
|
|
189
126
|
*/
|
|
190
127
|
function incrementErrorCount(compositeKey, owner) {
|
|
191
|
-
const pollerState = ownedPollerState(compositeKey, owner);
|
|
128
|
+
const pollerState = (0, auto_yes_poller_generation_1.ownedPollerState)(compositeKey, owner);
|
|
192
129
|
if (pollerState) {
|
|
193
130
|
pollerState.consecutiveErrors++;
|
|
194
131
|
pollerState.currentInterval = (0, auto_yes_state_1.calculateBackoffInterval)(pollerState.consecutiveErrors);
|
|
@@ -208,50 +145,10 @@ function incrementErrorCount(compositeKey, owner) {
|
|
|
208
145
|
// Issue #896: target the specific instance state (3-part keys carry instanceId).
|
|
209
146
|
(0, auto_yes_state_1.disableAutoYes)(worktreeId, cliToolId, 'consecutive_errors', (0, auto_yes_state_1.extractInstanceId)(compositeKey) ?? undefined);
|
|
210
147
|
}
|
|
211
|
-
stopAutoYesPolling(compositeKey);
|
|
148
|
+
stopAutoYesPolling(compositeKey, 'consecutive-errors');
|
|
212
149
|
}
|
|
213
150
|
}
|
|
214
151
|
}
|
|
215
|
-
/**
|
|
216
|
-
* The poller state under `compositeKey`, but only when it is `owner` — the
|
|
217
|
-
* tick's own (Issue #3706). Without `owner` (callers outside a tick, and tests
|
|
218
|
-
* driving `detectAndRespondToPrompt` with a hand-built state) it is the plain
|
|
219
|
-
* by-key read this always was.
|
|
220
|
-
*/
|
|
221
|
-
function ownedPollerState(compositeKey, owner) {
|
|
222
|
-
const pollerState = getPollerState(compositeKey);
|
|
223
|
-
if (owner !== undefined && pollerState !== owner)
|
|
224
|
-
return undefined;
|
|
225
|
-
return pollerState;
|
|
226
|
-
}
|
|
227
|
-
/** Is the tick's poller still the one under its key (not stopped, not replaced)? */
|
|
228
|
-
function isPollerCurrent(generation) {
|
|
229
|
-
return getPollerState(generation.compositeKey) === generation.pollerState;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* May the tick still act: its poller, its grant (the same enable, not expired)
|
|
233
|
-
* and its session (no relaunch since) are all still the ones it started under.
|
|
234
|
-
* Checked after capture, after each wait before a key, and inside the send.
|
|
235
|
-
*/
|
|
236
|
-
function isTickCurrent(generation) {
|
|
237
|
-
if (!isPollerCurrent(generation))
|
|
238
|
-
return false;
|
|
239
|
-
// `getAutoYesState` returns the stored object until it expires, when it
|
|
240
|
-
// stores (and returns) a disabled one — so an expiry fails identity too.
|
|
241
|
-
const grant = (0, auto_yes_state_1.getAutoYesState)(generation.worktreeId, generation.cliToolId, generation.instanceId);
|
|
242
|
-
if (grant !== generation.grant || !grant.enabled)
|
|
243
|
-
return false;
|
|
244
|
-
return isSameSession(generation);
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Is the session the tick answered still the one it started on (Issue #3706)?
|
|
248
|
-
* What the follow-ups of an answer already sent — the response poller restart,
|
|
249
|
-
* the terminal push — are judged by: a disable after the keys landed does not
|
|
250
|
-
* un-send them, a relaunch does make them about another process.
|
|
251
|
-
*/
|
|
252
|
-
function isSameSession(generation) {
|
|
253
|
-
return (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(generation.compositeKey) === generation.sessionEpoch;
|
|
254
|
-
}
|
|
255
152
|
/**
|
|
256
153
|
* End a tick that found its generation gone (Issue #3706). It changes nothing;
|
|
257
154
|
* it re-arms its timer only when its own poller is still the current one — a
|
|
@@ -263,25 +160,11 @@ function endStaleTick(generation) {
|
|
|
263
160
|
worktreeId: generation.worktreeId,
|
|
264
161
|
cliToolId: generation.cliToolId,
|
|
265
162
|
instanceId: generation.instanceId,
|
|
266
|
-
pollerCurrent: isPollerCurrent(generation),
|
|
163
|
+
pollerCurrent: (0, auto_yes_poller_generation_1.isPollerCurrent)(generation),
|
|
267
164
|
});
|
|
268
|
-
if (isPollerCurrent(generation))
|
|
165
|
+
if ((0, auto_yes_poller_generation_1.isPollerCurrent)(generation))
|
|
269
166
|
scheduleNextPoll(generation);
|
|
270
167
|
}
|
|
271
|
-
/**
|
|
272
|
-
* Check if the given prompt has already been answered recently.
|
|
273
|
-
*
|
|
274
|
-
* @param pollerState - Current poller state
|
|
275
|
-
* @param promptKey - Composite key of the current prompt
|
|
276
|
-
* @returns true if the prompt key matches and is within the retry expiry window
|
|
277
|
-
*/
|
|
278
|
-
function isDuplicatePrompt(pollerState, promptKey) {
|
|
279
|
-
if (pollerState.lastAnsweredPromptKey !== promptKey)
|
|
280
|
-
return false;
|
|
281
|
-
if (pollerState.lastAnsweredAt === null)
|
|
282
|
-
return false;
|
|
283
|
-
return (Date.now() - pollerState.lastAnsweredAt) < auto_yes_state_1.DUPLICATE_RETRY_EXPIRY_MS;
|
|
284
|
-
}
|
|
285
168
|
// =============================================================================
|
|
286
169
|
// Extracted Functions for pollAutoYes (Issue #323: SRP decomposition)
|
|
287
170
|
// =============================================================================
|
|
@@ -302,50 +185,22 @@ function validatePollingContext(compositeKey, pollerState) {
|
|
|
302
185
|
const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
|
|
303
186
|
const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
|
|
304
187
|
if (!cliToolId) {
|
|
305
|
-
stopAutoYesPolling(compositeKey);
|
|
188
|
+
stopAutoYesPolling(compositeKey, 'invalid-key');
|
|
306
189
|
return 'expired';
|
|
307
190
|
}
|
|
308
191
|
// Issue #896: resolve instanceId so per-instance enabled state is checked.
|
|
309
192
|
const instanceId = (0, auto_yes_state_1.extractInstanceId)(compositeKey) ?? undefined;
|
|
310
193
|
const autoYesState = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
311
194
|
if (!autoYesState?.enabled) {
|
|
312
|
-
|
|
195
|
+
// Issue #3730: the return value says 'expired' for every one of these (its
|
|
196
|
+
// callers only need "stop"), but the log says which it was — the getter
|
|
197
|
+
// has just turned a past deadline into `stopReason: 'expired'`, and
|
|
198
|
+
// anything else is a grant some other path disabled or removed.
|
|
199
|
+
stopAutoYesPolling(compositeKey, autoYesState?.stopReason === 'expired' ? 'expired' : 'not-enabled');
|
|
313
200
|
return 'expired';
|
|
314
201
|
}
|
|
315
202
|
return 'valid';
|
|
316
203
|
}
|
|
317
|
-
/**
|
|
318
|
-
* Capture tmux session output once, keeping both spellings (Issue #2522).
|
|
319
|
-
*
|
|
320
|
-
* @internal Exported for testing purposes only.
|
|
321
|
-
* @param worktreeId - Worktree identifier
|
|
322
|
-
* @param cliToolId - CLI tool type being polled
|
|
323
|
-
* @param captureLines - Optional number of lines to capture
|
|
324
|
-
* @param instanceId - Optional agent instance ID (Issue #896; defaults to primary session)
|
|
325
|
-
* @returns The tick's raw capture and its cleaned form
|
|
326
|
-
*/
|
|
327
|
-
async function capturePollerFrame(worktreeId, cliToolId, captureLines, instanceId) {
|
|
328
|
-
const lines = captureLines ?? auto_yes_config_1.FULL_CAPTURE_LINES;
|
|
329
|
-
const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, lines, instanceId);
|
|
330
|
-
return { raw: output, clean: (0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(output)) };
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Capture tmux session output and strip ANSI escape codes.
|
|
334
|
-
*
|
|
335
|
-
* Kept as the cleaned half of {@link capturePollerFrame} so the many callers and
|
|
336
|
-
* tests that only ever wanted that string are untouched; `pollAutoYes` takes the
|
|
337
|
-
* pair. `stripBoxDrawing` still runs exactly once per capture either way.
|
|
338
|
-
*
|
|
339
|
-
* @internal Exported for testing purposes only.
|
|
340
|
-
* @param worktreeId - Worktree identifier
|
|
341
|
-
* @param cliToolId - CLI tool type being polled
|
|
342
|
-
* @param captureLines - Optional number of lines to capture
|
|
343
|
-
* @param instanceId - Optional agent instance ID (Issue #896; defaults to primary session)
|
|
344
|
-
* @returns Cleaned output string (ANSI stripped)
|
|
345
|
-
*/
|
|
346
|
-
async function captureAndCleanOutput(worktreeId, cliToolId, captureLines, instanceId) {
|
|
347
|
-
return (await capturePollerFrame(worktreeId, cliToolId, captureLines, instanceId)).clean;
|
|
348
|
-
}
|
|
349
204
|
/**
|
|
350
205
|
* Process stop condition check using delta-based approach.
|
|
351
206
|
*
|
|
@@ -366,62 +221,13 @@ function processStopConditionDelta(compositeKey, pollerState, cleanOutput) {
|
|
|
366
221
|
if (cleanOutput.length > baseline) {
|
|
367
222
|
const newContent = cleanOutput.substring(baseline);
|
|
368
223
|
pollerState.stopCheckBaselineLength = cleanOutput.length;
|
|
369
|
-
return (0, auto_yes_state_1.checkStopCondition)(compositeKey, newContent, stopAutoYesPolling);
|
|
224
|
+
return (0, auto_yes_state_1.checkStopCondition)(compositeKey, newContent, (key) => stopAutoYesPolling(key, 'stop-pattern'));
|
|
370
225
|
}
|
|
371
226
|
else if (cleanOutput.length < baseline) {
|
|
372
227
|
pollerState.stopCheckBaselineLength = cleanOutput.length;
|
|
373
228
|
}
|
|
374
229
|
return false;
|
|
375
230
|
}
|
|
376
|
-
/**
|
|
377
|
-
* Say, once a minute, that Auto-Yes left an agy dialog alone for want of a hook
|
|
378
|
-
* receipt (Issue #2857).
|
|
379
|
-
*
|
|
380
|
-
* `detectPromptOnCleanFrame` hands a frame the receipt gate (#2849) withholds
|
|
381
|
-
* back as an ordinary `isPrompt: false`, so the poller cannot tell "no dialog on
|
|
382
|
-
* the pane" from "a dialog agy never asked us about" by looking at the result.
|
|
383
|
-
* The gate is the ONLY thing `receiptScope` changes, so the same frame read
|
|
384
|
-
* without it answering a prompt is exactly the withheld case. That second
|
|
385
|
-
* reading is taken only after the cheap tests: no receipt for this instance in
|
|
386
|
-
* the window (with one, the gate let the frame through and a no-prompt result is
|
|
387
|
-
* a real one) and no line for it in the last minute.
|
|
388
|
-
*
|
|
389
|
-
* Why it is worth a line: a machine whose `~/.gemini/config/hooks.json` points at
|
|
390
|
-
* another server (#2622) never sends us the question, and every real dialog then
|
|
391
|
-
* waits for a human with no sign of why. The line names the file to look at.
|
|
392
|
-
* The response-checker's own `antigravity-dialog-no-recent-receipt` stays at
|
|
393
|
-
* debug — it prints on every tick the same pane is read again.
|
|
394
|
-
*
|
|
395
|
-
* @param compositeKey - The instance's key, for the once-a-minute limit
|
|
396
|
-
* @param readWithoutGate - The same frame read without `receiptScope`
|
|
397
|
-
*/
|
|
398
|
-
function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, readWithoutGate) {
|
|
399
|
-
if ((0, antigravity_permission_receipts_1.hasRecentAntigravityPermissionReceipt)(worktreeId, 'antigravity', instanceId))
|
|
400
|
-
return;
|
|
401
|
-
const now = Date.now();
|
|
402
|
-
const lastLoggedAt = withheldNoReceiptLoggedAt.get(compositeKey);
|
|
403
|
-
if (lastLoggedAt !== undefined && now - lastLoggedAt < WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS)
|
|
404
|
-
return;
|
|
405
|
-
const ungated = readWithoutGate();
|
|
406
|
-
if (!ungated.isPrompt || !ungated.promptData)
|
|
407
|
-
return;
|
|
408
|
-
for (const [key, loggedAt] of withheldNoReceiptLoggedAt) {
|
|
409
|
-
if (now - loggedAt >= WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS)
|
|
410
|
-
withheldNoReceiptLoggedAt.delete(key);
|
|
411
|
-
}
|
|
412
|
-
withheldNoReceiptLoggedAt.set(compositeKey, now);
|
|
413
|
-
logger.info('antigravity-autoyes-withheld-no-hook-receipt', {
|
|
414
|
-
worktreeId,
|
|
415
|
-
instanceId: instanceId ?? 'antigravity',
|
|
416
|
-
windowMs: antigravity_permission_receipts_1.ANTIGRAVITY_PERMISSION_RECEIPT_WINDOW_MS,
|
|
417
|
-
hint: 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認',
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* The audit row's `answer` for the Enter (Issue #3397): not a digit, so the
|
|
422
|
-
* History reads as "Auto-Yes pressed Enter" rather than as a chosen option.
|
|
423
|
-
*/
|
|
424
|
-
exports.AUTO_YES_ENTER_FALLBACK_ANSWER = '[Enter]';
|
|
425
231
|
/**
|
|
426
232
|
* Issue #3397: is the fresh capture still the screen the Enter was decided for?
|
|
427
233
|
* Re-reads it the way one tick does — prompt reading, the same `promptFrameKey`,
|
|
@@ -497,19 +303,20 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
497
303
|
});
|
|
498
304
|
return false;
|
|
499
305
|
}
|
|
500
|
-
// 3. The contract policy, as step 4 reads it.
|
|
306
|
+
// 3. The contract policy, as step 4 reads it (Issue #3822: a failed lookup withholds).
|
|
501
307
|
const policy = (0, auto_yes_policy_1.getSessionAutoYesPolicy)(worktreeId, cliToolId, instanceId);
|
|
502
308
|
const resolution = (0, auto_yes_resolver_1.resolveAutoAnswerWithPolicy)(promptData, policy);
|
|
503
309
|
if (resolution.suppressedBy) {
|
|
504
310
|
pollerState.enterFallbackCandidateKey = null;
|
|
311
|
+
const mode = (0, auto_yes_resolver_1.policyLookupMode)(policy);
|
|
505
312
|
(0, auto_yes_prompt_suppression_1.suppressAndWarnOnce)(prompt, {
|
|
506
313
|
reason: resolution.suppressedBy,
|
|
507
|
-
mode
|
|
314
|
+
mode,
|
|
508
315
|
promptType: promptData.type,
|
|
509
316
|
pattern: resolution.pattern,
|
|
510
|
-
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${
|
|
317
|
+
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
511
318
|
reason: resolution.suppressedBy,
|
|
512
|
-
mode
|
|
319
|
+
mode,
|
|
513
320
|
pattern: resolution.pattern,
|
|
514
321
|
promptType: promptData.type,
|
|
515
322
|
enterFallback: true,
|
|
@@ -544,9 +351,11 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
544
351
|
// 5. Never another server's session (Issue #2865).
|
|
545
352
|
const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
|
|
546
353
|
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName);
|
|
547
|
-
if (generation !== undefined && !isTickCurrent(generation))
|
|
354
|
+
if (generation !== undefined && !(0, auto_yes_poller_generation_1.isTickCurrent)(generation))
|
|
548
355
|
return false;
|
|
549
356
|
if (ownership === null || ownership.verdict === 'foreign') {
|
|
357
|
+
// Issue #3820: the ledger's own reason, as `skippedForUnownedSession` records it.
|
|
358
|
+
(0, auto_yes_confirmation_ledger_1.withholdLedgerConfirmation)(prompt, 'foreign-session');
|
|
550
359
|
(0, auto_yes_poller_state_1.warnOncePerFrame)(pollerState, `${frameKey}\u0000${sessionName}\u0000${ownership ? 'foreign' : 'worktree_not_found'}`, 'poller:auto-yes-skipped-foreign-session', {
|
|
551
360
|
worktreeId,
|
|
552
361
|
cliToolId,
|
|
@@ -565,7 +374,7 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
565
374
|
// has the box back. Everything that decided the Enter is judged again on the
|
|
566
375
|
// fresh frame; any difference sends nothing, and the next tick starts over.
|
|
567
376
|
const fresh = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, (rawOutput ?? '').split('\n').length, instanceId);
|
|
568
|
-
if (generation !== undefined && !isTickCurrent(generation))
|
|
377
|
+
if (generation !== undefined && !(0, auto_yes_poller_generation_1.isTickCurrent)(generation))
|
|
569
378
|
return false;
|
|
570
379
|
if (!isStillEnterFallbackScreen(prompt, fresh)) {
|
|
571
380
|
pollerState.enterFallbackCandidateKey = null;
|
|
@@ -577,17 +386,29 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
577
386
|
});
|
|
578
387
|
return false;
|
|
579
388
|
}
|
|
389
|
+
const receiptEpisode = (0, auto_yes_poller_receipt_log_1.receiptEpisodeOfSend)(cliToolId, worktreeId, instanceId);
|
|
390
|
+
// Issue #3820: taken before the await, so the result goes to this confirmation.
|
|
391
|
+
const ledgerAttempt = (0, auto_yes_confirmation_ledger_1.beginLedgerAttempt)(prompt, 'enter-fallback');
|
|
580
392
|
try {
|
|
581
393
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
582
394
|
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
// Issue #3796: the Enter may or may not have reached the pane.
|
|
397
|
+
(0, auto_yes_poller_receipt_log_1.noteAnswerSent)(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
398
|
+
(0, auto_yes_confirmation_ledger_1.settleLedgerAttempt)(ledgerAttempt, 'failed');
|
|
399
|
+
throw error;
|
|
400
|
+
}
|
|
583
401
|
finally {
|
|
584
402
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
585
403
|
}
|
|
404
|
+
// Issue #3796 review E: the Enter is out — for the episode it began for only.
|
|
405
|
+
(0, auto_yes_poller_receipt_log_1.noteAnswerSent)(cliToolId, worktreeId, instanceId, false, receiptEpisode);
|
|
406
|
+
(0, auto_yes_confirmation_ledger_1.settleLedgerAttempt)(ledgerAttempt, 'ok');
|
|
586
407
|
// Issue #3706: the Enter is out, but the per-screen record is the CURRENT
|
|
587
408
|
// session's: when the poller was stopped (the record was forgotten with it)
|
|
588
409
|
// or a new session began while `send-keys` was awaited, the return of this
|
|
589
410
|
// send must not put the record back. The audit row below is kept either way.
|
|
590
|
-
if (generation === undefined || (isPollerCurrent(generation) && isSameSession(generation))) {
|
|
411
|
+
if (generation === undefined || ((0, auto_yes_poller_generation_1.isPollerCurrent)(generation) && (0, auto_yes_poller_generation_1.isSameSession)(generation))) {
|
|
591
412
|
pollerState.enterFallbackSentKey = frameKey;
|
|
592
413
|
pollerState.enterFallbackCandidateKey = null;
|
|
593
414
|
(0, auto_yes_enter_fallback_1.recordEnterFallbackSent)(worktreeId, cliToolId, instanceId, {
|
|
@@ -605,7 +426,7 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
605
426
|
refusalReason: judgement.refusalReason,
|
|
606
427
|
composerState: judgement.composerState,
|
|
607
428
|
});
|
|
608
|
-
await finishAnsweredPrompt(prompt, promptDetection,
|
|
429
|
+
await finishAnsweredPrompt(prompt, promptDetection, auto_yes_poller_enter_fallback_1.AUTO_YES_ENTER_FALLBACK_ANSWER, generation);
|
|
609
430
|
return true;
|
|
610
431
|
}
|
|
611
432
|
/**
|
|
@@ -633,17 +454,29 @@ async function finishAnsweredPrompt(prompt, promptDetection, answer, generation)
|
|
|
633
454
|
// process's identical question), not the poller's response time, not the
|
|
634
455
|
// task event (the task looked up now may be the new session's). Only the
|
|
635
456
|
// audit row is, and it may not adopt a pending row saved after the tick began.
|
|
636
|
-
const sameSession = generation === undefined || isSameSession(generation);
|
|
457
|
+
const sameSession = generation === undefined || (0, auto_yes_poller_generation_1.isSameSession)(generation);
|
|
637
458
|
if (sameSession) {
|
|
638
459
|
// 6. Update timestamp and reset error count
|
|
639
|
-
updateLastServerResponseTimestamp(compositeKey, Date.now(), generation?.pollerState);
|
|
640
|
-
resetErrorCount(compositeKey, generation?.pollerState);
|
|
460
|
+
(0, auto_yes_poller_generation_1.updateLastServerResponseTimestamp)(compositeKey, Date.now(), generation?.pollerState);
|
|
461
|
+
(0, auto_yes_poller_generation_1.resetErrorCount)(compositeKey, generation?.pollerState);
|
|
641
462
|
// 7. Record answered prompt key and timestamp
|
|
642
463
|
pollerState.lastAnsweredPromptKey = promptKey;
|
|
643
464
|
pollerState.lastAnsweredAt = Date.now();
|
|
644
465
|
pollerState.lastSkipWarnKey = null;
|
|
645
466
|
}
|
|
646
|
-
|
|
467
|
+
// Issue #3748: what was answered and with what — the question (cut to
|
|
468
|
+
// MAX_LOGGED_QUESTION_LENGTH, never the full text) and the answer sent (the
|
|
469
|
+
// option number, `y`, or `[Enter]`) — so an answer that should not have been
|
|
470
|
+
// given can be told from the log alone.
|
|
471
|
+
logger.info('poller:response-sent', {
|
|
472
|
+
worktreeId,
|
|
473
|
+
cliToolId,
|
|
474
|
+
instanceId,
|
|
475
|
+
sameSession,
|
|
476
|
+
promptType: promptData.type,
|
|
477
|
+
question: (0, auto_yes_prompt_suppression_1.truncateForLog)(promptData.question),
|
|
478
|
+
answer,
|
|
479
|
+
});
|
|
647
480
|
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
648
481
|
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
649
482
|
// answer. No-ops when this instance is not running a contract.
|
|
@@ -700,11 +533,152 @@ async function finishAnsweredPrompt(prompt, promptDetection, answer, generation)
|
|
|
700
533
|
]);
|
|
701
534
|
// Re-read after the await, not the `sameSession` taken before the audit: a
|
|
702
535
|
// relaunch while the modules loaded makes the restart about the new process.
|
|
703
|
-
if (!sameSession || (generation !== undefined && !isSameSession(generation)))
|
|
536
|
+
if (!sameSession || (generation !== undefined && !(0, auto_yes_poller_generation_1.isSameSession)(generation)))
|
|
704
537
|
return;
|
|
705
538
|
startResponsePolling(worktreeId, cliToolId, instanceId);
|
|
706
539
|
void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
|
|
707
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* Step 1 of `detectAndRespondToPrompt`: normalise the tick's frame once and
|
|
543
|
+
* read the prompt on it.
|
|
544
|
+
*/
|
|
545
|
+
function readPromptFrame(worktreeId, cliToolId, cleanOutput, precomputedLines, instanceId, rawOutput) {
|
|
546
|
+
const receiptScope = { worktreeId, instanceId };
|
|
547
|
+
// Issue #3183: the ONE frame every judgement below reads — normalised once,
|
|
548
|
+
// from the capture as captured (the input-box markers are rule rows the
|
|
549
|
+
// cleaned spelling has blanked), and handed as the same object to the
|
|
550
|
+
// prompt reading, the codex launch guards and the dialog gate. That is what
|
|
551
|
+
// makes "the status chain and Auto-Yes read the same live region" a fact
|
|
552
|
+
// rather than a hope: there is no second normalisation to disagree with.
|
|
553
|
+
const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
|
|
554
|
+
// Issue #3767: bracket the read so the receipt gate can tell when an agy
|
|
555
|
+
// dialog first appeared, not only what time this tick is.
|
|
556
|
+
if (cliToolId === 'antigravity')
|
|
557
|
+
(0, antigravity_receipt_episodes_1.beginAntigravityFrameRead)(worktreeId, instanceId);
|
|
558
|
+
const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
|
|
559
|
+
if (cliToolId === 'antigravity')
|
|
560
|
+
(0, antigravity_receipt_episodes_1.endAntigravityFrameRead)(worktreeId, instanceId);
|
|
561
|
+
return { frame, promptDetection };
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* What `detectAndRespondToPrompt` does to the poller state on a frame with no
|
|
565
|
+
* prompt to answer, before it returns `no_prompt`.
|
|
566
|
+
*/
|
|
567
|
+
function noteNoPromptOnScreen(tick) {
|
|
568
|
+
const { worktreeId, cliToolId, instanceId, compositeKey, pollerState, frame, promptDetection, cleanOutput, precomputedLines, rawOutput, } = tick;
|
|
569
|
+
(0, auto_yes_poller_state_1.forgetPartialAnswer)(compositeKey);
|
|
570
|
+
pollerState.lastAnsweredPromptKey = null;
|
|
571
|
+
pollerState.lastAnsweredAt = null;
|
|
572
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
573
|
+
// Issue #3757: agy's trust screen reads as no prompt (unnumbered: neither
|
|
574
|
+
// reader takes it), but it is one nobody here answers — record why, still
|
|
575
|
+
// as `no_prompt`. Before the warn key is cleared, so the WARN stays once
|
|
576
|
+
// per screen.
|
|
577
|
+
// Issue #3820: the trust screen records itself in the ledger when it records
|
|
578
|
+
// its reason (`suppressAntigravityTrustScreen`).
|
|
579
|
+
if (cliToolId === 'antigravity' &&
|
|
580
|
+
(0, auto_yes_prompt_suppression_1.suppressAntigravityTrustScreen)(worktreeId, instanceId, pollerState, frame, manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId))) {
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
pollerState.lastSkipWarnKey = null;
|
|
584
|
+
if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
|
|
585
|
+
const seen = (0, auto_yes_poller_receipt_log_1.logIfWithheldForWantOfReceipt)(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
|
|
586
|
+
// Issue #3820: past the receipt window the gated reading says "no prompt"
|
|
587
|
+
// while the dialog is still up. The ungated reading says it is, so the
|
|
588
|
+
// ledger keeps the same confirmation (and the same withheld interval)
|
|
589
|
+
// rather than closing it on every tick outside the window.
|
|
590
|
+
if (seen !== null) {
|
|
591
|
+
const scope = { compositeKey, worktreeId, cliToolId, instanceId };
|
|
592
|
+
(0, auto_yes_confirmation_ledger_1.observeLedgerScreen)(scope, (0, auto_yes_poller_state_1.ledgerScreenKey)(seen.promptData), seen.promptData.type, ledgerCallOf(cliToolId, worktreeId, instanceId));
|
|
593
|
+
if (seen.reason !== null)
|
|
594
|
+
(0, auto_yes_confirmation_ledger_1.withholdLedgerConfirmation)(scope, seen.reason);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Issue #3820 (design §2.4, PR 3): the agy call the receipt episode on screen
|
|
600
|
+
* was accepted for, for the ledger to tie the confirmation to. Asked after the
|
|
601
|
+
* frame was judged; read only to record, and never throws.
|
|
602
|
+
*/
|
|
603
|
+
function ledgerCallOf(cliToolId, worktreeId, instanceId) {
|
|
604
|
+
if (cliToolId !== 'antigravity')
|
|
605
|
+
return {};
|
|
606
|
+
try {
|
|
607
|
+
const callId = (0, antigravity_receipt_episodes_1.getAntigravityAcceptedReceiptCallId)(worktreeId, instanceId);
|
|
608
|
+
return callId === null ? {} : { callId };
|
|
609
|
+
}
|
|
610
|
+
catch {
|
|
611
|
+
// Recording only: a failure here ties nothing and changes nothing else.
|
|
612
|
+
return {};
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Issue #3820: the result of a send that threw, as the ledger counts it.
|
|
617
|
+
* `keysSent` is what the sender said (#3706); a throw that says nothing is a
|
|
618
|
+
* failure whose keys may or may not be on the pane.
|
|
619
|
+
*/
|
|
620
|
+
function attemptResultOfThrow(keysSent) {
|
|
621
|
+
if (keysSent === true)
|
|
622
|
+
return 'partial';
|
|
623
|
+
if (keysSent === false)
|
|
624
|
+
return 'no-keys-sent';
|
|
625
|
+
return 'failed';
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Issue #3820: the evidence an answer on the screen path is given on (design
|
|
629
|
+
* §7 PR 1). A tool's own dialog detector vouched for the frame: `L3`. The
|
|
630
|
+
* gate did not judge it (a `legacy` tool, a non-multiple-choice prompt): the
|
|
631
|
+
* generic reading alone, `L4`.
|
|
632
|
+
*
|
|
633
|
+
* agy's gate is `legacy` (`gated: false`), yet its prompts are read by its own
|
|
634
|
+
* reader first (`detectPromptOnCleanFrame` returns that reader's result
|
|
635
|
+
* whenever it reads the frame). Which reader it was is not on the detection
|
|
636
|
+
* result, so it is asked of the same reader on the same text here — for the
|
|
637
|
+
* label only; the answer was decided before this is called. Read by agy's own
|
|
638
|
+
* reader, and through the receipt gate (the tick's reading carried the
|
|
639
|
+
* receipt scope): `L3`, with `receiptAccepted` on the attempt.
|
|
640
|
+
*/
|
|
641
|
+
function answerBasisOf(prompt, cleanOutput) {
|
|
642
|
+
if (prompt.cliToolId === 'antigravity') {
|
|
643
|
+
return (0, dialog_1.detectAntigravityNumberedDialogPrompt)(cleanOutput) !== null ? 'L3' : 'L4';
|
|
644
|
+
}
|
|
645
|
+
const gate = prompt.dialogGate;
|
|
646
|
+
return gate !== undefined && gate.gated && gate.allowed && gate.dialog !== null ? 'L3' : 'L4';
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* The `catch` of `detectAndRespondToPrompt`: settles the send in flight and
|
|
650
|
+
* tells an abandoned tick from a failed one.
|
|
651
|
+
*/
|
|
652
|
+
function settleFailedTick(error, tick) {
|
|
653
|
+
const { worktreeId, cliToolId, instanceId, compositeKey, generation, attempt, sendInFlight, receiptEpisode } = tick;
|
|
654
|
+
const keysSent = error instanceof Error && 'keysSent' in error ? Boolean(error.keysSent) : null;
|
|
655
|
+
// Issue #3820: the send that was cut short, in the ledger — before the send
|
|
656
|
+
// record below is settled, whose state says whether it had expired.
|
|
657
|
+
if (attempt !== null && sendInFlight) {
|
|
658
|
+
(0, auto_yes_confirmation_ledger_1.settleLedgerAttempt)(attempt.ledger, attemptResultOfThrow(keysSent), { expired: attempt.state === 'expired' });
|
|
659
|
+
}
|
|
660
|
+
// Issue #3706: a tick that lost its generation — the send stopped part-way
|
|
661
|
+
// (`PromptAnswerAbortedError`), or failed after the grant went — is not a
|
|
662
|
+
// failure of the poller that now holds the key, and not an answer either.
|
|
663
|
+
if (generation !== undefined && !(0, auto_yes_poller_generation_1.isTickCurrent)(generation)) {
|
|
664
|
+
// A stop with keys already on the pane: the next tick must not type the
|
|
665
|
+
// answer again over them (step 2.5). Recorded under the attempt's key as
|
|
666
|
+
// it is now — the new one when a worktree ID move carried it (#3713).
|
|
667
|
+
if (attempt !== null)
|
|
668
|
+
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, keysSent === true);
|
|
669
|
+
if (sendInFlight)
|
|
670
|
+
(0, auto_yes_poller_receipt_log_1.noteAnswerSent)(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
671
|
+
logger.info('poller:auto-yes-answer-abandoned', { worktreeId, cliToolId, instanceId, keysSent });
|
|
672
|
+
return 'no_answer';
|
|
673
|
+
}
|
|
674
|
+
if (attempt !== null)
|
|
675
|
+
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, false);
|
|
676
|
+
if (sendInFlight)
|
|
677
|
+
(0, auto_yes_poller_receipt_log_1.noteAnswerSent)(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
678
|
+
incrementErrorCount(compositeKey, generation?.pollerState);
|
|
679
|
+
logger.warn('poller:detect-respond-error', { worktreeId, cliToolId, instanceId });
|
|
680
|
+
return 'error';
|
|
681
|
+
}
|
|
708
682
|
/**
|
|
709
683
|
* Detect prompt in terminal output, resolve auto-answer, and send response.
|
|
710
684
|
*
|
|
@@ -730,6 +704,14 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
730
704
|
// Issue #3706 / #3713: the send in flight, settled without an await once it
|
|
731
705
|
// comes back — as a partial answer when it was stopped with keys on the pane.
|
|
732
706
|
let attempt = null;
|
|
707
|
+
// Issue #3796: `sendPromptAnswer` began and has not returned — a throw now cut
|
|
708
|
+
// the send short, and the agy receipt gate is told so (`noteAnswerSent`).
|
|
709
|
+
let sendInFlight = false;
|
|
710
|
+
let receiptEpisode = null;
|
|
711
|
+
// Issue #3820: the ledger's tick. A tick that read the screen and saw no
|
|
712
|
+
// confirmation closes the open one as gone when it ends (`endLedgerTick`).
|
|
713
|
+
const ledgerScope = { compositeKey, worktreeId, cliToolId, instanceId };
|
|
714
|
+
const ledgerTick = (0, auto_yes_confirmation_ledger_1.beginLedgerTick)(ledgerScope);
|
|
733
715
|
try {
|
|
734
716
|
// 1. Detect prompt.
|
|
735
717
|
//
|
|
@@ -770,38 +752,38 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
770
752
|
// machine whose hook does not reach us. The price is that Auto-Yes leaves
|
|
771
753
|
// such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
|
|
772
754
|
// says so.
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
const epoch = (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(compositeKey);
|
|
776
|
-
if ((pollerState.enterFallbackEpoch ?? 0) !== epoch) {
|
|
777
|
-
pollerState.enterFallbackSentKey = null;
|
|
778
|
-
pollerState.enterFallbackCandidateKey = null;
|
|
779
|
-
pollerState.enterFallbackEpoch = epoch;
|
|
780
|
-
}
|
|
781
|
-
const receiptScope = { worktreeId, instanceId };
|
|
782
|
-
// Issue #3183: the ONE frame every judgement below reads — normalised once,
|
|
783
|
-
// from the capture as captured (the input-box markers are rule rows the
|
|
784
|
-
// cleaned spelling has blanked), and handed as the same object to the
|
|
785
|
-
// prompt reading, the codex launch guards and the dialog gate. That is what
|
|
786
|
-
// makes "the status chain and Auto-Yes read the same live region" a fact
|
|
787
|
-
// rather than a hope: there is no second normalisation to disagree with.
|
|
788
|
-
const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
|
|
789
|
-
const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
|
|
755
|
+
const epoch = (0, auto_yes_poller_enter_fallback_1.syncEnterFallbackEpoch)(compositeKey, pollerState);
|
|
756
|
+
const { frame, promptDetection } = readPromptFrame(worktreeId, cliToolId, cleanOutput, precomputedLines, instanceId, rawOutput);
|
|
790
757
|
if (!promptDetection.isPrompt || !promptDetection.promptData) {
|
|
791
|
-
(
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
758
|
+
noteNoPromptOnScreen({
|
|
759
|
+
worktreeId,
|
|
760
|
+
cliToolId,
|
|
761
|
+
instanceId,
|
|
762
|
+
compositeKey,
|
|
763
|
+
pollerState,
|
|
764
|
+
frame,
|
|
765
|
+
promptDetection,
|
|
766
|
+
cleanOutput,
|
|
767
|
+
precomputedLines,
|
|
768
|
+
rawOutput,
|
|
769
|
+
});
|
|
799
770
|
return 'no_prompt';
|
|
800
771
|
}
|
|
772
|
+
// Issue #3820: computed here, before the duplicate check, so the ledger
|
|
773
|
+
// sees the confirmation on every tick it is on screen (step 2.5 below
|
|
774
|
+
// reads the same key).
|
|
775
|
+
// The ledger's own key keeps the body (`ledgerScreenKey`): two commands
|
|
776
|
+
// that differ by a `>` or an indent are two confirmations to count.
|
|
777
|
+
const screenKey = (0, auto_yes_poller_state_1.partialAnswerScreenKey)(promptDetection.promptData);
|
|
778
|
+
// agy (PR 3): tied to the call the receipt that let it through asked about.
|
|
779
|
+
(0, auto_yes_confirmation_ledger_1.observeLedgerScreen)(ledgerScope, (0, auto_yes_poller_state_1.ledgerScreenKey)(promptDetection.promptData), promptDetection.promptData.type, ledgerCallOf(cliToolId, worktreeId, instanceId));
|
|
801
780
|
// 2. Check for duplicate prompt (Issue #306)
|
|
802
781
|
const promptKey = (0, prompt_key_1.generatePromptKey)(promptDetection.promptData);
|
|
803
782
|
const frameKey = (0, auto_yes_poller_state_1.promptFrameKey)(promptDetection.promptData);
|
|
804
|
-
if (isDuplicatePrompt(pollerState, promptKey)) {
|
|
783
|
+
if ((0, auto_yes_poller_generation_1.isDuplicatePrompt)(pollerState, promptKey)) {
|
|
784
|
+
// Issue #3820: not answered on this tick either — an interval of its own
|
|
785
|
+
// reason, so the count can tell the wait for an answer to land apart.
|
|
786
|
+
(0, auto_yes_confirmation_ledger_1.withholdLedgerConfirmation)(ledgerScope, 'answered-recently');
|
|
805
787
|
return 'duplicate';
|
|
806
788
|
}
|
|
807
789
|
const judged = {
|
|
@@ -822,27 +804,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
822
804
|
// (`partialAnswerScreenKey`: options and approvalTarget count, the cursor
|
|
823
805
|
// does not), or the session is relaunched. Recorded as a suppression, so
|
|
824
806
|
// the prompt Push and `cmate wait` see "withheld", not "answering".
|
|
825
|
-
|
|
826
|
-
const partial = (0, auto_yes_poller_state_1.getPartialAnswer)(compositeKey, epoch);
|
|
827
|
-
if (partial !== null) {
|
|
828
|
-
if (partial.screenKey === screenKey) {
|
|
829
|
-
(0, auto_yes_prompt_suppression_1.suppressAndWarnOnce)(judged, {
|
|
830
|
-
reason: auto_yes_suppression_reason_1.PARTIAL_ANSWER_SUPPRESSION_REASON,
|
|
831
|
-
mode: null,
|
|
832
|
-
promptType: promptDetection.promptData.type,
|
|
833
|
-
}, `${frameKey}\u0000partial-answer`, 'poller:auto-yes-skipped-partial-answer', { promptType: promptDetection.promptData.type, stoppedAt: partial.at });
|
|
834
|
-
return 'no_answer';
|
|
835
|
-
}
|
|
836
|
-
// Another prompt is on screen: only the sends at the forgotten one's
|
|
837
|
-
// screen go with it (#3713) — one in flight at this screen keeps its hold.
|
|
838
|
-
(0, auto_yes_poller_state_1.forgetPartialAnswer)(compositeKey, partial.screenKey);
|
|
839
|
-
}
|
|
840
|
-
// Issue #3713: a worktree ID move carried an answer still being sent to
|
|
841
|
-
// this session's key. Its keys may already be on the pane, and how its send
|
|
842
|
-
// ends is not known yet — so this screen gets no keys until it comes back
|
|
843
|
-
// (recorded as a partial answer above, or gone).
|
|
844
|
-
if ((0, auto_yes_poller_state_1.hasMovedSendInFlight)(compositeKey, epoch, screenKey)) {
|
|
845
|
-
(0, auto_yes_poller_state_1.warnOncePerFrame)(pollerState, `${frameKey}\u0000moved-send-in-flight`, 'poller:auto-yes-skipped-moved-send-in-flight', { worktreeId, cliToolId, instanceId, promptType: promptDetection.promptData.type });
|
|
807
|
+
if ((0, auto_yes_poller_steps_1.withheldForEarlierSend)(judged, screenKey, epoch)) {
|
|
846
808
|
return 'no_answer';
|
|
847
809
|
}
|
|
848
810
|
// 3., 3.2., 3.5. Frames that are not Auto-Yes's to answer: see
|
|
@@ -857,9 +819,10 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
857
819
|
// 3.6. Issue #3397: a refused frame may be a choice screen CommandMate
|
|
858
820
|
// cannot read; with Auto-Yes on it gets one Enter. See `tryEnterFallback`.
|
|
859
821
|
if (notOurs.kind === 'dialog-gate-refused') {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
822
|
+
if (!(await tryEnterFallback(judged, promptDetection, notOurs.dialogGate, rawOutput, generation))) {
|
|
823
|
+
return 'no_answer';
|
|
824
|
+
}
|
|
825
|
+
return 'responded';
|
|
863
826
|
}
|
|
864
827
|
// 4. Resolve auto answer under the execution contract's policy (Issue #1547).
|
|
865
828
|
// Auto-Yes reads the frame itself instead of going through status-detector
|
|
@@ -867,25 +830,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
867
830
|
// auto-answer: a prompt the policy withholds is left for a human, and the
|
|
868
831
|
// response poller's prompt path (WS broadcast + Web Push, see
|
|
869
832
|
// polling/response-checker.ts) is what tells them it is waiting.
|
|
870
|
-
const
|
|
871
|
-
const resolution = (0, auto_yes_resolver_1.resolveAutoAnswerWithPolicy)(promptDetection.promptData, policy);
|
|
872
|
-
if (resolution.suppressedBy) {
|
|
873
|
-
// Issue #1684: the log line alone leaves a CLI-driven pipeline blind to
|
|
874
|
-
// why its worker stalled. Record the suppression so buildCurrentOutput
|
|
875
|
-
// can publish it (`autoYes.lastSuppression` in capture --json).
|
|
876
|
-
(0, auto_yes_prompt_suppression_1.suppressAndWarnOnce)(judged, {
|
|
877
|
-
reason: resolution.suppressedBy,
|
|
878
|
-
mode: policy?.mode ?? null,
|
|
879
|
-
promptType: promptDetection.promptData.type,
|
|
880
|
-
pattern: resolution.pattern,
|
|
881
|
-
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
882
|
-
reason: resolution.suppressedBy,
|
|
883
|
-
mode: policy?.mode ?? null,
|
|
884
|
-
pattern: resolution.pattern,
|
|
885
|
-
promptType: promptDetection.promptData.type,
|
|
886
|
-
});
|
|
887
|
-
}
|
|
888
|
-
const answer = resolution.answer;
|
|
833
|
+
const answer = (0, auto_yes_poller_steps_1.resolveAnswerUnderPolicy)(judged);
|
|
889
834
|
if (answer === null) {
|
|
890
835
|
return 'no_answer';
|
|
891
836
|
}
|
|
@@ -896,20 +841,18 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
896
841
|
// Issue #2865: never auto-answer a same-named session another CommandMate
|
|
897
842
|
// server created. The poller keeps running; it just does not type.
|
|
898
843
|
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName);
|
|
899
|
-
if (generation !== undefined && !isTickCurrent(generation))
|
|
844
|
+
if (generation !== undefined && !(0, auto_yes_poller_generation_1.isTickCurrent)(generation))
|
|
900
845
|
return 'no_answer';
|
|
901
|
-
if (
|
|
902
|
-
(0, auto_yes_poller_state_1.warnOncePerFrame)(pollerState, `${frameKey}\u0000${sessionName}\u0000${ownership ? 'foreign' : 'worktree_not_found'}`, 'poller:auto-yes-skipped-foreign-session', {
|
|
903
|
-
worktreeId,
|
|
904
|
-
cliToolId,
|
|
905
|
-
instanceId,
|
|
906
|
-
sessionName,
|
|
907
|
-
sessionPath: ownership?.sessionPath ?? null,
|
|
908
|
-
reason: ownership ? 'foreign' : 'worktree_not_found',
|
|
909
|
-
});
|
|
846
|
+
if ((0, auto_yes_poller_steps_1.skippedForUnownedSession)(judged, sessionName, ownership)) {
|
|
910
847
|
return 'no_answer';
|
|
911
848
|
}
|
|
912
|
-
attempt = (0, auto_yes_poller_state_1.beginSendAttempt)(compositeKey, screenKey, generation?.sessionEpoch ?? epoch
|
|
849
|
+
attempt = (0, auto_yes_poller_state_1.beginSendAttempt)(compositeKey, screenKey, generation?.sessionEpoch ?? epoch,
|
|
850
|
+
// Issue #3820: an agy prompt read past the gate is one a hook receipt let through.
|
|
851
|
+
(0, auto_yes_confirmation_ledger_1.beginLedgerAttempt)(ledgerScope, answerBasisOf(judged, cleanOutput), {
|
|
852
|
+
receiptAccepted: cliToolId === 'antigravity',
|
|
853
|
+
}));
|
|
854
|
+
receiptEpisode = (0, auto_yes_poller_receipt_log_1.receiptEpisodeOfSend)(cliToolId, worktreeId, instanceId);
|
|
855
|
+
sendInFlight = true;
|
|
913
856
|
try {
|
|
914
857
|
await (0, prompt_answer_sender_1.sendPromptAnswer)({
|
|
915
858
|
sessionName,
|
|
@@ -917,36 +860,35 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
917
860
|
cliToolId,
|
|
918
861
|
promptData: promptDetection.promptData,
|
|
919
862
|
// Issue #3706: asked after each wait inside the send.
|
|
920
|
-
...(generation !== undefined ? { stillCurrent: () => isTickCurrent(generation) } : {}),
|
|
863
|
+
...(generation !== undefined ? { stillCurrent: () => (0, auto_yes_poller_generation_1.isTickCurrent)(generation) } : {}),
|
|
921
864
|
});
|
|
922
865
|
}
|
|
923
866
|
finally {
|
|
924
867
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
925
868
|
}
|
|
869
|
+
sendInFlight = false;
|
|
870
|
+
(0, auto_yes_confirmation_ledger_1.settleLedgerAttempt)(attempt.ledger, 'ok', { expired: attempt.state === 'expired' });
|
|
926
871
|
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, false);
|
|
872
|
+
// Issue #3796 review E: the episode the send began for, as on the failure side.
|
|
873
|
+
(0, auto_yes_poller_receipt_log_1.noteAnswerSent)(cliToolId, worktreeId, instanceId, false, receiptEpisode);
|
|
927
874
|
// 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
|
|
928
875
|
await finishAnsweredPrompt(judged, promptDetection, answer, generation);
|
|
929
876
|
return 'responded';
|
|
930
877
|
}
|
|
931
878
|
catch (error) {
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
if (attempt !== null)
|
|
946
|
-
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, false);
|
|
947
|
-
incrementErrorCount(compositeKey, generation?.pollerState);
|
|
948
|
-
logger.warn('poller:detect-respond-error', { worktreeId, cliToolId, instanceId });
|
|
949
|
-
return 'error';
|
|
879
|
+
return settleFailedTick(error, {
|
|
880
|
+
worktreeId,
|
|
881
|
+
cliToolId,
|
|
882
|
+
instanceId,
|
|
883
|
+
compositeKey,
|
|
884
|
+
generation,
|
|
885
|
+
attempt,
|
|
886
|
+
sendInFlight,
|
|
887
|
+
receiptEpisode,
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
finally {
|
|
891
|
+
(0, auto_yes_confirmation_ledger_1.endLedgerTick)(ledgerScope, ledgerTick);
|
|
950
892
|
}
|
|
951
893
|
}
|
|
952
894
|
/**
|
|
@@ -961,7 +903,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
961
903
|
async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
962
904
|
const compositeKey = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
963
905
|
// 1. Validate context
|
|
964
|
-
const pollerState = getPollerState(compositeKey);
|
|
906
|
+
const pollerState = (0, auto_yes_poller_generation_1.getPollerState)(compositeKey);
|
|
965
907
|
if (owner !== undefined && pollerState !== owner)
|
|
966
908
|
return;
|
|
967
909
|
const contextResult = validatePollingContext(compositeKey, pollerState);
|
|
@@ -982,6 +924,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
982
924
|
sessionEpoch: (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(compositeKey),
|
|
983
925
|
startedAt: Date.now(),
|
|
984
926
|
};
|
|
927
|
+
// Issue #3796: this is the session wait's tick (it was scheduled as one) —
|
|
928
|
+
// recorded before anything can fail, for the push gate.
|
|
929
|
+
if (pollerState.sessionWaitTickAt !== undefined)
|
|
930
|
+
pollerState.sessionWaitTickRanAt = generation.startedAt;
|
|
985
931
|
try {
|
|
986
932
|
// 2. Capture and clean output
|
|
987
933
|
const captureLines = grant.stopPattern
|
|
@@ -991,13 +937,15 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
991
937
|
// step below exactly as it did; the raw one is carried to the prompt reading
|
|
992
938
|
// so a dialog anchored on box drawing is not invisible to the one path that
|
|
993
939
|
// can answer it without a human.
|
|
994
|
-
const { raw: rawOutput, clean: cleanOutput } = await capturePollerFrame(worktreeId, cliToolId, captureLines, instanceId);
|
|
995
|
-
if (!isTickCurrent(generation)) {
|
|
940
|
+
const { raw: rawOutput, clean: cleanOutput } = await (0, auto_yes_poller_capture_1.capturePollerFrame)(worktreeId, cliToolId, captureLines, instanceId);
|
|
941
|
+
if (!(0, auto_yes_poller_generation_1.isTickCurrent)(generation)) {
|
|
996
942
|
endStaleTick(generation);
|
|
997
943
|
return;
|
|
998
944
|
}
|
|
999
945
|
if (pollerState.waitingForSession) {
|
|
1000
946
|
pollerState.waitingForSession = false;
|
|
947
|
+
// Issue #3796: the session wait's tick ran here — read by the push gate.
|
|
948
|
+
pollerState.sessionAppearedAt = generation.startedAt;
|
|
1001
949
|
logger.info('poller:session-appeared', { worktreeId, cliToolId, instanceId });
|
|
1002
950
|
}
|
|
1003
951
|
const lines = cleanOutput.split('\n');
|
|
@@ -1007,7 +955,7 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
1007
955
|
}
|
|
1008
956
|
// 4. Detect and respond to prompt
|
|
1009
957
|
const result = await detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, cleanOutput, lines, instanceId, rawOutput, generation);
|
|
1010
|
-
if (!isTickCurrent(generation)) {
|
|
958
|
+
if (!(0, auto_yes_poller_generation_1.isTickCurrent)(generation)) {
|
|
1011
959
|
endStaleTick(generation);
|
|
1012
960
|
return;
|
|
1013
961
|
}
|
|
@@ -1016,7 +964,7 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
1016
964
|
// over hours. Not on 'error': a capture that works followed by an answer
|
|
1017
965
|
// that fails every time must still back off and stop.
|
|
1018
966
|
if (result !== 'error') {
|
|
1019
|
-
resetErrorCount(compositeKey, generation.pollerState);
|
|
967
|
+
(0, auto_yes_poller_generation_1.resetErrorCount)(compositeKey, generation.pollerState);
|
|
1020
968
|
}
|
|
1021
969
|
if (result === 'responded') {
|
|
1022
970
|
scheduleNextPoll(generation, auto_yes_state_1.COOLDOWN_INTERVAL_MS);
|
|
@@ -1037,7 +985,7 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
1037
985
|
// enables it before the session starts — so wait until `expiresAt`, at the
|
|
1038
986
|
// backoff cap, instead of counting toward `consecutive_errors`.
|
|
1039
987
|
const sessionMissing = await isSessionMissing(worktreeId, cliToolId, instanceId);
|
|
1040
|
-
if (!isTickCurrent(generation)) {
|
|
988
|
+
if (!(0, auto_yes_poller_generation_1.isTickCurrent)(generation)) {
|
|
1041
989
|
endStaleTick(generation);
|
|
1042
990
|
return;
|
|
1043
991
|
}
|
|
@@ -1046,7 +994,7 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
1046
994
|
pollerState.waitingForSession = true;
|
|
1047
995
|
logger.info('poller:waiting-for-session', { worktreeId, cliToolId, instanceId });
|
|
1048
996
|
}
|
|
1049
|
-
scheduleNextPoll(generation, auto_yes_state_1.MAX_BACKOFF_MS);
|
|
997
|
+
scheduleNextPoll(generation, auto_yes_state_1.MAX_BACKOFF_MS, { sessionWait: true });
|
|
1050
998
|
return;
|
|
1051
999
|
}
|
|
1052
1000
|
incrementErrorCount(compositeKey, generation.pollerState);
|
|
@@ -1077,15 +1025,70 @@ async function isSessionMissing(worktreeId, cliToolId, instanceId) {
|
|
|
1077
1025
|
*
|
|
1078
1026
|
* @param generation - The tick's generation
|
|
1079
1027
|
* @param overrideInterval - Optional override for the next poll delay
|
|
1028
|
+
* @param options.sessionWait - The tick waits for a session to appear (Issue #3791)
|
|
1080
1029
|
*/
|
|
1081
|
-
function scheduleNextPoll(generation, overrideInterval) {
|
|
1082
|
-
if (!isPollerCurrent(generation))
|
|
1030
|
+
function scheduleNextPoll(generation, overrideInterval, options = {}) {
|
|
1031
|
+
if (!(0, auto_yes_poller_generation_1.isPollerCurrent)(generation))
|
|
1083
1032
|
return;
|
|
1084
1033
|
const { worktreeId, cliToolId, instanceId, pollerState } = generation;
|
|
1085
1034
|
const interval = Math.max(overrideInterval ?? pollerState.currentInterval, auto_yes_state_1.POLLING_INTERVAL_MS);
|
|
1086
|
-
|
|
1035
|
+
// Issue #3791: only the session wait's tick is one the push gate waits for.
|
|
1036
|
+
pollerState.sessionWaitTickAt = options.sessionWait === true ? Date.now() + interval : undefined;
|
|
1037
|
+
// Issue #3796: any new timer supersedes the previous one's wake.
|
|
1038
|
+
dropSessionWaitWake(generation.compositeKey);
|
|
1039
|
+
const timerId = setTimeout(() => {
|
|
1040
|
+
dropSessionWaitWake(generation.compositeKey, timerId);
|
|
1087
1041
|
void pollAutoYes(worktreeId, cliToolId, instanceId, pollerState);
|
|
1088
1042
|
}, interval);
|
|
1043
|
+
pollerState.timerId = timerId;
|
|
1044
|
+
if (options.sessionWait === true)
|
|
1045
|
+
armSessionWaitWake(generation, timerId);
|
|
1046
|
+
}
|
|
1047
|
+
/** compositeKey -> the pending session-wait tick's wake. At most one per poller key. */
|
|
1048
|
+
const sessionWaitWakes = (0, global_state_1.getOrInitGlobal)('__autoYesSessionWaitWakes', () => new Map());
|
|
1049
|
+
/**
|
|
1050
|
+
* Stop listening for the session of `compositeKey` (Issue #3796).
|
|
1051
|
+
*
|
|
1052
|
+
* @param timerId - Only when the wake is this timer's: the timer firing drops
|
|
1053
|
+
* its own wake, never a successor's
|
|
1054
|
+
*/
|
|
1055
|
+
function dropSessionWaitWake(compositeKey, timerId) {
|
|
1056
|
+
const wake = sessionWaitWakes.get(compositeKey);
|
|
1057
|
+
if (wake === undefined || (timerId !== undefined && wake.timerId !== timerId))
|
|
1058
|
+
return;
|
|
1059
|
+
sessionWaitWakes.delete(compositeKey);
|
|
1060
|
+
wake.unsubscribe();
|
|
1061
|
+
}
|
|
1062
|
+
/**
|
|
1063
|
+
* Issue #3796: while the poller waits `MAX_BACKOFF_MS` for its session, the
|
|
1064
|
+
* session's creation brings the tick forward to a poll interval — so the first
|
|
1065
|
+
* prompt of a session started right after the poller looked (`send --auto-yes`
|
|
1066
|
+
* enables Auto-Yes before the session exists) is answered, or its human
|
|
1067
|
+
* notified, without waiting out the backoff. The push gate's hold follows the
|
|
1068
|
+
* earlier tick (`autoYesHoldEndsAt`).
|
|
1069
|
+
*
|
|
1070
|
+
* The wake replaces the pending timer and nothing else: it does nothing once
|
|
1071
|
+
* that timer fired (the tick drops the wake before it runs, so a tick in flight
|
|
1072
|
+
* is never doubled), once another timer replaced it, or once the poller was
|
|
1073
|
+
* stopped or replaced (`stopAutoYesPolling` drops it, and `scheduleNextPoll`
|
|
1074
|
+
* checks the poller is still the generation's).
|
|
1075
|
+
*/
|
|
1076
|
+
function armSessionWaitWake(generation, timerId) {
|
|
1077
|
+
const { compositeKey, worktreeId, cliToolId, instanceId, pollerState } = generation;
|
|
1078
|
+
const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
|
|
1079
|
+
const unsubscribe = (0, session_created_signal_1.onTmuxSessionCreated)(sessionName, () => {
|
|
1080
|
+
const wake = sessionWaitWakes.get(compositeKey);
|
|
1081
|
+
if (wake === undefined || wake.timerId !== timerId)
|
|
1082
|
+
return;
|
|
1083
|
+
sessionWaitWakes.delete(compositeKey);
|
|
1084
|
+
if (!(0, auto_yes_poller_generation_1.isPollerCurrent)(generation) || pollerState.timerId !== timerId)
|
|
1085
|
+
return;
|
|
1086
|
+
clearTimeout(timerId);
|
|
1087
|
+
logger.info('poller:session-created-wake', { worktreeId, cliToolId, instanceId });
|
|
1088
|
+
// Still the session wait's tick — the one the push gate's hold is about.
|
|
1089
|
+
scheduleNextPoll(generation, auto_yes_state_1.POLLING_INTERVAL_MS, { sessionWait: true });
|
|
1090
|
+
});
|
|
1091
|
+
sessionWaitWakes.set(compositeKey, { timerId, unsubscribe });
|
|
1089
1092
|
}
|
|
1090
1093
|
// =============================================================================
|
|
1091
1094
|
// Public Poller API
|
|
@@ -1109,6 +1112,11 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1109
1112
|
}
|
|
1110
1113
|
// Resolve the effective instance ID (primary === cliToolId).
|
|
1111
1114
|
const effectiveInstanceId = instanceId ?? cliToolId;
|
|
1115
|
+
// Issue #3730: nothing starts once a shutdown has recorded what it releases —
|
|
1116
|
+
// a poller started after the record would be a grant the record never saw.
|
|
1117
|
+
if ((0, auto_yes_state_1.isAutoYesShutdownStarted)()) {
|
|
1118
|
+
return { started: false, reason: 'server shutting down' };
|
|
1119
|
+
}
|
|
1112
1120
|
// Check if auto-yes is enabled
|
|
1113
1121
|
const autoYesState = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, effectiveInstanceId);
|
|
1114
1122
|
if (!autoYesState?.enabled) {
|
|
@@ -1116,8 +1124,8 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1116
1124
|
}
|
|
1117
1125
|
const compositeKey = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, effectiveInstanceId);
|
|
1118
1126
|
// Check concurrent poller limit (DoS protection)
|
|
1119
|
-
const existingPollerState = getPollerState(compositeKey);
|
|
1120
|
-
if (!existingPollerState && autoYesPollerStates.size >= auto_yes_state_1.MAX_CONCURRENT_POLLERS) {
|
|
1127
|
+
const existingPollerState = (0, auto_yes_poller_generation_1.getPollerState)(compositeKey);
|
|
1128
|
+
if (!existingPollerState && auto_yes_poller_generation_1.autoYesPollerStates.size >= auto_yes_state_1.MAX_CONCURRENT_POLLERS) {
|
|
1121
1129
|
return { started: false, reason: 'max concurrent pollers reached' };
|
|
1122
1130
|
}
|
|
1123
1131
|
// Issue #501: Idempotency check (key already encodes the instance, so a matching
|
|
@@ -1127,7 +1135,7 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1127
1135
|
}
|
|
1128
1136
|
// Stop existing poller if cliToolId changed
|
|
1129
1137
|
if (existingPollerState) {
|
|
1130
|
-
stopAutoYesPolling(compositeKey);
|
|
1138
|
+
stopAutoYesPolling(compositeKey, 'replaced');
|
|
1131
1139
|
}
|
|
1132
1140
|
// Create new poller state
|
|
1133
1141
|
const pollerState = {
|
|
@@ -1142,7 +1150,7 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1142
1150
|
stopCheckBaselineLength: -1,
|
|
1143
1151
|
lastSkipWarnKey: null,
|
|
1144
1152
|
};
|
|
1145
|
-
autoYesPollerStates.set(compositeKey, pollerState);
|
|
1153
|
+
auto_yes_poller_generation_1.autoYesPollerStates.set(compositeKey, pollerState);
|
|
1146
1154
|
// A task may have been recorded moments ago; start from a fresh policy read.
|
|
1147
1155
|
(0, auto_yes_policy_1.invalidateSessionAutoYesPolicy)(compositeKey);
|
|
1148
1156
|
// Start polling immediately
|
|
@@ -1157,35 +1165,54 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1157
1165
|
*
|
|
1158
1166
|
* Issue #525: Changed from (worktreeId) to (compositeKey).
|
|
1159
1167
|
*
|
|
1168
|
+
* Issue #3730: `reason` is why the POLLER stops, logged on `poller:stopped`. It
|
|
1169
|
+
* does not touch the grant: an ID move and a replacement stop the poller and
|
|
1170
|
+
* keep the grant, so disabling stays each caller's own decision. Omitted, the
|
|
1171
|
+
* reason of an enclosing {@link withPollerStopReason} applies (the lifecycle
|
|
1172
|
+
* table's path), else `unspecified`.
|
|
1173
|
+
*
|
|
1160
1174
|
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
1175
|
+
* @param reason - Why the poller stops
|
|
1161
1176
|
*/
|
|
1162
|
-
function stopAutoYesPolling(compositeKey) {
|
|
1177
|
+
function stopAutoYesPolling(compositeKey, reason) {
|
|
1163
1178
|
// Issue #3397: before the early return — the disable route and the session
|
|
1164
1179
|
// cleanup call this for an instance whose poller may already be gone, and the
|
|
1165
1180
|
// Enter record must not outlive the grant or the session either way.
|
|
1166
1181
|
(0, auto_yes_enter_fallback_1.forgetEnterFallback)(compositeKey);
|
|
1167
|
-
|
|
1182
|
+
// Issue #3820: before the early return too — a session ended after its
|
|
1183
|
+
// poller had already stopped still abandons the confirmation left on it.
|
|
1184
|
+
(0, auto_yes_confirmation_ledger_1.noteLedgerPollerStopped)(compositeKey, (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(reason, 'unspecified'));
|
|
1185
|
+
const pollerState = (0, auto_yes_poller_generation_1.getPollerState)(compositeKey);
|
|
1168
1186
|
if (!pollerState)
|
|
1169
1187
|
return;
|
|
1170
1188
|
if (pollerState.timerId) {
|
|
1171
1189
|
clearTimeout(pollerState.timerId);
|
|
1172
1190
|
}
|
|
1173
|
-
|
|
1191
|
+
dropSessionWaitWake(compositeKey);
|
|
1192
|
+
auto_yes_poller_generation_1.autoYesPollerStates.delete(compositeKey);
|
|
1174
1193
|
(0, auto_yes_policy_1.invalidateSessionAutoYesPolicy)(compositeKey);
|
|
1175
|
-
logger.info('poller:stopped', { compositeKey });
|
|
1194
|
+
logger.info('poller:stopped', { compositeKey, reason: (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(reason, 'unspecified') });
|
|
1176
1195
|
}
|
|
1177
1196
|
/**
|
|
1178
1197
|
* Stop all server-side auto-yes polling (graceful shutdown).
|
|
1198
|
+
*
|
|
1199
|
+
* Issue #3730: logs `shutdown` unless an enclosing
|
|
1200
|
+
* {@link withPollerStopReason} says otherwise (the test reset). Writes nothing
|
|
1201
|
+
* to disk: the record of the grants a shutdown released is the server's to
|
|
1202
|
+
* make (`lib/auto-yes-shutdown-record`), never a side effect of this.
|
|
1179
1203
|
*/
|
|
1180
1204
|
function stopAllAutoYesPolling() {
|
|
1181
|
-
|
|
1205
|
+
const reason = (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(undefined, 'shutdown');
|
|
1206
|
+
for (const [key, pollerState] of auto_yes_poller_generation_1.autoYesPollerStates.entries()) {
|
|
1182
1207
|
if (pollerState.timerId) {
|
|
1183
1208
|
clearTimeout(pollerState.timerId);
|
|
1184
1209
|
}
|
|
1210
|
+
dropSessionWaitWake(key);
|
|
1185
1211
|
(0, auto_yes_policy_1.invalidateSessionAutoYesPolicy)(key);
|
|
1186
|
-
|
|
1212
|
+
(0, auto_yes_confirmation_ledger_1.noteLedgerPollerStopped)(key, reason);
|
|
1213
|
+
logger.info('poller:stopped', { compositeKey: key, reason });
|
|
1187
1214
|
}
|
|
1188
|
-
autoYesPollerStates.clear();
|
|
1215
|
+
auto_yes_poller_generation_1.autoYesPollerStates.clear();
|
|
1189
1216
|
(0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
|
|
1190
1217
|
(0, auto_yes_poller_state_1.clearPartialAnswers)();
|
|
1191
1218
|
}
|
|
@@ -1197,7 +1224,7 @@ function stopAllAutoYesPolling() {
|
|
|
1197
1224
|
* @returns Array of composite keys present in the autoYesPollerStates Map
|
|
1198
1225
|
*/
|
|
1199
1226
|
function getAutoYesPollerCompositeKeys() {
|
|
1200
|
-
return Array.from(autoYesPollerStates.keys());
|
|
1227
|
+
return Array.from(auto_yes_poller_generation_1.autoYesPollerStates.keys());
|
|
1201
1228
|
}
|
|
1202
1229
|
// =============================================================================
|
|
1203
1230
|
// byWorktree Helpers (Issue #525)
|
|
@@ -1207,6 +1234,7 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
1207
1234
|
* [SF-001] Uses shared filterCompositeKeysByWorktree (DRY).
|
|
1208
1235
|
*
|
|
1209
1236
|
* @param worktreeId - Worktree identifier
|
|
1237
|
+
* @param options.reason - Issue #3730: why the pollers stop, for `poller:stopped`
|
|
1210
1238
|
* @param options.keepPartialAnswers - Issue #3713 (re-instruction 1, P2-1): the
|
|
1211
1239
|
* disable route's "every agent" passes it — a disable, like one agent's
|
|
1212
1240
|
* `stopAutoYesPolling`, keeps the memory of an answer stopped part-way and
|
|
@@ -1215,10 +1243,14 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
1215
1243
|
* `auto-yes-lifecycle`), both are dropped and a late send records nothing.
|
|
1216
1244
|
*/
|
|
1217
1245
|
function stopAutoYesPollingByWorktree(worktreeId, options) {
|
|
1218
|
-
const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
|
|
1219
|
-
|
|
1246
|
+
const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(auto_yes_poller_generation_1.autoYesPollerStates.keys()), worktreeId);
|
|
1247
|
+
// Issue #3730: `options.reason`, else the enclosing scope's (the lifecycle table).
|
|
1248
|
+
pollerKeys.forEach(key => stopAutoYesPolling(key, options?.reason));
|
|
1220
1249
|
// Issue #3397: and the records of instances whose poller had already stopped.
|
|
1221
1250
|
(0, auto_yes_enter_fallback_1.forgetEnterFallbacksByWorktree)(worktreeId);
|
|
1251
|
+
// Issue #3820: and the ledger's confirmations on them — an API approval is
|
|
1252
|
+
// opened with Auto-Yes off too, so the running pollers do not name them all.
|
|
1253
|
+
(0, auto_yes_confirmation_ledger_1.noteLedgerWorktreeStopped)(worktreeId, (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(options?.reason, 'unspecified'));
|
|
1222
1254
|
if (!options?.keepPartialAnswers)
|
|
1223
1255
|
(0, auto_yes_poller_state_1.forgetPartialAnswersByWorktree)(worktreeId);
|
|
1224
1256
|
}
|
|
@@ -1230,5 +1262,5 @@ function stopAutoYesPollingByWorktree(worktreeId, options) {
|
|
|
1230
1262
|
* @returns true if any poller is active for this worktree
|
|
1231
1263
|
*/
|
|
1232
1264
|
function isAnyPollerActiveForWorktree(worktreeId) {
|
|
1233
|
-
return (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId).length > 0;
|
|
1265
|
+
return (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(auto_yes_poller_generation_1.autoYesPollerStates.keys()), worktreeId).length > 0;
|
|
1234
1266
|
}
|