commandmate 0.46.1 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +223 -216
- package/.next/app-path-routes-manifest.json +19 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +4 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -7
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -7
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +19 -18
- 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/1836.js +1 -0
- package/.next/server/chunks/1945.js +14 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/{3077.js → 4194.js} +12 -12
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5292.js +1 -1
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5845.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/{2283.js → 6486.js} +7 -7
- package/.next/server/chunks/6722.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +2 -2
- package/.next/server/chunks/7166.js +19 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +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/9199.js +1 -0
- package/.next/server/chunks/936.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -0
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-9703c569370b8a9d.js → 2407-b2f524f99f7fc353.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/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/auto-yes.d.ts +19 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +45 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -18
- package/dist/cli/commands/ls.d.ts +15 -1
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +39 -3
- package/dist/cli/commands/prompt.d.ts +42 -0
- package/dist/cli/commands/prompt.d.ts.map +1 -0
- package/dist/cli/commands/prompt.js +211 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +13 -1
- package/dist/cli/commands/respond-strict.d.ts +31 -0
- package/dist/cli/commands/respond-strict.d.ts.map +1 -0
- package/dist/cli/commands/respond-strict.js +214 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +38 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +41 -5
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +18 -0
- package/dist/cli/commands/wait.d.ts +21 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +108 -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 +54 -0
- 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 +43 -1
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +18 -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 +345 -28
- 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/selection-shape.js +35 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
- package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
- package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
- package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +18 -1
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
- package/dist/server/src/lib/polling/response-checker.js +9 -0
- package/dist/server/src/lib/polling/response-poller-core.js +136 -104
- 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 +1 -1
- package/release-notes/0.47.0.json +118 -0
- package/.next/server/chunks/1789.js +0 -1
- package/.next/server/chunks/2908.js +0 -1
- package/.next/server/chunks/2984.js +0 -25
- package/.next/server/chunks/3718.js +0 -1
- package/.next/server/chunks/4837.js +0 -14
- package/.next/server/chunks/611.js +0 -1
- package/.next/server/chunks/850.js +0 -1
- package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
- package/.next/static/chunks/5371-0dc947683e46e78c.js +0 -1
- package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/layout-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/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
- /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
|
@@ -54,6 +54,7 @@ exports.validatePollingContext = validatePollingContext;
|
|
|
54
54
|
exports.capturePollerFrame = capturePollerFrame;
|
|
55
55
|
exports.captureAndCleanOutput = captureAndCleanOutput;
|
|
56
56
|
exports.processStopConditionDelta = processStopConditionDelta;
|
|
57
|
+
exports.noHookReceiptHint = noHookReceiptHint;
|
|
57
58
|
exports.detectAndRespondToPrompt = detectAndRespondToPrompt;
|
|
58
59
|
exports.startAutoYesPolling = startAutoYesPolling;
|
|
59
60
|
exports.stopAutoYesPolling = stopAutoYesPolling;
|
|
@@ -63,6 +64,7 @@ exports.stopAutoYesPollingByWorktree = stopAutoYesPollingByWorktree;
|
|
|
63
64
|
exports.isAnyPollerActiveForWorktree = isAnyPollerActiveForWorktree;
|
|
64
65
|
const cli_session_1 = require("./session/cli-session");
|
|
65
66
|
const response_checker_1 = require("./polling/response-checker");
|
|
67
|
+
const antigravity_receipt_episodes_1 = require("./polling/antigravity-receipt-episodes");
|
|
66
68
|
const antigravity_permission_receipts_1 = require("./polling/antigravity-permission-receipts");
|
|
67
69
|
const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
|
|
68
70
|
const auto_yes_policy_1 = require("./polling/auto-yes-policy");
|
|
@@ -77,18 +79,21 @@ const worktree_session_ownership_1 = require("./cli-tools/worktree-session-owner
|
|
|
77
79
|
const prompt_answer_sender_1 = require("./prompt-answer-sender");
|
|
78
80
|
const prompt_answer_semantic_1 = require("./prompt-answer-semantic");
|
|
79
81
|
const tmux_1 = require("./tmux/tmux");
|
|
82
|
+
const session_created_signal_1 = require("./tmux/session-created-signal");
|
|
80
83
|
const manager_1 = require("./cli-tools/manager");
|
|
81
84
|
const cli_patterns_1 = require("./detection/cli-patterns");
|
|
82
85
|
const prompt_key_1 = require("./detection/prompt-key");
|
|
83
86
|
const errors_1 = require("./errors");
|
|
84
87
|
const tmux_capture_cache_1 = require("./tmux/tmux-capture-cache");
|
|
85
88
|
const auto_yes_config_1 = require("../config/auto-yes-config");
|
|
89
|
+
const auto_yes_poller_stop_reason_1 = require("./polling/auto-yes-poller-stop-reason");
|
|
86
90
|
const logger_1 = require("../lib/logger");
|
|
87
91
|
const logger = (0, logger_1.createLogger)('auto-yes-poller');
|
|
88
92
|
const path_validator_1 = require("./security/path-validator");
|
|
89
93
|
const auto_yes_state_1 = require("./auto-yes-state");
|
|
90
94
|
const global_state_1 = require("./global-state");
|
|
91
95
|
const auto_yes_suppression_reason_1 = require("./polling/auto-yes-suppression-reason");
|
|
96
|
+
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
92
97
|
const auto_yes_poller_state_1 = require("./polling/auto-yes-poller-state");
|
|
93
98
|
const auto_yes_prompt_suppression_1 = require("./polling/auto-yes-prompt-suppression");
|
|
94
99
|
/** In-memory storage for poller states (globalThis for hot reload persistence) */
|
|
@@ -100,7 +105,10 @@ const autoYesPollerStates = (0, global_state_1.getOrInitGlobal)('__autoYesPoller
|
|
|
100
105
|
* instance. globalThis for the same reason as the poller states above.
|
|
101
106
|
*/
|
|
102
107
|
const withheldNoReceiptLoggedAt = (0, global_state_1.getOrInitGlobal)('__autoYesWithheldNoReceiptLoggedAt', () => new Map());
|
|
103
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* Least gap between two `antigravity-autoyes-withheld-no-hook-receipt` lines for
|
|
110
|
+
* one instance. `antigravity-autoyes-withheld-by-policy` (Issue #3724) shares it.
|
|
111
|
+
*/
|
|
104
112
|
const WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS = 60_000;
|
|
105
113
|
// =============================================================================
|
|
106
114
|
// Poller State Accessors (compositeKey-based)
|
|
@@ -126,7 +134,8 @@ function getActivePollerCount() {
|
|
|
126
134
|
* @internal Exported for testing purposes only.
|
|
127
135
|
*/
|
|
128
136
|
function clearAllPollerStates() {
|
|
129
|
-
|
|
137
|
+
// Issue #3730: a test seam, not a shutdown — logged as such.
|
|
138
|
+
(0, auto_yes_poller_stop_reason_1.withPollerStopReason)('reset', () => stopAllAutoYesPolling());
|
|
130
139
|
autoYesPollerStates.clear();
|
|
131
140
|
withheldNoReceiptLoggedAt.clear();
|
|
132
141
|
}
|
|
@@ -208,7 +217,7 @@ function incrementErrorCount(compositeKey, owner) {
|
|
|
208
217
|
// Issue #896: target the specific instance state (3-part keys carry instanceId).
|
|
209
218
|
(0, auto_yes_state_1.disableAutoYes)(worktreeId, cliToolId, 'consecutive_errors', (0, auto_yes_state_1.extractInstanceId)(compositeKey) ?? undefined);
|
|
210
219
|
}
|
|
211
|
-
stopAutoYesPolling(compositeKey);
|
|
220
|
+
stopAutoYesPolling(compositeKey, 'consecutive-errors');
|
|
212
221
|
}
|
|
213
222
|
}
|
|
214
223
|
}
|
|
@@ -302,14 +311,18 @@ function validatePollingContext(compositeKey, pollerState) {
|
|
|
302
311
|
const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
|
|
303
312
|
const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
|
|
304
313
|
if (!cliToolId) {
|
|
305
|
-
stopAutoYesPolling(compositeKey);
|
|
314
|
+
stopAutoYesPolling(compositeKey, 'invalid-key');
|
|
306
315
|
return 'expired';
|
|
307
316
|
}
|
|
308
317
|
// Issue #896: resolve instanceId so per-instance enabled state is checked.
|
|
309
318
|
const instanceId = (0, auto_yes_state_1.extractInstanceId)(compositeKey) ?? undefined;
|
|
310
319
|
const autoYesState = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
311
320
|
if (!autoYesState?.enabled) {
|
|
312
|
-
|
|
321
|
+
// Issue #3730: the return value says 'expired' for every one of these (its
|
|
322
|
+
// callers only need "stop"), but the log says which it was — the getter
|
|
323
|
+
// has just turned a past deadline into `stopReason: 'expired'`, and
|
|
324
|
+
// anything else is a grant some other path disabled or removed.
|
|
325
|
+
stopAutoYesPolling(compositeKey, autoYesState?.stopReason === 'expired' ? 'expired' : 'not-enabled');
|
|
313
326
|
return 'expired';
|
|
314
327
|
}
|
|
315
328
|
return 'valid';
|
|
@@ -366,7 +379,7 @@ function processStopConditionDelta(compositeKey, pollerState, cleanOutput) {
|
|
|
366
379
|
if (cleanOutput.length > baseline) {
|
|
367
380
|
const newContent = cleanOutput.substring(baseline);
|
|
368
381
|
pollerState.stopCheckBaselineLength = cleanOutput.length;
|
|
369
|
-
return (0, auto_yes_state_1.checkStopCondition)(compositeKey, newContent, stopAutoYesPolling);
|
|
382
|
+
return (0, auto_yes_state_1.checkStopCondition)(compositeKey, newContent, (key) => stopAutoYesPolling(key, 'stop-pattern'));
|
|
370
383
|
}
|
|
371
384
|
else if (cleanOutput.length < baseline) {
|
|
372
385
|
pollerState.stopCheckBaselineLength = cleanOutput.length;
|
|
@@ -389,6 +402,13 @@ function processStopConditionDelta(compositeKey, pollerState, cleanOutput) {
|
|
|
389
402
|
* Why it is worth a line: a machine whose `~/.gemini/config/hooks.json` points at
|
|
390
403
|
* another server (#2622) never sends us the question, and every real dialog then
|
|
391
404
|
* waits for a human with no sign of why. The line names the file to look at.
|
|
405
|
+
*
|
|
406
|
+
* A stale receipt does not always mean that, though (Issue #3724): a dialog the
|
|
407
|
+
* contract's autoYes withheld got its receipt, the server answered `ask`, and
|
|
408
|
+
* the dialog outlived the window. When `resolveAutoAnswerWithPolicy` on the
|
|
409
|
+
* ungated reading suppresses the answer by contract (the base rules would have
|
|
410
|
+
* answered it), the line is `antigravity-autoyes-withheld-by-policy` instead,
|
|
411
|
+
* naming the reason, the mode and the task. Both share the limit.
|
|
392
412
|
* The response-checker's own `antigravity-dialog-no-recent-receipt` stays at
|
|
393
413
|
* debug — it prints on every tick the same pane is read again.
|
|
394
414
|
*
|
|
@@ -396,27 +416,193 @@ function processStopConditionDelta(compositeKey, pollerState, cleanOutput) {
|
|
|
396
416
|
* @param readWithoutGate - The same frame read without `receiptScope`
|
|
397
417
|
*/
|
|
398
418
|
function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, readWithoutGate) {
|
|
399
|
-
|
|
419
|
+
// Issue #3767: the gate's own verdict for this tick's candidate. Null means it
|
|
420
|
+
// never saw one (no dialog), `ok` that it let the frame through.
|
|
421
|
+
let verdict = (0, antigravity_receipt_episodes_1.getAntigravityReceiptVerdict)(worktreeId, instanceId);
|
|
422
|
+
if (verdict?.ok)
|
|
400
423
|
return;
|
|
401
424
|
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
425
|
const ungated = readWithoutGate();
|
|
406
426
|
if (!ungated.isPrompt || !ungated.promptData)
|
|
407
427
|
return;
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
428
|
+
// The gate was not consulted (the gated reading declined the frame on screen
|
|
429
|
+
// grounds alone) yet the frame reads as a prompt: judge it here.
|
|
430
|
+
verdict ??= (0, antigravity_receipt_episodes_1.judgeAntigravityPermissionReceipt)(worktreeId, instanceId, now);
|
|
431
|
+
if (verdict.ok)
|
|
432
|
+
return;
|
|
433
|
+
// Issue #3724: a contract that withholds the answer makes the server reply
|
|
434
|
+
// `ask`, so the dialog stays up past the receipt window. The cause is then the
|
|
435
|
+
// contract, not a hooks.json that points elsewhere. Judged exactly as the tick
|
|
436
|
+
// judges a prompt it can read — the base rules first, then the contract — so
|
|
437
|
+
// a prompt the base rules never answer (a checkbox, a typed option) is not
|
|
438
|
+
// blamed on the contract. Policy and task id come from one lookup.
|
|
439
|
+
const { policy, taskId } = (0, auto_yes_policy_1.getSessionAutoYesPolicyEntry)(worktreeId, 'antigravity', instanceId);
|
|
440
|
+
const resolution = (0, auto_yes_resolver_1.resolveAutoAnswerWithPolicy)(ungated.promptData, policy);
|
|
441
|
+
// Issue #3767: `answered` is the dialog the gate already let through on this
|
|
442
|
+
// receipt, still up past the window. Unless the contract withheld it, that is
|
|
443
|
+
// not a missing receipt: neither recorded nor logged, nor counted for the limit.
|
|
444
|
+
// Issue #3789: `answered` is also a dialog accepted but never sent to (the
|
|
445
|
+
// tick recorded its own reason, if any, and that record is kept). One the
|
|
446
|
+
// poller DID send keys to and still up past the grace is `outlived`, which is
|
|
447
|
+
// recorded and logged like the others, so the stop is not a silent one.
|
|
448
|
+
// Issue #3796: the reason the poller recorded for this dialog (partial-answer,
|
|
449
|
+
// the contract, …) while it could still read it inside the window was not
|
|
450
|
+
// re-stamped once the window closed — the gated reading stopped seeing the
|
|
451
|
+
// prompt — so `cmate wait` dropped it as stale a minute later with the dialog
|
|
452
|
+
// still up. Re-stamped here on every tick the dialog stays — only while it
|
|
453
|
+
// still holds under this tick's evaluation — and kept over a `no-hook-receipt`
|
|
454
|
+
// for it: it is the more exact reason.
|
|
455
|
+
const keptPartialAnswer = refreshEpisodeSuppression(worktreeId, instanceId, verdict, resolution);
|
|
456
|
+
// Issue #3796 review D: a contract that withholds the prompt now is published
|
|
457
|
+
// whatever was recorded before — none at all (the window closed before the
|
|
458
|
+
// tick could read it, or an ended contract's record was dropped and a new one
|
|
459
|
+
// withholds it again) or another reason. Without it `cmate wait` read no
|
|
460
|
+
// reason and held the prompt as one Auto-Yes was answering. Only a partial
|
|
461
|
+
// answer still on screen comes first, as it does on the tick (step 2.5).
|
|
462
|
+
if (resolution.suppressedBy && !keptPartialAnswer) {
|
|
463
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, 'antigravity', instanceId, {
|
|
464
|
+
reason: resolution.suppressedBy,
|
|
465
|
+
mode: policy?.mode ?? null,
|
|
466
|
+
promptType: ungated.promptData.type,
|
|
467
|
+
...(resolution.pattern !== undefined ? { pattern: resolution.pattern } : {}),
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
if (!resolution.suppressedBy && (verdict.cause === 'answered' || keptPartialAnswer))
|
|
471
|
+
return;
|
|
472
|
+
const lastLoggedAt = withheldNoReceiptLoggedAt.get(compositeKey);
|
|
473
|
+
const logDue = lastLoggedAt === undefined || now - lastLoggedAt >= WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS;
|
|
474
|
+
if (logDue) {
|
|
475
|
+
for (const [key, loggedAt] of withheldNoReceiptLoggedAt) {
|
|
476
|
+
if (now - loggedAt >= WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS)
|
|
477
|
+
withheldNoReceiptLoggedAt.delete(key);
|
|
478
|
+
}
|
|
479
|
+
withheldNoReceiptLoggedAt.set(compositeKey, now);
|
|
411
480
|
}
|
|
412
|
-
|
|
481
|
+
if (resolution.suppressedBy) {
|
|
482
|
+
if (!logDue)
|
|
483
|
+
return;
|
|
484
|
+
logger.info('antigravity-autoyes-withheld-by-policy', {
|
|
485
|
+
worktreeId,
|
|
486
|
+
instanceId: instanceId ?? 'antigravity',
|
|
487
|
+
reason: resolution.suppressedBy,
|
|
488
|
+
mode: policy?.mode ?? null,
|
|
489
|
+
taskId,
|
|
490
|
+
hint: '契約の autoYes が答えを止めている。契約の autoYes を確認',
|
|
491
|
+
});
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
// Issue #3767: recorded on every tick (the record's `at` follows the prompt
|
|
495
|
+
// while it stays up), logged once a minute.
|
|
496
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, 'antigravity', instanceId, {
|
|
497
|
+
reason: auto_yes_suppression_reason_1.NO_HOOK_RECEIPT_SUPPRESSION_REASON,
|
|
498
|
+
mode: null,
|
|
499
|
+
promptType: ungated.promptData.type,
|
|
500
|
+
});
|
|
501
|
+
if (!logDue)
|
|
502
|
+
return;
|
|
413
503
|
logger.info('antigravity-autoyes-withheld-no-hook-receipt', {
|
|
414
504
|
worktreeId,
|
|
415
505
|
instanceId: instanceId ?? 'antigravity',
|
|
416
506
|
windowMs: antigravity_permission_receipts_1.ANTIGRAVITY_PERMISSION_RECEIPT_WINDOW_MS,
|
|
417
|
-
hint:
|
|
507
|
+
hint: noHookReceiptHint(verdict, now),
|
|
418
508
|
});
|
|
419
509
|
}
|
|
510
|
+
/**
|
|
511
|
+
* Issue #3796: keep the suppression the poller recorded during this dialog's
|
|
512
|
+
* episode current while the dialog it accepted (`answered` / `outlived`) is
|
|
513
|
+
* still up. Only a record made since the dialog was first read, and never the
|
|
514
|
+
* receipt gate's own `no-hook-receipt` (the caller records that itself). A
|
|
515
|
+
* record is kept only while its reason still holds NOW:
|
|
516
|
+
*
|
|
517
|
+
* - `partial-answer` remembers an event: it holds for as long as the dialog
|
|
518
|
+
* the keys went to stays up (this episode), and is re-stamped here;
|
|
519
|
+
* - a contract reason is the contract's verdict on the prompt, re-evaluated on
|
|
520
|
+
* every tick (`resolution`): no verdict (the contract ended, or now answers
|
|
521
|
+
* it) drops the record — the dialog is then `answered` / `outlived` like any
|
|
522
|
+
* other. A verdict is recorded by the caller (review D), whatever was here;
|
|
523
|
+
* - any other reason is left as it was recorded.
|
|
524
|
+
*
|
|
525
|
+
* @returns true when a `partial-answer` that still holds was re-stamped
|
|
526
|
+
*/
|
|
527
|
+
function refreshEpisodeSuppression(worktreeId, instanceId, verdict, resolution) {
|
|
528
|
+
if (verdict.cause !== 'answered' && verdict.cause !== 'outlived')
|
|
529
|
+
return false;
|
|
530
|
+
const own = (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, 'antigravity', instanceId);
|
|
531
|
+
if (own === null || own.reason === auto_yes_suppression_reason_1.NO_HOOK_RECEIPT_SUPPRESSION_REASON || !(own.at >= verdict.firstSeenAt)) {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
if (own.reason === auto_yes_suppression_reason_1.PARTIAL_ANSWER_SUPPRESSION_REASON) {
|
|
535
|
+
// The memory is the episode's: the dialog the keys went to is still the one
|
|
536
|
+
// up (same episode, accepted on the same receipt). Not `getPartialAnswer`:
|
|
537
|
+
// the tick forgets it as soon as the gated reading stops seeing the prompt,
|
|
538
|
+
// which past the window is every tick.
|
|
539
|
+
const { at: _recordedAt, ...suppression } = own;
|
|
540
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, 'antigravity', instanceId, suppression);
|
|
541
|
+
return true;
|
|
542
|
+
}
|
|
543
|
+
if (auto_yes_suppression_reason_1.CONTRACT_SUPPRESSION_REASONS.has(own.reason) && !resolution.suppressedBy) {
|
|
544
|
+
(0, auto_yes_suppression_state_1.forgetPolicySuppression)(worktreeId, 'antigravity', instanceId);
|
|
545
|
+
}
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Issue #3789: keys for an agy dialog the receipt gate accepted reached tmux.
|
|
550
|
+
* Only here does the gate start the grace after which a dialog still up is
|
|
551
|
+
* reported as `outlived`; the tick's `no_answer` exits (another server's session,
|
|
552
|
+
* a partial answer, the base rules or the contract not answering) never get
|
|
553
|
+
* here, so their own records are not overwritten by `no-hook-receipt`.
|
|
554
|
+
*
|
|
555
|
+
* Issue #3796: `interrupted` — the send began and was cut short (stopped
|
|
556
|
+
* part-way, or failed). Its keys may be on the pane and the receipt is spent,
|
|
557
|
+
* so the grace starts here too; without it the dialog stayed `answered`, and
|
|
558
|
+
* silent, for as long as it stayed up.
|
|
559
|
+
*/
|
|
560
|
+
function noteAnswerSent(cliToolId, worktreeId, instanceId, interrupted = false, forReceiptAt) {
|
|
561
|
+
if (cliToolId !== 'antigravity')
|
|
562
|
+
return;
|
|
563
|
+
(0, antigravity_receipt_episodes_1.markAntigravityAnswerSent)(worktreeId, instanceId, Date.now(), {
|
|
564
|
+
interrupted,
|
|
565
|
+
...(forReceiptAt !== undefined ? { forReceiptAt } : {}),
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Issue #3796 review: the agy episode a send is about to go to, read before
|
|
570
|
+
* its first await; null for other tools. Given back to {@link noteAnswerSent}
|
|
571
|
+
* however the send came back — whole, failed or cut short (review E) — so that
|
|
572
|
+
* only that episode is marked — the same
|
|
573
|
+
* idea as the Enter record's generation check in `tryEnterFallback`.
|
|
574
|
+
*/
|
|
575
|
+
function receiptEpisodeOfSend(cliToolId, worktreeId, instanceId) {
|
|
576
|
+
return cliToolId === 'antigravity' ? (0, antigravity_receipt_episodes_1.getAntigravityAcceptedReceiptAt)(worktreeId, instanceId) : null;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* The hint for `antigravity-autoyes-withheld-no-hook-receipt` (Issue #3767):
|
|
580
|
+
* which of the withheld cases it was decides where to look.
|
|
581
|
+
*/
|
|
582
|
+
function noHookReceiptHint(verdict, now = Date.now()) {
|
|
583
|
+
const seconds = verdict.ageMs === null ? null : Math.round(verdict.ageMs / 1000);
|
|
584
|
+
// `lapsed` says how long ago, so from now: the line repeats once a minute.
|
|
585
|
+
const secondsAgo = verdict.lastReceiptAt === null ? null : Math.round((now - verdict.lastReceiptAt) / 1000);
|
|
586
|
+
switch (verdict.cause) {
|
|
587
|
+
case 'never':
|
|
588
|
+
return 'hook の受信が一度も無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認';
|
|
589
|
+
case 'late':
|
|
590
|
+
return `最後の受信から ${seconds} 秒後に確認が出た(窓 ${antigravity_permission_receipts_1.ANTIGRAVITY_PERMISSION_RECEIPT_WINDOW_MS / 1000} 秒の外)ため答えなかった。人が答える(auto-yes --disable → prompt --json → respond --expect-screen)。続くなら ~/.gemini/config/hooks.json の向き先(#2622)も確認`;
|
|
591
|
+
case 'lapsed':
|
|
592
|
+
return `最後の受信は ${secondsAgo} 秒前で途絶えている(hook が届かなくなった)。hooks.json の向き先(#2622)と agy の再起動を確認`;
|
|
593
|
+
case 'predates':
|
|
594
|
+
return '確認は最後の受信より前から画面に出ていた(引用か別の確認)ため答えなかった。人が答える';
|
|
595
|
+
case 'used':
|
|
596
|
+
return '最後の受信は直前の確認に使い済み。この確認に対する受信は無いため答えなかった。人が答える';
|
|
597
|
+
case 'outlived':
|
|
598
|
+
if (verdict.answerInterrupted === true) {
|
|
599
|
+
return `Auto-Yes が最後の受信の確認へ答えを送る途中で送信が止まり(キーの一部が入力に残っている可能性がある)、${antigravity_receipt_episodes_1.ANTIGRAVITY_ANSWERED_DIALOG_GRACE_MS / 1000} 秒を過ぎても確認が画面に残っている。未使用の受信が無いため、もう一度は答えない。人が答える(auto-yes --disable → prompt --json → respond --expect-screen)`;
|
|
600
|
+
}
|
|
601
|
+
return `Auto-Yes が最後の受信の確認へキーを送ってから ${antigravity_receipt_episodes_1.ANTIGRAVITY_ANSWERED_DIALOG_GRACE_MS / 1000} 秒を過ぎても、確認が画面に残っている。キーで確認が閉じなかったか、新しい受信の無い別の確認と入れ替わった(画面からは区別できない)。未使用の受信が無いため、もう一度は答えない。人が答える(auto-yes --disable → prompt --json → respond --expect-screen)`;
|
|
602
|
+
default:
|
|
603
|
+
return 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認';
|
|
604
|
+
}
|
|
605
|
+
}
|
|
420
606
|
/**
|
|
421
607
|
* The audit row's `answer` for the Enter (Issue #3397): not a digit, so the
|
|
422
608
|
* History reads as "Auto-Yes pressed Enter" rather than as a chosen option.
|
|
@@ -577,12 +763,20 @@ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput,
|
|
|
577
763
|
});
|
|
578
764
|
return false;
|
|
579
765
|
}
|
|
766
|
+
const receiptEpisode = receiptEpisodeOfSend(cliToolId, worktreeId, instanceId);
|
|
580
767
|
try {
|
|
581
768
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
582
769
|
}
|
|
770
|
+
catch (error) {
|
|
771
|
+
// Issue #3796: the Enter may or may not have reached the pane.
|
|
772
|
+
noteAnswerSent(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
773
|
+
throw error;
|
|
774
|
+
}
|
|
583
775
|
finally {
|
|
584
776
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
585
777
|
}
|
|
778
|
+
// Issue #3796 review E: the Enter is out — for the episode it began for only.
|
|
779
|
+
noteAnswerSent(cliToolId, worktreeId, instanceId, false, receiptEpisode);
|
|
586
780
|
// Issue #3706: the Enter is out, but the per-screen record is the CURRENT
|
|
587
781
|
// session's: when the poller was stopped (the record was forgotten with it)
|
|
588
782
|
// or a new session began while `send-keys` was awaited, the return of this
|
|
@@ -643,7 +837,19 @@ async function finishAnsweredPrompt(prompt, promptDetection, answer, generation)
|
|
|
643
837
|
pollerState.lastAnsweredAt = Date.now();
|
|
644
838
|
pollerState.lastSkipWarnKey = null;
|
|
645
839
|
}
|
|
646
|
-
|
|
840
|
+
// Issue #3748: what was answered and with what — the question (cut to
|
|
841
|
+
// MAX_LOGGED_QUESTION_LENGTH, never the full text) and the answer sent (the
|
|
842
|
+
// option number, `y`, or `[Enter]`) — so an answer that should not have been
|
|
843
|
+
// given can be told from the log alone.
|
|
844
|
+
logger.info('poller:response-sent', {
|
|
845
|
+
worktreeId,
|
|
846
|
+
cliToolId,
|
|
847
|
+
instanceId,
|
|
848
|
+
sameSession,
|
|
849
|
+
promptType: promptData.type,
|
|
850
|
+
question: (0, auto_yes_prompt_suppression_1.truncateForLog)(promptData.question),
|
|
851
|
+
answer,
|
|
852
|
+
});
|
|
647
853
|
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
648
854
|
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
649
855
|
// answer. No-ops when this instance is not running a contract.
|
|
@@ -730,6 +936,10 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
730
936
|
// Issue #3706 / #3713: the send in flight, settled without an await once it
|
|
731
937
|
// comes back — as a partial answer when it was stopped with keys on the pane.
|
|
732
938
|
let attempt = null;
|
|
939
|
+
// Issue #3796: `sendPromptAnswer` began and has not returned — a throw now cut
|
|
940
|
+
// the send short, and the agy receipt gate is told so (`noteAnswerSent`).
|
|
941
|
+
let sendInFlight = false;
|
|
942
|
+
let receiptEpisode = null;
|
|
733
943
|
try {
|
|
734
944
|
// 1. Detect prompt.
|
|
735
945
|
//
|
|
@@ -786,13 +996,27 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
786
996
|
// makes "the status chain and Auto-Yes read the same live region" a fact
|
|
787
997
|
// rather than a hope: there is no second normalisation to disagree with.
|
|
788
998
|
const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
|
|
999
|
+
// Issue #3767: bracket the read so the receipt gate can tell when an agy
|
|
1000
|
+
// dialog first appeared, not only what time this tick is.
|
|
1001
|
+
if (cliToolId === 'antigravity')
|
|
1002
|
+
(0, antigravity_receipt_episodes_1.beginAntigravityFrameRead)(worktreeId, instanceId);
|
|
789
1003
|
const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
|
|
1004
|
+
if (cliToolId === 'antigravity')
|
|
1005
|
+
(0, antigravity_receipt_episodes_1.endAntigravityFrameRead)(worktreeId, instanceId);
|
|
790
1006
|
if (!promptDetection.isPrompt || !promptDetection.promptData) {
|
|
791
1007
|
(0, auto_yes_poller_state_1.forgetPartialAnswer)(compositeKey);
|
|
792
1008
|
pollerState.lastAnsweredPromptKey = null;
|
|
793
1009
|
pollerState.lastAnsweredAt = null;
|
|
794
|
-
pollerState.lastSkipWarnKey = null;
|
|
795
1010
|
pollerState.enterFallbackCandidateKey = null;
|
|
1011
|
+
// Issue #3757: agy's trust screen reads as no prompt (unnumbered: neither
|
|
1012
|
+
// reader takes it), but it is one nobody here answers — record why, still
|
|
1013
|
+
// as `no_prompt`. Before the warn key is cleared, so the WARN stays once
|
|
1014
|
+
// per screen.
|
|
1015
|
+
if (cliToolId === 'antigravity' &&
|
|
1016
|
+
(0, auto_yes_prompt_suppression_1.suppressAntigravityTrustScreen)(worktreeId, instanceId, pollerState, frame, manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId))) {
|
|
1017
|
+
return 'no_prompt';
|
|
1018
|
+
}
|
|
1019
|
+
pollerState.lastSkipWarnKey = null;
|
|
796
1020
|
if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
|
|
797
1021
|
logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
|
|
798
1022
|
}
|
|
@@ -857,9 +1081,10 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
857
1081
|
// 3.6. Issue #3397: a refused frame may be a choice screen CommandMate
|
|
858
1082
|
// cannot read; with Auto-Yes on it gets one Enter. See `tryEnterFallback`.
|
|
859
1083
|
if (notOurs.kind === 'dialog-gate-refused') {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
1084
|
+
if (!(await tryEnterFallback(judged, promptDetection, notOurs.dialogGate, rawOutput, generation))) {
|
|
1085
|
+
return 'no_answer';
|
|
1086
|
+
}
|
|
1087
|
+
return 'responded';
|
|
863
1088
|
}
|
|
864
1089
|
// 4. Resolve auto answer under the execution contract's policy (Issue #1547).
|
|
865
1090
|
// Auto-Yes reads the frame itself instead of going through status-detector
|
|
@@ -910,6 +1135,8 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
910
1135
|
return 'no_answer';
|
|
911
1136
|
}
|
|
912
1137
|
attempt = (0, auto_yes_poller_state_1.beginSendAttempt)(compositeKey, screenKey, generation?.sessionEpoch ?? epoch);
|
|
1138
|
+
receiptEpisode = receiptEpisodeOfSend(cliToolId, worktreeId, instanceId);
|
|
1139
|
+
sendInFlight = true;
|
|
913
1140
|
try {
|
|
914
1141
|
await (0, prompt_answer_sender_1.sendPromptAnswer)({
|
|
915
1142
|
sessionName,
|
|
@@ -923,7 +1150,10 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
923
1150
|
finally {
|
|
924
1151
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
925
1152
|
}
|
|
1153
|
+
sendInFlight = false;
|
|
926
1154
|
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, false);
|
|
1155
|
+
// Issue #3796 review E: the episode the send began for, as on the failure side.
|
|
1156
|
+
noteAnswerSent(cliToolId, worktreeId, instanceId, false, receiptEpisode);
|
|
927
1157
|
// 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
|
|
928
1158
|
await finishAnsweredPrompt(judged, promptDetection, answer, generation);
|
|
929
1159
|
return 'responded';
|
|
@@ -939,11 +1169,15 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
939
1169
|
// it is now — the new one when a worktree ID move carried it (#3713).
|
|
940
1170
|
if (attempt !== null)
|
|
941
1171
|
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, keysSent === true);
|
|
1172
|
+
if (sendInFlight)
|
|
1173
|
+
noteAnswerSent(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
942
1174
|
logger.info('poller:auto-yes-answer-abandoned', { worktreeId, cliToolId, instanceId, keysSent });
|
|
943
1175
|
return 'no_answer';
|
|
944
1176
|
}
|
|
945
1177
|
if (attempt !== null)
|
|
946
1178
|
(0, auto_yes_poller_state_1.settleSendAttempt)(attempt, false);
|
|
1179
|
+
if (sendInFlight)
|
|
1180
|
+
noteAnswerSent(cliToolId, worktreeId, instanceId, true, receiptEpisode);
|
|
947
1181
|
incrementErrorCount(compositeKey, generation?.pollerState);
|
|
948
1182
|
logger.warn('poller:detect-respond-error', { worktreeId, cliToolId, instanceId });
|
|
949
1183
|
return 'error';
|
|
@@ -982,6 +1216,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
982
1216
|
sessionEpoch: (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(compositeKey),
|
|
983
1217
|
startedAt: Date.now(),
|
|
984
1218
|
};
|
|
1219
|
+
// Issue #3796: this is the session wait's tick (it was scheduled as one) —
|
|
1220
|
+
// recorded before anything can fail, for the push gate.
|
|
1221
|
+
if (pollerState.sessionWaitTickAt !== undefined)
|
|
1222
|
+
pollerState.sessionWaitTickRanAt = generation.startedAt;
|
|
985
1223
|
try {
|
|
986
1224
|
// 2. Capture and clean output
|
|
987
1225
|
const captureLines = grant.stopPattern
|
|
@@ -998,6 +1236,8 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
998
1236
|
}
|
|
999
1237
|
if (pollerState.waitingForSession) {
|
|
1000
1238
|
pollerState.waitingForSession = false;
|
|
1239
|
+
// Issue #3796: the session wait's tick ran here — read by the push gate.
|
|
1240
|
+
pollerState.sessionAppearedAt = generation.startedAt;
|
|
1001
1241
|
logger.info('poller:session-appeared', { worktreeId, cliToolId, instanceId });
|
|
1002
1242
|
}
|
|
1003
1243
|
const lines = cleanOutput.split('\n');
|
|
@@ -1046,7 +1286,7 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId, owner) {
|
|
|
1046
1286
|
pollerState.waitingForSession = true;
|
|
1047
1287
|
logger.info('poller:waiting-for-session', { worktreeId, cliToolId, instanceId });
|
|
1048
1288
|
}
|
|
1049
|
-
scheduleNextPoll(generation, auto_yes_state_1.MAX_BACKOFF_MS);
|
|
1289
|
+
scheduleNextPoll(generation, auto_yes_state_1.MAX_BACKOFF_MS, { sessionWait: true });
|
|
1050
1290
|
return;
|
|
1051
1291
|
}
|
|
1052
1292
|
incrementErrorCount(compositeKey, generation.pollerState);
|
|
@@ -1077,15 +1317,70 @@ async function isSessionMissing(worktreeId, cliToolId, instanceId) {
|
|
|
1077
1317
|
*
|
|
1078
1318
|
* @param generation - The tick's generation
|
|
1079
1319
|
* @param overrideInterval - Optional override for the next poll delay
|
|
1320
|
+
* @param options.sessionWait - The tick waits for a session to appear (Issue #3791)
|
|
1080
1321
|
*/
|
|
1081
|
-
function scheduleNextPoll(generation, overrideInterval) {
|
|
1322
|
+
function scheduleNextPoll(generation, overrideInterval, options = {}) {
|
|
1082
1323
|
if (!isPollerCurrent(generation))
|
|
1083
1324
|
return;
|
|
1084
1325
|
const { worktreeId, cliToolId, instanceId, pollerState } = generation;
|
|
1085
1326
|
const interval = Math.max(overrideInterval ?? pollerState.currentInterval, auto_yes_state_1.POLLING_INTERVAL_MS);
|
|
1086
|
-
|
|
1327
|
+
// Issue #3791: only the session wait's tick is one the push gate waits for.
|
|
1328
|
+
pollerState.sessionWaitTickAt = options.sessionWait === true ? Date.now() + interval : undefined;
|
|
1329
|
+
// Issue #3796: any new timer supersedes the previous one's wake.
|
|
1330
|
+
dropSessionWaitWake(generation.compositeKey);
|
|
1331
|
+
const timerId = setTimeout(() => {
|
|
1332
|
+
dropSessionWaitWake(generation.compositeKey, timerId);
|
|
1087
1333
|
void pollAutoYes(worktreeId, cliToolId, instanceId, pollerState);
|
|
1088
1334
|
}, interval);
|
|
1335
|
+
pollerState.timerId = timerId;
|
|
1336
|
+
if (options.sessionWait === true)
|
|
1337
|
+
armSessionWaitWake(generation, timerId);
|
|
1338
|
+
}
|
|
1339
|
+
/** compositeKey -> the pending session-wait tick's wake. At most one per poller key. */
|
|
1340
|
+
const sessionWaitWakes = (0, global_state_1.getOrInitGlobal)('__autoYesSessionWaitWakes', () => new Map());
|
|
1341
|
+
/**
|
|
1342
|
+
* Stop listening for the session of `compositeKey` (Issue #3796).
|
|
1343
|
+
*
|
|
1344
|
+
* @param timerId - Only when the wake is this timer's: the timer firing drops
|
|
1345
|
+
* its own wake, never a successor's
|
|
1346
|
+
*/
|
|
1347
|
+
function dropSessionWaitWake(compositeKey, timerId) {
|
|
1348
|
+
const wake = sessionWaitWakes.get(compositeKey);
|
|
1349
|
+
if (wake === undefined || (timerId !== undefined && wake.timerId !== timerId))
|
|
1350
|
+
return;
|
|
1351
|
+
sessionWaitWakes.delete(compositeKey);
|
|
1352
|
+
wake.unsubscribe();
|
|
1353
|
+
}
|
|
1354
|
+
/**
|
|
1355
|
+
* Issue #3796: while the poller waits `MAX_BACKOFF_MS` for its session, the
|
|
1356
|
+
* session's creation brings the tick forward to a poll interval — so the first
|
|
1357
|
+
* prompt of a session started right after the poller looked (`send --auto-yes`
|
|
1358
|
+
* enables Auto-Yes before the session exists) is answered, or its human
|
|
1359
|
+
* notified, without waiting out the backoff. The push gate's hold follows the
|
|
1360
|
+
* earlier tick (`autoYesHoldEndsAt`).
|
|
1361
|
+
*
|
|
1362
|
+
* The wake replaces the pending timer and nothing else: it does nothing once
|
|
1363
|
+
* that timer fired (the tick drops the wake before it runs, so a tick in flight
|
|
1364
|
+
* is never doubled), once another timer replaced it, or once the poller was
|
|
1365
|
+
* stopped or replaced (`stopAutoYesPolling` drops it, and `scheduleNextPoll`
|
|
1366
|
+
* checks the poller is still the generation's).
|
|
1367
|
+
*/
|
|
1368
|
+
function armSessionWaitWake(generation, timerId) {
|
|
1369
|
+
const { compositeKey, worktreeId, cliToolId, instanceId, pollerState } = generation;
|
|
1370
|
+
const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
|
|
1371
|
+
const unsubscribe = (0, session_created_signal_1.onTmuxSessionCreated)(sessionName, () => {
|
|
1372
|
+
const wake = sessionWaitWakes.get(compositeKey);
|
|
1373
|
+
if (wake === undefined || wake.timerId !== timerId)
|
|
1374
|
+
return;
|
|
1375
|
+
sessionWaitWakes.delete(compositeKey);
|
|
1376
|
+
if (!isPollerCurrent(generation) || pollerState.timerId !== timerId)
|
|
1377
|
+
return;
|
|
1378
|
+
clearTimeout(timerId);
|
|
1379
|
+
logger.info('poller:session-created-wake', { worktreeId, cliToolId, instanceId });
|
|
1380
|
+
// Still the session wait's tick — the one the push gate's hold is about.
|
|
1381
|
+
scheduleNextPoll(generation, auto_yes_state_1.POLLING_INTERVAL_MS, { sessionWait: true });
|
|
1382
|
+
});
|
|
1383
|
+
sessionWaitWakes.set(compositeKey, { timerId, unsubscribe });
|
|
1089
1384
|
}
|
|
1090
1385
|
// =============================================================================
|
|
1091
1386
|
// Public Poller API
|
|
@@ -1109,6 +1404,11 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1109
1404
|
}
|
|
1110
1405
|
// Resolve the effective instance ID (primary === cliToolId).
|
|
1111
1406
|
const effectiveInstanceId = instanceId ?? cliToolId;
|
|
1407
|
+
// Issue #3730: nothing starts once a shutdown has recorded what it releases —
|
|
1408
|
+
// a poller started after the record would be a grant the record never saw.
|
|
1409
|
+
if ((0, auto_yes_state_1.isAutoYesShutdownStarted)()) {
|
|
1410
|
+
return { started: false, reason: 'server shutting down' };
|
|
1411
|
+
}
|
|
1112
1412
|
// Check if auto-yes is enabled
|
|
1113
1413
|
const autoYesState = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, effectiveInstanceId);
|
|
1114
1414
|
if (!autoYesState?.enabled) {
|
|
@@ -1127,7 +1427,7 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1127
1427
|
}
|
|
1128
1428
|
// Stop existing poller if cliToolId changed
|
|
1129
1429
|
if (existingPollerState) {
|
|
1130
|
-
stopAutoYesPolling(compositeKey);
|
|
1430
|
+
stopAutoYesPolling(compositeKey, 'replaced');
|
|
1131
1431
|
}
|
|
1132
1432
|
// Create new poller state
|
|
1133
1433
|
const pollerState = {
|
|
@@ -1157,9 +1457,16 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
1157
1457
|
*
|
|
1158
1458
|
* Issue #525: Changed from (worktreeId) to (compositeKey).
|
|
1159
1459
|
*
|
|
1460
|
+
* Issue #3730: `reason` is why the POLLER stops, logged on `poller:stopped`. It
|
|
1461
|
+
* does not touch the grant: an ID move and a replacement stop the poller and
|
|
1462
|
+
* keep the grant, so disabling stays each caller's own decision. Omitted, the
|
|
1463
|
+
* reason of an enclosing {@link withPollerStopReason} applies (the lifecycle
|
|
1464
|
+
* table's path), else `unspecified`.
|
|
1465
|
+
*
|
|
1160
1466
|
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
1467
|
+
* @param reason - Why the poller stops
|
|
1161
1468
|
*/
|
|
1162
|
-
function stopAutoYesPolling(compositeKey) {
|
|
1469
|
+
function stopAutoYesPolling(compositeKey, reason) {
|
|
1163
1470
|
// Issue #3397: before the early return — the disable route and the session
|
|
1164
1471
|
// cleanup call this for an instance whose poller may already be gone, and the
|
|
1165
1472
|
// Enter record must not outlive the grant or the session either way.
|
|
@@ -1170,20 +1477,28 @@ function stopAutoYesPolling(compositeKey) {
|
|
|
1170
1477
|
if (pollerState.timerId) {
|
|
1171
1478
|
clearTimeout(pollerState.timerId);
|
|
1172
1479
|
}
|
|
1480
|
+
dropSessionWaitWake(compositeKey);
|
|
1173
1481
|
autoYesPollerStates.delete(compositeKey);
|
|
1174
1482
|
(0, auto_yes_policy_1.invalidateSessionAutoYesPolicy)(compositeKey);
|
|
1175
|
-
logger.info('poller:stopped', { compositeKey });
|
|
1483
|
+
logger.info('poller:stopped', { compositeKey, reason: (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(reason, 'unspecified') });
|
|
1176
1484
|
}
|
|
1177
1485
|
/**
|
|
1178
1486
|
* Stop all server-side auto-yes polling (graceful shutdown).
|
|
1487
|
+
*
|
|
1488
|
+
* Issue #3730: logs `shutdown` unless an enclosing
|
|
1489
|
+
* {@link withPollerStopReason} says otherwise (the test reset). Writes nothing
|
|
1490
|
+
* to disk: the record of the grants a shutdown released is the server's to
|
|
1491
|
+
* make (`lib/auto-yes-shutdown-record`), never a side effect of this.
|
|
1179
1492
|
*/
|
|
1180
1493
|
function stopAllAutoYesPolling() {
|
|
1494
|
+
const reason = (0, auto_yes_poller_stop_reason_1.resolvePollerStopReason)(undefined, 'shutdown');
|
|
1181
1495
|
for (const [key, pollerState] of autoYesPollerStates.entries()) {
|
|
1182
1496
|
if (pollerState.timerId) {
|
|
1183
1497
|
clearTimeout(pollerState.timerId);
|
|
1184
1498
|
}
|
|
1499
|
+
dropSessionWaitWake(key);
|
|
1185
1500
|
(0, auto_yes_policy_1.invalidateSessionAutoYesPolicy)(key);
|
|
1186
|
-
logger.info('poller:stopped', { compositeKey: key, reason
|
|
1501
|
+
logger.info('poller:stopped', { compositeKey: key, reason });
|
|
1187
1502
|
}
|
|
1188
1503
|
autoYesPollerStates.clear();
|
|
1189
1504
|
(0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
|
|
@@ -1207,6 +1522,7 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
1207
1522
|
* [SF-001] Uses shared filterCompositeKeysByWorktree (DRY).
|
|
1208
1523
|
*
|
|
1209
1524
|
* @param worktreeId - Worktree identifier
|
|
1525
|
+
* @param options.reason - Issue #3730: why the pollers stop, for `poller:stopped`
|
|
1210
1526
|
* @param options.keepPartialAnswers - Issue #3713 (re-instruction 1, P2-1): the
|
|
1211
1527
|
* disable route's "every agent" passes it — a disable, like one agent's
|
|
1212
1528
|
* `stopAutoYesPolling`, keeps the memory of an answer stopped part-way and
|
|
@@ -1216,7 +1532,8 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
1216
1532
|
*/
|
|
1217
1533
|
function stopAutoYesPollingByWorktree(worktreeId, options) {
|
|
1218
1534
|
const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
|
|
1219
|
-
|
|
1535
|
+
// Issue #3730: `options.reason`, else the enclosing scope's (the lifecycle table).
|
|
1536
|
+
pollerKeys.forEach(key => stopAutoYesPolling(key, options?.reason));
|
|
1220
1537
|
// Issue #3397: and the records of instances whose poller had already stopped.
|
|
1221
1538
|
(0, auto_yes_enter_fallback_1.forgetEnterFallbacksByWorktree)(worktreeId);
|
|
1222
1539
|
if (!options?.keepPartialAnswers)
|