commandmate 0.31.1 → 0.31.3
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 +170 -170
- package/.next/app-path-routes-manifest.json +29 -29
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- 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/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +2 -2
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +2 -2
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- 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 +2 -2
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +2 -2
- 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/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/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/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.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/todos/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.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_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]/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_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/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.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_client-reference-manifest.js +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]/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_client-reference-manifest.js +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_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.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 +1 -1
- 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_client-reference-manifest.js +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/chat/page_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_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 +10 -10
- 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 +29 -29
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1886.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -1
- package/.next/server/chunks/2739.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3484.js +1 -0
- package/.next/server/chunks/358.js +1 -0
- package/.next/server/chunks/4325.js +1 -1
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5120.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/552.js +3 -3
- package/.next/server/chunks/595.js +8 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/chunks/9130.js +2 -2
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/9696.js +2 -2
- package/.next/server/chunks/9798.js +2 -2
- 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/{1783-11c9b4d8a52ebd91.js → 2813-de885de8a4b11910.js} +1 -1
- package/.next/static/chunks/4718-07ec4e10186928db.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-91b639c90795baa9.js +1 -0
- package/.next/static/css/acc4b9c3feb04287.css +1 -0
- package/.next/trace +13 -13
- package/dist/lib/detection/tools/verified-against.d.ts +24 -24
- package/dist/lib/detection/tools/verified-against.js +24 -24
- package/dist/server/locales/en/worktree.json +1402 -0
- package/dist/server/locales/ja/worktree.json +1402 -0
- package/dist/server/src/lib/db/chat-db.js +44 -1
- package/dist/server/src/lib/detection/cli-patterns.js +157 -23
- package/dist/server/src/lib/detection/model-info-extractor.js +185 -4
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +105 -25
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +233 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +24 -24
- package/dist/server/src/lib/hooks/hook-settings-generator.js +16 -0
- package/dist/server/src/lib/hooks/sources/claude/model-switch.js +169 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +14 -1
- package/dist/server/src/lib/polling/response-checker.js +17 -1
- package/dist/server/src/lib/polling/response-poller-core.js +143 -9
- package/dist/server/src/lib/push/index.js +13 -1
- package/dist/server/src/lib/push/model-change-push-notifier.js +174 -0
- package/dist/server/src/lib/push/notification-dedup.js +2 -1
- package/dist/server/src/lib/push/push-sender.js +48 -20
- package/dist/server/src/lib/realtime/model-change-broadcast.js +171 -0
- package/dist/server/src/lib/realtime/types.js +19 -1
- package/dist/server/src/lib/realtime/waiting-broadcast.js +13 -0
- package/dist/server/src/lib/session/agent-event-state.js +344 -12
- package/package.json +1 -1
- package/.next/server/chunks/6894.js +0 -8
- package/.next/server/chunks/7187.js +0 -1
- package/.next/server/chunks/7472.js +0 -1
- package/.next/static/chunks/4718-46e1d2f07c8423ba.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-64d4ec3051971760.js +0 -1
- package/.next/static/css/5c13ea243dfdcb66.css +0 -1
- /package/.next/static/{60mm4_QBuFtFTfo5UMyKU → 0hTIackGXw6v7diXJS6yN}/_buildManifest.js +0 -0
- /package/.next/static/{60mm4_QBuFtFTfo5UMyKU → 0hTIackGXw6v7diXJS6yN}/_ssgManifest.js +0 -0
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
* Antigravity (agy) status detector (Issue #1927, 方針書 §4 D2).
|
|
4
4
|
*
|
|
5
5
|
* A verbatim lift of the `cliToolId === 'antigravity'` blocks (priorities 0.9
|
|
6
|
-
* and 2.8) out of `detectSessionStatus
|
|
6
|
+
* and 2.8) out of `detectSessionStatus`, plus the Issue #2364 dialog reading in
|
|
7
|
+
* `beforePrompt`.
|
|
7
8
|
*
|
|
8
9
|
* No `readIdleEvidence`: agy's idle branch reads the same always-visible `> `
|
|
9
|
-
* input box that #1885 showed is not evidence on its own
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* without a measured rule keeps the pre-#1927 reading
|
|
14
|
-
* off ITS OWN frames rather than inferred from another
|
|
15
|
-
* the mistake #1979 corrected.
|
|
10
|
+
* input box that #1885 showed is not evidence on its own. Issue #2364 captured
|
|
11
|
+
* the first live IDLE agy frame (`antigravity-live-2364/boot-idle.txt`: a bare
|
|
12
|
+
* `>` between two rules over a `? for shortcuts` status row), so a rule could
|
|
13
|
+
* now be measured — but it has not been, and per §4 D1 決定 1's tool-by-tool
|
|
14
|
+
* rollout (DR2-002) a tool without a measured rule keeps the pre-#1927 reading.
|
|
15
|
+
* Its rule must be read off ITS OWN frames rather than inferred from another
|
|
16
|
+
* tool's — which is exactly the mistake #1979 corrected.
|
|
16
17
|
*/
|
|
17
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
19
|
exports.antigravityStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
@@ -20,12 +21,66 @@ const cli_patterns_1 = require("../../cli-patterns");
|
|
|
20
21
|
const status_reason_1 = require("../../status-reason");
|
|
21
22
|
const run_detection_1 = require("../run-detection");
|
|
22
23
|
const verified_against_1 = require("../verified-against");
|
|
23
|
-
|
|
24
|
+
const dialog_1 = require("./dialog");
|
|
25
|
+
/** agy build these rules were read off (Issue #988 / #995 / #2364; value in ../verified-against, #1929). */
|
|
24
26
|
exports.VERIFIED_AGAINST = verified_against_1.ANTIGRAVITY_VERIFIED_AGAINST;
|
|
27
|
+
/**
|
|
28
|
+
* An agy screen only the terminal can drive: the `/model` picker, the folder
|
|
29
|
+
* trust screen, the slash-command popup — and the post-answer survey.
|
|
30
|
+
*
|
|
31
|
+
* `hasActivePrompt: false` with a reason in `SELECTION_LIST_REASONS` is what
|
|
32
|
+
* puts NavigationButtons (and the chat surface's "drive it from the terminal"
|
|
33
|
+
* card) on screen, and what makes `wait` stop with exit 10 instead of hanging.
|
|
34
|
+
*/
|
|
35
|
+
const SELECTION_LIST_VERDICT = {
|
|
36
|
+
status: 'waiting',
|
|
37
|
+
confidence: 'high',
|
|
38
|
+
reason: status_reason_1.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
|
|
39
|
+
hasActivePrompt: false,
|
|
40
|
+
evidence: 'positive',
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* How close to the bottom of the content the survey row must be to count as
|
|
44
|
+
* open: itself, a blank row and the `? for shortcuts` status row.
|
|
45
|
+
*/
|
|
46
|
+
const SURVEY_TAIL_ROWS = 3;
|
|
47
|
+
/**
|
|
48
|
+
* Is the post-answer survey the live screen, rather than a row of it left in
|
|
49
|
+
* the scrollback? (Issue #2364)
|
|
50
|
+
*
|
|
51
|
+
* agy retains scrollback, so the guard is positional: the `[1] Good … [0] Skip`
|
|
52
|
+
* row is the survey only while it sits within the last few content rows and
|
|
53
|
+
* no bare `>` composer has been drawn below it — the composer is what replaces
|
|
54
|
+
* it once the digit is typed.
|
|
55
|
+
*/
|
|
56
|
+
function isAntigravitySurveyOpen(contentLines) {
|
|
57
|
+
const tail = contentLines.slice(-SURVEY_TAIL_ROWS);
|
|
58
|
+
const surveyAt = tail.findIndex(row => cli_patterns_1.ANTIGRAVITY_SURVEY_PATTERN.test(row));
|
|
59
|
+
if (surveyAt < 0)
|
|
60
|
+
return false;
|
|
61
|
+
const { promptPattern } = (0, cli_patterns_1.getCliToolPatterns)('antigravity');
|
|
62
|
+
return !tail.slice(surveyAt + 1).some(row => promptPattern.test(row));
|
|
63
|
+
}
|
|
25
64
|
exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
26
65
|
tool: 'antigravity',
|
|
27
66
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
28
67
|
beforePrompt(frame) {
|
|
68
|
+
// 0.85. Issue #2364: the survey agy draws in place of its composer after a
|
|
69
|
+
// tool decision — `[1] Good [2] Fine [3] Bad [0] Skip` under `How's the
|
|
70
|
+
// CLI experience so far?`. Nothing else on that frame is readable: there is
|
|
71
|
+
// no `↑/↓ Navigate` footer and no bare `>` row, so it used to reach the
|
|
72
|
+
// `default` floor as `running`, and the chat surface showed "generating"
|
|
73
|
+
// over a screen waiting for a keypress.
|
|
74
|
+
//
|
|
75
|
+
// Published as a selection list rather than as a `multiple_choice` prompt
|
|
76
|
+
// on purpose. The screen takes a TYPED digit (`0` closes it), while
|
|
77
|
+
// `sendPromptAnswer` drives every numeric agy answer with arrow keys +
|
|
78
|
+
// Enter (Issue #999) — a `0. Skip` button on PromptPanel would send `Up`,
|
|
79
|
+
// `Enter` to a screen that does not navigate. As a selection list the
|
|
80
|
+
// frame is `waiting`, `wait` returns, the waiting push fires, and the chat
|
|
81
|
+
// surface's card points at the terminal, where a single `0` is the answer.
|
|
82
|
+
if (isAntigravitySurveyOpen(frame.contentLines))
|
|
83
|
+
return SELECTION_LIST_VERDICT;
|
|
29
84
|
// 0.9. Antigravity: selection list detection BEFORE thinking detection (Issue #995)
|
|
30
85
|
// agy's "Switch Model" (and other) selection TUIs render an "esc to cancel"
|
|
31
86
|
// footer that ANTIGRAVITY_THINKING_PATTERN also matches, so the generic thinking
|
|
@@ -35,7 +90,7 @@ exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector
|
|
|
35
90
|
// Codex early-detection pattern.
|
|
36
91
|
if (!cli_patterns_1.ANTIGRAVITY_SELECTION_LIST_PATTERN.test(frame.lastLines))
|
|
37
92
|
return null;
|
|
38
|
-
// Issue #2270: except when the frame is
|
|
93
|
+
// Issue #2270 / #2364: except when the frame is a NUMBERED dialog.
|
|
39
94
|
//
|
|
40
95
|
// #997 widened the pattern above to the bare `↑/↓ Navigate` footer so the
|
|
41
96
|
// "Do you want to proceed?" menu would reach this branch — but this branch
|
|
@@ -47,23 +102,48 @@ exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector
|
|
|
47
102
|
// with four `multiple_choice` options and the push notification sent
|
|
48
103
|
// `kind: 'prompt'` — one screen, two answers.
|
|
49
104
|
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
// the
|
|
105
|
+
// #2270 returned null here and let priority 1's generic `detectPrompt` read
|
|
106
|
+
// the frame. That held for the one dialog it measured and broke on the next
|
|
107
|
+
// two (#2364): the file-creation menu never passed its `Do you want to
|
|
108
|
+
// proceed?` discriminator, and a Bash approval whose option labels wrap —
|
|
109
|
+
// agy prints the command inside the label, so most of them do — passed it
|
|
110
|
+
// and then failed in the one-row-per-option parser, after which the `esc
|
|
111
|
+
// to cancel` status row matched the thinking pattern and the pane went out
|
|
112
|
+
// as `running` / `thinking_indicator`. So the discriminator is structural
|
|
113
|
+
// now (`isAntigravityNumberedDialog`), the frame is read by agy's own
|
|
114
|
+
// reader (`./dialog.ts`), and a frame the reader cannot parse is published
|
|
115
|
+
// as UNCLASSIFIED — never as a picker, and never as "generating", which is
|
|
116
|
+
// the worst answer a waiting dialog can get: `wait` never returns from it.
|
|
117
|
+
//
|
|
118
|
+
// `stripBoxDrawing` here, as priority 1 applies it before `detectPrompt`,
|
|
119
|
+
// so this verdict and the response poller's (`detectPromptWithOptions`,
|
|
120
|
+
// which reads the same helper over the same spelling) carry one question,
|
|
121
|
+
// one option list and one `instructionText` for one screen.
|
|
55
122
|
//
|
|
56
123
|
// #995's own case is untouched: the Switch Model picker carries no numbered
|
|
57
|
-
// rows, so it still resolves
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
124
|
+
// rows, so it still resolves below and still keeps NavigationButtons.
|
|
125
|
+
const text = (0, cli_patterns_1.stripBoxDrawing)(frame.clean);
|
|
126
|
+
if ((0, cli_patterns_1.isAntigravityNumberedDialog)(text)) {
|
|
127
|
+
const promptDetection = (0, dialog_1.detectAntigravityNumberedDialogPrompt)(text);
|
|
128
|
+
if (promptDetection !== null) {
|
|
129
|
+
return {
|
|
130
|
+
status: 'waiting',
|
|
131
|
+
confidence: 'high',
|
|
132
|
+
reason: status_reason_1.STATUS_REASON.PROMPT_DETECTED,
|
|
133
|
+
hasActivePrompt: true,
|
|
134
|
+
evidence: 'positive',
|
|
135
|
+
promptDetection,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
status: 'running',
|
|
140
|
+
confidence: 'low',
|
|
141
|
+
reason: status_reason_1.STATUS_REASON.UNKNOWN_FRAME,
|
|
142
|
+
hasActivePrompt: false,
|
|
143
|
+
evidence: 'none',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return SELECTION_LIST_VERDICT;
|
|
67
147
|
},
|
|
68
148
|
afterThinking(frame) {
|
|
69
149
|
// 2.8. Antigravity (agy) footer-based detection (Issue #988)
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Antigravity (agy)'s numbered permission dialogs, read on their own terms
|
|
4
|
+
* (Issue #2364).
|
|
5
|
+
*
|
|
6
|
+
* ## What was measured (agy 1.1.27, pane 200x1000, 2026-09-06)
|
|
7
|
+
*
|
|
8
|
+
* `tests/fixtures/antigravity-live-2364/` holds the frames. The two that this
|
|
9
|
+
* module exists for:
|
|
10
|
+
*
|
|
11
|
+
* | frame | question | options | shape |
|
|
12
|
+
* |---------------------------|---------------------------------|---------|------------------------------------|
|
|
13
|
+
* | `dialog-create-file.txt` | `Allow creation of this file?` | 2 | diff preview above the question |
|
|
14
|
+
* | `dialog-bash-wrapped.txt` | `Do you want to proceed?` | 4 | options 2 and 3 wrap onto 3 rows |
|
|
15
|
+
*
|
|
16
|
+
* Before this Issue the first resolved as `antigravity_selection_list`
|
|
17
|
+
* (`hasActivePrompt: false`, so the chat surface drew an arrow pad and no
|
|
18
|
+
* yes/no panel) because Issue #2270's discriminator was the sentence `Do you
|
|
19
|
+
* want to proceed?`; the second passed the discriminator and then failed in the
|
|
20
|
+
* generic multiple-choice parser, which reads one row per option, so the
|
|
21
|
+
* `esc to cancel` status row fell through to the thinking pattern and the pane
|
|
22
|
+
* was published as `running` / `thinking_indicator` — "generating", with `wait`
|
|
23
|
+
* never returning. agy prints the command text inside the option label, so
|
|
24
|
+
* every Bash approval of a multi-line command takes the second shape.
|
|
25
|
+
*
|
|
26
|
+
* ## What this reads
|
|
27
|
+
*
|
|
28
|
+
* The block between the nearest boundary row and the `↑/↓ Navigate` footer
|
|
29
|
+
* ({@link locateAntigravityDialogRegion}), through the shared
|
|
30
|
+
* {@link findNumberedOptionBlock}: a run of `N. label` rows descending to `1.`,
|
|
31
|
+
* every non-numbered row folded into the label above it, the `>` gutter naming
|
|
32
|
+
* the highlighted option. The question is the one `?`-terminated row directly
|
|
33
|
+
* above option 1 — NOT the five rows the generic parser joins, which on the
|
|
34
|
+
* file-creation menu put the diff preview into the question
|
|
35
|
+
* (`…hello-agy.txt +1 1 + hello from antigravity Allow creation of this file?`).
|
|
36
|
+
* The diff, the command and the panel header go to `instructionText`, where the
|
|
37
|
+
* prompt panels render them as context.
|
|
38
|
+
*
|
|
39
|
+
* ## Who calls it
|
|
40
|
+
*
|
|
41
|
+
* Both producers of the wire, so that they cannot disagree about one screen:
|
|
42
|
+
* `antigravity/detect.ts` (the status verdict `/current-output` publishes) and
|
|
43
|
+
* `polling/response-checker.ts` (the `prompt` row the poller stores and the
|
|
44
|
+
* push notification it raises). The Auto-Yes poller is deliberately NOT a
|
|
45
|
+
* caller: with Auto-Yes on, agy's `PreToolUse` hook answers the permission
|
|
46
|
+
* request before the dialog is drawn (Issue #1779), so the dialogs this module
|
|
47
|
+
* reads only appear when nothing is going to auto-answer them.
|
|
48
|
+
*
|
|
49
|
+
* Deliberately NOT a change to the generic multiple-choice parser: folding
|
|
50
|
+
* continuation rows there would change what every other tool's dialogs read
|
|
51
|
+
* as, and each of those readings is pinned to its own live captures.
|
|
52
|
+
*
|
|
53
|
+
* ## Input contract
|
|
54
|
+
*
|
|
55
|
+
* ANSI-stripped text; box drawing optional (the poller's copy has been through
|
|
56
|
+
* `stripBoxDrawing`, the status path's has not, and the block is bounded the
|
|
57
|
+
* same way on both — see {@link ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN}).
|
|
58
|
+
*/
|
|
59
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
+
exports.readAntigravityNumberedDialog = readAntigravityNumberedDialog;
|
|
61
|
+
exports.detectAntigravityNumberedDialogPrompt = detectAntigravityNumberedDialogPrompt;
|
|
62
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
63
|
+
const prompt_detect_multiple_choice_1 = require("../../prompt-detect-multiple-choice");
|
|
64
|
+
const tui_detection_frame_1 = require("../../tui-detection-frame");
|
|
65
|
+
const dialog_block_1 = require("../dialog-block");
|
|
66
|
+
/**
|
|
67
|
+
* How many non-blank rows above option 1 may be searched for the question.
|
|
68
|
+
*
|
|
69
|
+
* On every measured frame the question is the row directly above option 1;
|
|
70
|
+
* the allowance is for a blank row or a wrapped question, not for reaching up
|
|
71
|
+
* into the diff preview.
|
|
72
|
+
*/
|
|
73
|
+
const QUESTION_SCAN_ROWS = 3;
|
|
74
|
+
/**
|
|
75
|
+
* How far above the question the panel header may sit.
|
|
76
|
+
*
|
|
77
|
+
* The `●` tool-call row that opens the panel is what `instructionText` starts
|
|
78
|
+
* under; the cap keeps a frame with no such row from carrying the whole
|
|
79
|
+
* transcript into the panel text.
|
|
80
|
+
*/
|
|
81
|
+
const INSTRUCTION_LOOKBACK_ROWS = 40;
|
|
82
|
+
/**
|
|
83
|
+
* How many non-blank rows under the bottom option row may be its wrapped tail.
|
|
84
|
+
*
|
|
85
|
+
* Handed to {@link findNumberedOptionBlock} as its footer scan, because the
|
|
86
|
+
* region this reader hands it ends above the real footer. Sized well past the
|
|
87
|
+
* three-row labels agy 1.1.27 draws; a command long enough to exceed it is
|
|
88
|
+
* elided by agy itself (`pr...'`).
|
|
89
|
+
*/
|
|
90
|
+
const LAST_OPTION_TAIL_ROWS = 12;
|
|
91
|
+
/** The `●` tool-call row that opens every measured agy permission panel. */
|
|
92
|
+
const TOOL_CALL_ROW_PATTERN = /^\s*●\s/;
|
|
93
|
+
/** A horizontal rule; dropped from `instructionText`, where a 200-column rule is noise. */
|
|
94
|
+
const RULE_ROW_PATTERN = /^\s*─{3,}\s*$/;
|
|
95
|
+
/** A row that asks something — the shape the question row takes on every measured dialog. */
|
|
96
|
+
const QUESTION_ROW_PATTERN = /[??]\s*$/;
|
|
97
|
+
/**
|
|
98
|
+
* The same tail limits `prompt-detector.ts` applies to `rawContent`
|
|
99
|
+
* (`RAW_CONTENT_MAX_LINES` / `RAW_CONTENT_MAX_CHARS`), restated because that
|
|
100
|
+
* helper is private to it. A prompt row stores this text as its message body,
|
|
101
|
+
* so an unbounded 1000-row pane must not go in.
|
|
102
|
+
*/
|
|
103
|
+
const RAW_CONTENT_MAX_LINES = 200;
|
|
104
|
+
const RAW_CONTENT_MAX_CHARS = 5000;
|
|
105
|
+
function truncateRawContent(content) {
|
|
106
|
+
const lines = content.split('\n');
|
|
107
|
+
const tail = lines.length > RAW_CONTENT_MAX_LINES ? lines.slice(-RAW_CONTENT_MAX_LINES) : lines;
|
|
108
|
+
const joined = tail.join('\n');
|
|
109
|
+
return joined.length > RAW_CONTENT_MAX_CHARS ? joined.slice(-RAW_CONTENT_MAX_CHARS) : joined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Read agy's numbered dialog off ANSI-stripped rows.
|
|
113
|
+
*
|
|
114
|
+
* Null when the frame has no `↑/↓ Navigate` footer, when the rows above it do
|
|
115
|
+
* not form a numbered run reaching `1.` (the Switch Model picker, the trust
|
|
116
|
+
* screen, the slash popup), or when the block sits under a `Switch Model`
|
|
117
|
+
* header. A caller that has already passed `isAntigravityNumberedDialog` and
|
|
118
|
+
* still gets null here is looking at a numbered dialog this reader cannot
|
|
119
|
+
* parse — which is an unclassified frame, not a picker.
|
|
120
|
+
*/
|
|
121
|
+
function readAntigravityNumberedDialog(lines) {
|
|
122
|
+
const region = (0, cli_patterns_1.locateAntigravityDialogRegion)(lines);
|
|
123
|
+
if (region === null)
|
|
124
|
+
return null;
|
|
125
|
+
const regionRows = lines.slice(region.start, region.footer);
|
|
126
|
+
if (regionRows.some(row => cli_patterns_1.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN.test(row)))
|
|
127
|
+
return null;
|
|
128
|
+
// The slice stops ABOVE the footer row, so the rows the block reader files
|
|
129
|
+
// as `footer` — the non-option rows between the bottom option and the region
|
|
130
|
+
// end — are the wrapped tail of the LAST option, not chrome: agy 1.1.27 draws
|
|
131
|
+
// `6. No, and always deny for commands that start with '<cmd>` over three
|
|
132
|
+
// rows on a repeated denial (`dialog-bash-wrapped-six.txt`), and the
|
|
133
|
+
// `↑/↓ Navigate` footer this region is anchored on already vouched for the
|
|
134
|
+
// block. Every other row of the region above the block is question / preview
|
|
135
|
+
// and never reached (the run stops at `1.`).
|
|
136
|
+
const block = (0, dialog_block_1.findNumberedOptionBlock)(regionRows, regionRows.length, LAST_OPTION_TAIL_ROWS);
|
|
137
|
+
if (block === null)
|
|
138
|
+
return null;
|
|
139
|
+
const options = [...block.options];
|
|
140
|
+
if (block.footer !== '') {
|
|
141
|
+
const last = options.length - 1;
|
|
142
|
+
options[last] = [options[last], ...block.footer.split('\n')].join(' ').trim();
|
|
143
|
+
}
|
|
144
|
+
const firstOptionRow = region.start + block.firstRow;
|
|
145
|
+
// The question: the nearest `?`-terminated row above option 1, looking past
|
|
146
|
+
// blank rows and at most QUESTION_SCAN_ROWS non-blank ones, none of which
|
|
147
|
+
// may be a boundary (that would be the previous turn, not this panel).
|
|
148
|
+
let questionRow = -1;
|
|
149
|
+
let fallbackRow = -1;
|
|
150
|
+
let scanned = 0;
|
|
151
|
+
for (let i = firstOptionRow - 1; i >= region.start && scanned < QUESTION_SCAN_ROWS; i--) {
|
|
152
|
+
const row = lines[i];
|
|
153
|
+
if (row.trim() === '')
|
|
154
|
+
continue;
|
|
155
|
+
if (cli_patterns_1.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN.test(row) || RULE_ROW_PATTERN.test(row))
|
|
156
|
+
break;
|
|
157
|
+
scanned++;
|
|
158
|
+
if (fallbackRow < 0)
|
|
159
|
+
fallbackRow = i;
|
|
160
|
+
if (QUESTION_ROW_PATTERN.test(row)) {
|
|
161
|
+
questionRow = i;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (questionRow < 0)
|
|
166
|
+
questionRow = fallbackRow;
|
|
167
|
+
return {
|
|
168
|
+
question: questionRow < 0 ? 'Please select an option:' : lines[questionRow].trim(),
|
|
169
|
+
options,
|
|
170
|
+
selectedIndex: block.selectedIndex,
|
|
171
|
+
questionRow: questionRow < 0 ? firstOptionRow : questionRow,
|
|
172
|
+
firstOptionRow,
|
|
173
|
+
footerRow: region.footer,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The panel text above the options, for the prompt panels' context box.
|
|
178
|
+
*
|
|
179
|
+
* From the row under the `●` tool-call row that opened the panel (`Command`,
|
|
180
|
+
* `Create file`, the `Requesting permission for:` block, the diff preview),
|
|
181
|
+
* through the question, the options and the footer — rules dropped. Falls back
|
|
182
|
+
* to the dialog region when no tool-call row is within reach.
|
|
183
|
+
*/
|
|
184
|
+
function extractInstructionText(lines, dialog) {
|
|
185
|
+
const region = (0, cli_patterns_1.locateAntigravityDialogRegion)(lines);
|
|
186
|
+
let start = region?.start ?? dialog.questionRow;
|
|
187
|
+
const floor = Math.max(0, dialog.questionRow - INSTRUCTION_LOOKBACK_ROWS);
|
|
188
|
+
for (let i = dialog.questionRow - 1; i >= floor; i--) {
|
|
189
|
+
if (TOOL_CALL_ROW_PATTERN.test(lines[i])) {
|
|
190
|
+
start = i + 1;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const text = lines
|
|
195
|
+
.slice(start, dialog.footerRow + 1)
|
|
196
|
+
.filter(row => !RULE_ROW_PATTERN.test(row))
|
|
197
|
+
.map(row => row.trimEnd())
|
|
198
|
+
.join('\n')
|
|
199
|
+
.trim();
|
|
200
|
+
return text.length > 0 ? text : undefined;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Read agy's numbered dialog as the `multiple_choice` prompt the rest of the
|
|
204
|
+
* system consumes, or null when the frame does not carry one.
|
|
205
|
+
*
|
|
206
|
+
* The result has the same shape `detectPrompt` produces for a numbered dialog
|
|
207
|
+
* — `promptData.type === 'multiple_choice'`, `options[].isDefault` on the
|
|
208
|
+
* highlighted row, `instructionText` / `approvalTarget` / `rawContent` filled
|
|
209
|
+
* the way Issues #235 and #1699 defined them — so `PromptPanel`,
|
|
210
|
+
* `MobilePromptSheet`, `respond`, the deny patterns and the prompt-history
|
|
211
|
+
* writers all read it unchanged.
|
|
212
|
+
*
|
|
213
|
+
* @param text - ANSI-stripped capture, box drawing optional
|
|
214
|
+
*/
|
|
215
|
+
function detectAntigravityNumberedDialogPrompt(text) {
|
|
216
|
+
const normalized = (0, tui_detection_frame_1.normalizeTuiFrameForDetection)(text);
|
|
217
|
+
const lines = normalized.split('\n');
|
|
218
|
+
const dialog = readAntigravityNumberedDialog(lines);
|
|
219
|
+
if (dialog === null)
|
|
220
|
+
return null;
|
|
221
|
+
return (0, prompt_detect_multiple_choice_1.buildMultipleChoiceResult)(dialog.question, dialog.options.map((label, index) => ({
|
|
222
|
+
number: index + 1,
|
|
223
|
+
label,
|
|
224
|
+
isDefault: index === dialog.selectedIndex,
|
|
225
|
+
})), {
|
|
226
|
+
instructionText: extractInstructionText(lines, dialog),
|
|
227
|
+
// Issue #1699's machine-facing surface: bounded above at the previous
|
|
228
|
+
// turn's boundary and below at the footer, so the command in the
|
|
229
|
+
// `Requesting permission for:` block and in the labels is judged and
|
|
230
|
+
// nothing from an earlier, already-answered approval is.
|
|
231
|
+
approvalTarget: (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(lines, (0, prompt_detect_multiple_choice_1.findApprovalContextStart)(lines, dialog.questionRow), dialog.footerRow),
|
|
232
|
+
}, normalized, truncateRawContent);
|
|
233
|
+
}
|
|
@@ -74,35 +74,35 @@ exports.OPENCODE_VERIFIED_AGAINST = {
|
|
|
74
74
|
paneGeometry: '80x200',
|
|
75
75
|
};
|
|
76
76
|
/**
|
|
77
|
-
* agy these rules were read off (#988 / #995 footer + selection rules,
|
|
78
|
-
*
|
|
77
|
+
* agy these rules were read off (#988 / #995 footer + selection rules, #2270's
|
|
78
|
+
* numbered-dialog carve-out, re-measured and re-captured by #2364).
|
|
79
79
|
*
|
|
80
|
-
* Bumped from
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* `
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
80
|
+
* Bumped from 1.1.25 because the frames were RE-CAPTURED and the rules CHANGED:
|
|
81
|
+
* #2364 drove agy 1.1.27 on a private tmux socket at the production geometry and
|
|
82
|
+
* kept the frames in `tests/fixtures/antigravity-live-2364/` — the file-creation
|
|
83
|
+
* menu (`Allow creation of this file?`, two options), the Bash approval whose
|
|
84
|
+
* option labels wrap onto three rows each, the one-row Bash approval #2270 had
|
|
85
|
+
* measured on 1.1.25, the `/model` picker, the folder-trust screen, the
|
|
86
|
+
* slash-command popup, and the first live IDLE agy frame. The numbered-dialog
|
|
87
|
+
* discriminator (`isAntigravityNumberedDialog`) was rewritten off those frames
|
|
88
|
+
* from a question-line match to the footer + numbered-row structure, and the
|
|
89
|
+
* dialogs are now read by `tools/antigravity/dialog.ts` rather than by the
|
|
90
|
+
* generic multiple-choice parser. `ANTIGRAVITY_SELECTION_LIST_PATTERN`
|
|
91
|
+
* (#995 / #997) was re-checked against every frame and left unchanged.
|
|
89
92
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* different `lastLines` slice than production does. That is a statement about
|
|
94
|
-
* the capture condition, not about agy: the scrollback-retained rendering the
|
|
95
|
-
* `afterThinking` footer rules rest on (#988) is unchanged, and the 1.1.25
|
|
96
|
-
* dialog still ends on `esc to cancel`.
|
|
93
|
+
* The #2270 1.1.25 panes stay where they are
|
|
94
|
+
* (`tests/unit/status-detector-selection.test.ts`) and the rules still answer
|
|
95
|
+
* for both builds.
|
|
97
96
|
*
|
|
98
|
-
* What this stamp does NOT claim:
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
97
|
+
* What this stamp does NOT claim: the generating (spinner) branch is still
|
|
98
|
+
* carried over from the 0.4 captures rather than re-measured, and the
|
|
99
|
+
* post-answer survey (`[1] Good … [0] Skip`) was seen once on the production
|
|
100
|
+
* server and reconstructed from its cleaned rows — the raw frame is not in the
|
|
101
|
+
* fixture directory (see its README).
|
|
102
102
|
*/
|
|
103
103
|
exports.ANTIGRAVITY_VERIFIED_AGAINST = {
|
|
104
|
-
version: '1.1.
|
|
105
|
-
capturedAt: '2026-09-
|
|
104
|
+
version: '1.1.27',
|
|
105
|
+
capturedAt: '2026-09-06',
|
|
106
106
|
paneGeometry: '200x1000',
|
|
107
107
|
};
|
|
108
108
|
/**
|
|
@@ -64,6 +64,7 @@ const path_1 = require("path");
|
|
|
64
64
|
const safe_directory_1 = require("../../config/safe-directory");
|
|
65
65
|
const env_1 = require("../../lib/env");
|
|
66
66
|
const types_1 = require("../../lib/cli-tools/types");
|
|
67
|
+
const model_switch_1 = require("../../lib/hooks/sources/claude/model-switch");
|
|
67
68
|
const tool_id_1 = require("../../lib/hooks/sources/claude/tool-id");
|
|
68
69
|
const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
|
|
69
70
|
const logger_1 = require("../../lib/logger");
|
|
@@ -343,6 +344,17 @@ function buildSessionStartCommand(target, options = {}) {
|
|
|
343
344
|
* hook and nothing here delivers it — Claude enforces it itself, before any
|
|
344
345
|
* `PermissionRequest` exists — which is precisely why it belongs next to the
|
|
345
346
|
* hook that Auto-Yes answers rather than in the contract layer above it.
|
|
347
|
+
*
|
|
348
|
+
* `PostModelSwitch` (Issue #2363) is the structured report of a `/model` or
|
|
349
|
+
* `/fast` switch, measured on 2.1.263 to reach a `type: "http"` hook injected
|
|
350
|
+
* through this very file (`lib/hooks/sources/claude/model-switch` has the
|
|
351
|
+
* payload). It posts to the event receiver with no matcher: the event fires
|
|
352
|
+
* only when the model actually changes, so there is nothing to narrow. Its
|
|
353
|
+
* `PreModelSwitch` twin is deliberately NOT registered — it is a decision hook
|
|
354
|
+
* whose reply can block the switch, the probe's second session saw it fire
|
|
355
|
+
* twice per switch with inconsistent `from_model` values, and the `Post` event
|
|
356
|
+
* alone says what happened. The omission is pinned by
|
|
357
|
+
* `tests/unit/lib/hooks/hook-settings-post-model-switch-2363.test.ts`.
|
|
346
358
|
*/
|
|
347
359
|
function buildAgentHookSettings(target, options = {}) {
|
|
348
360
|
const url = buildAgentEventUrl(target, options);
|
|
@@ -369,6 +381,10 @@ function buildAgentHookSettings(target, options = {}) {
|
|
|
369
381
|
// Issue #1726. The event receiver, not the permission one: observation.
|
|
370
382
|
PreToolUse: [{ matcher: exports.TOOL_USE_MATCHER, hooks: [http()] }],
|
|
371
383
|
PostToolUse: [{ matcher: exports.TOOL_USE_MATCHER, hooks: [http()] }],
|
|
384
|
+
// Issue #2363. The model the session is now on, on every `/model` and
|
|
385
|
+
// `/fast` that changes it. Observation, so the event receiver; and only
|
|
386
|
+
// the `Post` half — see the function comment.
|
|
387
|
+
[model_switch_1.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME]: [{ hooks: [http()] }],
|
|
372
388
|
// Issue #1724. Points at its own receiver, not the event one.
|
|
373
389
|
PermissionRequest: [{ hooks: [permissionHttp()] }],
|
|
374
390
|
},
|