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
|
@@ -533,6 +533,135 @@ function splitPollerKey(pollerKey) {
|
|
|
533
533
|
instanceId: pollerKey.slice(separatorIndex + 1),
|
|
534
534
|
};
|
|
535
535
|
}
|
|
536
|
+
/** Old worktree ID -> new worktree ID, skipping empty and no-op pairs. */
|
|
537
|
+
function collectRenameTargets(renames) {
|
|
538
|
+
const targets = new Map();
|
|
539
|
+
for (const { oldId, newId } of renames) {
|
|
540
|
+
if (!oldId || !newId || oldId === newId)
|
|
541
|
+
continue;
|
|
542
|
+
targets.set(oldId, newId);
|
|
543
|
+
}
|
|
544
|
+
return targets;
|
|
545
|
+
}
|
|
546
|
+
/** Sort every running poller under a renamed ID into a move or an abandoned stop. */
|
|
547
|
+
function planRunningPollerMoves(targets, resolveCliToolId) {
|
|
548
|
+
const moves = [];
|
|
549
|
+
const abandoned = [];
|
|
550
|
+
for (const pollerKey of Array.from(exports.activePollers.keys())) {
|
|
551
|
+
const parts = splitPollerKey(pollerKey);
|
|
552
|
+
if (!parts)
|
|
553
|
+
continue;
|
|
554
|
+
const newWorktreeId = targets.get(parts.worktreeId);
|
|
555
|
+
if (!newWorktreeId)
|
|
556
|
+
continue;
|
|
557
|
+
const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
|
|
558
|
+
if (!cliToolId) {
|
|
559
|
+
abandoned.push({ pollerKey, newWorktreeId });
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
562
|
+
moves.push({
|
|
563
|
+
oldKey: pollerKey,
|
|
564
|
+
newKey: getPollerKey(newWorktreeId, cliToolId, parts.instanceId),
|
|
565
|
+
newWorktreeId,
|
|
566
|
+
cliToolId,
|
|
567
|
+
instanceId: parts.instanceId,
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
return { moves, abandoned };
|
|
571
|
+
}
|
|
572
|
+
/** Phase 1 of the migration for the moved pollers (see the caller). */
|
|
573
|
+
function liftMovedPollers(moves, carried) {
|
|
574
|
+
for (const move of moves) {
|
|
575
|
+
const timerId = exports.activePollers.get(move.oldKey);
|
|
576
|
+
if (timerId)
|
|
577
|
+
clearTimeout(timerId);
|
|
578
|
+
exports.activePollers.delete(move.oldKey);
|
|
579
|
+
// Issue #2223: retire the ownership token as well. A tick that is inside
|
|
580
|
+
// `checkForResponse()` right now cannot be cancelled by `clearTimeout`, and
|
|
581
|
+
// without this it would resume, find its key gone and — before #2223 —
|
|
582
|
+
// still be able to act on the old worktree ID. Marked superseded rather
|
|
583
|
+
// than merely stopped: Phase 2 below arms a replacement chain, so the old
|
|
584
|
+
// tick's snapshot would land on top of the new one's.
|
|
585
|
+
const retired = coordinator.owners.get(move.oldKey);
|
|
586
|
+
if (retired) {
|
|
587
|
+
retired.superseded = true;
|
|
588
|
+
retired.stopped = true;
|
|
589
|
+
coordinator.owners.delete(move.oldKey);
|
|
590
|
+
}
|
|
591
|
+
coordinator.pendingRestart.delete(move.oldKey);
|
|
592
|
+
carried.set(move.newKey, { startedAt: exports.pollingStartTimes.get(move.oldKey) });
|
|
593
|
+
exports.pollingStartTimes.delete(move.oldKey);
|
|
594
|
+
(0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
/** The paused chains under a renamed ID, keyed old -> new (see the caller). */
|
|
598
|
+
function collectPausedMoves(targets) {
|
|
599
|
+
const pausedMoves = [];
|
|
600
|
+
for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
|
|
601
|
+
const parts = splitPollerKey(pollerKey);
|
|
602
|
+
if (!parts)
|
|
603
|
+
continue;
|
|
604
|
+
const newWorktreeId = targets.get(parts.worktreeId);
|
|
605
|
+
if (!newWorktreeId)
|
|
606
|
+
continue;
|
|
607
|
+
pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
|
|
608
|
+
}
|
|
609
|
+
return pausedMoves;
|
|
610
|
+
}
|
|
611
|
+
/** The held scrapes under a renamed ID, keyed old -> new (see the caller). */
|
|
612
|
+
function collectPendingMoves(targets, abandonedKeys) {
|
|
613
|
+
const pendingMoves = [];
|
|
614
|
+
for (const pollerKey of (0, pending_scraped_response_1.listPendingScrapedResponseKeys)()) {
|
|
615
|
+
if (abandonedKeys.has(pollerKey))
|
|
616
|
+
continue;
|
|
617
|
+
const parts = splitPollerKey(pollerKey);
|
|
618
|
+
if (!parts)
|
|
619
|
+
continue;
|
|
620
|
+
const newWorktreeId = targets.get(parts.worktreeId);
|
|
621
|
+
if (!newWorktreeId)
|
|
622
|
+
continue;
|
|
623
|
+
pendingMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}`, newWorktreeId });
|
|
624
|
+
}
|
|
625
|
+
return pendingMoves;
|
|
626
|
+
}
|
|
627
|
+
/** Stop the chains on destinations that no source vacates (see the caller). */
|
|
628
|
+
function stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys) {
|
|
629
|
+
const vacated = new Set([
|
|
630
|
+
...moves.map((move) => move.oldKey),
|
|
631
|
+
...pausedMoves.map((move) => move.oldKey),
|
|
632
|
+
...pendingMoves.map((move) => move.oldKey),
|
|
633
|
+
]);
|
|
634
|
+
// A held scrape moved on its own (no chain, no pause) changes the key's
|
|
635
|
+
// owner just the same, so its destination is handled alike (#3663 review).
|
|
636
|
+
const occupied = new Set([
|
|
637
|
+
...moves.map((move) => move.newKey),
|
|
638
|
+
...pausedMoves.map((move) => move.newKey),
|
|
639
|
+
...pendingMoves.map((move) => move.newKey),
|
|
640
|
+
]);
|
|
641
|
+
for (const pollerKey of occupied) {
|
|
642
|
+
if (vacated.has(pollerKey) || abandonedKeys.has(pollerKey))
|
|
643
|
+
continue;
|
|
644
|
+
const held = coordinator.owners.has(pollerKey) ||
|
|
645
|
+
exports.activePollers.has(pollerKey) ||
|
|
646
|
+
coordinator.pausedOnPrompt.has(pollerKey) ||
|
|
647
|
+
(0, pending_scraped_response_1.hasPendingScrapedResponse)(pollerKey);
|
|
648
|
+
if (!held)
|
|
649
|
+
continue;
|
|
650
|
+
stopPollingByKey(pollerKey);
|
|
651
|
+
logger.warn('poller:migrate-displaced', { pollerKey });
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
/** Phase 2 of the migration: restart each moved poller (see the caller). */
|
|
655
|
+
function restartMovedPollers(moves, carried) {
|
|
656
|
+
for (const move of moves) {
|
|
657
|
+
const startedAt = carried.get(move.newKey)?.startedAt;
|
|
658
|
+
exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
|
|
659
|
+
if (isFullScreenTui(move.cliToolId)) {
|
|
660
|
+
(0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
|
|
661
|
+
}
|
|
662
|
+
scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
536
665
|
/**
|
|
537
666
|
* Move every running response poller from a renamed worktree ID to the new one
|
|
538
667
|
* (Issue #1621 Phase 3).
|
|
@@ -585,36 +714,10 @@ function splitPollerKey(pollerKey) {
|
|
|
585
714
|
* @returns One entry per poller that was moved
|
|
586
715
|
*/
|
|
587
716
|
function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
588
|
-
const targets =
|
|
589
|
-
for (const { oldId, newId } of renames) {
|
|
590
|
-
if (!oldId || !newId || oldId === newId)
|
|
591
|
-
continue;
|
|
592
|
-
targets.set(oldId, newId);
|
|
593
|
-
}
|
|
717
|
+
const targets = collectRenameTargets(renames);
|
|
594
718
|
if (targets.size === 0)
|
|
595
719
|
return [];
|
|
596
|
-
const moves =
|
|
597
|
-
const abandoned = [];
|
|
598
|
-
for (const pollerKey of Array.from(exports.activePollers.keys())) {
|
|
599
|
-
const parts = splitPollerKey(pollerKey);
|
|
600
|
-
if (!parts)
|
|
601
|
-
continue;
|
|
602
|
-
const newWorktreeId = targets.get(parts.worktreeId);
|
|
603
|
-
if (!newWorktreeId)
|
|
604
|
-
continue;
|
|
605
|
-
const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
|
|
606
|
-
if (!cliToolId) {
|
|
607
|
-
abandoned.push({ pollerKey, newWorktreeId });
|
|
608
|
-
continue;
|
|
609
|
-
}
|
|
610
|
-
moves.push({
|
|
611
|
-
oldKey: pollerKey,
|
|
612
|
-
newKey: getPollerKey(newWorktreeId, cliToolId, parts.instanceId),
|
|
613
|
-
newWorktreeId,
|
|
614
|
-
cliToolId,
|
|
615
|
-
instanceId: parts.instanceId,
|
|
616
|
-
});
|
|
617
|
-
}
|
|
720
|
+
const { moves, abandoned } = planRunningPollerMoves(targets, resolveCliToolId);
|
|
618
721
|
// Phase 1: stop every affected timer and lift the state off the old keys.
|
|
619
722
|
// Done for the whole batch before any write so a swap cannot self-collide.
|
|
620
723
|
const carried = new Map();
|
|
@@ -628,28 +731,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
628
731
|
const inFlight = coordinator.running.get(move.oldKey);
|
|
629
732
|
return inFlight !== undefined && inFlight.owner === coordinator.owners.get(move.oldKey);
|
|
630
733
|
});
|
|
631
|
-
|
|
632
|
-
const timerId = exports.activePollers.get(move.oldKey);
|
|
633
|
-
if (timerId)
|
|
634
|
-
clearTimeout(timerId);
|
|
635
|
-
exports.activePollers.delete(move.oldKey);
|
|
636
|
-
// Issue #2223: retire the ownership token as well. A tick that is inside
|
|
637
|
-
// `checkForResponse()` right now cannot be cancelled by `clearTimeout`, and
|
|
638
|
-
// without this it would resume, find its key gone and — before #2223 —
|
|
639
|
-
// still be able to act on the old worktree ID. Marked superseded rather
|
|
640
|
-
// than merely stopped: Phase 2 below arms a replacement chain, so the old
|
|
641
|
-
// tick's snapshot would land on top of the new one's.
|
|
642
|
-
const retired = coordinator.owners.get(move.oldKey);
|
|
643
|
-
if (retired) {
|
|
644
|
-
retired.superseded = true;
|
|
645
|
-
retired.stopped = true;
|
|
646
|
-
coordinator.owners.delete(move.oldKey);
|
|
647
|
-
}
|
|
648
|
-
coordinator.pendingRestart.delete(move.oldKey);
|
|
649
|
-
carried.set(move.newKey, { startedAt: exports.pollingStartTimes.get(move.oldKey) });
|
|
650
|
-
exports.pollingStartTimes.delete(move.oldKey);
|
|
651
|
-
(0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
|
|
652
|
-
}
|
|
734
|
+
liftMovedPollers(moves, carried);
|
|
653
735
|
// Stop the abandoned pollers before any dedup state is written: the stop
|
|
654
736
|
// clears every cache under its key, and that key can be the destination of
|
|
655
737
|
// another move in this batch (A:x paused → B:x while B:x is abandoned).
|
|
@@ -670,31 +752,11 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
670
752
|
// never see it — but it is holding the response hash for the turn it paused
|
|
671
753
|
// on, and `/respond` will resume it under the NEW ID. Move the hash and the
|
|
672
754
|
// pause mark with it; the chain itself stays paused until that resume.
|
|
673
|
-
const pausedMoves =
|
|
674
|
-
for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
|
|
675
|
-
const parts = splitPollerKey(pollerKey);
|
|
676
|
-
if (!parts)
|
|
677
|
-
continue;
|
|
678
|
-
const newWorktreeId = targets.get(parts.worktreeId);
|
|
679
|
-
if (!newWorktreeId)
|
|
680
|
-
continue;
|
|
681
|
-
pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
|
|
682
|
-
}
|
|
755
|
+
const pausedMoves = collectPausedMoves(targets);
|
|
683
756
|
// Issue #3663: every held scrape under a renamed worktree ID moves — a
|
|
684
757
|
// running chain's, a paused chain's, and one whose chain is already gone.
|
|
685
758
|
// The abandoned ones were written above and are no longer held.
|
|
686
|
-
const pendingMoves =
|
|
687
|
-
for (const pollerKey of (0, pending_scraped_response_1.listPendingScrapedResponseKeys)()) {
|
|
688
|
-
if (abandonedKeys.has(pollerKey))
|
|
689
|
-
continue;
|
|
690
|
-
const parts = splitPollerKey(pollerKey);
|
|
691
|
-
if (!parts)
|
|
692
|
-
continue;
|
|
693
|
-
const newWorktreeId = targets.get(parts.worktreeId);
|
|
694
|
-
if (!newWorktreeId)
|
|
695
|
-
continue;
|
|
696
|
-
pendingMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}`, newWorktreeId });
|
|
697
|
-
}
|
|
759
|
+
const pendingMoves = collectPendingMoves(targets, abandonedKeys);
|
|
698
760
|
// Issue #3663: a destination a chain (running or paused) moves onto, that no
|
|
699
761
|
// source of this batch vacates, may already be held by another chain — B:x
|
|
700
762
|
// running while A:x moves to B:x. That chain loses the key, so it is stopped
|
|
@@ -703,30 +765,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
703
765
|
// no longer hold or drop anything, and its caches are cleared before the
|
|
704
766
|
// moved state is written. A destination nothing is on is left alone, and so
|
|
705
767
|
// is every other instance of the destination worktree.
|
|
706
|
-
|
|
707
|
-
...moves.map((move) => move.oldKey),
|
|
708
|
-
...pausedMoves.map((move) => move.oldKey),
|
|
709
|
-
...pendingMoves.map((move) => move.oldKey),
|
|
710
|
-
]);
|
|
711
|
-
// A held scrape moved on its own (no chain, no pause) changes the key's
|
|
712
|
-
// owner just the same, so its destination is handled alike (#3663 review).
|
|
713
|
-
const occupied = new Set([
|
|
714
|
-
...moves.map((move) => move.newKey),
|
|
715
|
-
...pausedMoves.map((move) => move.newKey),
|
|
716
|
-
...pendingMoves.map((move) => move.newKey),
|
|
717
|
-
]);
|
|
718
|
-
for (const pollerKey of occupied) {
|
|
719
|
-
if (vacated.has(pollerKey) || abandonedKeys.has(pollerKey))
|
|
720
|
-
continue;
|
|
721
|
-
const held = coordinator.owners.has(pollerKey) ||
|
|
722
|
-
exports.activePollers.has(pollerKey) ||
|
|
723
|
-
coordinator.pausedOnPrompt.has(pollerKey) ||
|
|
724
|
-
(0, pending_scraped_response_1.hasPendingScrapedResponse)(pollerKey);
|
|
725
|
-
if (!held)
|
|
726
|
-
continue;
|
|
727
|
-
stopPollingByKey(pollerKey);
|
|
728
|
-
logger.warn('poller:migrate-displaced', { pollerKey });
|
|
729
|
-
}
|
|
768
|
+
stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys);
|
|
730
769
|
// Issue #3553: the dedup state of the whole batch moves in one call per map
|
|
731
770
|
// family, each lifting every source before writing any destination. Re-keyed
|
|
732
771
|
// pair by pair, a swap left A with its own state and B empty.
|
|
@@ -766,14 +805,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
|
|
|
766
805
|
: [];
|
|
767
806
|
}));
|
|
768
807
|
// Phase 2: restart each poller under its new identity.
|
|
769
|
-
|
|
770
|
-
const startedAt = carried.get(move.newKey)?.startedAt;
|
|
771
|
-
exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
|
|
772
|
-
if (isFullScreenTui(move.cliToolId)) {
|
|
773
|
-
(0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
|
|
774
|
-
}
|
|
775
|
-
scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
776
|
-
}
|
|
808
|
+
restartMovedPollers(moves, carried);
|
|
777
809
|
// Issue #2230: the pause marks of the chains collected above follow their
|
|
778
810
|
// hashes (moved with the batch). All removed before any is added, for the
|
|
779
811
|
// same swap reason.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The screen kinds a prompt observation publishes (Issue #3755, #3746 A-3).
|
|
4
|
+
*
|
|
5
|
+
* ## Why a vocabulary of its own
|
|
6
|
+
*
|
|
7
|
+
* `promptData.type` (`yes_no` / `multiple_choice` / `unclassified`) says how a
|
|
8
|
+
* parsed prompt is answered, and agy's status detector
|
|
9
|
+
* (`detection/tools/antigravity/detect.ts`) publishes the folder-trust screen,
|
|
10
|
+
* the `/model` picker and the slash popup under ONE reason
|
|
11
|
+
* (`antigravity_selection_list`). Neither can say "this is the trust screen and
|
|
12
|
+
* not the picker", which is exactly what a caller about to answer one of them
|
|
13
|
+
* has to be sure of (#3746 P4-1). So the values a caller may branch on — and
|
|
14
|
+
* that the strict `respond` (#3756) may make a send condition — live here, and
|
|
15
|
+
* are never mixed into `promptData.type` or read back from the detector's
|
|
16
|
+
* reason.
|
|
17
|
+
*
|
|
18
|
+
* A kind is added only for a screen whose reading is pinned to a measured
|
|
19
|
+
* frame. Everything else that waits on a human is `unknown`: an unmeasured
|
|
20
|
+
* screen must not borrow a measured screen's name.
|
|
21
|
+
*
|
|
22
|
+
* ## No imports, on purpose
|
|
23
|
+
*
|
|
24
|
+
* The CLI (`tsconfig.cli.json`) compiles with `"paths": {}` and reaches a
|
|
25
|
+
* module under `src/lib` only by a relative path whose graph uses no `@/`
|
|
26
|
+
* alias (the arrangement `lib/session/prompt-view` documents). `prompt` and
|
|
27
|
+
* `wait` import these values from here rather than restating them.
|
|
28
|
+
*
|
|
29
|
+
* @module lib/prompt-observation/kinds
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.EXITING_STRICT_ANSWERS = exports.UNNUMBERED_STRICT_RESPOND_KINDS = exports.STRICT_RESPOND_KINDS = exports.NO_PROMPT_OBSERVATION_KINDS = exports.PROMPT_OBSERVATION_KINDS = exports.PROMPT_OBSERVATION_SCHEMA_VERSION = void 0;
|
|
33
|
+
exports.isPromptObservationKind = isPromptObservationKind;
|
|
34
|
+
exports.isDecisionKind = isDecisionKind;
|
|
35
|
+
exports.isStrictRespondKind = isStrictRespondKind;
|
|
36
|
+
exports.isExitingStrictAnswer = isExitingStrictAnswer;
|
|
37
|
+
/** `schemaVersion` of the observation payload. Bumped when a field changes meaning. */
|
|
38
|
+
exports.PROMPT_OBSERVATION_SCHEMA_VERSION = 1;
|
|
39
|
+
/**
|
|
40
|
+
* Every kind an observation can publish.
|
|
41
|
+
*
|
|
42
|
+
* - `antigravity-trust` — agy's first-run folder trust screen (`Do you trust
|
|
43
|
+
* the contents of this project?` over `> Yes, I trust this folder` /
|
|
44
|
+
* `No, exit`). Unnumbered; Enter confirms the highlighted row.
|
|
45
|
+
* - `antigravity-model-picker` — agy's `/model` picker (`Switch Model`): the
|
|
46
|
+
* 1.1.27 layout (`antigravity-live-2364/picker-switch-model.txt`) and the
|
|
47
|
+
* 1.4 one with a search box (`prompt-observation-3797/`, Issue #3797).
|
|
48
|
+
* - `antigravity-permission` — agy's numbered permission dialog (command
|
|
49
|
+
* execution, file creation; `tests/fixtures/antigravity-live-2364/dialog-*`),
|
|
50
|
+
* ending on its `tab Amend` footer. agy's numbered login-method screen is
|
|
51
|
+
* not one (`unknown`).
|
|
52
|
+
* - `antigravity-slash-menu` — agy's slash-command popup.
|
|
53
|
+
* - `composer` — no confirmation: the agent sits at its input box.
|
|
54
|
+
* - `none` — no confirmation, and not at the input box either (working).
|
|
55
|
+
* - `unknown` — something waits on a human and no measured reading names it.
|
|
56
|
+
*/
|
|
57
|
+
exports.PROMPT_OBSERVATION_KINDS = [
|
|
58
|
+
'antigravity-trust',
|
|
59
|
+
'antigravity-model-picker',
|
|
60
|
+
'antigravity-permission',
|
|
61
|
+
'antigravity-slash-menu',
|
|
62
|
+
'composer',
|
|
63
|
+
'none',
|
|
64
|
+
'unknown',
|
|
65
|
+
];
|
|
66
|
+
/** The two kinds that mean "nothing on screen is asking for a decision". */
|
|
67
|
+
exports.NO_PROMPT_OBSERVATION_KINDS = ['composer', 'none'];
|
|
68
|
+
/** Whether `value` is one of {@link PROMPT_OBSERVATION_KINDS}. */
|
|
69
|
+
function isPromptObservationKind(value) {
|
|
70
|
+
return typeof value === 'string' && exports.PROMPT_OBSERVATION_KINDS.includes(value);
|
|
71
|
+
}
|
|
72
|
+
/** Whether `kind` is a screen that asks for a decision (neither `composer` nor `none`). */
|
|
73
|
+
function isDecisionKind(kind) {
|
|
74
|
+
return !exports.NO_PROMPT_OBSERVATION_KINDS.includes(kind);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The kinds the strict `respond` (Issue #3756) answers. Every other kind is
|
|
78
|
+
* refused before a key: the `/model` picker's effort slider is not read, the
|
|
79
|
+
* slash popup is a menu of the composer, and `unknown` is never answered.
|
|
80
|
+
*/
|
|
81
|
+
exports.STRICT_RESPOND_KINDS = ['antigravity-trust', 'antigravity-permission'];
|
|
82
|
+
/** Whether `kind` is one of {@link STRICT_RESPOND_KINDS}. */
|
|
83
|
+
function isStrictRespondKind(kind) {
|
|
84
|
+
return typeof kind === 'string' && exports.STRICT_RESPOND_KINDS.includes(kind);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Strict kinds whose rows carry no number: answered only by a label, which is
|
|
88
|
+
* sent as ↑/↓ and Enter. An option number or `--default` is refused there.
|
|
89
|
+
*/
|
|
90
|
+
exports.UNNUMBERED_STRICT_RESPOND_KINDS = ['antigravity-trust'];
|
|
91
|
+
/**
|
|
92
|
+
* Per strict kind, the answer whose consequence is the agent exiting (Issue
|
|
93
|
+
* #3788): its 1-based position, valid only on a screen that shows exactly
|
|
94
|
+
* `optionCount` options AND whose row at that position reads `label`. agy's
|
|
95
|
+
* trust screen offers `Yes, I trust this folder` then `No, exit` (measured:
|
|
96
|
+
* `tests/fixtures/prompt-observation-3755/antigravity-trust.txt`,
|
|
97
|
+
* `antigravity-live-2364/trust-dialog.txt`), and agy exits on the second.
|
|
98
|
+
*
|
|
99
|
+
* The three conditions only narrow: a screen drawn in another order, with
|
|
100
|
+
* another number of rows, or with another wording has no exiting answer, and
|
|
101
|
+
* its outcome stays `indeterminate` (exit 41).
|
|
102
|
+
*
|
|
103
|
+
* Only after such an answer may a shell back in front of the pane be read as
|
|
104
|
+
* the session having ended: after any other answer it is the agent falling
|
|
105
|
+
* over (a crash, a failed start), which the answer did not ask for. A kind
|
|
106
|
+
* absent here has no exiting answer.
|
|
107
|
+
*/
|
|
108
|
+
exports.EXITING_STRICT_ANSWERS = {
|
|
109
|
+
// eslint-disable-next-line no-restricted-syntax -- agy's drawn option row, matched against the screen, not display text
|
|
110
|
+
'antigravity-trust': { position: 2, optionCount: 2, label: 'No, exit' },
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Whether answering option `position` (1-based) of a `kind` screen showing
|
|
114
|
+
* `options` (labels in draw order) exits the agent: the declared position, the
|
|
115
|
+
* declared number of options, and the declared label at that position (runs of
|
|
116
|
+
* spaces folded, ends trimmed; case kept).
|
|
117
|
+
*/
|
|
118
|
+
function isExitingStrictAnswer(kind, position, options) {
|
|
119
|
+
const exiting = exports.EXITING_STRICT_ANSWERS[kind];
|
|
120
|
+
if (exiting === undefined || exiting.position !== position || exiting.optionCount !== options.length)
|
|
121
|
+
return false;
|
|
122
|
+
return options[position - 1].replace(/\s+/g, ' ').trim() === exiting.label;
|
|
123
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The payload of one prompt observation (Issue #3755): what
|
|
4
|
+
* `GET /api/worktrees/:id/current-output?observe=1` adds as `promptObservation`,
|
|
5
|
+
* what `commandmate prompt --json` prints, and what `commandmate wait` adds to
|
|
6
|
+
* its exit-10 payload as `observation`.
|
|
7
|
+
*
|
|
8
|
+
* Types only, and importable from the CLI for the reason `./kinds` gives: the
|
|
9
|
+
* two imports outside this directory (`polling/auto-yes-suppression-reason`,
|
|
10
|
+
* `session/send-attempt-types`) have no imports of their own.
|
|
11
|
+
*
|
|
12
|
+
* @module lib/prompt-observation/types
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -56,6 +56,43 @@
|
|
|
56
56
|
* it resolves in seconds, and the reminder below is what catches it when it
|
|
57
57
|
* does not.
|
|
58
58
|
*
|
|
59
|
+
* ## "About to answer" has a deadline (Issue #3757)
|
|
60
|
+
*
|
|
61
|
+
* Nothing recorded is not proof that Auto-Yes is answering. A screen the poller
|
|
62
|
+
* cannot read at all (agy's folder-trust screen was the measured case: the
|
|
63
|
+
* poller read no prompt, so it recorded nothing) looked exactly like the
|
|
64
|
+
* common case above, and the wait was held silent until the ten-minute
|
|
65
|
+
* reminder. So the hold lasts {@link AUTO_YES_ANSWER_GRACE_MS} — time for the
|
|
66
|
+
* poller to answer or to record why it did not — and a wait still open after
|
|
67
|
+
* that notifies as `auto-yes-not-answered`. `waiting-push-notifier` asks again
|
|
68
|
+
* when the hold ends.
|
|
69
|
+
*
|
|
70
|
+
* The hold is NOT counted from `waitingSince`. That is the wait's identity,
|
|
71
|
+
* not when anyone saw it: it can be a hook's timestamp older than the probe
|
|
72
|
+
* that opened the edge, and it stays frozen across several prompts of one
|
|
73
|
+
* episode. It is counted from {@link autoYesHoldStartedAt}: the later of the
|
|
74
|
+
* moment the gate first held this episode and the poller's last answer, so a
|
|
75
|
+
* second prompt right after an answer gets a full hold of its own. Both
|
|
76
|
+
* producers ask through {@link decideAndLogPromptPush} and share that origin.
|
|
77
|
+
*
|
|
78
|
+
* ## The hold reaches the session wait's tick (Issue #3791)
|
|
79
|
+
*
|
|
80
|
+
* The 9 s assume the poller's next tick is at most a cooldown away. Its ticks
|
|
81
|
+
* are a poll interval, a cooldown or the thinking interval (5 s) apart — inside
|
|
82
|
+
* the 9 s — with two exceptions. An error backoff (up to `MAX_BACKOFF_MS`) is
|
|
83
|
+
* not waited for: a poller failing in a row is the least likely to answer, and
|
|
84
|
+
* a broken Auto-Yes is when a human most needs the notification. The session
|
|
85
|
+
* wait is: a capture that found no session puts the next tick `MAX_BACKOFF_MS`
|
|
86
|
+
* away, and a session started meanwhile (`send --auto-yes` enables Auto-Yes
|
|
87
|
+
* before the session exists) gets its first prompt answered on that tick. So
|
|
88
|
+
* when the hold begins while that tick is pending, it lasts until the tick plus
|
|
89
|
+
* two ticks (answer, or the Enter fallback's second look):
|
|
90
|
+
* {@link autoYesHoldEndsAt}. The tick is read once, and only counts while the
|
|
91
|
+
* poller that scheduled it is still the one running — a poller stopped or
|
|
92
|
+
* replaced meanwhile will not tick. Issue #3796: the session's creation brings
|
|
93
|
+
* that tick forward to a poll interval, and the hold follows it — the tick is
|
|
94
|
+
* only ever read earlier than it was when the hold began.
|
|
95
|
+
*
|
|
59
96
|
* ## The reminder is never muted
|
|
60
97
|
*
|
|
61
98
|
* `runEscalationTick` has already established that the wait is still open — it
|
|
@@ -71,12 +108,141 @@
|
|
|
71
108
|
* @module lib/push/prompt-push-gate
|
|
72
109
|
*/
|
|
73
110
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
111
|
+
exports.AUTO_YES_HOLD_MAX_AGE_MS = exports.AUTO_YES_ANSWER_AFTER_TICK_MS = exports.AUTO_YES_ANSWER_GRACE_MS = void 0;
|
|
112
|
+
exports.autoYesHoldStartedAt = autoYesHoldStartedAt;
|
|
113
|
+
exports.autoYesHoldEndsAt = autoYesHoldEndsAt;
|
|
114
|
+
exports.forgetAutoYesHold = forgetAutoYesHold;
|
|
115
|
+
exports.clearAutoYesHolds = clearAutoYesHolds;
|
|
74
116
|
exports.decidePromptPush = decidePromptPush;
|
|
75
117
|
exports.isPromptPushSuppressed = isPromptPushSuppressed;
|
|
118
|
+
exports.decideAndLogPromptPush = decideAndLogPromptPush;
|
|
76
119
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
77
120
|
const logger_1 = require("../../lib/logger");
|
|
78
121
|
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
122
|
+
const global_state_1 = require("../../lib/global-state");
|
|
79
123
|
const logger = (0, logger_1.createLogger)('push/prompt-gate');
|
|
124
|
+
/**
|
|
125
|
+
* How long a wait with nothing recorded about it is held as "Auto-Yes is
|
|
126
|
+
* answering" (Issue #3757), from {@link autoYesHoldStartedAt}. The poller
|
|
127
|
+
* answers a prompt it can read on the tick that sees it and records a reason
|
|
128
|
+
* on the same tick when it will not, but that tick can be a cooldown away
|
|
129
|
+
* (`COOLDOWN_INTERVAL_MS` after an answer, as long while thinking), and the
|
|
130
|
+
* Enter fallback needs one more tick: a cooldown plus two ticks, 9 s.
|
|
131
|
+
*/
|
|
132
|
+
exports.AUTO_YES_ANSWER_GRACE_MS = Math.max(3 * auto_yes_state_1.POLLING_INTERVAL_MS, auto_yes_state_1.COOLDOWN_INTERVAL_MS + 2 * auto_yes_state_1.POLLING_INTERVAL_MS);
|
|
133
|
+
/** compositeKey -> the hold of that session's current episode. globalThis per #1736. */
|
|
134
|
+
const autoYesHolds = (0, global_state_1.getOrInitGlobal)('__promptPushAutoYesHolds', () => new Map());
|
|
135
|
+
/**
|
|
136
|
+
* Where this wait's `auto-yes-answering` hold is counted from (Issue #3757):
|
|
137
|
+
* the later of the moment the gate first held this episode (recorded here on
|
|
138
|
+
* the first call) and the Auto-Yes poller's last answer to this session.
|
|
139
|
+
*
|
|
140
|
+
* The poller's answer is read off its state on `globalThis`
|
|
141
|
+
* (`__autoYesPollerStates`, `lastServerResponseTimestamp`) rather than through
|
|
142
|
+
* `auto-yes-poller`, which imports `response-checker`, which imports this gate.
|
|
143
|
+
*
|
|
144
|
+
* @param now - Epoch ms of the decision; recorded as the start of a new hold
|
|
145
|
+
*/
|
|
146
|
+
function autoYesHoldStartedAt(input, now) {
|
|
147
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
148
|
+
sweepStaleAutoYesHolds(now);
|
|
149
|
+
let hold = autoYesHolds.get(key);
|
|
150
|
+
if (hold === undefined || hold.since !== input.waitingSince) {
|
|
151
|
+
hold = { since: input.waitingSince, firstHeldAt: now, sessionWaitTick: pendingSessionWaitTick(key, now) };
|
|
152
|
+
autoYesHolds.set(key, hold);
|
|
153
|
+
}
|
|
154
|
+
// Issue #3770: Auto-Yes switched off and on again inside one episode starts a
|
|
155
|
+
// fresh hold; the old origin would read the poller's silence while it was off
|
|
156
|
+
// as "did not answer".
|
|
157
|
+
const enabledAt = (0, auto_yes_state_1.getAutoYesState)(input.worktreeId, input.cliToolId, input.instanceId)?.enabledAt;
|
|
158
|
+
if (enabledAt !== undefined && enabledAt > hold.firstHeldAt && enabledAt <= now)
|
|
159
|
+
hold.firstHeldAt = enabledAt;
|
|
160
|
+
const lastAnswer = globalThis.__autoYesPollerStates?.get(key)?.lastServerResponseTimestamp ?? null;
|
|
161
|
+
return lastAnswer !== null ? Math.max(hold.firstHeldAt, lastAnswer) : hold.firstHeldAt;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* How long after the poller's tick the hold still lasts (Issue #3791): that
|
|
165
|
+
* tick answers, or records why not, and the Enter fallback answers on the tick
|
|
166
|
+
* after it — the "two ticks" of {@link AUTO_YES_ANSWER_GRACE_MS}.
|
|
167
|
+
*/
|
|
168
|
+
exports.AUTO_YES_ANSWER_AFTER_TICK_MS = 2 * auto_yes_state_1.POLLING_INTERVAL_MS;
|
|
169
|
+
/**
|
|
170
|
+
* The Auto-Yes poller's pending session-wait tick (Issue #3791), read off its
|
|
171
|
+
* state on `globalThis` for the same reason as `lastServerResponseTimestamp`.
|
|
172
|
+
* Only a tick due after `now`, and no further than the session wait puts it.
|
|
173
|
+
*/
|
|
174
|
+
function pendingSessionWaitTick(key, now) {
|
|
175
|
+
const poller = globalThis.__autoYesPollerStates?.get(key);
|
|
176
|
+
const at = poller?.sessionWaitTickAt;
|
|
177
|
+
if (poller === undefined || at === undefined || at <= now)
|
|
178
|
+
return undefined;
|
|
179
|
+
return { at: Math.min(at, now + auto_yes_state_1.MAX_BACKOFF_MS), poller, heldAt: now };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Issue #3796: when the session wait's tick the hold counts on actually comes.
|
|
183
|
+
* The tick read when the hold began, brought forward when the poller ticked
|
|
184
|
+
* early — its session was created, and it rescheduled the tick a poll interval
|
|
185
|
+
* away (`sessionWaitTickAt`), or already ran it (`sessionWaitTickRanAt`,
|
|
186
|
+
* `sessionAppearedAt`) — only times since the hold began count. Only
|
|
187
|
+
* ever earlier: a session wait scheduled after the hold began does not extend
|
|
188
|
+
* it (#3791).
|
|
189
|
+
*/
|
|
190
|
+
function effectiveSessionWaitTickAt(tick) {
|
|
191
|
+
let at = tick.at;
|
|
192
|
+
for (const t of [tick.poller.sessionWaitTickAt, tick.poller.sessionWaitTickRanAt, tick.poller.sessionAppearedAt]) {
|
|
193
|
+
if (t !== undefined && t >= tick.heldAt && t < at)
|
|
194
|
+
at = t;
|
|
195
|
+
}
|
|
196
|
+
return at;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* When this wait's `auto-yes-answering` hold ends (Issue #3791): a full
|
|
200
|
+
* {@link AUTO_YES_ANSWER_GRACE_MS} after {@link autoYesHoldStartedAt}, and not
|
|
201
|
+
* before {@link AUTO_YES_ANSWER_AFTER_TICK_MS} past the session wait's tick
|
|
202
|
+
* pending when the hold began — while the poller that scheduled it still runs.
|
|
203
|
+
*
|
|
204
|
+
* @param now - Epoch ms of the decision; recorded as the start of a new hold
|
|
205
|
+
*/
|
|
206
|
+
function autoYesHoldEndsAt(input, now) {
|
|
207
|
+
const startedAt = autoYesHoldStartedAt(input, now);
|
|
208
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
|
|
209
|
+
const tick = autoYesHolds.get(key)?.sessionWaitTick;
|
|
210
|
+
const graceEndsAt = startedAt + exports.AUTO_YES_ANSWER_GRACE_MS;
|
|
211
|
+
// A poller stopped or replaced since (disable, off → on) will not tick.
|
|
212
|
+
if (tick === undefined || globalThis.__autoYesPollerStates?.get(key) !== tick.poller)
|
|
213
|
+
return graceEndsAt;
|
|
214
|
+
// Kept on the hold: an earlier tick once adopted is not lost when the poller
|
|
215
|
+
// later reschedules (an ordinary tick after a failed capture, a new session
|
|
216
|
+
// wait) — the hold never moves back out.
|
|
217
|
+
tick.at = effectiveSessionWaitTickAt(tick);
|
|
218
|
+
return Math.max(graceEndsAt, tick.at + exports.AUTO_YES_ANSWER_AFTER_TICK_MS);
|
|
219
|
+
}
|
|
220
|
+
/** A hold older than this is dropped (Issue #3770): its episode is long over. */
|
|
221
|
+
exports.AUTO_YES_HOLD_MAX_AGE_MS = 60 * 60 * 1000;
|
|
222
|
+
function sweepStaleAutoYesHolds(now) {
|
|
223
|
+
for (const [key, hold] of autoYesHolds) {
|
|
224
|
+
if (now - hold.firstHeldAt >= exports.AUTO_YES_HOLD_MAX_AGE_MS)
|
|
225
|
+
autoYesHolds.delete(key);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Drop the hold of one session (Issue #3770): Auto-Yes went off, or the
|
|
230
|
+
* episode closed.
|
|
231
|
+
*
|
|
232
|
+
* @param since - Issue #3776: drop it only when it is this episode's hold. A
|
|
233
|
+
* caller retiring one episode must not take the next episode's origin with it
|
|
234
|
+
* (that hold would start over, and its notification come up to a hold late).
|
|
235
|
+
* Omitted, the session's hold goes whatever its episode.
|
|
236
|
+
*/
|
|
237
|
+
function forgetAutoYesHold(key, since) {
|
|
238
|
+
if (since !== undefined && autoYesHolds.get(key)?.since !== since)
|
|
239
|
+
return;
|
|
240
|
+
autoYesHolds.delete(key);
|
|
241
|
+
}
|
|
242
|
+
/** Forget every hold. Test seam. */
|
|
243
|
+
function clearAutoYesHolds() {
|
|
244
|
+
autoYesHolds.clear();
|
|
245
|
+
}
|
|
80
246
|
/**
|
|
81
247
|
* Decide whether this prompt notification is worth a human's attention.
|
|
82
248
|
*
|
|
@@ -97,6 +263,10 @@ function decidePromptPush(input) {
|
|
|
97
263
|
if (input.escalated === true) {
|
|
98
264
|
return { suppress: false, reason: 'escalation-reminder' };
|
|
99
265
|
}
|
|
266
|
+
const holdEndsAt = input.holdEndsAt ?? (input.holdStartedAt !== undefined ? input.holdStartedAt + exports.AUTO_YES_ANSWER_GRACE_MS : undefined);
|
|
267
|
+
if (holdEndsAt !== undefined && (input.now ?? Date.now()) >= holdEndsAt) {
|
|
268
|
+
return { suppress: false, reason: 'auto-yes-not-answered' };
|
|
269
|
+
}
|
|
100
270
|
return { suppress: true, reason: 'auto-yes-answering' };
|
|
101
271
|
}
|
|
102
272
|
/**
|
|
@@ -111,7 +281,23 @@ function decidePromptPush(input) {
|
|
|
111
281
|
* so the line is only there for the "why did this one ring?" question.
|
|
112
282
|
*/
|
|
113
283
|
function isPromptPushSuppressed(input) {
|
|
114
|
-
|
|
284
|
+
return decideAndLogPromptPush(input).suppress;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* {@link isPromptPushSuppressed}, with the whole decision handed back — for the
|
|
288
|
+
* caller that has to ask again when an `auto-yes-answering` hold ends
|
|
289
|
+
* (`waiting-push-notifier`, Issue #3757).
|
|
290
|
+
*/
|
|
291
|
+
function decideAndLogPromptPush(input, options = {}) {
|
|
292
|
+
let decision = decidePromptPush(input);
|
|
293
|
+
if (decision.reason === 'auto-yes-inactive') {
|
|
294
|
+
forgetAutoYesHold((0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId));
|
|
295
|
+
}
|
|
296
|
+
// Issue #3757: only a wait that reached the hold gets an origin recorded.
|
|
297
|
+
if (decision.reason === 'auto-yes-answering' && input.holdStartedAt === undefined && input.holdEndsAt === undefined) {
|
|
298
|
+
const now = input.now ?? Date.now();
|
|
299
|
+
decision = decidePromptPush({ ...input, now, holdEndsAt: autoYesHoldEndsAt(input, now) });
|
|
300
|
+
}
|
|
115
301
|
const context = {
|
|
116
302
|
worktreeId: input.worktreeId,
|
|
117
303
|
cliToolId: input.cliToolId,
|
|
@@ -122,9 +308,15 @@ function isPromptPushSuppressed(input) {
|
|
|
122
308
|
...(decision.stopReason !== undefined ? { stopReason: decision.stopReason } : {}),
|
|
123
309
|
...(decision.suppressedBy !== undefined ? { suppressedBy: decision.suppressedBy } : {}),
|
|
124
310
|
};
|
|
125
|
-
|
|
311
|
+
// A re-ask at the end of a hold (Issue #3757) that holds again was already
|
|
312
|
+
// logged when the hold began.
|
|
313
|
+
if (decision.suppress && options.recheck === true)
|
|
314
|
+
logger.debug('prompt-push-suppressed', context);
|
|
315
|
+
else if (decision.suppress)
|
|
126
316
|
logger.info('prompt-push-suppressed', context);
|
|
317
|
+
else if (decision.reason === 'auto-yes-not-answered')
|
|
318
|
+
logger.info('prompt-push-allowed', context);
|
|
127
319
|
else
|
|
128
320
|
logger.debug('prompt-push-allowed', context);
|
|
129
|
-
return decision
|
|
321
|
+
return decision;
|
|
130
322
|
}
|