commandmate 0.23.0 → 0.24.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 +393 -384
- package/.next/app-path-routes-manifest.json +15 -14
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +1 -1
- 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/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 +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 +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 +1 -1
- 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 +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/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 +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 +1 -1
- 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 -0
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -0
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -0
- 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 +1 -1
- 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/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.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.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/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.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.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.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.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]/cli-tool/route.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]/execution-logs/[logId]/route.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_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.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.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.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.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.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.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.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.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]/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.js +5 -5
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_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]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_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 +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.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.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]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route_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.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.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.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.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.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/route.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]/route.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/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.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +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.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +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.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +1 -1
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +6 -6
- 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 +15 -14
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1366.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1825.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2546.js +1 -1
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3451.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4393.js +1 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/4455.js +1 -0
- package/.next/server/chunks/5164.js +1 -0
- package/.next/server/chunks/5959.js +5 -5
- package/.next/server/chunks/5998.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6159.js +1 -1
- package/.next/server/chunks/6274.js +2 -2
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7458.js +5 -5
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/880.js +21 -0
- package/.next/server/chunks/8807.js +134 -129
- package/.next/server/chunks/9058.js +1 -1
- package/.next/server/chunks/9123.js +8 -8
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9373.js +3 -3
- package/.next/server/chunks/9687.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/4322-dfd5a7119b5ba4fc.js +1 -0
- package/.next/static/chunks/{4974-eaf66770bfa9dea0.js → 4974-35592ec312322124.js} +1 -1
- package/.next/static/chunks/5229-0610b4e3288e777d.js +1 -0
- package/.next/static/chunks/6381-18a6a02a94d00d76.js +1 -0
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
- package/.next/static/chunks/{744-fa8c0ae444c8338c.js → 744-3ad06d8c8ca482fc.js} +1 -1
- package/.next/static/chunks/app/api/app/update/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/app/update-check/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/conversation/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/current-output/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/chat/page-15d13fc024d78f5d.js +1 -0
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/more/page-b8ba537baeac8d5b.js +1 -0
- package/.next/static/chunks/app/page-afc64708362f31e5.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/repositories/page-3469dacb6be7842f.js +1 -0
- package/.next/static/chunks/app/review/page-2d9cb7e068f8f35a.js +1 -0
- package/.next/static/chunks/app/sessions/page-7470c2bfd89e0df9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-5e24481162f7ea78.js +1 -0
- package/.next/static/chunks/app/skills/installed/page-efd2d710a27f9735.js +1 -0
- package/.next/static/chunks/app/skills/page-0498adfc6e48684b.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9ddcb224594f620f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e611d30e47989e5d.js +1 -0
- package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-3534d858912a6c92.js} +1 -1
- package/.next/static/css/3ac44cfc082d02ad.css +1 -0
- package/.next/static/smu4mnL7qMf8w38n9dQJE/_buildManifest.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/app/api/push/escalation/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +6 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +19 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +6 -0
- package/dist/cli/commands/verify.js +6 -1
- package/dist/cli/types/api-responses.d.ts +46 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +17 -1
- package/dist/server/locales/en/notifications.json +20 -1
- package/dist/server/locales/ja/notifications.json +20 -1
- package/dist/server/server.js +23 -0
- package/dist/server/src/lib/db/db.js +2 -1
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v56-gate-result-source.js +58 -0
- package/dist/server/src/lib/db/verification-db.js +26 -6
- package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +7 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +5 -0
- package/dist/server/src/lib/hooks/sources/define-source.js +8 -0
- package/dist/server/src/lib/hooks/sources/event-mapper.js +20 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +22 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +3 -0
- package/dist/server/src/lib/polling/response-checker.js +47 -0
- package/dist/server/src/lib/push/escalation-settings.js +114 -0
- package/dist/server/src/lib/push/index.js +21 -1
- package/dist/server/src/lib/push/notification-dedup.js +35 -0
- package/dist/server/src/lib/push/push-sender.js +66 -7
- package/dist/server/src/lib/push/waiting-push-notifier.js +231 -0
- package/dist/server/src/lib/realtime/waiting-broadcast.js +93 -0
- package/dist/server/src/lib/session/agent-event-state.js +260 -0
- package/dist/server/src/lib/session/current-output-builder.js +24 -0
- package/dist/server/src/lib/session/next-action-helper.js +93 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +38 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +136 -0
- package/dist/server/src/lib/session/waiting-kind.js +59 -0
- package/dist/server/src/lib/tasks/contract-message.js +64 -21
- package/dist/server/src/lib/tasks/contract-parser.js +58 -12
- package/dist/server/src/lib/verification/gate-runner.js +64 -22
- package/dist/server/src/lib/verification/verify-config.js +84 -51
- package/dist/server/src/lib/ws-server.js +9 -0
- package/dist/server/src/types/sidebar.js +68 -0
- package/package.json +1 -1
- package/.next/server/chunks/6283.js +0 -1
- package/.next/server/chunks/646.js +0 -21
- package/.next/static/chunks/4560-0917ae2e6a0e5400.js +0 -1
- package/.next/static/chunks/6488-95ba9d24a76f0cc5.js +0 -1
- package/.next/static/chunks/7229.edb331fb9fbafa27.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/templates/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +0 -1
- package/.next/static/chunks/app/layout-86574192bd3c0e6b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/more/page-1619018cac999bbc.js +0 -1
- package/.next/static/chunks/app/page-a34d26812f085b6c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +0 -1
- package/.next/static/chunks/app/review/page-b559bfb11c46931b.js +0 -1
- package/.next/static/chunks/app/sessions/page-3fa7e767d0ab3889.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +0 -1
- package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +0 -1
- package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-6041d3c3db326317.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-966a451ae7b0903a.js +0 -1
- package/.next/static/css/d3453a6876553d32.css +0 -1
- package/.next/static/wH6K6QNPHSdATFkVoIcy3/_buildManifest.js +0 -1
- /package/.next/static/{wH6K6QNPHSdATFkVoIcy3 → smu4mnL7qMf8w38n9dQJE}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model / reasoning-effort extraction from the terminal frame (Issue #1784).
|
|
4
|
+
*
|
|
5
|
+
* Phase 1 (#1783) reads the model off the agents' own structured hook events.
|
|
6
|
+
* That channel has one hole and one gap:
|
|
7
|
+
*
|
|
8
|
+
* - **No effort, anywhere.** Not one hook payload of any tool carries a
|
|
9
|
+
* reasoning-effort field (verified across every fixture under
|
|
10
|
+
* `tests/fixtures/hooks/`). The only place the number exists at all is on
|
|
11
|
+
* screen, in the TUI's own chrome.
|
|
12
|
+
* - **No model after a restart, for Claude.** Claude publishes its model on
|
|
13
|
+
* `SessionStart` and on nothing else, so a server that restarts mid-session
|
|
14
|
+
* never hears it again for that session. The banner is still in scrollback.
|
|
15
|
+
*
|
|
16
|
+
* This module is the screen-scraped half. It is deliberately a *separate* set of
|
|
17
|
+
* patterns from `cli-patterns.ts`: two of the patterns it would otherwise have
|
|
18
|
+
* been tempting to extend are load-bearing for behaviour that has nothing to do
|
|
19
|
+
* with display —
|
|
20
|
+
*
|
|
21
|
+
* - `CODEX_STATUS_BAR_PATTERN` is the footer boundary the Codex running/idle
|
|
22
|
+
* decision is windowed on (#1150). Widening it to capture groups risks the
|
|
23
|
+
* dot.
|
|
24
|
+
* - `CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN` is the guard that stops Auto-Yes from
|
|
25
|
+
* Enter-confirming the `/model` picker and rewriting the user's **global
|
|
26
|
+
* default model** (#1495).
|
|
27
|
+
*
|
|
28
|
+
* So: read-only reuse of `CODEX_STATUS_BAR_PATTERN` to *locate* the footer (one
|
|
29
|
+
* definition of "which line is the status bar", shared with the detector), new
|
|
30
|
+
* patterns to read values out of it, and not one byte changed in either file.
|
|
31
|
+
*
|
|
32
|
+
* ## Where the values come from (all measured on real TUIs, 2026-08-15)
|
|
33
|
+
*
|
|
34
|
+
* | tool | line |
|
|
35
|
+
* |-------------|------------------------------------------------------------------|
|
|
36
|
+
* | codex | footer: `gpt-5.6-sol xhigh · ~/share/work/…` |
|
|
37
|
+
* | claude | banner: `▝▜█████▛▘ Opus 5 (1M context) with xhigh effort · Claude Max` |
|
|
38
|
+
* | antigravity | footer: `? for shortcuts … Gemini 3.7 Flash · hig` |
|
|
39
|
+
* | antigravity | banner: ` ▀▀▀▀▀▀▀▀ Gemini 3.7 Flash (High)` |
|
|
40
|
+
*
|
|
41
|
+
* Everything is matched **after** `stripAnsi`. The real captures are shot
|
|
42
|
+
* through with SGR sequences *inside* the value — the Codex footer arrives as
|
|
43
|
+
* `\x1b[38;2;…mgpt-5.6-sol xhigh\x1b[2m\x1b[39m · …` — so a pattern applied to
|
|
44
|
+
* the raw bytes matches nothing at all. `tests/fixtures/model-info-captures.ts`
|
|
45
|
+
* keeps one ANSI-bearing capture precisely so a regression here fails a test
|
|
46
|
+
* rather than a user's screen.
|
|
47
|
+
*
|
|
48
|
+
* ## Not a new capture
|
|
49
|
+
*
|
|
50
|
+
* Nothing here issues a `capture-pane`. {@link extractModelInfo} is a pure
|
|
51
|
+
* function of text the status-detection poll already fetched
|
|
52
|
+
* (`worktree-status-helper.ts`), so the added load is zero.
|
|
53
|
+
*
|
|
54
|
+
* @see Issue #1784, Phase 2 of the model/effort visibility series
|
|
55
|
+
*/
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
58
|
+
exports.resolveEffortToken = resolveEffortToken;
|
|
59
|
+
exports.extractModelInfo = extractModelInfo;
|
|
60
|
+
exports.deriveEffortFromModelId = deriveEffortFromModelId;
|
|
61
|
+
exports.mergeModelInfo = mergeModelInfo;
|
|
62
|
+
const ansi_1 = require("./ansi");
|
|
63
|
+
const cli_patterns_1 = require("./cli-patterns");
|
|
64
|
+
/**
|
|
65
|
+
* The reasoning-effort vocabulary these tools actually print.
|
|
66
|
+
*
|
|
67
|
+
* `minimal` and `xhigh` are the ends Codex exposes; Claude prints `xhigh` too.
|
|
68
|
+
* Anything outside this list is treated as "not an effort token", which is what
|
|
69
|
+
* keeps a stray word at the end of a status bar from being published as one.
|
|
70
|
+
*/
|
|
71
|
+
exports.REASONING_EFFORT_LEVELS = ['minimal', 'low', 'medium', 'high', 'xhigh'];
|
|
72
|
+
/**
|
|
73
|
+
* Longest string accepted as a model name.
|
|
74
|
+
*
|
|
75
|
+
* A bound, not a format check: the point is that a runaway match (a wrapped
|
|
76
|
+
* conversation line that happened to satisfy the shape) is rejected rather than
|
|
77
|
+
* pushed into the UI and the API. Real ids are far shorter — the longest
|
|
78
|
+
* observed is `Opus 5 (1M context)` at 19.
|
|
79
|
+
*/
|
|
80
|
+
const MAX_MODEL_NAME_LENGTH = 64;
|
|
81
|
+
/** An unknown answer. Freshly built each time — callers may keep the object. */
|
|
82
|
+
function unknown() {
|
|
83
|
+
return { model: null, effort: null };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Bare model *token* shape — Codex, whose footer prints the raw id.
|
|
87
|
+
*
|
|
88
|
+
* No spaces: the Codex footer's model is one token (`gpt-5.6-sol`, `o4-mini`).
|
|
89
|
+
*/
|
|
90
|
+
const MODEL_TOKEN_SHAPE = /^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/;
|
|
91
|
+
/**
|
|
92
|
+
* Model *label* shape — Claude and Antigravity, which print a display name.
|
|
93
|
+
*
|
|
94
|
+
* Spaces, dots and parentheses are in (`Opus 5 (1M context)`, `Gemini 3.7
|
|
95
|
+
* Flash`); anything else — box glyphs, `?`, `·`, `>` — is out, which is what
|
|
96
|
+
* rejects a status-bar hint that was mistaken for the model.
|
|
97
|
+
*/
|
|
98
|
+
const MODEL_LABEL_SHAPE = /^[A-Za-z0-9][A-Za-z0-9 .()[\]_:@/-]*$/;
|
|
99
|
+
function isPlausibleModelToken(value) {
|
|
100
|
+
return value.length > 0 && value.length <= MAX_MODEL_NAME_LENGTH && MODEL_TOKEN_SHAPE.test(value);
|
|
101
|
+
}
|
|
102
|
+
function isPlausibleModelLabel(value) {
|
|
103
|
+
return value.length > 0 && value.length <= MAX_MODEL_NAME_LENGTH && MODEL_LABEL_SHAPE.test(value);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a word to a {@link ReasoningEffort}, or null.
|
|
107
|
+
*
|
|
108
|
+
* `allowTruncated` exists for exactly one measured defect: **agy 1.1.13 renders
|
|
109
|
+
* its right-aligned status bar one column short**, so `high` reaches the pane as
|
|
110
|
+
* `hig` at every width tested (200 and 120 both produce a 199-/119-column line
|
|
111
|
+
* whose last glyph is missing). Accepting a one-character-short prefix recovers
|
|
112
|
+
* it. The prefix must resolve to exactly one level, so nothing ambiguous is ever
|
|
113
|
+
* promoted — `hig`→`high`, `lo`→`low`, `mediu`→`medium`, `xhig`→`xhigh`, and a
|
|
114
|
+
* single letter resolves to nothing.
|
|
115
|
+
*
|
|
116
|
+
* Off for Codex and Claude: neither truncates, and loosening a matcher that does
|
|
117
|
+
* not need it only buys false positives.
|
|
118
|
+
*/
|
|
119
|
+
function resolveEffortToken(token, options = {}) {
|
|
120
|
+
const normalized = token.trim().toLowerCase();
|
|
121
|
+
if (normalized === '')
|
|
122
|
+
return null;
|
|
123
|
+
if (exports.REASONING_EFFORT_LEVELS.includes(normalized))
|
|
124
|
+
return normalized;
|
|
125
|
+
if (!options.allowTruncated || normalized.length < 2)
|
|
126
|
+
return null;
|
|
127
|
+
const candidates = exports.REASONING_EFFORT_LEVELS.filter((level) => level.length === normalized.length + 1 && level.startsWith(normalized));
|
|
128
|
+
return candidates.length === 1 ? candidates[0] : null;
|
|
129
|
+
}
|
|
130
|
+
// =============================================================================
|
|
131
|
+
// Codex
|
|
132
|
+
// =============================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Reads `<model>[ <effort>]` off the head of a Codex status bar (Issue #1784).
|
|
135
|
+
*
|
|
136
|
+
* Applied to the segment *before* the first "·", which is what makes one pattern
|
|
137
|
+
* cover all three footer formats the CLI has shipped:
|
|
138
|
+
*
|
|
139
|
+
* v0.147 / v0.141: `gpt-5.6-sol xhigh · ~/share/work/…` → head `gpt-5.6-sol xhigh `
|
|
140
|
+
* legacy w/ quota: `gpt-5.4 high · 21% left · ~/…` → head `gpt-5.4 high `
|
|
141
|
+
* legacy o4-mini: ` o4-mini 50% left · /path` → head ` o4-mini 50% left `
|
|
142
|
+
*
|
|
143
|
+
* The last one is why the effort group is optional *and* why it is anchored to a
|
|
144
|
+
* keyword rather than "the second token": that format's second token is `50%`,
|
|
145
|
+
* and a positional read would publish "50%" as the reasoning effort.
|
|
146
|
+
*
|
|
147
|
+
* No /g flag (stateless `exec`). No nested quantifiers — `[^\s·]+` and the
|
|
148
|
+
* optional `\s+<keyword>` are adjacent, never nested (ReDoS-safe, same rule
|
|
149
|
+
* `cli-patterns.ts` documents).
|
|
150
|
+
*/
|
|
151
|
+
exports.CODEX_FOOTER_MODEL_PATTERN = /^\s*([^\s·]+)(?:\s+(minimal|low|medium|high|xhigh)\b)?/i;
|
|
152
|
+
function readCodexFooter(line) {
|
|
153
|
+
// Same "is this the status bar" question the detector asks, answered by the
|
|
154
|
+
// same pattern (#1150). Imported read-only: this module must never be the
|
|
155
|
+
// reason that boundary moves.
|
|
156
|
+
if (!cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line))
|
|
157
|
+
return null;
|
|
158
|
+
const separator = line.indexOf('·');
|
|
159
|
+
if (separator < 0)
|
|
160
|
+
return null;
|
|
161
|
+
const match = exports.CODEX_FOOTER_MODEL_PATTERN.exec(line.slice(0, separator));
|
|
162
|
+
if (!match)
|
|
163
|
+
return null;
|
|
164
|
+
const model = match[1];
|
|
165
|
+
if (!isPlausibleModelToken(model))
|
|
166
|
+
return null;
|
|
167
|
+
const effort = match[2] ? resolveEffortToken(match[2]) : null;
|
|
168
|
+
// `CODEX_STATUS_BAR_PATTERN` is a *boundary* test — "a token, a middle dot, a
|
|
169
|
+
// trailing path" — and the detector can afford that because it only ever asks
|
|
170
|
+
// it inside a window it already knows the footer is in. Reading values needs
|
|
171
|
+
// one more bit of evidence, because a sentence Codex printed about a file
|
|
172
|
+
// ("Updated · /src/foo.ts") satisfies the boundary shape, and a value read
|
|
173
|
+
// here LATCHES for the rest of the session. Every Codex model id carries a
|
|
174
|
+
// version number, so a digit in the token or a recognised effort keyword
|
|
175
|
+
// beside it is what separates chrome from prose.
|
|
176
|
+
if (effort === null && !/\d/.test(model))
|
|
177
|
+
return null;
|
|
178
|
+
return { model, effort };
|
|
179
|
+
}
|
|
180
|
+
// =============================================================================
|
|
181
|
+
// Claude
|
|
182
|
+
// =============================================================================
|
|
183
|
+
/**
|
|
184
|
+
* Reads `<model> with <effort> effort` off the Claude startup banner (#1784).
|
|
185
|
+
*
|
|
186
|
+
* Measured on claude 2.1.232:
|
|
187
|
+
* `▝▜█████▛▘ Opus 5 (1M context) with xhigh effort · Claude Max`
|
|
188
|
+
*
|
|
189
|
+
* Three deliberate choices:
|
|
190
|
+
*
|
|
191
|
+
* - **The block/box glyph is required.** `U+2500–U+259F` covers both the ASCII
|
|
192
|
+
* art of the plain banner (`▝▜█████▛▘`) and the frame of the boxed welcome
|
|
193
|
+
* variant (`│ Opus 4.8 (1M context) with xhigh effort · Claude Max │`,
|
|
194
|
+
* `tests/fixtures/claude-model-overlay.ts`). Without it, a *reply* containing
|
|
195
|
+
* the words "…with high effort…" would be scraped as a model — Claude's own
|
|
196
|
+
* prose shares the pane with its chrome.
|
|
197
|
+
* - **The plan suffix is not matched.** `· Claude Max` is one plan of several
|
|
198
|
+
* and is not part of the model; the match ends at `effort`.
|
|
199
|
+
* - **`(1M context)` is inside the model, not stripped.** It is what
|
|
200
|
+
* distinguishes the 1M variant, and #1783 already displays the hook-reported
|
|
201
|
+
* id verbatim.
|
|
202
|
+
*
|
|
203
|
+
* No /g. No nested quantifiers: the lazy `[^\u2500-\u259F]*?` sits between two
|
|
204
|
+
* literal-anchored parts, and the greedy prefix class is disjoint from `\S`.
|
|
205
|
+
*/
|
|
206
|
+
exports.CLAUDE_STARTUP_BANNER_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+with\s+(minimal|low|medium|high|xhigh)\s+effort\b/i;
|
|
207
|
+
function readClaudeBanner(line) {
|
|
208
|
+
const match = exports.CLAUDE_STARTUP_BANNER_PATTERN.exec(line);
|
|
209
|
+
if (!match)
|
|
210
|
+
return null;
|
|
211
|
+
const model = match[1].trim();
|
|
212
|
+
if (!isPlausibleModelLabel(model))
|
|
213
|
+
return null;
|
|
214
|
+
return { model, effort: resolveEffortToken(match[2]) };
|
|
215
|
+
}
|
|
216
|
+
// =============================================================================
|
|
217
|
+
// Antigravity
|
|
218
|
+
// =============================================================================
|
|
219
|
+
/**
|
|
220
|
+
* The two left-hand hints agy prints on its status bar (#1784).
|
|
221
|
+
*
|
|
222
|
+
* `? for shortcuts` when idle and `esc to cancel` while generating — both
|
|
223
|
+
* measured on agy 1.1.13, and both already documented in
|
|
224
|
+
* `src/lib/cli-tools/antigravity.ts`. Requiring one of them is what stops a
|
|
225
|
+
* wrapped answer line that happens to end in `· high` from being read as chrome.
|
|
226
|
+
*/
|
|
227
|
+
exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = /^\s*(?:\?\s+for\s+shortcuts|esc\s+to\s+cancel)\b/i;
|
|
228
|
+
/**
|
|
229
|
+
* Reads `<model> (<Effort>)` off the agy startup banner (#1784).
|
|
230
|
+
*
|
|
231
|
+
* Measured: ` ▀▀▀▀▀▀▀▀ Gemini 3.7 Flash (High)`. Same block-glyph anchor
|
|
232
|
+
* as the Claude banner, for the same reason. The sibling banner lines are
|
|
233
|
+
* rejected by the effort keyword — the account line `dev@example.com (Google AI
|
|
234
|
+
* Pro)` sitting directly above it has the shape but not the vocabulary.
|
|
235
|
+
*
|
|
236
|
+
* Used only as the fallback: the status bar survives scrollback eviction and the
|
|
237
|
+
* banner does not.
|
|
238
|
+
*/
|
|
239
|
+
exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+\((minimal|low|medium|high|xhigh)\)\s*$/i;
|
|
240
|
+
function readAntigravityStatusBar(line) {
|
|
241
|
+
if (!exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN.test(line))
|
|
242
|
+
return null;
|
|
243
|
+
const separator = line.lastIndexOf('·');
|
|
244
|
+
if (separator < 0)
|
|
245
|
+
return null;
|
|
246
|
+
// agy drops the final column of this line (see `resolveEffortToken`), so the
|
|
247
|
+
// trailing token is read with truncation tolerance. If it does not resolve,
|
|
248
|
+
// the whole line is abandoned rather than half-read: a bar with no effort
|
|
249
|
+
// suffix would otherwise hand back a model name with its last letter shaved
|
|
250
|
+
// off.
|
|
251
|
+
const effort = resolveEffortToken(line.slice(separator + 1), { allowTruncated: true });
|
|
252
|
+
if (!effort)
|
|
253
|
+
return null;
|
|
254
|
+
// The bar is `<hint>` … right-aligned `<model>`, so the model is the last
|
|
255
|
+
// run of text separated from the hint by the alignment padding.
|
|
256
|
+
const chunks = line.slice(0, separator).trimEnd().split(/\s{2,}/);
|
|
257
|
+
const model = (chunks[chunks.length - 1] ?? '').trim();
|
|
258
|
+
return { model: isPlausibleModelLabel(model) ? model : null, effort };
|
|
259
|
+
}
|
|
260
|
+
function readAntigravityBanner(line) {
|
|
261
|
+
const match = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN.exec(line);
|
|
262
|
+
if (!match)
|
|
263
|
+
return null;
|
|
264
|
+
const model = match[1].trim();
|
|
265
|
+
if (!isPlausibleModelLabel(model))
|
|
266
|
+
return null;
|
|
267
|
+
return { model, effort: resolveEffortToken(match[2]) };
|
|
268
|
+
}
|
|
269
|
+
// =============================================================================
|
|
270
|
+
// Public API
|
|
271
|
+
// =============================================================================
|
|
272
|
+
/**
|
|
273
|
+
* Scan a capture from the bottom up, returning the first line that reads.
|
|
274
|
+
*
|
|
275
|
+
* Bottom-up is the whole rule: the status bar is the last line of the frame, and
|
|
276
|
+
* for Claude "the last banner wins" is how a mid-session `/model` switch — which
|
|
277
|
+
* prints a fresh banner — overtakes the one from session start.
|
|
278
|
+
*
|
|
279
|
+
* ANSI is stripped per line rather than over the whole blob so a malformed OSC
|
|
280
|
+
* sequence can never swallow a newline and merge two lines into one.
|
|
281
|
+
*/
|
|
282
|
+
function scanFromEnd(captureText, read) {
|
|
283
|
+
const lines = captureText.split('\n');
|
|
284
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
285
|
+
const result = read((0, ansi_1.stripAnsi)(lines[i]));
|
|
286
|
+
if (result)
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* What this capture says the session's model and reasoning effort are (#1784).
|
|
293
|
+
*
|
|
294
|
+
* Pure and side-effect free. Never throws, and answers `{ model: null, effort:
|
|
295
|
+
* null }` for every tool it has no rule for (gemini / copilot / vibe-local /
|
|
296
|
+
* opencode — out of scope for this Issue) and for every frame that does not show
|
|
297
|
+
* the chrome it looks for.
|
|
298
|
+
*
|
|
299
|
+
* **Answering null is a correct outcome, not a failure.** tmux keeps a
|
|
300
|
+
* 2000-line `history-limit`; a Claude session that has been talking for hours
|
|
301
|
+
* has long since scrolled its banner away, and the honest answer then is "the
|
|
302
|
+
* screen does not say" — the alternative, a stale or guessed value, is the one
|
|
303
|
+
* thing this must not do. The caller latches the last non-null sighting.
|
|
304
|
+
*
|
|
305
|
+
* @param cliToolId - Which TUI the text came from; the rules are per-tool
|
|
306
|
+
* @param captureText - `capture-pane` output, ANSI-bearing or not
|
|
307
|
+
*/
|
|
308
|
+
function extractModelInfo(cliToolId, captureText) {
|
|
309
|
+
if (!captureText)
|
|
310
|
+
return unknown();
|
|
311
|
+
switch (cliToolId) {
|
|
312
|
+
case 'codex':
|
|
313
|
+
return scanFromEnd(captureText, readCodexFooter) ?? unknown();
|
|
314
|
+
case 'claude':
|
|
315
|
+
return scanFromEnd(captureText, readClaudeBanner) ?? unknown();
|
|
316
|
+
case 'antigravity':
|
|
317
|
+
return (scanFromEnd(captureText, readAntigravityStatusBar) ??
|
|
318
|
+
scanFromEnd(captureText, readAntigravityBanner) ??
|
|
319
|
+
unknown());
|
|
320
|
+
default:
|
|
321
|
+
return unknown();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* The effort an Antigravity model id carries in its own name (#1784).
|
|
326
|
+
*
|
|
327
|
+
* agy's ids embed the level — `gemini-3.7-flash-high`, `gemini-3.5-flash-low` —
|
|
328
|
+
* and that id arrives on **every** agy hook payload (`modelName`), which makes
|
|
329
|
+
* it a strictly better source than the screen for this one tool: no scrollback
|
|
330
|
+
* dependency, no truncation, no polling delay.
|
|
331
|
+
*
|
|
332
|
+
* Ids that carry no suffix (`claude-sonnet-4-6`, `claude-opus-4-6-thinking`)
|
|
333
|
+
* answer null and fall through to the scraped bar.
|
|
334
|
+
*
|
|
335
|
+
* **Measured against the Issue text**: #1784 lists `gpt-oss-120b-medium` as an
|
|
336
|
+
* id "without a suffix" while also specifying `-low|-medium|-high$` as the rule
|
|
337
|
+
* — the two contradict each other, because that id ends in `-medium`. The stated
|
|
338
|
+
* rule is applied as written (it reads `medium`), which is also the reading that
|
|
339
|
+
* matches what the level means for that model. Nothing is lost either way: the
|
|
340
|
+
* *model* shown in the UI is the hook-reported id verbatim, so the id is never
|
|
341
|
+
* rewritten by this function.
|
|
342
|
+
*
|
|
343
|
+
* `minimal` / `xhigh` are deliberately not in the suffix vocabulary: no agy id
|
|
344
|
+
* has been observed with them, and a model genuinely named `…-minimal` would be
|
|
345
|
+
* misread.
|
|
346
|
+
*/
|
|
347
|
+
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = /-(low|medium|high)$/i;
|
|
348
|
+
function deriveEffortFromModelId(modelId) {
|
|
349
|
+
if (!modelId)
|
|
350
|
+
return null;
|
|
351
|
+
const match = exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN.exec(modelId);
|
|
352
|
+
return match ? match[1].toLowerCase() : null;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Fold the hook-reported model together with the scraped frame (#1784).
|
|
356
|
+
*
|
|
357
|
+
* The precedence, and why:
|
|
358
|
+
*
|
|
359
|
+
* - **model — hooks win.** A hook payload is the agent naming itself; the
|
|
360
|
+
* screen is a render of that, abbreviated for display (agy prints `Gemini 3.7
|
|
361
|
+
* Flash` for `gemini-3.7-flash-high`). When they disagree the exact one is
|
|
362
|
+
* right. Capture only fills the hole: Claude after a server restart, and any
|
|
363
|
+
* session that predates this process.
|
|
364
|
+
* - **effort — the screen wins for codex/claude**, because it is the *only*
|
|
365
|
+
* source: no hook payload of any tool carries an effort field.
|
|
366
|
+
* - **effort — the id wins for antigravity**, because agy encodes the level in
|
|
367
|
+
* the id it reports on every event, and that beats a bar that is only on
|
|
368
|
+
* screen while the session lives.
|
|
369
|
+
*
|
|
370
|
+
* The derivation reads the *merged* model rather than the hook value alone:
|
|
371
|
+
* effort-in-the-id is a property of the id being published, and when no hook has
|
|
372
|
+
* spoken the merged value is the scraped display name, which carries no suffix
|
|
373
|
+
* and falls through to the scraped effort anyway. Same answer, one input.
|
|
374
|
+
*
|
|
375
|
+
* @param cliToolId - Which tool; only `antigravity` derives effort from the id
|
|
376
|
+
* @param hooksModel - {@link import('../../lib/session/agent-event-state').getLastKnownAgentModel}
|
|
377
|
+
* @param captured - {@link extractModelInfo}'s answer, latched by the caller
|
|
378
|
+
*/
|
|
379
|
+
function mergeModelInfo(cliToolId, hooksModel, captured) {
|
|
380
|
+
const model = (hooksModel || null) ?? captured?.model ?? null;
|
|
381
|
+
const capturedEffort = captured?.effort ?? null;
|
|
382
|
+
const effort = cliToolId === 'antigravity' ? (deriveEffortFromModelId(model) ?? capturedEffort) : capturedEffort;
|
|
383
|
+
return { model, effort };
|
|
384
|
+
}
|
|
@@ -198,6 +198,10 @@ exports.antigravityAgentEventSource = (0, define_source_1.definePushHookSource)(
|
|
|
198
198
|
// protojson camelCase, one tool out of six. `session_id` does not exist here.
|
|
199
199
|
conversationIdFields: ['conversationId'],
|
|
200
200
|
toolCallIdFields: [],
|
|
201
|
+
// Issue #1783. protojson camelCase again: `modelName`, not `model`. Present on
|
|
202
|
+
// all six captured fixtures, so agy is the one tool whose model survives every
|
|
203
|
+
// kind of event — including the ones that carry no session id at all.
|
|
204
|
+
modelFields: ['modelName'],
|
|
201
205
|
// The tool name is nested under `toolCall`, and it is present on both
|
|
202
206
|
// `PreToolUse` and `PostToolUse` payloads (checked against both fixtures).
|
|
203
207
|
extractDetail: (event, payload) => event === 'pre_tool_use' || event === 'post_tool_use'
|
|
@@ -109,6 +109,13 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
109
109
|
nativeEventNameFields: ['hook_event_name'],
|
|
110
110
|
conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
|
|
111
111
|
toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
|
|
112
|
+
// Issue #1783. Claude sends it on `SessionStart` and nowhere else — checked
|
|
113
|
+
// against every fixture in `tests/fixtures/hooks/claude/`, where only
|
|
114
|
+
// `session-start.json` carries the key. So the value has to be *remembered*
|
|
115
|
+
// rather than read off the newest event; `getLastKnownAgentModel` is what
|
|
116
|
+
// does that. The value arrives with its own suffix (`claude-opus-5[1m]`) and
|
|
117
|
+
// is not parsed here: a display string the tool chose is the tool's to spell.
|
|
118
|
+
modelFields: ['model'],
|
|
112
119
|
// S2.
|
|
113
120
|
extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
|
|
114
121
|
// S7. Both parsers are strict and answer null for anything they cannot vouch
|
|
@@ -107,6 +107,11 @@ exports.codexAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
107
107
|
nativeEventNameFields: ['hook_event_name'],
|
|
108
108
|
conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
|
|
109
109
|
toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
|
|
110
|
+
// Issue #1783. Same spelling as Claude, but on every event except `SessionEnd`
|
|
111
|
+
// rather than on `SessionStart` alone — verified against the fixtures, where
|
|
112
|
+
// only `session-end.json` lacks the key. codex therefore keeps its model
|
|
113
|
+
// visible through a restart of this server, which claude does not.
|
|
114
|
+
modelFields: ['model'],
|
|
110
115
|
extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
|
|
111
116
|
// The captured `PermissionRequest` payload is Claude-shaped field for field —
|
|
112
117
|
// `hook_event_name`, `tool_name`, `tool_input`, `session_id`,
|
|
@@ -67,6 +67,8 @@ function definePushHookSource(spec) {
|
|
|
67
67
|
detail: spec.extractDetail,
|
|
68
68
|
conversationId: spec.conversationIdFields,
|
|
69
69
|
toolCallId: spec.toolCallIdFields,
|
|
70
|
+
modelFields: spec.modelFields,
|
|
71
|
+
extractModel: spec.extractModel,
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
|
|
@@ -80,6 +82,8 @@ function definePushHookSource(spec) {
|
|
|
80
82
|
detail: spec.extractDetail,
|
|
81
83
|
conversationId: spec.conversationIdFields,
|
|
82
84
|
toolCallId: spec.toolCallIdFields,
|
|
85
|
+
modelFields: spec.modelFields,
|
|
86
|
+
extractModel: spec.extractModel,
|
|
83
87
|
});
|
|
84
88
|
},
|
|
85
89
|
parsePermissionRequest: spec.parsePermissionRequest,
|
|
@@ -136,6 +140,8 @@ function definePullEventSource(spec) {
|
|
|
136
140
|
detail: spec.extractDetail,
|
|
137
141
|
conversationId: spec.conversationIdFields,
|
|
138
142
|
toolCallId: spec.toolCallIdFields,
|
|
143
|
+
modelFields: spec.modelFields,
|
|
144
|
+
extractModel: spec.extractModel,
|
|
139
145
|
});
|
|
140
146
|
}
|
|
141
147
|
const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
|
|
@@ -147,6 +153,8 @@ function definePullEventSource(spec) {
|
|
|
147
153
|
detail: spec.extractDetail,
|
|
148
154
|
conversationId: spec.conversationIdFields,
|
|
149
155
|
toolCallId: spec.toolCallIdFields,
|
|
156
|
+
modelFields: spec.modelFields,
|
|
157
|
+
extractModel: spec.extractModel,
|
|
150
158
|
});
|
|
151
159
|
},
|
|
152
160
|
parsePermissionRequest: spec.parsePermissionRequest,
|
|
@@ -33,6 +33,7 @@ exports.resetUnknownEventTallies = resetUnknownEventTallies;
|
|
|
33
33
|
exports.readStringField = readStringField;
|
|
34
34
|
exports.readFirstStringField = readFirstStringField;
|
|
35
35
|
exports.boundDetail = boundDetail;
|
|
36
|
+
exports.boundModel = boundModel;
|
|
36
37
|
exports.isPlainObject = isPlainObject;
|
|
37
38
|
exports.readNestedString = readNestedString;
|
|
38
39
|
exports.buildNormalizedEvent = buildNormalizedEvent;
|
|
@@ -118,6 +119,20 @@ function boundDetail(value) {
|
|
|
118
119
|
return null;
|
|
119
120
|
return value.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH);
|
|
120
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Trim a model id to the length the store accepts (Issue #1783).
|
|
124
|
+
*
|
|
125
|
+
* The same bound as {@link boundDetail} and deliberately so: both are short
|
|
126
|
+
* enum-ish words the agent chose, both end up rendered, and giving the model its
|
|
127
|
+
* own number would only invite the two to drift. Named separately because the
|
|
128
|
+
* call sites read better and because a future measurement could move one
|
|
129
|
+
* without moving the other.
|
|
130
|
+
*/
|
|
131
|
+
function boundModel(value) {
|
|
132
|
+
if (value === null || value === '')
|
|
133
|
+
return null;
|
|
134
|
+
return value.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH);
|
|
135
|
+
}
|
|
121
136
|
/** Type guard for a JSON object (not an array, not null). */
|
|
122
137
|
function isPlainObject(value) {
|
|
123
138
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
@@ -151,6 +166,11 @@ function buildNormalizedEvent(mapping, payload, receivedAt, fallbacks = {}) {
|
|
|
151
166
|
(fallbacks.conversationId ? readFirstStringField(payload, fallbacks.conversationId) : null),
|
|
152
167
|
toolCallId: mapping.toolCallId ??
|
|
153
168
|
(fallbacks.toolCallId ? readFirstStringField(payload, fallbacks.toolCallId) : null),
|
|
169
|
+
// Issue #1783. Every source runs through here, so a tool that declares
|
|
170
|
+
// neither hook simply answers null — which is the honest answer for gemini
|
|
171
|
+
// and copilot, whose payloads never carry one.
|
|
172
|
+
model: boundModel(fallbacks.extractModel?.(payload) ??
|
|
173
|
+
(fallbacks.modelFields ? readFirstStringField(payload, fallbacks.modelFields) : null)),
|
|
154
174
|
raw: payload,
|
|
155
175
|
receivedAt,
|
|
156
176
|
};
|
|
@@ -230,6 +230,12 @@ async function ingestOpencodeEvent(target, event) {
|
|
|
230
230
|
detail: event.detail?.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH) ?? null,
|
|
231
231
|
sessionId: event.conversationId,
|
|
232
232
|
message: describeNotification(event)?.slice(0, structured_prompt_1.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH) ?? null,
|
|
233
|
+
// Issue #1783. The second of the two receiving paths — this one is
|
|
234
|
+
// in-process rather than an HTTP route, and forgetting it would leave
|
|
235
|
+
// opencode as the one tool whose model is extracted and then dropped.
|
|
236
|
+
// Already bounded by the normaliser; null on the frames that carry no
|
|
237
|
+
// `properties.info.model` (every `session.idle`, every tool part).
|
|
238
|
+
model: event.model,
|
|
233
239
|
});
|
|
234
240
|
if (event.event === 'notification' && event.detail === mappers_1.OPENCODE_PERMISSION_DETAIL) {
|
|
235
241
|
await adjudicatePermission(target, event, instanceId);
|
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.OPENCODE_MAPPERS = exports.OPENCODE_ERROR_DETAIL = exports.OPENCODE_QUESTION_DETAIL = exports.OPENCODE_PERMISSION_DETAIL = void 0;
|
|
37
37
|
exports.frameProperties = frameProperties;
|
|
38
38
|
exports.frameSessionId = frameSessionId;
|
|
39
|
+
exports.frameModel = frameModel;
|
|
39
40
|
exports.partToolName = partToolName;
|
|
40
41
|
exports.partCallId = partCallId;
|
|
41
42
|
exports.withConversationId = withConversationId;
|
|
@@ -69,6 +70,27 @@ function frameProperties(payload) {
|
|
|
69
70
|
function frameSessionId(payload) {
|
|
70
71
|
return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['sessionID']);
|
|
71
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* `properties.info.model` — the model this frame's session/message ran on (#1783).
|
|
75
|
+
*
|
|
76
|
+
* Two spellings, both live, and the Issue text only named the first: a
|
|
77
|
+
* `message.updated` frame carries `{ providerID, modelID }` while
|
|
78
|
+
* `session.created` / `session.deleted` carry `{ id, providerID }`. Checked
|
|
79
|
+
* against the captured fixtures, which is the only specification that has been
|
|
80
|
+
* right about this server so far (its own `/doc` omits `server.heartbeat`).
|
|
81
|
+
* Reading `modelID` alone would have left `session_start` — the one event a
|
|
82
|
+
* fresh subscription is guaranteed to see — with no model at all.
|
|
83
|
+
*
|
|
84
|
+
* `providerID` is deliberately not folded in. `github-copilot/claude-sonnet-4.6`
|
|
85
|
+
* would be a *composed* string, and every other tool reports the bare model, so
|
|
86
|
+
* composing here would make opencode the odd one out in the UI for no gain.
|
|
87
|
+
*/
|
|
88
|
+
function frameModel(payload) {
|
|
89
|
+
const info = frameProperties(payload).info;
|
|
90
|
+
if (!(0, event_mapper_1.isPlainObject)(info))
|
|
91
|
+
return null;
|
|
92
|
+
return (0, event_mapper_1.readNestedString)(info, ['model', 'modelID']) ?? (0, event_mapper_1.readNestedString)(info, ['model', 'id']);
|
|
93
|
+
}
|
|
72
94
|
/** `properties.part.state.status` — `pending` / `running` / `completed` / `error`. */
|
|
73
95
|
function partStatus(payload) {
|
|
74
96
|
return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['part', 'state', 'status']);
|
|
@@ -238,6 +238,9 @@ exports.opencodeAgentEventSource = (0, define_source_1.definePullEventSource)({
|
|
|
238
238
|
nativeEventNameFields: ['type'],
|
|
239
239
|
// Flat lookup cannot reach `properties.sessionID`; the rules fill it in.
|
|
240
240
|
conversationIdFields: [],
|
|
241
|
+
// Issue #1783: nor `properties.info.model.*`, so the spec takes the reader
|
|
242
|
+
// instead of a key list. See {@link frameModel} for the two spellings.
|
|
243
|
+
extractModel: mappers_1.frameModel,
|
|
241
244
|
parsePermissionRequest: payloads_1.parseOpencodePermissionRequest,
|
|
242
245
|
parseQuestion: payloads_1.parseOpencodeQuestion,
|
|
243
246
|
// Self-reference resolves at call time, which is after this const is bound.
|
|
@@ -28,7 +28,20 @@ const prompt_dedup_1 = require("./prompt-dedup");
|
|
|
28
28
|
const response_dedup_1 = require("./response-dedup");
|
|
29
29
|
const response_poller_core_1 = require("./response-poller-core");
|
|
30
30
|
const push_1 = require("../../lib/push");
|
|
31
|
+
// Issue #1790: imported by deep path, not through `@/lib/push`. Suites that
|
|
32
|
+
// replace the barrel to count notifications (e.g. the #1547 escalation test)
|
|
33
|
+
// would otherwise get `undefined` here and take down module evaluation.
|
|
34
|
+
const waiting_push_notifier_1 = require("../../lib/push/waiting-push-notifier");
|
|
35
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
31
36
|
const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
|
|
37
|
+
// Issue #1790: arm the waiting-edge push subscription.
|
|
38
|
+
//
|
|
39
|
+
// It has to exist before the first edge, and `server.ts` reaches this module at
|
|
40
|
+
// boot (it imports `polling/response-poller` for `stopAllPolling`, which pulls
|
|
41
|
+
// in `response-poller-core` and then this file), so this is the earliest hook
|
|
42
|
+
// the notification path owns. Idempotent by replacement, and it starts no timer
|
|
43
|
+
// and touches no database until a wait actually opens.
|
|
44
|
+
(0, waiting_push_notifier_1.startWaitingPushNotifier)();
|
|
32
45
|
/**
|
|
33
46
|
* Creates an incomplete extraction result with empty response.
|
|
34
47
|
* Centralizes the repeated pattern of returning an in-progress/incomplete state.
|
|
@@ -465,13 +478,39 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
|
|
|
465
478
|
});
|
|
466
479
|
// Web Push fan-out (Issue #1125): agent is now waiting for a prompt reply.
|
|
467
480
|
// Fire-and-forget — push is advisory and must never block/break the poller.
|
|
481
|
+
//
|
|
482
|
+
// Issue #1790: the wait is now named by #1786's episode rather than by the
|
|
483
|
+
// prompt text. The two lines below are ordered, not incidental:
|
|
484
|
+
//
|
|
485
|
+
// 1. the notification is raised first, while it still has the prompt's
|
|
486
|
+
// own question to quote — it records the episode in the dedup, so
|
|
487
|
+
// whichever path reports the wait second says nothing;
|
|
488
|
+
// 2. `observeWaitingEdge` then opens that same episode, which is what
|
|
489
|
+
// lets the edge listener (and #1788's WebSocket frame) agree with this
|
|
490
|
+
// call about *which* wait this is instead of raising a second one.
|
|
491
|
+
//
|
|
492
|
+
// Both use one timestamp so the episode the notification claims and the
|
|
493
|
+
// episode the store opens are the same number.
|
|
494
|
+
const promptObservedAt = Date.now();
|
|
495
|
+
const promptWaitingSince = (0, waiting_episode_state_1.getWaitingEpisode)(worktreeId, cliToolId, instanceId)?.since ?? promptObservedAt;
|
|
468
496
|
void (0, push_1.notifyPushSubscribers)({
|
|
469
497
|
worktreeId,
|
|
470
498
|
worktreeName: worktree.name,
|
|
471
499
|
kind: 'prompt',
|
|
472
500
|
agentName: resolvedInstanceId,
|
|
501
|
+
instanceId: resolvedInstanceId,
|
|
502
|
+
waitingKind: 'prompt',
|
|
503
|
+
waitingSince: promptWaitingSince,
|
|
473
504
|
excerpt: promptDetection.promptData?.question ?? promptSaveContent,
|
|
474
505
|
}).catch(() => { });
|
|
506
|
+
(0, waiting_episode_state_1.observeWaitingEdge)({
|
|
507
|
+
worktreeId,
|
|
508
|
+
cliToolId,
|
|
509
|
+
instanceId,
|
|
510
|
+
waiting: true,
|
|
511
|
+
kind: 'prompt',
|
|
512
|
+
now: promptObservedAt,
|
|
513
|
+
});
|
|
475
514
|
if (!isFullScreenTui) {
|
|
476
515
|
(0, response_poller_core_1.stopPolling)(worktreeId, cliToolId, instanceId);
|
|
477
516
|
}
|
|
@@ -562,6 +601,14 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
|
|
|
562
601
|
});
|
|
563
602
|
// Broadcast message to WebSocket clients
|
|
564
603
|
(0, ws_server_1.broadcastMessage)('message', { worktreeId, message });
|
|
604
|
+
// Issue #1790: the agent has just produced a reply, so whatever it was
|
|
605
|
+
// waiting for is over. Closing the episode here is what makes a *second*
|
|
606
|
+
// prompt in the same session notify again: without it a wait opened by the
|
|
607
|
+
// prompt branch above could stay open until a browser next probes the status
|
|
608
|
+
// API, and every later prompt would be folded into that stale episode and
|
|
609
|
+
// silently deduped. Nothing to close is a no-op, and no notification is
|
|
610
|
+
// raised for a closing edge.
|
|
611
|
+
(0, waiting_episode_state_1.observeWaitingEdge)({ worktreeId, cliToolId, instanceId, waiting: false });
|
|
565
612
|
// Web Push fan-out (Issue #1125): session completed (running → idle).
|
|
566
613
|
// Fire-and-forget — push is advisory and must never block/break the poller.
|
|
567
614
|
void (0, push_1.notifyPushSubscribers)({
|