commandmate 0.23.0 → 0.25.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 +415 -406
- package/.next/app-path-routes-manifest.json +27 -26
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +4 -4
- 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.js +2 -2
- package/.next/server/app/login/page.js.nft.json +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 +2 -2
- 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.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +7 -7
- 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 +27 -26
- 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/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2546.js +1 -1
- package/.next/server/chunks/3346.js +1 -1
- package/.next/server/chunks/3417.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/5571.js +1 -1
- 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/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7458.js +5 -5
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/8730.js +1 -0
- 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/9328.js +1 -1
- 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/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2053-dfac2d49227cc942.js +1 -0
- package/.next/static/chunks/3898-ef488bfa804507d9.js +1 -0
- 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-35f9acab97a553c5.js +1 -0
- package/.next/static/chunks/6381-51f9c4a128aadc0b.js +1 -0
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
- package/.next/static/chunks/{9599-d29d2f8eeaf7c249.js → 8649-f551b0010dba4986.js} +1 -1
- package/.next/static/chunks/9263.f2034ec525abcf72.js +1 -0
- 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-439b35c9cb90dbe0.js +1 -0
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
- package/.next/static/chunks/app/login/page-eefd515d8c37e5ee.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/more/page-889b7546a8a553dc.js +1 -0
- package/.next/static/chunks/app/page-a8d04ac0e3e4c9fc.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/repositories/page-f3c4d8839b1ca203.js +1 -0
- package/.next/static/chunks/app/review/page-6dc88649fe88ac16.js +1 -0
- package/.next/static/chunks/app/sessions/page-2c9ed9e969097688.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-19beef6121c4c982.js +1 -0
- package/.next/static/chunks/app/skills/installed/page-d5b9cef6d21fabda.js +1 -0
- package/.next/static/chunks/app/skills/page-06ef637e07dd9377.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-5fed3984fafcd910.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-207c69540fd856ef.js +1 -0
- package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-9d892a9ff07c289d.js} +1 -1
- package/.next/static/css/e865c4979a41aa03.css +1 -0
- package/.next/static/ehkNc5xDMDkXlua08Bwq0/_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/README.md +96 -45
- 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/config/activity-bar-config.js +5 -1
- package/dist/server/src/lib/auto-yes-poller.js +40 -4
- package/dist/server/src/lib/cli-tools/codex.js +58 -29
- 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/cli-patterns.js +148 -6
- package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
- package/dist/server/src/lib/detection/status-detector.js +28 -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/3451.js +0 -1
- package/.next/server/chunks/6283.js +0 -1
- package/.next/server/chunks/646.js +0 -21
- package/.next/static/chunks/2053-52d3c82014e1cd54.js +0 -1
- 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/744-fa8c0ae444c8338c.js +0 -1
- package/.next/static/chunks/9263.5259f73f89220d64.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/login/page-0247a3fb569bb22b.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 → ehkNc5xDMDkXlua08Bwq0}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What *kind* of waiting a session is in (Issue #1786).
|
|
4
|
+
*
|
|
5
|
+
* `isWaitingForResponse` answers "does this session need a human?" and nothing
|
|
6
|
+
* else, so every surface that shows it has to render one orange dot for three
|
|
7
|
+
* situations a user would act on differently:
|
|
8
|
+
*
|
|
9
|
+
* - a y/n or numbered prompt the app itself can answer for them (`prompt`);
|
|
10
|
+
* - a selection list or a pager, which only the terminal can drive (`menu`);
|
|
11
|
+
* - a dialog only the agent's own events reported, or a frame neither layer
|
|
12
|
+
* could classify (`unclassified`).
|
|
13
|
+
*
|
|
14
|
+
* Kept a pure function of the detector's verdict — no clock, no store, no tmux —
|
|
15
|
+
* because it is the one piece of #1786 that the display Issues (#1787/#1788)
|
|
16
|
+
* will read literally and therefore the one piece that has to be pinned by unit
|
|
17
|
+
* tests rather than by a live session.
|
|
18
|
+
*
|
|
19
|
+
* @module lib/session/waiting-kind
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.deriveWaitingKind = deriveWaitingKind;
|
|
23
|
+
const status_detector_1 = require("../../lib/detection/status-detector");
|
|
24
|
+
/**
|
|
25
|
+
* Classify a waiting session, or answer null when it is not waiting.
|
|
26
|
+
*
|
|
27
|
+
* The order is a precedence, not a sequence of independent tests: a frame that
|
|
28
|
+
* carries an answerable prompt is a `prompt` even if the reason string would
|
|
29
|
+
* also pass the menu test, because "you can answer this from the app" is the
|
|
30
|
+
* more actionable fact.
|
|
31
|
+
*
|
|
32
|
+
* | condition | kind |
|
|
33
|
+
* |--------------------------------------------------|------------------|
|
|
34
|
+
* | not waiting | `null` |
|
|
35
|
+
* | `hasActivePrompt` | `'prompt'` |
|
|
36
|
+
* | scraper `waiting` + a {@link SELECTION_LIST_REASONS} reason | `'menu'` |
|
|
37
|
+
* | anything else that is still waiting | `'unclassified'` |
|
|
38
|
+
*
|
|
39
|
+
* The `menu` row is the same expression `current-output-builder` publishes as
|
|
40
|
+
* `isSelectionListActive`, and the pager (`codex_pager`) is a member of that set
|
|
41
|
+
* — so the pager lands in `menu` for the reason the Issue asks for, without a
|
|
42
|
+
* second copy of the membership test.
|
|
43
|
+
*
|
|
44
|
+
* `unclassified` is the honest fallback rather than a fourth guess. In practice
|
|
45
|
+
* it is reached when only the structured layer sees the dialog: every scraper
|
|
46
|
+
* `waiting` verdict is either `prompt_detected` (→ `prompt`) or a selection-list
|
|
47
|
+
* reason (→ `menu`), so a waiting session the scraper never classified is one it
|
|
48
|
+
* could not read at all.
|
|
49
|
+
*/
|
|
50
|
+
function deriveWaitingKind(input) {
|
|
51
|
+
if (!input.waiting)
|
|
52
|
+
return null;
|
|
53
|
+
if (input.hasActivePrompt)
|
|
54
|
+
return 'prompt';
|
|
55
|
+
if (input.scraperStatus === 'waiting' && status_detector_1.SELECTION_LIST_REASONS.has(input.scraperReason)) {
|
|
56
|
+
return 'menu';
|
|
57
|
+
}
|
|
58
|
+
return 'unclassified';
|
|
59
|
+
}
|
|
@@ -18,6 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
exports.REQUIRE_COMMIT_SOURCE_CONTRACT = exports.REQUIRE_COMMIT_SOURCE_CONFIG = void 0;
|
|
19
19
|
exports.resolveRequireCommit = resolveRequireCommit;
|
|
20
20
|
exports.resolveContractGateIds = resolveContractGateIds;
|
|
21
|
+
exports.contractGateDefinitions = contractGateDefinitions;
|
|
21
22
|
exports.validateContractAgainstVerifyConfig = validateContractAgainstVerifyConfig;
|
|
22
23
|
exports.resolveGateCommands = resolveGateCommands;
|
|
23
24
|
exports.composeContractMessage = composeContractMessage;
|
|
@@ -88,37 +89,75 @@ function resolveContractGateIds(contract) {
|
|
|
88
89
|
return [...selected, ...rest];
|
|
89
90
|
}
|
|
90
91
|
/**
|
|
91
|
-
*
|
|
92
|
+
* The gates this contract defines itself (#1791).
|
|
93
|
+
*
|
|
94
|
+
* Read through a helper because `contract` also arrives from
|
|
95
|
+
* `tasks.contract_json`, and a row written before the field existed parses back
|
|
96
|
+
* as `undefined` rather than an empty list. Every consumer reads it here so
|
|
97
|
+
* "an old task" and "a task that defines no gates" cannot behave differently.
|
|
98
|
+
*/
|
|
99
|
+
function contractGateDefinitions(contract) {
|
|
100
|
+
return contract.verify.gateDefinitions ?? [];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check that the contract's gates can actually be resolved, and that its own
|
|
104
|
+
* definitions do not collide with the repository's.
|
|
92
105
|
*
|
|
93
106
|
* A contract pointing at a gate id that does not exist would only be caught at
|
|
94
107
|
* verification time, by which point the agent has already been told a
|
|
95
108
|
* completion criterion that cannot be evaluated. Reporting it here makes
|
|
96
109
|
* "the contract was accepted" and "the contract's gates exist" the same moment.
|
|
97
110
|
*
|
|
111
|
+
* The collision check is the same discipline pointed the other way (#1791). A
|
|
112
|
+
* contract that redefined an id `.commandmate/verify.yaml` already declares
|
|
113
|
+
* would replace the repository's own definition of passing with one written per
|
|
114
|
+
* delegation — silently, since both spell the same id in the report. Reserved
|
|
115
|
+
* ids (`work-evidence` / `scope` / `env-clean`) are refused one step earlier, by
|
|
116
|
+
* the shared gate validator in the parser; both refusals happen at send.
|
|
117
|
+
*
|
|
98
118
|
* @returns issue strings, empty when the contract resolves cleanly
|
|
99
119
|
*/
|
|
100
120
|
function validateContractAgainstVerifyConfig(contract, config) {
|
|
101
121
|
const gates = contract.verify.gates;
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
const definitions = contractGateDefinitions(contract);
|
|
123
|
+
const issues = [];
|
|
104
124
|
if (!config) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
125
|
+
// Fail-closed for definitions too: the runner refuses to start a run at all
|
|
126
|
+
// without a config, so accepting the contract would promise a criterion that
|
|
127
|
+
// can never be evaluated — the exact thing this function exists to prevent.
|
|
128
|
+
if (definitions.length > 0) {
|
|
129
|
+
issues.push(`verify.gateDefinitions: declared ${definitions.map((gate) => gate.id).join(', ')}, ` +
|
|
130
|
+
`but ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} is missing or unreadable in this worktree, ` +
|
|
131
|
+
'so no verification run can execute them');
|
|
132
|
+
}
|
|
133
|
+
if (gates) {
|
|
134
|
+
issues.push(`verify.gates: declared ${gates.join(', ')}, but ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} ` +
|
|
135
|
+
'is missing or unreadable in this worktree, so the gate ids cannot be resolved');
|
|
136
|
+
}
|
|
137
|
+
return issues;
|
|
109
138
|
}
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
139
|
+
const configIds = config.gates.map((gate) => gate.id);
|
|
140
|
+
const collisions = definitions
|
|
141
|
+
.map((gate) => gate.id)
|
|
142
|
+
.filter((id) => configIds.includes(id));
|
|
143
|
+
if (collisions.length > 0) {
|
|
144
|
+
issues.push(`verify.gateDefinitions: gate id(s) ${collisions.join(', ')} are already declared in ` +
|
|
145
|
+
`${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}. A contract may add gates, never redefine the ` +
|
|
146
|
+
"repository's own — rename the contract gate.");
|
|
147
|
+
}
|
|
148
|
+
if (gates) {
|
|
149
|
+
const known = new Set([verify_config_1.WORK_EVIDENCE_GATE_ID, verify_config_1.SCOPE_GATE_ID, ...configIds]);
|
|
150
|
+
const defined = new Set(definitions.map((gate) => gate.id));
|
|
151
|
+
const unknown = gates.filter((id) => !known.has(id) && !defined.has(id));
|
|
152
|
+
if (unknown.length > 0) {
|
|
153
|
+
const sources = [`Declared in ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}: ${[...known].join(', ')}`];
|
|
154
|
+
if (defined.size > 0) {
|
|
155
|
+
sources.push(`in verify.gateDefinitions: ${[...defined].join(', ')}`);
|
|
156
|
+
}
|
|
157
|
+
issues.push(`verify.gates: unknown gate id(s) ${unknown.join(', ')}. ${sources.join('; ')}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return issues;
|
|
122
161
|
}
|
|
123
162
|
/**
|
|
124
163
|
* The commands the contract's gates will run, in the order they will run.
|
|
@@ -136,6 +175,10 @@ function resolveGateCommands(contract, config) {
|
|
|
136
175
|
[verify_config_1.WORK_EVIDENCE_GATE_ID, workEvidenceLabel],
|
|
137
176
|
[verify_config_1.SCOPE_GATE_ID, SCOPE_LABEL],
|
|
138
177
|
]);
|
|
178
|
+
// Contract-defined gates run after the repository's own, so the preamble
|
|
179
|
+
// lists them in that order too — the line claims to be "the commands that
|
|
180
|
+
// will run", and an order it invents would be the first thing to drift.
|
|
181
|
+
const declared = [...config.gates, ...contractGateDefinitions(contract)];
|
|
139
182
|
const selected = resolveContractGateIds(contract);
|
|
140
183
|
if (!selected) {
|
|
141
184
|
// An omitted gates list runs every gate, and the built-ins are still governed
|
|
@@ -143,9 +186,9 @@ function resolveGateCommands(contract, config) {
|
|
|
143
186
|
const builtIns = [workEvidenceLabel];
|
|
144
187
|
if (contract.success.requireScopeClean)
|
|
145
188
|
builtIns.push(SCOPE_LABEL);
|
|
146
|
-
return [...builtIns, ...
|
|
189
|
+
return [...builtIns, ...declared.map((gate) => gate.command)];
|
|
147
190
|
}
|
|
148
|
-
const byId = new Map(
|
|
191
|
+
const byId = new Map(declared.map((gate) => [gate.id, gate.command]));
|
|
149
192
|
return selected.map((id) => builtInLabels.get(id) ?? byId.get(id));
|
|
150
193
|
}
|
|
151
194
|
/**
|
|
@@ -23,13 +23,14 @@
|
|
|
23
23
|
* @module lib/tasks/contract-parser
|
|
24
24
|
*/
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.TaskContractError = exports.MAX_ALLOW_PROMPT_TYPES = exports.MAX_DENY_PATTERNS = exports.MAX_GATE_IDS = exports.MAX_SCOPE_PATTERNS = exports.MAX_PATTERN_LENGTH = exports.MAX_GOAL_LENGTH = exports.MAX_TITLE_LENGTH = exports.PROMPT_TYPES = exports.AUTO_YES_MODES = exports.TASK_CONTRACT_DIR = void 0;
|
|
26
|
+
exports.TaskContractError = exports.MAX_ALLOW_PROMPT_TYPES = exports.MAX_DENY_PATTERNS = exports.MAX_GATE_DEFINITIONS = exports.MAX_GATE_IDS = exports.MAX_SCOPE_PATTERNS = exports.MAX_PATTERN_LENGTH = exports.MAX_GOAL_LENGTH = exports.MAX_TITLE_LENGTH = exports.PROMPT_TYPES = exports.AUTO_YES_MODES = exports.TASK_CONTRACT_DIR = void 0;
|
|
27
27
|
exports.parseTaskContract = parseTaskContract;
|
|
28
28
|
exports.loadTaskContract = loadTaskContract;
|
|
29
29
|
const fs_1 = require("fs");
|
|
30
30
|
const path_1 = require("path");
|
|
31
31
|
const yaml_1 = require("yaml");
|
|
32
32
|
const path_validator_1 = require("../../lib/security/path-validator");
|
|
33
|
+
const verify_config_1 = require("../../lib/verification/verify-config");
|
|
33
34
|
/** Directory contracts live in, relative to the worktree root. */
|
|
34
35
|
exports.TASK_CONTRACT_DIR = '.commandmate/tasks';
|
|
35
36
|
/**
|
|
@@ -63,11 +64,13 @@ exports.MAX_GOAL_LENGTH = 8000;
|
|
|
63
64
|
exports.MAX_PATTERN_LENGTH = 200;
|
|
64
65
|
exports.MAX_SCOPE_PATTERNS = 200;
|
|
65
66
|
exports.MAX_GATE_IDS = 32;
|
|
67
|
+
/** Matches {@link MAX_GATE_IDS}: a contract cannot select more gates than it may define. */
|
|
68
|
+
exports.MAX_GATE_DEFINITIONS = 32;
|
|
66
69
|
exports.MAX_DENY_PATTERNS = 32;
|
|
67
70
|
exports.MAX_ALLOW_PROMPT_TYPES = 16;
|
|
68
71
|
const TOP_LEVEL_KEYS = ['version', 'title', 'goal', 'scope', 'verify', 'autoYes', 'success'];
|
|
69
72
|
const SCOPE_KEYS = ['allow', 'deny'];
|
|
70
|
-
const VERIFY_KEYS = ['gates'];
|
|
73
|
+
const VERIFY_KEYS = ['gates', 'gateDefinitions'];
|
|
71
74
|
const AUTO_YES_KEYS = ['mode', 'allowPromptTypes', 'denyPatterns'];
|
|
72
75
|
const SUCCESS_KEYS = [
|
|
73
76
|
'requireWorkEvidence',
|
|
@@ -75,8 +78,6 @@ const SUCCESS_KEYS = [
|
|
|
75
78
|
'requireCommit',
|
|
76
79
|
'autoVerifyOnStop',
|
|
77
80
|
];
|
|
78
|
-
/** Mirrors GATE_ID_PATTERN in verify-config.ts: a contract can only name ids that could exist. */
|
|
79
|
-
const GATE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
80
81
|
class TaskContractError extends Error {
|
|
81
82
|
issues;
|
|
82
83
|
constructor(issues) {
|
|
@@ -198,30 +199,61 @@ function validateScope(value, issues) {
|
|
|
198
199
|
}
|
|
199
200
|
return scope;
|
|
200
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Validate `verify.gateDefinitions` (Issue #1791).
|
|
204
|
+
*
|
|
205
|
+
* Delegates every per-entry rule to verify-config's own gate validator, so a
|
|
206
|
+
* gate defined in a contract is held to exactly the constraints a gate declared
|
|
207
|
+
* in `.commandmate/verify.yaml` is — including the reserved ids, which is where
|
|
208
|
+
* a contract shadowing `work-evidence` or `scope` is rejected. That rejection
|
|
209
|
+
* lands here, at parse time, rather than in the verify.yaml cross-check: it
|
|
210
|
+
* needs no config to decide, and both run at send.
|
|
211
|
+
*
|
|
212
|
+
* An empty list is accepted as equivalent to omitting the key. Unlike
|
|
213
|
+
* `verify.gates: []` — which would read as "pass having run nothing" — a
|
|
214
|
+
* definition list with no entries has exactly one possible meaning, and an
|
|
215
|
+
* orchestrator that emits YAML programmatically should not have to special-case
|
|
216
|
+
* "this delegation happens to need no extra gate".
|
|
217
|
+
*/
|
|
218
|
+
function validateGateDefinitions(value, issues) {
|
|
219
|
+
if (value === undefined || value === null)
|
|
220
|
+
return [];
|
|
221
|
+
if (Array.isArray(value) && value.length > exports.MAX_GATE_DEFINITIONS) {
|
|
222
|
+
issues.push(`verify.gateDefinitions: at most ${exports.MAX_GATE_DEFINITIONS} entries (got ${value.length})`);
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
return (0, verify_config_1.validateGateEntries)(value, 'verify.gateDefinitions', issues);
|
|
226
|
+
}
|
|
201
227
|
function validateVerify(value, issues) {
|
|
228
|
+
const empty = () => ({ gates: null, gateDefinitions: [] });
|
|
202
229
|
if (value === undefined || value === null)
|
|
203
|
-
return
|
|
230
|
+
return empty();
|
|
204
231
|
if (!isMapping(value)) {
|
|
205
232
|
issues.push(`verify: must be a mapping (got ${describe(value)})`);
|
|
206
|
-
return
|
|
233
|
+
return empty();
|
|
207
234
|
}
|
|
208
235
|
collectUnknownKeys(value, VERIFY_KEYS, 'verify', issues);
|
|
236
|
+
const gateDefinitions = validateGateDefinitions(value.gateDefinitions, issues);
|
|
237
|
+
const withDefinitions = (gates) => ({
|
|
238
|
+
gates,
|
|
239
|
+
gateDefinitions,
|
|
240
|
+
});
|
|
209
241
|
if (value.gates === undefined || value.gates === null)
|
|
210
|
-
return
|
|
242
|
+
return withDefinitions(null);
|
|
211
243
|
const gates = validateStringList(value.gates, 'verify.gates', { maxEntries: exports.MAX_GATE_IDS, maxLength: 32 }, issues);
|
|
212
244
|
if (!gates)
|
|
213
|
-
return
|
|
245
|
+
return withDefinitions(null);
|
|
214
246
|
// An empty list would read as "pass with no gates run". "Run everything" is
|
|
215
247
|
// spelled by omitting the key, so the two can never be confused.
|
|
216
248
|
if (Array.isArray(value.gates) && value.gates.length === 0) {
|
|
217
249
|
issues.push('verify.gates: must name at least one gate (omit the key to run every gate)');
|
|
218
|
-
return
|
|
250
|
+
return withDefinitions(null);
|
|
219
251
|
}
|
|
220
252
|
const valid = [];
|
|
221
253
|
const seen = new Set();
|
|
222
254
|
gates.forEach((id, index) => {
|
|
223
|
-
if (!GATE_ID_PATTERN.test(id)) {
|
|
224
|
-
issues.push(`verify.gates[${index}]: "${id}" must match ${GATE_ID_PATTERN.source}`);
|
|
255
|
+
if (!verify_config_1.GATE_ID_PATTERN.test(id)) {
|
|
256
|
+
issues.push(`verify.gates[${index}]: "${id}" must match ${verify_config_1.GATE_ID_PATTERN.source}`);
|
|
225
257
|
return;
|
|
226
258
|
}
|
|
227
259
|
if (seen.has(id)) {
|
|
@@ -231,7 +263,7 @@ function validateVerify(value, issues) {
|
|
|
231
263
|
seen.add(id);
|
|
232
264
|
valid.push(id);
|
|
233
265
|
});
|
|
234
|
-
return
|
|
266
|
+
return withDefinitions(valid.length > 0 ? valid : null);
|
|
235
267
|
}
|
|
236
268
|
function validateAutoYes(value, issues) {
|
|
237
269
|
const autoYes = { mode: null, allowPromptTypes: [], denyPatterns: [] };
|
|
@@ -364,6 +396,20 @@ function parseTaskContract(raw, sourceLabel) {
|
|
|
364
396
|
'(the commit requirement is judged by the work-evidence gate, which ' +
|
|
365
397
|
'requireWorkEvidence: false switches off)');
|
|
366
398
|
}
|
|
399
|
+
// Same rule again, for the gates this contract defines itself (#1791). A
|
|
400
|
+
// definition that `verify.gates` leaves out is a check the contract appears to
|
|
401
|
+
// add and never runs — and it is the *only* declaration of that gate, so
|
|
402
|
+
// unlike a verify.yaml gate there is no other run that would ever execute it.
|
|
403
|
+
// Selecting a subset is spelled by deleting the definition.
|
|
404
|
+
if (verify.gates) {
|
|
405
|
+
const unselected = verify.gateDefinitions
|
|
406
|
+
.map((gate) => gate.id)
|
|
407
|
+
.filter((id) => !verify.gates?.includes(id));
|
|
408
|
+
if (unselected.length > 0) {
|
|
409
|
+
issues.push(`verify.gateDefinitions: ${unselected.join(', ')} defined but not named in verify.gates, ` +
|
|
410
|
+
'so nothing would ever run them (list them, or delete the definition)');
|
|
411
|
+
}
|
|
412
|
+
}
|
|
367
413
|
if (issues.length > 0)
|
|
368
414
|
throw new TaskContractError(issues);
|
|
369
415
|
return { version: 1, title, goal, scope, verify, autoYes, success };
|
|
@@ -389,33 +389,65 @@ async function resolveBaseRef(config, worktreePath) {
|
|
|
389
389
|
return defaultBranch ? `origin/${defaultBranch}` : null;
|
|
390
390
|
}
|
|
391
391
|
/**
|
|
392
|
-
*
|
|
392
|
+
* Every gate available to this run, in execution order (Issue #1791).
|
|
393
|
+
*
|
|
394
|
+
* The repository's own declarations first, then the ones this delegation's
|
|
395
|
+
* contract carried. Repository-wide criteria are what an Issue gate is judged
|
|
396
|
+
* *against*, so running the shared ones first is what makes a report readable
|
|
397
|
+
* top to bottom: "the repository's definition of passing held, and then the
|
|
398
|
+
* Issue-specific check did too".
|
|
399
|
+
*
|
|
400
|
+
* A contract gate whose id collides with a verify.yaml gate is refused rather
|
|
401
|
+
* than merged. `validateContractAgainstVerifyConfig` already rejects that at
|
|
402
|
+
* send, so reaching here means the contract was stored by an older build or
|
|
403
|
+
* written straight into the database — and running both would put two rows
|
|
404
|
+
* under one id in the report, which is precisely the ambiguity `source` exists
|
|
405
|
+
* to remove.
|
|
406
|
+
*/
|
|
407
|
+
function declaredGates(config, contractGates) {
|
|
408
|
+
const fromConfig = config.gates.map((gate) => ({
|
|
409
|
+
...gate,
|
|
410
|
+
source: 'verify.yaml',
|
|
411
|
+
}));
|
|
412
|
+
const configIds = new Set(fromConfig.map((gate) => gate.id));
|
|
413
|
+
const collisions = contractGates.filter((gate) => configIds.has(gate.id)).map((gate) => gate.id);
|
|
414
|
+
if (collisions.length > 0) {
|
|
415
|
+
return (`Contract gate id(s) ${collisions.join(', ')} are already declared in ` +
|
|
416
|
+
`${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}. A contract may add gates, never redefine the ` +
|
|
417
|
+
"repository's own.");
|
|
418
|
+
}
|
|
419
|
+
return [...fromConfig, ...contractGates.map((gate) => ({ ...gate, source: 'contract' }))];
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Resolve `gateIds` against the declared gates.
|
|
393
423
|
*
|
|
394
424
|
* Returns a message instead of a selection when the request names a gate that
|
|
395
425
|
* does not exist, or selects nothing at all. Both would otherwise produce a run
|
|
396
426
|
* with zero gate results, which {@link aggregateRunStatus} would have to call
|
|
397
427
|
* `passed` — a green verdict from having checked nothing.
|
|
398
428
|
*
|
|
429
|
+
* @param declared verify.yaml's gates followed by the contract's (#1791); the
|
|
430
|
+
* selection preserves this order, never the order `gateIds` was typed in
|
|
399
431
|
* @param requireEnvClean whether a declaration switched env-clean on. It is
|
|
400
432
|
* ORed with an explicit request rather than replacing it, so `--gates
|
|
401
433
|
* env-clean` still works with the switch off (and honestly reports
|
|
402
434
|
* UNKNOWN, because no baseline was recorded), and a delegation that
|
|
403
435
|
* declared the requirement cannot lose it by naming a narrower gate list.
|
|
404
436
|
*/
|
|
405
|
-
function selectGates(
|
|
437
|
+
function selectGates(declared, gateIds, requireEnvClean) {
|
|
406
438
|
if (!gateIds) {
|
|
407
439
|
return {
|
|
408
440
|
runWorkEvidence: true,
|
|
409
441
|
scope: 'implicit',
|
|
410
442
|
runEnvClean: requireEnvClean,
|
|
411
|
-
gates:
|
|
443
|
+
gates: declared,
|
|
412
444
|
};
|
|
413
445
|
}
|
|
414
446
|
const known = new Set([
|
|
415
447
|
verify_config_1.WORK_EVIDENCE_GATE_ID,
|
|
416
448
|
verify_config_1.SCOPE_GATE_ID,
|
|
417
449
|
verify_config_1.ENV_CLEAN_GATE_ID,
|
|
418
|
-
...
|
|
450
|
+
...declared.map((g) => g.id),
|
|
419
451
|
]);
|
|
420
452
|
const unknown = gateIds.filter((id) => !known.has(id));
|
|
421
453
|
if (unknown.length > 0) {
|
|
@@ -426,7 +458,7 @@ function selectGates(config, gateIds, requireEnvClean) {
|
|
|
426
458
|
runWorkEvidence: requested.has(verify_config_1.WORK_EVIDENCE_GATE_ID),
|
|
427
459
|
scope: requested.has(verify_config_1.SCOPE_GATE_ID) ? 'explicit' : 'off',
|
|
428
460
|
runEnvClean: requested.has(verify_config_1.ENV_CLEAN_GATE_ID) || requireEnvClean,
|
|
429
|
-
gates:
|
|
461
|
+
gates: declared.filter((gate) => requested.has(gate.id)),
|
|
430
462
|
};
|
|
431
463
|
if (!selection.runWorkEvidence &&
|
|
432
464
|
selection.scope === 'off' &&
|
|
@@ -486,8 +518,8 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
|
|
|
486
518
|
* and closing back to back (what this used to do) left that loop with nothing
|
|
487
519
|
* to find, and an interrupted gate with no record at all.
|
|
488
520
|
*/
|
|
489
|
-
const runGate = async (gateId, command, evaluate) => {
|
|
490
|
-
const row = (0, db_1.createGateResult)(db, runId, { gateId, command });
|
|
521
|
+
const runGate = async (gateId, command, source, evaluate) => {
|
|
522
|
+
const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
|
|
491
523
|
return close(row.id, await evaluate());
|
|
492
524
|
};
|
|
493
525
|
/**
|
|
@@ -496,26 +528,26 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
|
|
|
496
528
|
* Opened and closed on the spot: there is no execution to leave a `running`
|
|
497
529
|
* row around, and the row carries {@link notRun}'s zero-length window.
|
|
498
530
|
*/
|
|
499
|
-
const recordNotRun = (gateId, command, reason) => {
|
|
531
|
+
const recordNotRun = (gateId, command, source, reason) => {
|
|
500
532
|
const outcome = notRun(reason);
|
|
501
|
-
const row = (0, db_1.createGateResult)(db, runId, { gateId, command });
|
|
533
|
+
const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
|
|
502
534
|
return close(row.id, outcome);
|
|
503
535
|
};
|
|
504
536
|
const statuses = [];
|
|
505
537
|
if (runWorkEvidence) {
|
|
506
|
-
const outcome = await runGate(verify_config_1.WORK_EVIDENCE_GATE_ID, WORK_EVIDENCE_GATE_COMMAND, () => evaluateWorkEvidence(worktreePath, baseRef, requireCommit));
|
|
538
|
+
const outcome = await runGate(verify_config_1.WORK_EVIDENCE_GATE_ID, WORK_EVIDENCE_GATE_COMMAND, 'builtin', () => evaluateWorkEvidence(worktreePath, baseRef, requireCommit));
|
|
507
539
|
if (outcome.status !== 'passed') {
|
|
508
540
|
// Nothing was produced, so every command gate below would be judging the
|
|
509
541
|
// base commit. Record them as skipped so the run shows what was not run.
|
|
510
542
|
const reason = `skipped: the ${verify_config_1.WORK_EVIDENCE_GATE_ID} gate did not pass.`;
|
|
511
543
|
if (selection.scope !== 'off') {
|
|
512
|
-
recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, reason);
|
|
544
|
+
recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', reason);
|
|
513
545
|
}
|
|
514
546
|
if (selection.runEnvClean) {
|
|
515
|
-
recordNotRun(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, reason);
|
|
547
|
+
recordNotRun(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', reason);
|
|
516
548
|
}
|
|
517
549
|
for (const gate of gates) {
|
|
518
|
-
recordNotRun(gate.id, gate.command, reason);
|
|
550
|
+
recordNotRun(gate.id, gate.command, gate.source, reason);
|
|
519
551
|
}
|
|
520
552
|
return outcome.status === 'failed' ? 'not_started' : 'error';
|
|
521
553
|
}
|
|
@@ -525,8 +557,8 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
|
|
|
525
557
|
// A detached contract is decided before the gate would run, so its row is
|
|
526
558
|
// recorded rather than executed.
|
|
527
559
|
const outcome = detachedContract
|
|
528
|
-
? recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, (0, scope_gate_1.scopeSkipDetachedContract)(detachedContract.id, detachedContract.status))
|
|
529
|
-
: await runGate(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, () => (0, scope_gate_1.evaluateScope)(worktreePath, task?.contract.scope ?? null, task?.contract.success.requireScopeClean ?? false, baseRef, task?.contractPath ?? null));
|
|
560
|
+
? recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', (0, scope_gate_1.scopeSkipDetachedContract)(detachedContract.id, detachedContract.status))
|
|
561
|
+
: await runGate(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', () => (0, scope_gate_1.evaluateScope)(worktreePath, task?.contract.scope ?? null, task?.contract.success.requireScopeClean ?? false, baseRef, task?.contractPath ?? null));
|
|
530
562
|
// A skipped scope gate in the default selection is usually not a declined
|
|
531
563
|
// check: no contract declared a scope, so there was no assertion to test.
|
|
532
564
|
// Counting it would turn every contract-less run into `error` (see
|
|
@@ -544,7 +576,7 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
|
|
|
544
576
|
// the agent's working window, and the gates below are the repository's own
|
|
545
577
|
// declared commands. A `test:e2e` gate that starts a server would otherwise
|
|
546
578
|
// be reported as the agent leaking one.
|
|
547
|
-
const outcome = await runGate(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, () => (0, env_clean_gate_1.evaluateEnvClean)({
|
|
579
|
+
const outcome = await runGate(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', () => (0, env_clean_gate_1.evaluateEnvClean)({
|
|
548
580
|
worktreeId: envClean.worktreeId,
|
|
549
581
|
worktreePath,
|
|
550
582
|
taskId: envClean.taskId,
|
|
@@ -559,11 +591,11 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
|
|
|
559
591
|
// The server process runs out of this directory. A `build` here replaces
|
|
560
592
|
// the chunks the running app is serving mid-flight and breaks the live UI
|
|
561
593
|
// — observed twice before this guard existed.
|
|
562
|
-
statuses.push(recordNotRun(gate.id, gate.command, 'skipped: worktreePath is the server process working directory and ' +
|
|
594
|
+
statuses.push(recordNotRun(gate.id, gate.command, gate.source, 'skipped: worktreePath is the server process working directory and ' +
|
|
563
595
|
'options.skipInPrimaryCheckout is true.').status);
|
|
564
596
|
continue;
|
|
565
597
|
}
|
|
566
|
-
const outcome = await runGate(gate.id, gate.command, () => runCommand(gate.command, worktreePath, gate.timeoutSec, maxLogTailBytes));
|
|
598
|
+
const outcome = await runGate(gate.id, gate.command, gate.source, () => runCommand(gate.command, worktreePath, gate.timeoutSec, maxLogTailBytes));
|
|
567
599
|
statuses.push(outcome.status);
|
|
568
600
|
}
|
|
569
601
|
return aggregateRunStatus(statuses);
|
|
@@ -700,12 +732,21 @@ async function startVerification(input) {
|
|
|
700
732
|
const envCleanDecision = (0, env_clean_gate_1.resolveRequireEnvClean)(task?.contract ?? null, config);
|
|
701
733
|
let selection = null;
|
|
702
734
|
if (config && !configFailure) {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
735
|
+
// Contract gates come from the task this run is actually about (#1791), so
|
|
736
|
+
// a detached contract contributes none — the same rule `requireCommit`
|
|
737
|
+
// follows, and for the same reason: that run is not about that contract.
|
|
738
|
+
const declared = declaredGates(config, task ? (0, contract_message_1.contractGateDefinitions)(task.contract) : []);
|
|
739
|
+
if (typeof declared === 'string') {
|
|
740
|
+
configFailure = declared;
|
|
706
741
|
}
|
|
707
742
|
else {
|
|
708
|
-
|
|
743
|
+
const selected = selectGates(declared, gateIds, envCleanDecision.required);
|
|
744
|
+
if (typeof selected === 'string') {
|
|
745
|
+
configFailure = selected;
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
selection = selected;
|
|
749
|
+
}
|
|
709
750
|
}
|
|
710
751
|
}
|
|
711
752
|
const baseRef = config ? await resolveBaseRef(config, input.worktreePath) : null;
|
|
@@ -733,6 +774,7 @@ async function startVerification(input) {
|
|
|
733
774
|
const row = (0, db_1.createGateResult)(db, run.id, {
|
|
734
775
|
gateId: exports.CONFIG_GATE_ID,
|
|
735
776
|
command: verify_config_1.VERIFY_CONFIG_RELATIVE_PATH,
|
|
777
|
+
source: 'builtin',
|
|
736
778
|
});
|
|
737
779
|
(0, db_1.finishGateResult)(db, row.id, {
|
|
738
780
|
status: 'error',
|