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
|
@@ -43,7 +43,14 @@ exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.STRUCTURED_STATE_MAX_
|
|
|
43
43
|
exports.recordAgentStopEvent = recordAgentStopEvent;
|
|
44
44
|
exports.getLastStopEventAt = getLastStopEventAt;
|
|
45
45
|
exports.recordAgentEvent = recordAgentEvent;
|
|
46
|
+
exports.getAwaitingInstruction = getAwaitingInstruction;
|
|
47
|
+
exports.isAwaitingInstruction = isAwaitingInstruction;
|
|
46
48
|
exports.getLastAgentEvent = getLastAgentEvent;
|
|
49
|
+
exports.getLastKnownAgentModel = getLastKnownAgentModel;
|
|
50
|
+
exports.recordCapturedModelInfo = recordCapturedModelInfo;
|
|
51
|
+
exports.getLastCapturedModelInfo = getLastCapturedModelInfo;
|
|
52
|
+
exports.getResolvedAgentModelInfo = getResolvedAgentModelInfo;
|
|
53
|
+
exports.getLastKnownAgentEffort = getLastKnownAgentEffort;
|
|
47
54
|
exports.beginAgentEventGeneration = beginAgentEventGeneration;
|
|
48
55
|
exports.getAgentEventGenerationStartedAt = getAgentEventGenerationStartedAt;
|
|
49
56
|
exports.discardAgentEventState = discardAgentEventState;
|
|
@@ -60,7 +67,10 @@ exports.isDuplicateAgentEvent = isDuplicateAgentEvent;
|
|
|
60
67
|
exports.getRecentEventKeyCount = getRecentEventKeyCount;
|
|
61
68
|
exports.clearAgentStopEvents = clearAgentStopEvents;
|
|
62
69
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
70
|
+
const agent_event_types_1 = require("../../lib/hooks/agent-event-types");
|
|
63
71
|
const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
|
|
72
|
+
// Issue #1784: the terminal-frame half of "which model / effort is this on".
|
|
73
|
+
const model_info_extractor_1 = require("../../lib/detection/model-info-extractor");
|
|
64
74
|
const status_mapping_1 = require("../../lib/session/status-mapping");
|
|
65
75
|
const structured_prompt_1 = require("../../lib/session/structured-prompt");
|
|
66
76
|
/** compositeKey -> epoch ms of the most recent stop event. */
|
|
@@ -81,6 +91,46 @@ const askUserQuestion = globalThis.__agentEventAskUserQuestion ??
|
|
|
81
91
|
/** dedup key -> epoch ms it was first seen. See {@link isDuplicateAgentEvent}. */
|
|
82
92
|
const recentEventKeys = globalThis.__agentEventRecentKeys ??
|
|
83
93
|
(globalThis.__agentEventRecentKeys = new Map());
|
|
94
|
+
/** compositeKey -> the agent's own "I am waiting for instructions" (#1786). */
|
|
95
|
+
const awaitingInstruction = globalThis.__agentEventAwaitingInstruction ??
|
|
96
|
+
(globalThis.__agentEventAwaitingInstruction = new Map());
|
|
97
|
+
/**
|
|
98
|
+
* compositeKey -> the last non-null model this instance reported (Issue #1783).
|
|
99
|
+
*
|
|
100
|
+
* A *separate* map, not a field read off {@link lastAgentEvent}, and that is the
|
|
101
|
+
* whole point of it. `lastAgentEvent` is replaced wholesale on every delivery,
|
|
102
|
+
* and Claude puts the model on `SessionStart` and on nothing else — so the very
|
|
103
|
+
* next `UserPromptSubmit` would overwrite the only record that ever knew it, and
|
|
104
|
+
* the UI would show the model for the fraction of a second between session start
|
|
105
|
+
* and the first prompt. Keeping the last *non-null* sighting separately is what
|
|
106
|
+
* makes "which model is this session on" answerable at all for that tool.
|
|
107
|
+
*
|
|
108
|
+
* Never written with null: absent means "nothing has ever said", which is the
|
|
109
|
+
* honest state for gemini, copilot, and any session that predates this server
|
|
110
|
+
* process. See {@link getLastKnownAgentModel}.
|
|
111
|
+
*/
|
|
112
|
+
const lastAgentModel = globalThis.__agentEventLastModel ??
|
|
113
|
+
(globalThis.__agentEventLastModel = new Map());
|
|
114
|
+
/**
|
|
115
|
+
* compositeKey -> what the terminal frame last showed for this instance (#1784).
|
|
116
|
+
*
|
|
117
|
+
* The second source, and a strictly different kind of fact from
|
|
118
|
+
* {@link lastAgentModel}: that one is the agent naming itself over the hook
|
|
119
|
+
* channel, this one is the TUI's own chrome read back off the screen. It is
|
|
120
|
+
* kept apart rather than folded into the first map because the two have a
|
|
121
|
+
* precedence between them ({@link getResolvedAgentModelInfo}) — merging on write
|
|
122
|
+
* would let a scraped display name ("Gemini 3.7 Flash") overwrite the exact id
|
|
123
|
+
* the agent reported, with nothing left to recover it from.
|
|
124
|
+
*
|
|
125
|
+
* Latched the same way and for a sharper reason: Claude prints its model in the
|
|
126
|
+
* startup banner and nowhere else, and tmux keeps 2000 lines of history, so on
|
|
127
|
+
* any session that has been talking for a while the banner is simply gone. The
|
|
128
|
+
* screen going quiet is not the model changing, so the last non-null sighting
|
|
129
|
+
* stands until the process it described does not (see
|
|
130
|
+
* {@link beginAgentEventGeneration} / {@link discardAgentEventState}).
|
|
131
|
+
*/
|
|
132
|
+
const capturedModelInfo = globalThis.__agentCapturedModelInfo ??
|
|
133
|
+
(globalThis.__agentCapturedModelInfo = new Map());
|
|
84
134
|
/**
|
|
85
135
|
* How long two identical events count as one delivery.
|
|
86
136
|
*
|
|
@@ -124,6 +174,12 @@ function getLastStopEventAt(worktreeId, cliToolId, instanceId) {
|
|
|
124
174
|
function recordAgentEvent(worktreeId, cliToolId, instanceId, record) {
|
|
125
175
|
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
126
176
|
lastAgentEvent.set(key, record);
|
|
177
|
+
// Issue #1783: latch, never clear. An event without a model is the ordinary
|
|
178
|
+
// case (Claude sends one on `SessionStart` alone), and reading it as "the
|
|
179
|
+
// model is now unknown" would blank the display on the very next event.
|
|
180
|
+
if (typeof record.model === 'string' && record.model !== '') {
|
|
181
|
+
lastAgentModel.set(key, record.model.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH));
|
|
182
|
+
}
|
|
127
183
|
applyAskUserQuestionTransition(key, record);
|
|
128
184
|
if (record.event === 'session_start') {
|
|
129
185
|
// The agent restarting inside a pane CommandMate never touched — `claude`
|
|
@@ -134,6 +190,92 @@ function recordAgentEvent(worktreeId, cliToolId, instanceId, record) {
|
|
|
134
190
|
generationStartedAt.set(key, record.at);
|
|
135
191
|
}
|
|
136
192
|
applyPromptWaitingTransition(key, record);
|
|
193
|
+
applyAwaitingInstructionTransition(key, record);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* The third state: "this turn is over and nobody has told me what to do next"
|
|
197
|
+
* (Issue #1786).
|
|
198
|
+
*
|
|
199
|
+
* | event | effect on awaiting_instruction |
|
|
200
|
+
* |-----------------------------------|--------------------------------|
|
|
201
|
+
* | `notification(idle_prompt)` | **set** |
|
|
202
|
+
* | `user_prompt_submit` | release |
|
|
203
|
+
* | `session_start` / `session_end` | release |
|
|
204
|
+
* | everything else | unchanged |
|
|
205
|
+
*
|
|
206
|
+
* It is a boolean beside the status rather than a fifth `SessionStatus`, because
|
|
207
|
+
* `idle_prompt` already maps to `ready` (`agentEventToSessionStatus`) and
|
|
208
|
+
* `ready` means "you can send a message" everywhere in this codebase — the
|
|
209
|
+
* sidebar, `deriveCliStatus`, `getNextAction`, `commandmate wait`. Widening that
|
|
210
|
+
* vocabulary to carry "and it is *asking* you to" would have every consumer of
|
|
211
|
+
* the four values re-decide what they mean; the boolean asks nothing of anyone
|
|
212
|
+
* who does not want it.
|
|
213
|
+
*
|
|
214
|
+
* `stop` deliberately does NOT set it. `Stop` fires when the turn ends, which is
|
|
215
|
+
* most of the time the agent has simply finished a step of its own plan;
|
|
216
|
+
* `Notification(idle_prompt)` is Claude's separate, later "waiting for your
|
|
217
|
+
* input" signal, and using the turn boundary instead would mark every
|
|
218
|
+
* intermediate stop as a request for instructions.
|
|
219
|
+
*
|
|
220
|
+
* `pre_tool_use` / `post_tool_use` / `notification(permission_prompt)` leave it
|
|
221
|
+
* alone, and that is not a gap: a tool call or a dialog can only happen inside a
|
|
222
|
+
* turn, and the turn's own `user_prompt_submit` has already released it. Adding
|
|
223
|
+
* them would only paper over a `UserPromptSubmit` that never arrived — and an
|
|
224
|
+
* operator whose `UserPromptSubmit` hook is missing has no `Notification` hook
|
|
225
|
+
* either, so there would be nothing to release.
|
|
226
|
+
*
|
|
227
|
+
* There is deliberately no age bound here, unlike every other state in this
|
|
228
|
+
* module. Those bound the damage of an event that may never arrive (a lost
|
|
229
|
+
* `Stop`, a dialog answered with no event to say so). This one is released by
|
|
230
|
+
* events that cannot be missed while the fact is still true: typing into the
|
|
231
|
+
* composer — from the app or straight into the tmux pane — raises
|
|
232
|
+
* `UserPromptSubmit`, and ending the session raises `SessionEnd`. An agent that
|
|
233
|
+
* has been idle for six hours genuinely is still awaiting instructions, and
|
|
234
|
+
* expiring the flag would erase the notification #1790 exists to send. The
|
|
235
|
+
* generation fence in {@link isAwaitingInstruction} still applies, so the flag
|
|
236
|
+
* never survives the process that reported it.
|
|
237
|
+
*/
|
|
238
|
+
function applyAwaitingInstructionTransition(key, record) {
|
|
239
|
+
switch (record.event) {
|
|
240
|
+
case 'notification':
|
|
241
|
+
if (record.detail === 'idle_prompt') {
|
|
242
|
+
awaitingInstruction.set(key, { at: record.at, message: record.message ?? null });
|
|
243
|
+
}
|
|
244
|
+
return;
|
|
245
|
+
case 'user_prompt_submit':
|
|
246
|
+
case 'session_start':
|
|
247
|
+
case 'session_end':
|
|
248
|
+
awaitingInstruction.delete(key);
|
|
249
|
+
return;
|
|
250
|
+
case 'stop':
|
|
251
|
+
case 'pre_tool_use':
|
|
252
|
+
case 'post_tool_use':
|
|
253
|
+
return;
|
|
254
|
+
default:
|
|
255
|
+
// exhaustive check: a new AgentEventType must decide its transition here
|
|
256
|
+
record.event;
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* The agent's own "waiting for your input", or null (Issue #1786).
|
|
262
|
+
*
|
|
263
|
+
* Fenced by generation like the rest of this module: an `idle_prompt` from the
|
|
264
|
+
* Claude process that used to live in this pane is not this one's.
|
|
265
|
+
*/
|
|
266
|
+
function getAwaitingInstruction(worktreeId, cliToolId, instanceId) {
|
|
267
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
268
|
+
const record = awaitingInstruction.get(key);
|
|
269
|
+
if (!record)
|
|
270
|
+
return null;
|
|
271
|
+
const generation = generationStartedAt.get(key);
|
|
272
|
+
if (generation !== undefined && record.at < generation)
|
|
273
|
+
return null;
|
|
274
|
+
return record;
|
|
275
|
+
}
|
|
276
|
+
/** {@link getAwaitingInstruction} as the boolean the list API publishes. */
|
|
277
|
+
function isAwaitingInstruction(worktreeId, cliToolId, instanceId) {
|
|
278
|
+
return getAwaitingInstruction(worktreeId, cliToolId, instanceId) !== null;
|
|
137
279
|
}
|
|
138
280
|
/**
|
|
139
281
|
* The `prompt_waiting` half of the state machine, driven by the same events
|
|
@@ -221,6 +363,97 @@ function applyPromptWaitingTransition(key, record) {
|
|
|
221
363
|
function getLastAgentEvent(worktreeId, cliToolId, instanceId) {
|
|
222
364
|
return lastAgentEvent.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
223
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* The last model this instance reported running, or null (Issue #1783).
|
|
368
|
+
*
|
|
369
|
+
* "Last **non-null**", which is the only useful reading: three of the four tools
|
|
370
|
+
* that publish a model publish it on some events and not others, and Claude
|
|
371
|
+
* publishes it on exactly one. Reading `getLastAgentEvent()?.model` would
|
|
372
|
+
* therefore answer null for almost every moment of almost every session.
|
|
373
|
+
*
|
|
374
|
+
* Deliberately **not** bounded by {@link STRUCTURED_STATE_MAX_AGE_MS}, unlike
|
|
375
|
+
* every other reader in this module. That bound exists because a *status* that
|
|
376
|
+
* nothing has refreshed is a claim about right now that may have expired — a
|
|
377
|
+
* lost `Stop` leaving the layer asserting `running` forever. A model is not that
|
|
378
|
+
* kind of claim: an eight-hour turn is on the same model at the end as at the
|
|
379
|
+
* start, and expiring it would blank the display on precisely the long-running
|
|
380
|
+
* sessions this is most useful for. What *is* honoured is identity: a new
|
|
381
|
+
* generation or a discarded session drops the value, because the process that
|
|
382
|
+
* reported it is gone. See {@link beginAgentEventGeneration} /
|
|
383
|
+
* {@link discardAgentEventState}.
|
|
384
|
+
*
|
|
385
|
+
* In-memory only — nothing is written to `session_states`. After a server
|
|
386
|
+
* restart codex and antigravity repopulate on their next event; Claude stays
|
|
387
|
+
* null until its next `SessionStart`, a gap Phase 2 (#1784) closes from the
|
|
388
|
+
* terminal frame.
|
|
389
|
+
*/
|
|
390
|
+
function getLastKnownAgentModel(worktreeId, cliToolId, instanceId) {
|
|
391
|
+
return lastAgentModel.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Latch what a terminal capture showed for this instance (Issue #1784).
|
|
395
|
+
*
|
|
396
|
+
* Called from the status-detection poll with the text that poll already
|
|
397
|
+
* captured — no `capture-pane` is issued for this, so the feature costs nothing
|
|
398
|
+
* in tmux round-trips.
|
|
399
|
+
*
|
|
400
|
+
* **Each half latches independently.** A Codex footer carries a model on every
|
|
401
|
+
* frame but an effort only on some formats; a Claude banner carries both and
|
|
402
|
+
* then scrolls away entirely. Writing `{model, effort}` wholesale would let the
|
|
403
|
+
* frame that stopped showing one of them blank a value the other frame proved.
|
|
404
|
+
* Nothing is ever written as null: absent means "no frame has ever shown this",
|
|
405
|
+
* which is the honest state for gemini/copilot and for any session whose chrome
|
|
406
|
+
* this module has no rule for.
|
|
407
|
+
*
|
|
408
|
+
* @param info - {@link import('../../lib/detection/model-info-extractor').extractModelInfo}'s answer
|
|
409
|
+
*/
|
|
410
|
+
function recordCapturedModelInfo(worktreeId, cliToolId, instanceId, info) {
|
|
411
|
+
if (!info.model && !info.effort)
|
|
412
|
+
return;
|
|
413
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
414
|
+
const previous = capturedModelInfo.get(key);
|
|
415
|
+
capturedModelInfo.set(key, {
|
|
416
|
+
model: info.model ? info.model.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH) : (previous?.model ?? null),
|
|
417
|
+
effort: info.effort ?? previous?.effort ?? null,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* The last model/effort a terminal capture showed, both halves possibly null.
|
|
422
|
+
*
|
|
423
|
+
* The raw scraped value, before precedence is applied — {@link
|
|
424
|
+
* getResolvedAgentModelInfo} is what callers publishing to the UI or the API
|
|
425
|
+
* want. Exported for the tests and for anything that needs to tell "the screen
|
|
426
|
+
* said" apart from "the agent said".
|
|
427
|
+
*/
|
|
428
|
+
function getLastCapturedModelInfo(worktreeId, cliToolId, instanceId) {
|
|
429
|
+
const record = capturedModelInfo.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
|
|
430
|
+
return { model: record?.model ?? null, effort: record?.effort ?? null };
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* The model and reasoning effort to publish for this instance (Issue #1784).
|
|
434
|
+
*
|
|
435
|
+
* The single answer both surfaces should read: it folds the hook channel
|
|
436
|
+
* (#1783) together with the screen under the precedence documented on
|
|
437
|
+
* {@link mergeModelInfo} — hooks win for the model, the screen is the only
|
|
438
|
+
* source of effort for codex/claude, and antigravity's effort is derived from
|
|
439
|
+
* the id it reports rather than from its (renderer-truncated) status bar.
|
|
440
|
+
*
|
|
441
|
+
* Both halves may be null, and routinely are: no tool publishes an effort over
|
|
442
|
+
* hooks, and most tools publish neither. Callers omit the key rather than
|
|
443
|
+
* emitting null — see `CliToolSessionStatus`.
|
|
444
|
+
*/
|
|
445
|
+
function getResolvedAgentModelInfo(worktreeId, cliToolId, instanceId) {
|
|
446
|
+
return (0, model_info_extractor_1.mergeModelInfo)(cliToolId, getLastKnownAgentModel(worktreeId, cliToolId, instanceId), getLastCapturedModelInfo(worktreeId, cliToolId, instanceId));
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* The reasoning effort this instance is running at, or null (Issue #1784).
|
|
450
|
+
*
|
|
451
|
+
* Convenience reader over {@link getResolvedAgentModelInfo} for callers that
|
|
452
|
+
* want only the effort — `capture --json` and `instances` (#1785) among them.
|
|
453
|
+
*/
|
|
454
|
+
function getLastKnownAgentEffort(worktreeId, cliToolId, instanceId) {
|
|
455
|
+
return getResolvedAgentModelInfo(worktreeId, cliToolId, instanceId).effort;
|
|
456
|
+
}
|
|
224
457
|
/**
|
|
225
458
|
* How long a structured verdict is trusted after the event that produced it
|
|
226
459
|
* (Issue #1723).
|
|
@@ -266,6 +499,21 @@ function beginAgentEventGeneration(worktreeId, cliToolId, instanceId, at = Date.
|
|
|
266
499
|
promptWaiting.delete(key);
|
|
267
500
|
// Same reasoning for the question that dialog was asking (Issue #1726).
|
|
268
501
|
askUserQuestion.delete(key);
|
|
502
|
+
// And for "waiting for your input" (Issue #1786): a new process has not asked
|
|
503
|
+
// for anything yet.
|
|
504
|
+
awaitingInstruction.delete(key);
|
|
505
|
+
// And for the model (Issue #1783): a new generation is a new agent process,
|
|
506
|
+
// which may have been launched on a different model entirely. Latching across
|
|
507
|
+
// one would show the *previous* process's model with nothing to correct it —
|
|
508
|
+
// Claude only re-reports on `SessionStart`, which lands moments later anyway.
|
|
509
|
+
// A `/clear` is deliberately not affected: it reaches `recordAgentEvent` as
|
|
510
|
+
// `session_end` + `session_start`, never this function.
|
|
511
|
+
lastAgentModel.delete(key);
|
|
512
|
+
// Issue #1784: same argument for what the screen showed. The latch exists to
|
|
513
|
+
// survive the banner scrolling away *within* one process; carrying it across
|
|
514
|
+
// a relaunch would show the old process's effort with no frame left that
|
|
515
|
+
// could contradict it. The next poll re-reads a live footer immediately.
|
|
516
|
+
capturedModelInfo.delete(key);
|
|
269
517
|
}
|
|
270
518
|
/**
|
|
271
519
|
* @returns Epoch ms the current generation began, or null when no generation
|
|
@@ -290,6 +538,11 @@ function discardAgentEventState(worktreeId, cliToolId, instanceId) {
|
|
|
290
538
|
generationStartedAt.delete(key);
|
|
291
539
|
promptWaiting.delete(key);
|
|
292
540
|
askUserQuestion.delete(key);
|
|
541
|
+
awaitingInstruction.delete(key);
|
|
542
|
+
// Issue #1783: the session that was on this model no longer exists.
|
|
543
|
+
lastAgentModel.delete(key);
|
|
544
|
+
// Issue #1784: nor does the pane its footer was read from.
|
|
545
|
+
capturedModelInfo.delete(key);
|
|
293
546
|
}
|
|
294
547
|
/**
|
|
295
548
|
* The status this instance's structured events imply, or null when they imply
|
|
@@ -644,4 +897,11 @@ function clearAgentStopEvents() {
|
|
|
644
897
|
generationStartedAt.clear();
|
|
645
898
|
promptWaiting.clear();
|
|
646
899
|
askUserQuestion.clear();
|
|
900
|
+
awaitingInstruction.clear();
|
|
901
|
+
// Issue #1783. CI runs with `fileParallelism: false`, so every suite in the
|
|
902
|
+
// repo shares this process — a model latched by one test would otherwise be
|
|
903
|
+
// read by another, in file order, and only in CI.
|
|
904
|
+
lastAgentModel.clear();
|
|
905
|
+
// Issue #1784: and the same for the scraped half.
|
|
906
|
+
capturedModelInfo.clear();
|
|
647
907
|
}
|
|
@@ -292,6 +292,14 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
|
|
|
292
292
|
sessionStatusReason: 'session_not_running',
|
|
293
293
|
lastStopEventAt: stopEventAt,
|
|
294
294
|
structuredEvents,
|
|
295
|
+
// Issue #1785: null on a dead session, not the last model it ran. The
|
|
296
|
+
// latch outlives the process that filled it (by design — see
|
|
297
|
+
// getLastKnownAgentModel), so reporting it here would tell `commandmate
|
|
298
|
+
// instances` that a `RUNNING no` row is on gpt-5.6. The same holds for
|
|
299
|
+
// the effort, whose scraped half never expires either: dropping both is
|
|
300
|
+
// the server's job, done here and in exactly one place.
|
|
301
|
+
model: null,
|
|
302
|
+
reasoningEffort: null,
|
|
295
303
|
};
|
|
296
304
|
}
|
|
297
305
|
const sessionState = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId);
|
|
@@ -448,6 +456,18 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
|
|
|
448
456
|
}
|
|
449
457
|
const realtimeSnippet = lines.slice(-100).join('\n');
|
|
450
458
|
const autoYesState = (0, auto_yes_manager_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
459
|
+
// Issue #1785 + #1784: ONE resolution for both halves, not two readers.
|
|
460
|
+
//
|
|
461
|
+
// `getResolvedAgentModelInfo` is the reader #1784 documents as "the single
|
|
462
|
+
// answer both surfaces should read", and it is already what the list API
|
|
463
|
+
// publishes (`worktree-status-helper`). Reading the model off the hook latch
|
|
464
|
+
// here while taking the effort from the resolver would let this payload
|
|
465
|
+
// publish an effort with no model — the exact shape `buildModelByInstance`
|
|
466
|
+
// calls "unreachable through the API" — on a claude session whose banner the
|
|
467
|
+
// poller scraped before its first `SessionStart` hook arrived. It also folds
|
|
468
|
+
// in antigravity's rule that the effort comes from the model id, which a bare
|
|
469
|
+
// read of the scraped half would drop.
|
|
470
|
+
const { model, effort } = (0, agent_event_state_1.getResolvedAgentModelInfo)(worktreeId, cliToolId, instanceId);
|
|
451
471
|
return {
|
|
452
472
|
isRunning: true,
|
|
453
473
|
cliToolId,
|
|
@@ -477,5 +497,9 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
|
|
|
477
497
|
serverPollerActive: (0, auto_yes_manager_1.isPollerActive)(compositeKey),
|
|
478
498
|
lastStopEventAt: stopEventAt,
|
|
479
499
|
structuredEvents,
|
|
500
|
+
// Issue #1785: straight from the retention layer, unparsed. See the field
|
|
501
|
+
// docs on CurrentOutputPayload for why nothing is normalised on the way out.
|
|
502
|
+
model,
|
|
503
|
+
reasoningEffort: effort,
|
|
480
504
|
};
|
|
481
505
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Next Action Helper - Derived state for worktree next actions and review status.
|
|
4
|
+
*
|
|
5
|
+
* Issue #600: UX refresh - provides getNextAction() and getReviewStatus()
|
|
6
|
+
* for Review screen and WorktreeCard display.
|
|
7
|
+
*
|
|
8
|
+
* Uses exhaustive check (satisfies never) pattern to catch future
|
|
9
|
+
* SessionStatus extensions at compile time [DR2-005].
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.NEXT_ACTION_KEYS = void 0;
|
|
13
|
+
exports.isNextActionKey = isNextActionKey;
|
|
14
|
+
exports.getNextAction = getNextAction;
|
|
15
|
+
exports.getReviewStatus = getReviewStatus;
|
|
16
|
+
/**
|
|
17
|
+
* Dictionary keys returned by {@link getNextAction} (Issue #1787).
|
|
18
|
+
*
|
|
19
|
+
* These are keys in the `worktree` namespace (`locales/{en,ja}/worktree.json`),
|
|
20
|
+
* NOT display strings: the function runs on the server (`/api/worktrees`) and in
|
|
21
|
+
* module scope, where `t()` cannot be called, so pinning English here would ship
|
|
22
|
+
* "Approve / Reject" to a Japanese UI — the same problem #1271/#1273 fixed for
|
|
23
|
+
* StatusDot's labels. Rendering surfaces resolve them with
|
|
24
|
+
* `useTranslations('worktree')`.
|
|
25
|
+
*/
|
|
26
|
+
exports.NEXT_ACTION_KEYS = {
|
|
27
|
+
start: 'nextAction.start',
|
|
28
|
+
sendMessage: 'nextAction.sendMessage',
|
|
29
|
+
approveReject: 'nextAction.approveReject',
|
|
30
|
+
replyToPrompt: 'nextAction.replyToPrompt',
|
|
31
|
+
checkStalled: 'nextAction.checkStalled',
|
|
32
|
+
running: 'nextAction.running',
|
|
33
|
+
};
|
|
34
|
+
const NEXT_ACTION_KEY_SET = new Set(Object.values(exports.NEXT_ACTION_KEYS));
|
|
35
|
+
/**
|
|
36
|
+
* Whether a value is a key this module produces (Issue #1787).
|
|
37
|
+
*
|
|
38
|
+
* `Worktree.nextAction` is a plain `string` on the wire, and a server that
|
|
39
|
+
* predates this Issue still sends the old English literal. Callers must gate
|
|
40
|
+
* `t()` on this: next-intl reports a missing key by rendering the key path, so
|
|
41
|
+
* feeding it `"Approve / Reject"` would put `worktree.Approve / Reject` on
|
|
42
|
+
* screen. Anything that fails this test is rendered verbatim instead.
|
|
43
|
+
*/
|
|
44
|
+
function isNextActionKey(value) {
|
|
45
|
+
return NEXT_ACTION_KEY_SET.has(value);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Determine the next action for a given session state.
|
|
49
|
+
*
|
|
50
|
+
* @param status - Current session status (idle/ready/running/waiting) or null
|
|
51
|
+
* @param promptType - Type of active prompt, if any
|
|
52
|
+
* @param isStalled - Whether the session is considered stalled
|
|
53
|
+
* @returns A dictionary key from {@link NEXT_ACTION_KEYS} (Issue #1787 — this
|
|
54
|
+
* used to be a hard-coded English string)
|
|
55
|
+
*/
|
|
56
|
+
function getNextAction(status, promptType, isStalled) {
|
|
57
|
+
if (!status)
|
|
58
|
+
return exports.NEXT_ACTION_KEYS.start;
|
|
59
|
+
if (status === 'idle')
|
|
60
|
+
return exports.NEXT_ACTION_KEYS.start;
|
|
61
|
+
if (status === 'ready')
|
|
62
|
+
return exports.NEXT_ACTION_KEYS.sendMessage;
|
|
63
|
+
if (status === 'waiting' && promptType === 'approval')
|
|
64
|
+
return exports.NEXT_ACTION_KEYS.approveReject;
|
|
65
|
+
if (status === 'waiting')
|
|
66
|
+
return exports.NEXT_ACTION_KEYS.replyToPrompt;
|
|
67
|
+
if (status === 'running' && isStalled)
|
|
68
|
+
return exports.NEXT_ACTION_KEYS.checkStalled;
|
|
69
|
+
if (status === 'running')
|
|
70
|
+
return exports.NEXT_ACTION_KEYS.running;
|
|
71
|
+
// exhaustive check: SessionStatus extensions will cause compile error [DR2-005]
|
|
72
|
+
const _exhaustive = status;
|
|
73
|
+
void _exhaustive;
|
|
74
|
+
return exports.NEXT_ACTION_KEYS.running;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Determine the review status for a worktree.
|
|
78
|
+
*
|
|
79
|
+
* @param worktreeStatus - Worktree's status field (ready/in_progress/in_review/done/null)
|
|
80
|
+
* @param sessionStatus - Current session status or null
|
|
81
|
+
* @param promptType - Type of active prompt, if any
|
|
82
|
+
* @param isStalled - Whether the session is considered stalled
|
|
83
|
+
* @returns ReviewStatus if applicable, null otherwise
|
|
84
|
+
*/
|
|
85
|
+
function getReviewStatus(worktreeStatus, sessionStatus, promptType, isStalled) {
|
|
86
|
+
if (worktreeStatus === 'in_review')
|
|
87
|
+
return 'done';
|
|
88
|
+
if (sessionStatus === 'waiting' && promptType === 'approval')
|
|
89
|
+
return 'approval';
|
|
90
|
+
if (sessionStatus === 'running' && isStalled)
|
|
91
|
+
return 'stalled';
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
@@ -35,6 +35,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
35
35
|
exports.STRUCTURED_SEND_GUARD_ENV = exports.STRUCTURED_SEND_BLOCK_MAX_AGE_MS = void 0;
|
|
36
36
|
exports.structuredWaitingReason = structuredWaitingReason;
|
|
37
37
|
exports.resolvePromptWaiting = resolvePromptWaiting;
|
|
38
|
+
exports.peekPromptWaiting = peekPromptWaiting;
|
|
38
39
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
39
40
|
const status_mapping_1 = require("../../lib/session/status-mapping");
|
|
40
41
|
/**
|
|
@@ -160,6 +161,43 @@ function resolvePromptWaiting({ worktreeId, cliToolId, instanceId, scraper, igno
|
|
|
160
161
|
structuredSendBlockSuppressed: suppressed,
|
|
161
162
|
};
|
|
162
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* The OR rule without the release rule: read both layers, change neither
|
|
166
|
+
* (Issue #1786).
|
|
167
|
+
*
|
|
168
|
+
* Added for the list API (`/api/worktrees`), which had been publishing the
|
|
169
|
+
* scraper's verdict alone and therefore showed no dot at all for a dialog only
|
|
170
|
+
* the agent's events could see. It needs the composed answer; what it must not
|
|
171
|
+
* have is {@link resolvePromptWaiting}'s side effects, for three reasons:
|
|
172
|
+
*
|
|
173
|
+
* - **it is not the same evidence.** The list path detects on
|
|
174
|
+
* `STATUS_DETECTION_CAPTURE_LINES`, a deliberately smaller window than the
|
|
175
|
+
* detail path's, so its "no prompt here" is a weaker statement than the one
|
|
176
|
+
* the release rule was written for. Letting it clear a corroborated episode
|
|
177
|
+
* would retire a record on evidence #1725 never intended.
|
|
178
|
+
* - **`blocksSend` reads the same record.** A list poll that wrongly cleared it
|
|
179
|
+
* would silently disarm the `send` guard — the #1708 hazard, restored by a
|
|
180
|
+
* read endpoint. The Issue's own instruction is that `blocksSend` must not
|
|
181
|
+
* change, and the cheapest way to guarantee that is to write nothing.
|
|
182
|
+
* - **it is polled by every open tab, for every worktree.** A state machine
|
|
183
|
+
* whose outcome depends on how many browsers are watching is not one anybody
|
|
184
|
+
* can reason about later.
|
|
185
|
+
*
|
|
186
|
+
* What the list path gives up is arming corroboration. It costs nothing that was
|
|
187
|
+
* ever there: the arming callers (`current-output-builder`, the `send` guard)
|
|
188
|
+
* are unchanged, and the structured record's own releases — `Stop`,
|
|
189
|
+
* `user_prompt_submit`, `post_tool_use`, `Notification(idle_prompt)`, a
|
|
190
|
+
* generation change — are what retire it in the ordinary case, with
|
|
191
|
+
* {@link agent-event-state!STRUCTURED_STATE_MAX_AGE_MS} as the backstop.
|
|
192
|
+
*/
|
|
193
|
+
function peekPromptWaiting({ worktreeId, cliToolId, instanceId, scraper, now = Date.now(), }) {
|
|
194
|
+
const structured = (0, agent_event_state_1.getStructuredPromptWaiting)(worktreeId, cliToolId, instanceId, now);
|
|
195
|
+
return {
|
|
196
|
+
waiting: scraper.hasActivePrompt || structured !== null,
|
|
197
|
+
scraperWaiting: scraper.hasActivePrompt,
|
|
198
|
+
structured,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
163
201
|
/**
|
|
164
202
|
* Why this structured record may not refuse a send, or null when it may.
|
|
165
203
|
*
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* When each agent instance started waiting, and the one place that edge is
|
|
4
|
+
* observed (Issue #1786).
|
|
5
|
+
*
|
|
6
|
+
* `isWaitingForResponse` is a level, and every question the display Issues ask
|
|
7
|
+
* is about the *edge*: #1787 wants "waiting for how long", #1788 wants to push a
|
|
8
|
+
* WebSocket frame the instant it flips, #1790 wants to fire a push notification
|
|
9
|
+
* on the same instant and not on the 200 polls that follow. A level cannot
|
|
10
|
+
* answer any of those, and three surfaces each keeping their own "was it waiting
|
|
11
|
+
* last time?" would be three chances to disagree about when a wait began.
|
|
12
|
+
*
|
|
13
|
+
* So the edge is detected exactly once, here, by {@link observeWaitingEdge}, and
|
|
14
|
+
* everything else either reads {@link getWaitingEpisode} or subscribes with
|
|
15
|
+
* {@link onWaitingTransition}. There is one caller today —
|
|
16
|
+
* `worktree-status-helper`, on the list API's per-instance probe — and it passes
|
|
17
|
+
* the *composed* verdict (scraper OR structured), so a wait that only the
|
|
18
|
+
* agent's own events can see opens an episode exactly like one the screen
|
|
19
|
+
* scraper read.
|
|
20
|
+
*
|
|
21
|
+
* ## Where #1788 / #1790 plug in
|
|
22
|
+
*
|
|
23
|
+
* `onWaitingTransition(listener)` — the listener receives every false→true and
|
|
24
|
+
* true→false crossing, with the instance it belongs to, the episode's `since`
|
|
25
|
+
* and its {@link WaitingKind}. #1788 broadcasts it (`broadcastToWorktree`),
|
|
26
|
+
* #1790 decides whether to send a push. Neither needs to touch this module's
|
|
27
|
+
* internals, and neither can move the timestamps the other reports.
|
|
28
|
+
*
|
|
29
|
+
* Listeners are called synchronously, inside the request that observed the edge,
|
|
30
|
+
* because the point of the seam is immediacy. A listener that throws is
|
|
31
|
+
* contained: this store is on the list API's hot path, and a broken notification
|
|
32
|
+
* sink must not take the status read down with it.
|
|
33
|
+
*
|
|
34
|
+
* In-memory (via `globalThis`, per Issue #1736 — see the note in
|
|
35
|
+
* `agent-event-state`) rather than SQLite, for the same reason the structured
|
|
36
|
+
* state is: it describes a live tmux session, and a wait does not outlive the
|
|
37
|
+
* server process that observed it.
|
|
38
|
+
*
|
|
39
|
+
* @module lib/session/waiting-episode-state
|
|
40
|
+
*/
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.onWaitingTransition = onWaitingTransition;
|
|
43
|
+
exports.observeWaitingEdge = observeWaitingEdge;
|
|
44
|
+
exports.getWaitingEpisode = getWaitingEpisode;
|
|
45
|
+
exports.clearWaitingEpisodes = clearWaitingEpisodes;
|
|
46
|
+
exports.clearWaitingTransitionListeners = clearWaitingTransitionListeners;
|
|
47
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
48
|
+
const logger_1 = require("../../lib/logger");
|
|
49
|
+
const logger = (0, logger_1.createLogger)('waiting-episode-state');
|
|
50
|
+
/** compositeKey -> the wait currently in progress for that instance. */
|
|
51
|
+
const episodes = globalThis.__sessionWaitingEpisodes ??
|
|
52
|
+
(globalThis.__sessionWaitingEpisodes = new Map());
|
|
53
|
+
/** Subscribers to the edge. See the module docblock. */
|
|
54
|
+
const listeners = globalThis.__sessionWaitingTransitionListeners ??
|
|
55
|
+
(globalThis.__sessionWaitingTransitionListeners = new Set());
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to waiting edges.
|
|
58
|
+
*
|
|
59
|
+
* @returns An unsubscribe function. Idempotent — calling it twice is harmless.
|
|
60
|
+
*/
|
|
61
|
+
function onWaitingTransition(listener) {
|
|
62
|
+
listeners.add(listener);
|
|
63
|
+
return () => {
|
|
64
|
+
listeners.delete(listener);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Notify subscribers, containing anything they throw. */
|
|
68
|
+
function emit(transition) {
|
|
69
|
+
for (const listener of listeners) {
|
|
70
|
+
try {
|
|
71
|
+
listener(transition);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error('waiting-transition-listener-failed', {
|
|
75
|
+
worktreeId: transition.worktreeId,
|
|
76
|
+
cliToolId: transition.cliToolId,
|
|
77
|
+
instanceId: transition.instanceId ?? transition.cliToolId,
|
|
78
|
+
waiting: transition.waiting,
|
|
79
|
+
error: error instanceof Error ? error.message : String(error),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Record this poll's waiting verdict and answer when the current wait began.
|
|
86
|
+
*
|
|
87
|
+
* The single writer of the edge, by design (Issue #1786). Idempotent for a
|
|
88
|
+
* level that has not changed: repeated `waiting: true` polls return the same
|
|
89
|
+
* `since` and emit nothing, so a listener hears one event per wait rather than
|
|
90
|
+
* one per poll.
|
|
91
|
+
*
|
|
92
|
+
* @returns The episode's `since` while waiting, or null when it is not.
|
|
93
|
+
*/
|
|
94
|
+
function observeWaitingEdge({ worktreeId, cliToolId, instanceId, waiting, kind = null, structuredSince = null, now = Date.now(), }) {
|
|
95
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
96
|
+
const existing = episodes.get(key);
|
|
97
|
+
if (!waiting) {
|
|
98
|
+
if (existing === undefined)
|
|
99
|
+
return null;
|
|
100
|
+
episodes.delete(key);
|
|
101
|
+
emit({ worktreeId, cliToolId, instanceId, waiting: false, since: null, kind: null, at: now });
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (existing !== undefined) {
|
|
105
|
+
// A wait can change character without ending — a permission dialog answered
|
|
106
|
+
// into a selection list is still one uninterrupted wait — so the kind is
|
|
107
|
+
// refreshed while `since` stays put.
|
|
108
|
+
existing.kind = kind;
|
|
109
|
+
return existing.since;
|
|
110
|
+
}
|
|
111
|
+
const since = structuredSince ?? now;
|
|
112
|
+
episodes.set(key, { since, kind });
|
|
113
|
+
emit({ worktreeId, cliToolId, instanceId, waiting: true, since, kind, at: now });
|
|
114
|
+
return since;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @returns The wait in progress for this instance, or null when it is not
|
|
118
|
+
* waiting. Read-only: observing the edge is {@link observeWaitingEdge}'s job.
|
|
119
|
+
*/
|
|
120
|
+
function getWaitingEpisode(worktreeId, cliToolId, instanceId) {
|
|
121
|
+
return episodes.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Drop every episode. Test seam.
|
|
125
|
+
*
|
|
126
|
+
* CI runs with `fileParallelism: false`, so one process holds this map for the
|
|
127
|
+
* whole suite: a test that opens an episode and does not clear it hands the next
|
|
128
|
+
* file a session that is already waiting.
|
|
129
|
+
*/
|
|
130
|
+
function clearWaitingEpisodes() {
|
|
131
|
+
episodes.clear();
|
|
132
|
+
}
|
|
133
|
+
/** Drop every subscriber. Test seam, paired with {@link clearWaitingEpisodes}. */
|
|
134
|
+
function clearWaitingTransitionListeners() {
|
|
135
|
+
listeners.clear();
|
|
136
|
+
}
|