commandmate 0.15.0 → 0.17.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 +425 -310
- package/.next/app-path-routes-manifest.json +35 -20
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +11 -11
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +72 -0
- 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 +3 -3
- 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.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 -0
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -0
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -0
- 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/metrics/vibe/route.js +37 -0
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -0
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_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.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.js +23 -0
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/operations/route.js +13 -0
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/reindex/route.js +23 -0
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.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.js +4 -0
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/tasks/[taskId]/route.js +4 -0
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -0
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/templates/[id]/route.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.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 -0
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/verification/runs/route.js +1 -0
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -0
- 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_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 +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +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.js.nft.json +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.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.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 +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.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 +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.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 +18 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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/route.js +2 -2
- 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 +6 -0
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -0
- 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.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 +4 -0
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -0
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- 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 -0
- package/.next/server/app/skills/installed/page.js.nft.json +1 -0
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -0
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +4 -4
- 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 +35 -20
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1117.js +1 -1
- package/.next/server/chunks/1185.js +1 -0
- package/.next/server/chunks/1239.js +1 -0
- package/.next/server/chunks/1503.js +2 -0
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2366.js +1 -0
- package/.next/server/chunks/2710.js +2 -0
- package/.next/server/chunks/28.js +35 -0
- package/.next/server/chunks/3042.js +1 -2
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/4440.js +2 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/4548.js +1 -0
- package/.next/server/chunks/4689.js +25 -0
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5381.js +50 -10
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/5737.js +1 -0
- package/.next/server/chunks/5793.js +1 -0
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +13 -0
- package/.next/server/chunks/646.js +1 -1
- package/.next/server/chunks/8681.js +1 -1
- package/.next/server/chunks/8807.js +255 -51
- package/.next/server/chunks/8856.js +4 -0
- package/.next/server/chunks/9051.js +1 -0
- package/.next/server/chunks/9687.js +2 -2
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2751-7fabd91275b14ca3.js +1 -0
- package/.next/static/chunks/{4459.03172449db395039.js → 4459.a94b52985a76509a.js} +1 -1
- package/.next/static/chunks/{4560-8ffb0bb19f2ba998.js → 4560-0917ae2e6a0e5400.js} +1 -1
- package/.next/static/chunks/{6488-93870a55f4a3e3cd.js → 6488-f4e447464c9e0e22.js} +1 -1
- package/.next/static/chunks/{7485.43871aedf3dbb980.js → 7485.442b21101fca7257.js} +1 -1
- package/.next/static/chunks/8562-6e2ab32452f4fa5b.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/more/{page-082d4ae496f9a36e.js → page-1619018cac999bbc.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +1 -0
- package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +1 -0
- package/.next/static/chunks/app/review/{page-f431d630097c2e85.js → page-b559bfb11c46931b.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-20f07a99db64d2ca.js → page-3fa7e767d0ab3889.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/page-6008b904225ebb25.js +1 -0
- package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +1 -0
- package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-5ffc84094830babb.js +1 -0
- package/.next/static/chunks/{webpack-6b35d37d50302d27.js → webpack-180bebdee221b6f4.js} +1 -1
- package/.next/static/css/{5127edd9aa8f3b49.css → d3453a6876553d32.css} +1 -1
- package/.next/static/gR8Sh86RrTynJON8SWkWK/_buildManifest.js +1 -0
- package/.next/trace +12 -11
- package/.next/types/app/api/hooks/agent-event/route.ts +347 -0
- package/.next/types/app/api/metrics/vibe/route.ts +347 -0
- package/.next/types/app/api/skills/installations/route.ts +347 -0
- package/.next/types/app/api/skills/operations/route.ts +347 -0
- package/.next/types/app/api/skills/reindex/route.ts +347 -0
- package/.next/types/app/api/tasks/[taskId]/cancel/route.ts +347 -0
- package/.next/types/app/api/tasks/[taskId]/route.ts +347 -0
- package/.next/types/app/api/verification/runs/[runId]/route.ts +347 -0
- package/.next/types/app/api/verification/runs/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/tasks/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/route.ts +347 -0
- package/.next/types/app/skills/installed/page.ts +84 -0
- package/.next/types/routes.d.ts +17 -2
- package/.next/types/validator.ts +135 -0
- package/dist/cli/commands/report.d.ts +1 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +54 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +86 -3
- package/dist/cli/commands/skill.d.ts +2 -1
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +136 -2
- package/dist/cli/commands/task.d.ts +11 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +126 -0
- package/dist/cli/commands/verify.d.ts +19 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +229 -0
- package/dist/cli/commands/wait.d.ts +2 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +78 -13
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +92 -3
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +210 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +88 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +30 -1
- package/dist/cli/utils/api-client.d.ts +8 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +57 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -0
- package/dist/cli/utils/verify-runner.js +174 -0
- package/dist/server/server.js +15 -0
- package/dist/server/src/config/auto-yes-config.js +22 -0
- package/dist/server/src/lib/auto-yes-poller.js +34 -2
- package/dist/server/src/lib/auto-yes-state.js +6 -19
- package/dist/server/src/lib/db/db.js +34 -1
- package/dist/server/src/lib/db/migrations/index.js +8 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v48-skill-operations-audit-index.js +117 -0
- package/dist/server/src/lib/db/migrations/v49-verification-runs.js +86 -0
- package/dist/server/src/lib/db/migrations/v50-tasks.js +68 -0
- package/dist/server/src/lib/db/migrations/v51-task-events.js +58 -0
- package/dist/server/src/lib/db/task-events-db.js +59 -0
- package/dist/server/src/lib/db/tasks-db.js +218 -0
- package/dist/server/src/lib/db/verification-db.js +272 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +117 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +144 -4
- package/dist/server/src/lib/polling/response-checker.js +8 -0
- package/dist/server/src/lib/session/agent-event-state.js +46 -0
- package/dist/server/src/lib/session/current-output-builder.js +4 -0
- package/dist/server/src/lib/session/status-mapping.js +146 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +256 -0
- package/dist/server/src/lib/skills/compatibility.js +132 -11
- package/dist/server/src/lib/skills/operation-audit.js +85 -15
- package/dist/server/src/lib/skills/operation-journal.js +14 -1
- package/dist/server/src/lib/tasks/contract-parser.js +385 -0
- package/dist/server/src/lib/tasks/task-state-machine.js +183 -0
- package/dist/server/src/lib/tasks/task-transition-service.js +106 -0
- package/dist/server/src/lib/verification/verification-reconciler.js +49 -0
- package/dist/server/src/types/sidebar.js +7 -20
- package/package.json +5 -2
- package/scripts/hooks/cmate-agent-event.sh +175 -0
- package/.next/server/chunks/1808.js +0 -1
- package/.next/server/chunks/2064.js +0 -2
- package/.next/server/chunks/5226.js +0 -28
- package/.next/server/chunks/5306.js +0 -2
- package/.next/server/chunks/593.js +0 -1
- package/.next/server/chunks/9192.js +0 -1
- package/.next/static/MqlW91_Se_kEW6mtm-1x0/_buildManifest.js +0 -1
- package/.next/static/chunks/3418-7e47651340d940b0.js +0 -1
- package/.next/static/chunks/9142-41b13a2f278529cc.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/skills/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/templates/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/todos/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8c8bebe20cebf964.js +0 -1
- package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-8c40c9683f242207.js +0 -1
- package/.next/static/chunks/app/skills/page-46242c428ee8bccf.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-6da38f0a06dfd9db.js +0 -1
- /package/.next/static/{MqlW91_Se_kEW6mtm-1x0 → gR8Sh86RrTynJON8SWkWK}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loader and validator for `.commandmate/tasks/<name>.yaml` — the execution
|
|
4
|
+
* contract (Issue #1545, Phase 2-1).
|
|
5
|
+
*
|
|
6
|
+
* Canonical spec: docs/design/task-contract.md
|
|
7
|
+
*
|
|
8
|
+
* A contract declares, before the message is ever sent, what the task is for,
|
|
9
|
+
* which paths may change, what counts as done, and what the auto-answer policy
|
|
10
|
+
* is. This module only *validates and preserves* those declarations: the scope
|
|
11
|
+
* gate is #1546 and autoYes enforcement is #1547.
|
|
12
|
+
*
|
|
13
|
+
* Written in the same discipline as `lib/verification/verify-config.ts`: the
|
|
14
|
+
* `yaml` package, every violation collected rather than thrown one at a time,
|
|
15
|
+
* a closed key set, and a dedicated error class. Note that the Issue body says
|
|
16
|
+
* "ignore unknown keys" while also requiring that discipline; verify-config
|
|
17
|
+
* rejects them, and so does this. A misspelled `allowPromtTypes` that parsed
|
|
18
|
+
* cleanly would produce a contract that looks like it constrains auto-answering
|
|
19
|
+
* and does not — the worst failure a contract can have.
|
|
20
|
+
*
|
|
21
|
+
* Server-only: reads from disk, so import from API routes / CLI only.
|
|
22
|
+
*
|
|
23
|
+
* @module lib/tasks/contract-parser
|
|
24
|
+
*/
|
|
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;
|
|
27
|
+
exports.parseTaskContract = parseTaskContract;
|
|
28
|
+
exports.loadTaskContract = loadTaskContract;
|
|
29
|
+
const fs_1 = require("fs");
|
|
30
|
+
const path_1 = require("path");
|
|
31
|
+
const yaml_1 = require("yaml");
|
|
32
|
+
const path_validator_1 = require("../../lib/security/path-validator");
|
|
33
|
+
/** Directory contracts live in, relative to the worktree root. */
|
|
34
|
+
exports.TASK_CONTRACT_DIR = '.commandmate/tasks';
|
|
35
|
+
/**
|
|
36
|
+
* Auto-answer policy modes.
|
|
37
|
+
*
|
|
38
|
+
* A contract that omits `autoYes.mode` leaves the mode `null`, which is *not*
|
|
39
|
+
* `off`: null means "this contract says nothing about auto-answering, keep the
|
|
40
|
+
* existing behaviour", while `off` is an active prohibition. Phase 2-3's
|
|
41
|
+
* enforcement has to be able to tell those apart.
|
|
42
|
+
*/
|
|
43
|
+
exports.AUTO_YES_MODES = ['off', 'safe', 'allow-listed'];
|
|
44
|
+
/**
|
|
45
|
+
* Prompt-type names accepted in `autoYes.allowPromptTypes`.
|
|
46
|
+
*
|
|
47
|
+
* Built from a `Record<PromptType, true>` so the list is exhaustive by
|
|
48
|
+
* construction: adding a variant to {@link PromptType} without adding it here
|
|
49
|
+
* fails the build, instead of silently making a valid contract invalid.
|
|
50
|
+
*/
|
|
51
|
+
const PROMPT_TYPE_KEYS = {
|
|
52
|
+
yes_no: true,
|
|
53
|
+
multiple_choice: true,
|
|
54
|
+
approval: true,
|
|
55
|
+
choice: true,
|
|
56
|
+
input: true,
|
|
57
|
+
continue: true,
|
|
58
|
+
};
|
|
59
|
+
exports.PROMPT_TYPES = Object.keys(PROMPT_TYPE_KEYS);
|
|
60
|
+
exports.MAX_TITLE_LENGTH = 200;
|
|
61
|
+
exports.MAX_GOAL_LENGTH = 8000;
|
|
62
|
+
/** Applies to scope patterns and to autoYes.denyPatterns (ReDoS bound). */
|
|
63
|
+
exports.MAX_PATTERN_LENGTH = 200;
|
|
64
|
+
exports.MAX_SCOPE_PATTERNS = 200;
|
|
65
|
+
exports.MAX_GATE_IDS = 32;
|
|
66
|
+
exports.MAX_DENY_PATTERNS = 32;
|
|
67
|
+
exports.MAX_ALLOW_PROMPT_TYPES = 16;
|
|
68
|
+
const TOP_LEVEL_KEYS = ['version', 'title', 'goal', 'scope', 'verify', 'autoYes', 'success'];
|
|
69
|
+
const SCOPE_KEYS = ['allow', 'deny'];
|
|
70
|
+
const VERIFY_KEYS = ['gates'];
|
|
71
|
+
const AUTO_YES_KEYS = ['mode', 'allowPromptTypes', 'denyPatterns'];
|
|
72
|
+
const SUCCESS_KEYS = ['requireWorkEvidence', 'requireScopeClean', 'autoVerifyOnStop'];
|
|
73
|
+
/** Mirrors GATE_ID_PATTERN in verify-config.ts: a contract can only name ids that could exist. */
|
|
74
|
+
const GATE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
75
|
+
class TaskContractError extends Error {
|
|
76
|
+
issues;
|
|
77
|
+
constructor(issues) {
|
|
78
|
+
super(`invalid task contract:\n${issues.map((issue) => ` - ${issue}`).join('\n')}`);
|
|
79
|
+
this.name = 'TaskContractError';
|
|
80
|
+
this.issues = issues;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.TaskContractError = TaskContractError;
|
|
84
|
+
function isMapping(value) {
|
|
85
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
86
|
+
}
|
|
87
|
+
function asInteger(value) {
|
|
88
|
+
if (typeof value === 'number')
|
|
89
|
+
return Number.isInteger(value) ? value : null;
|
|
90
|
+
if (typeof value === 'string' && /^-?\d+$/.test(value))
|
|
91
|
+
return Number(value);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
function asBoolean(value) {
|
|
95
|
+
if (typeof value === 'boolean')
|
|
96
|
+
return value;
|
|
97
|
+
if (value === 'true')
|
|
98
|
+
return true;
|
|
99
|
+
if (value === 'false')
|
|
100
|
+
return false;
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function describe(value) {
|
|
104
|
+
if (value === undefined)
|
|
105
|
+
return 'nothing';
|
|
106
|
+
if (value === null)
|
|
107
|
+
return 'null';
|
|
108
|
+
if (typeof value === 'string')
|
|
109
|
+
return JSON.stringify(value);
|
|
110
|
+
if (Array.isArray(value))
|
|
111
|
+
return 'a list';
|
|
112
|
+
if (typeof value === 'object')
|
|
113
|
+
return 'a mapping';
|
|
114
|
+
return String(value);
|
|
115
|
+
}
|
|
116
|
+
function collectUnknownKeys(mapping, allowed, at, issues) {
|
|
117
|
+
for (const key of Object.keys(mapping)) {
|
|
118
|
+
if (!allowed.includes(key)) {
|
|
119
|
+
issues.push(`${at}: unknown key "${key}" (v1 is a closed set)`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate a list of strings, rejecting per-entry violations individually.
|
|
125
|
+
*
|
|
126
|
+
* @returns the accepted entries; entries that produced an issue are dropped so
|
|
127
|
+
* the returned contract never carries a value that failed validation
|
|
128
|
+
*/
|
|
129
|
+
function validateStringList(value, at, limits, issues) {
|
|
130
|
+
if (value === undefined)
|
|
131
|
+
return null;
|
|
132
|
+
if (value === null)
|
|
133
|
+
return [];
|
|
134
|
+
if (!Array.isArray(value)) {
|
|
135
|
+
issues.push(`${at}: must be a list (got ${describe(value)})`);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
if (value.length > limits.maxEntries) {
|
|
139
|
+
issues.push(`${at}: at most ${limits.maxEntries} entries (got ${value.length})`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const accepted = [];
|
|
143
|
+
value.forEach((entry, index) => {
|
|
144
|
+
const entryAt = `${at}[${index}]`;
|
|
145
|
+
if (typeof entry !== 'string' || entry.trim() === '') {
|
|
146
|
+
issues.push(`${entryAt}: must be a non-empty string (got ${describe(entry)})`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (entry.length > limits.maxLength) {
|
|
150
|
+
issues.push(`${entryAt}: at most ${limits.maxLength} characters (got ${entry.length})`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
accepted.push(entry);
|
|
154
|
+
});
|
|
155
|
+
return accepted;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A scope pattern can only speak about the inside of the worktree.
|
|
159
|
+
*
|
|
160
|
+
* An absolute path or a `..` segment is unjudgeable by the Phase 2-2 gate, and
|
|
161
|
+
* a NUL byte is never a path — all three are rejected at declaration time
|
|
162
|
+
* rather than becoming a pattern that silently matches nothing.
|
|
163
|
+
*/
|
|
164
|
+
function validateScopePattern(pattern, at, issues) {
|
|
165
|
+
if (pattern.includes('\0')) {
|
|
166
|
+
issues.push(`${at}: must not contain a NUL byte`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (pattern.startsWith('/')) {
|
|
170
|
+
issues.push(`${at}: must be relative to the worktree root (got the absolute path "${pattern}")`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (pattern.split('/').includes('..')) {
|
|
174
|
+
issues.push(`${at}: must not escape the worktree root with ".." (got "${pattern}")`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function validateScope(value, issues) {
|
|
178
|
+
const scope = { allow: [], deny: [] };
|
|
179
|
+
if (value === undefined || value === null)
|
|
180
|
+
return scope;
|
|
181
|
+
if (!isMapping(value)) {
|
|
182
|
+
issues.push(`scope: must be a mapping (got ${describe(value)})`);
|
|
183
|
+
return scope;
|
|
184
|
+
}
|
|
185
|
+
collectUnknownKeys(value, SCOPE_KEYS, 'scope', issues);
|
|
186
|
+
const limits = { maxEntries: exports.MAX_SCOPE_PATTERNS, maxLength: exports.MAX_PATTERN_LENGTH };
|
|
187
|
+
for (const key of ['allow', 'deny']) {
|
|
188
|
+
const list = validateStringList(value[key], `scope.${key}`, limits, issues);
|
|
189
|
+
if (!list)
|
|
190
|
+
continue;
|
|
191
|
+
list.forEach((pattern, index) => validateScopePattern(pattern, `scope.${key}[${index}]`, issues));
|
|
192
|
+
scope[key] = list;
|
|
193
|
+
}
|
|
194
|
+
return scope;
|
|
195
|
+
}
|
|
196
|
+
function validateVerify(value, issues) {
|
|
197
|
+
if (value === undefined || value === null)
|
|
198
|
+
return { gates: null };
|
|
199
|
+
if (!isMapping(value)) {
|
|
200
|
+
issues.push(`verify: must be a mapping (got ${describe(value)})`);
|
|
201
|
+
return { gates: null };
|
|
202
|
+
}
|
|
203
|
+
collectUnknownKeys(value, VERIFY_KEYS, 'verify', issues);
|
|
204
|
+
if (value.gates === undefined || value.gates === null)
|
|
205
|
+
return { gates: null };
|
|
206
|
+
const gates = validateStringList(value.gates, 'verify.gates', { maxEntries: exports.MAX_GATE_IDS, maxLength: 32 }, issues);
|
|
207
|
+
if (!gates)
|
|
208
|
+
return { gates: null };
|
|
209
|
+
// An empty list would read as "pass with no gates run". "Run everything" is
|
|
210
|
+
// spelled by omitting the key, so the two can never be confused.
|
|
211
|
+
if (Array.isArray(value.gates) && value.gates.length === 0) {
|
|
212
|
+
issues.push('verify.gates: must name at least one gate (omit the key to run every gate)');
|
|
213
|
+
return { gates: null };
|
|
214
|
+
}
|
|
215
|
+
const valid = [];
|
|
216
|
+
const seen = new Set();
|
|
217
|
+
gates.forEach((id, index) => {
|
|
218
|
+
if (!GATE_ID_PATTERN.test(id)) {
|
|
219
|
+
issues.push(`verify.gates[${index}]: "${id}" must match ${GATE_ID_PATTERN.source}`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (seen.has(id)) {
|
|
223
|
+
issues.push(`verify.gates[${index}]: duplicate gate id "${id}"`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
seen.add(id);
|
|
227
|
+
valid.push(id);
|
|
228
|
+
});
|
|
229
|
+
return { gates: valid.length > 0 ? valid : null };
|
|
230
|
+
}
|
|
231
|
+
function validateAutoYes(value, issues) {
|
|
232
|
+
const autoYes = { mode: null, allowPromptTypes: [], denyPatterns: [] };
|
|
233
|
+
if (value === undefined || value === null)
|
|
234
|
+
return autoYes;
|
|
235
|
+
if (!isMapping(value)) {
|
|
236
|
+
issues.push(`autoYes: must be a mapping (got ${describe(value)})`);
|
|
237
|
+
return autoYes;
|
|
238
|
+
}
|
|
239
|
+
collectUnknownKeys(value, AUTO_YES_KEYS, 'autoYes', issues);
|
|
240
|
+
if (value.mode !== undefined && value.mode !== null) {
|
|
241
|
+
if (typeof value.mode !== 'string' ||
|
|
242
|
+
!exports.AUTO_YES_MODES.includes(value.mode)) {
|
|
243
|
+
issues.push(`autoYes.mode: must be one of ${exports.AUTO_YES_MODES.join(', ')} (got ${describe(value.mode)})`);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
autoYes.mode = value.mode;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const promptTypes = validateStringList(value.allowPromptTypes, 'autoYes.allowPromptTypes', { maxEntries: exports.MAX_ALLOW_PROMPT_TYPES, maxLength: 64 }, issues);
|
|
250
|
+
if (promptTypes) {
|
|
251
|
+
promptTypes.forEach((type, index) => {
|
|
252
|
+
if (!exports.PROMPT_TYPES.includes(type)) {
|
|
253
|
+
issues.push(`autoYes.allowPromptTypes[${index}]: unknown prompt type "${type}" ` +
|
|
254
|
+
`(known: ${exports.PROMPT_TYPES.join(', ')})`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
autoYes.allowPromptTypes.push(type);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
const denyPatterns = validateStringList(value.denyPatterns, 'autoYes.denyPatterns', { maxEntries: exports.MAX_DENY_PATTERNS, maxLength: exports.MAX_PATTERN_LENGTH }, issues);
|
|
261
|
+
if (denyPatterns) {
|
|
262
|
+
denyPatterns.forEach((pattern, index) => {
|
|
263
|
+
try {
|
|
264
|
+
new RegExp(pattern);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
issues.push(`autoYes.denyPatterns[${index}]: not a valid regular expression: ${error.message}`);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
autoYes.denyPatterns.push(pattern);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return autoYes;
|
|
274
|
+
}
|
|
275
|
+
function validateSuccess(value, issues) {
|
|
276
|
+
const success = {
|
|
277
|
+
requireWorkEvidence: true,
|
|
278
|
+
requireScopeClean: true,
|
|
279
|
+
autoVerifyOnStop: false,
|
|
280
|
+
};
|
|
281
|
+
if (value === undefined || value === null)
|
|
282
|
+
return success;
|
|
283
|
+
if (!isMapping(value)) {
|
|
284
|
+
issues.push(`success: must be a mapping (got ${describe(value)})`);
|
|
285
|
+
return success;
|
|
286
|
+
}
|
|
287
|
+
collectUnknownKeys(value, SUCCESS_KEYS, 'success', issues);
|
|
288
|
+
for (const key of SUCCESS_KEYS) {
|
|
289
|
+
if (value[key] === undefined)
|
|
290
|
+
continue;
|
|
291
|
+
const parsed = asBoolean(value[key]);
|
|
292
|
+
if (parsed === null) {
|
|
293
|
+
issues.push(`success.${key}: must be true or false (got ${describe(value[key])})`);
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
success[key] = parsed;
|
|
297
|
+
}
|
|
298
|
+
return success;
|
|
299
|
+
}
|
|
300
|
+
function validateText(value, key, maxLength, issues) {
|
|
301
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
302
|
+
issues.push(`${key}: required, must be a non-empty string (got ${describe(value)})`);
|
|
303
|
+
return '';
|
|
304
|
+
}
|
|
305
|
+
if (value.length > maxLength) {
|
|
306
|
+
issues.push(`${key}: at most ${maxLength} characters (got ${value.length})`);
|
|
307
|
+
return '';
|
|
308
|
+
}
|
|
309
|
+
return value.trim();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Parse and validate a contract document.
|
|
313
|
+
*
|
|
314
|
+
* @param raw YAML source
|
|
315
|
+
* @param sourceLabel path or label used to prefix document-level issues
|
|
316
|
+
* @throws TaskContractError with every violation collected in `issues`
|
|
317
|
+
*/
|
|
318
|
+
function parseTaskContract(raw, sourceLabel) {
|
|
319
|
+
let document;
|
|
320
|
+
try {
|
|
321
|
+
document = (0, yaml_1.parse)(raw);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
throw new TaskContractError([`${sourceLabel}: YAML parse error: ${error.message}`]);
|
|
325
|
+
}
|
|
326
|
+
if (!isMapping(document)) {
|
|
327
|
+
throw new TaskContractError([
|
|
328
|
+
`${sourceLabel}: expected a YAML mapping at the top level (got ${describe(document)})`,
|
|
329
|
+
]);
|
|
330
|
+
}
|
|
331
|
+
const issues = [];
|
|
332
|
+
collectUnknownKeys(document, TOP_LEVEL_KEYS, 'top level', issues);
|
|
333
|
+
if (!('version' in document)) {
|
|
334
|
+
issues.push('version: required, v1 contracts must declare "version: 1"');
|
|
335
|
+
}
|
|
336
|
+
else if (asInteger(document.version) !== 1) {
|
|
337
|
+
issues.push(`version: must be 1 (got ${describe(document.version)})`);
|
|
338
|
+
}
|
|
339
|
+
const title = validateText(document.title, 'title', exports.MAX_TITLE_LENGTH, issues);
|
|
340
|
+
const goal = validateText(document.goal, 'goal', exports.MAX_GOAL_LENGTH, issues);
|
|
341
|
+
const success = validateSuccess(document.success, issues);
|
|
342
|
+
const scope = validateScope(document.scope, issues);
|
|
343
|
+
const verify = validateVerify(document.verify, issues);
|
|
344
|
+
const autoYes = validateAutoYes(document.autoYes, issues);
|
|
345
|
+
// Checked after both sections are parsed: "keep changes inside scope" with no
|
|
346
|
+
// scope listed makes the Phase 2-2 gate reject every change the moment it
|
|
347
|
+
// switches on, so the contract is rejected now instead.
|
|
348
|
+
if (success.requireScopeClean && scope.allow.length === 0) {
|
|
349
|
+
issues.push('scope.allow: at least one pattern is required while success.requireScopeClean is true');
|
|
350
|
+
}
|
|
351
|
+
if (issues.length > 0)
|
|
352
|
+
throw new TaskContractError(issues);
|
|
353
|
+
return { version: 1, title, goal, scope, verify, autoYes, success };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Read and validate a contract inside a worktree.
|
|
357
|
+
*
|
|
358
|
+
* `relativePath` is resolved against `worktreePath` and must stay inside it: a
|
|
359
|
+
* contract is a statement about one worktree, and a path that leaves it would
|
|
360
|
+
* let a send read an arbitrary file off the server's disk.
|
|
361
|
+
*
|
|
362
|
+
* @throws TaskContractError when the path escapes, the file is unreadable, or
|
|
363
|
+
* the document is invalid
|
|
364
|
+
*/
|
|
365
|
+
function loadTaskContract(worktreePath, relativePath) {
|
|
366
|
+
if (!(0, path_validator_1.isPathSafe)(relativePath, worktreePath)) {
|
|
367
|
+
throw new TaskContractError([
|
|
368
|
+
`${relativePath}: contract path must be inside the worktree (${worktreePath})`,
|
|
369
|
+
]);
|
|
370
|
+
}
|
|
371
|
+
const absolutePath = (0, path_1.join)(worktreePath, relativePath);
|
|
372
|
+
let raw;
|
|
373
|
+
try {
|
|
374
|
+
raw = (0, fs_1.readFileSync)(absolutePath, 'utf8');
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
const code = error.code;
|
|
378
|
+
throw new TaskContractError([
|
|
379
|
+
code === 'ENOENT'
|
|
380
|
+
? `${relativePath}: contract file not found in ${worktreePath}`
|
|
381
|
+
: `${relativePath}: ${error.message}`,
|
|
382
|
+
]);
|
|
383
|
+
}
|
|
384
|
+
return parseTaskContract(raw, relativePath);
|
|
385
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TaskStatus state machine (Issue #1548, Phase 3-1).
|
|
4
|
+
*
|
|
5
|
+
* Pure and side-effect free: given a status and an event, it answers what the
|
|
6
|
+
* status becomes, or `null` when the event does not apply. Phase 2-1 let each
|
|
7
|
+
* firing point decide the next status for itself, which meant the rules lived in
|
|
8
|
+
* six places and agreed with each other only by coincidence. They live here now,
|
|
9
|
+
* and `applyTaskEvent` is the only thing allowed to act on the answer.
|
|
10
|
+
*
|
|
11
|
+
* This is a different layer from `SessionStatus`. SessionStatus is derived from
|
|
12
|
+
* screen-scraped terminal output — low level, volatile, recomputed every poll.
|
|
13
|
+
* TaskStatus is durable and only moves because something *happened*. A
|
|
14
|
+
* SessionStatus reading is at most one of the events that can cause a move; it
|
|
15
|
+
* never writes TaskStatus itself.
|
|
16
|
+
*
|
|
17
|
+
* Rejection is not an error. A prompt detected while a verification run is in
|
|
18
|
+
* flight is an ordinary race, not a bug, so `transitionTask` returns `null` and
|
|
19
|
+
* the caller records the attempt and moves on. Throwing would turn a race into
|
|
20
|
+
* a crashed poller.
|
|
21
|
+
*
|
|
22
|
+
* @module lib/tasks/task-state-machine
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.TASK_EVENTS = void 0;
|
|
26
|
+
exports.transitionTask = transitionTask;
|
|
27
|
+
exports.TASK_EVENTS = [
|
|
28
|
+
'message_sent',
|
|
29
|
+
'send_failed',
|
|
30
|
+
'prompt_detected',
|
|
31
|
+
'prompt_answered_auto',
|
|
32
|
+
'prompt_answered_human',
|
|
33
|
+
'agent_idle',
|
|
34
|
+
'verify_started',
|
|
35
|
+
'verify_passed',
|
|
36
|
+
'verify_failed',
|
|
37
|
+
'verify_not_started',
|
|
38
|
+
'cancel',
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* The status `current` becomes when `event` happens, or `null` if it does not
|
|
42
|
+
* apply.
|
|
43
|
+
*
|
|
44
|
+
* Both switches are exhaustive by `satisfies never`, so adding a TaskStatus or a
|
|
45
|
+
* TaskEvent fails the build here instead of silently defaulting to "rejected" —
|
|
46
|
+
* a new event that quietly transitions nothing is indistinguishable from one
|
|
47
|
+
* that is wired up wrong.
|
|
48
|
+
*/
|
|
49
|
+
function transitionTask(current, event) {
|
|
50
|
+
switch (current) {
|
|
51
|
+
case 'pending':
|
|
52
|
+
// Nothing has been sent yet, so nothing about the agent's behaviour can
|
|
53
|
+
// be true of this task.
|
|
54
|
+
switch (event) {
|
|
55
|
+
case 'message_sent':
|
|
56
|
+
return 'running';
|
|
57
|
+
case 'send_failed':
|
|
58
|
+
return 'failed';
|
|
59
|
+
case 'cancel':
|
|
60
|
+
return 'cancelled';
|
|
61
|
+
case 'prompt_detected':
|
|
62
|
+
case 'prompt_answered_auto':
|
|
63
|
+
case 'prompt_answered_human':
|
|
64
|
+
case 'agent_idle':
|
|
65
|
+
case 'verify_started':
|
|
66
|
+
case 'verify_passed':
|
|
67
|
+
case 'verify_failed':
|
|
68
|
+
case 'verify_not_started':
|
|
69
|
+
return null;
|
|
70
|
+
default:
|
|
71
|
+
return assertNever(event);
|
|
72
|
+
}
|
|
73
|
+
case 'running':
|
|
74
|
+
switch (event) {
|
|
75
|
+
case 'prompt_detected':
|
|
76
|
+
return 'waiting_input';
|
|
77
|
+
// The agent going quiet without a verification run is not a verdict.
|
|
78
|
+
// The status is held and only the event is recorded, so "it stopped
|
|
79
|
+
// producing output" stays visible without being mistaken for "done".
|
|
80
|
+
case 'agent_idle':
|
|
81
|
+
return 'running';
|
|
82
|
+
case 'verify_started':
|
|
83
|
+
return 'verifying';
|
|
84
|
+
case 'send_failed':
|
|
85
|
+
return 'failed';
|
|
86
|
+
case 'cancel':
|
|
87
|
+
return 'cancelled';
|
|
88
|
+
case 'message_sent':
|
|
89
|
+
case 'prompt_answered_auto':
|
|
90
|
+
case 'prompt_answered_human':
|
|
91
|
+
case 'verify_passed':
|
|
92
|
+
case 'verify_failed':
|
|
93
|
+
case 'verify_not_started':
|
|
94
|
+
return null;
|
|
95
|
+
default:
|
|
96
|
+
return assertNever(event);
|
|
97
|
+
}
|
|
98
|
+
case 'waiting_input':
|
|
99
|
+
switch (event) {
|
|
100
|
+
case 'prompt_answered_auto':
|
|
101
|
+
case 'prompt_answered_human':
|
|
102
|
+
return 'running';
|
|
103
|
+
case 'agent_idle':
|
|
104
|
+
return 'running';
|
|
105
|
+
case 'verify_started':
|
|
106
|
+
return 'verifying';
|
|
107
|
+
case 'cancel':
|
|
108
|
+
return 'cancelled';
|
|
109
|
+
case 'message_sent':
|
|
110
|
+
case 'send_failed':
|
|
111
|
+
case 'prompt_detected':
|
|
112
|
+
case 'verify_passed':
|
|
113
|
+
case 'verify_failed':
|
|
114
|
+
case 'verify_not_started':
|
|
115
|
+
return null;
|
|
116
|
+
default:
|
|
117
|
+
return assertNever(event);
|
|
118
|
+
}
|
|
119
|
+
case 'verifying':
|
|
120
|
+
// A run is in flight. Only that run's verdict — or an explicit cancel —
|
|
121
|
+
// moves the task, so a prompt or a send racing the gates cannot overwrite
|
|
122
|
+
// the outcome the gates are about to produce.
|
|
123
|
+
switch (event) {
|
|
124
|
+
case 'verify_passed':
|
|
125
|
+
return 'succeeded';
|
|
126
|
+
case 'verify_failed':
|
|
127
|
+
return 'failed';
|
|
128
|
+
case 'verify_not_started':
|
|
129
|
+
return 'not_started';
|
|
130
|
+
case 'cancel':
|
|
131
|
+
return 'cancelled';
|
|
132
|
+
case 'message_sent':
|
|
133
|
+
case 'send_failed':
|
|
134
|
+
case 'prompt_detected':
|
|
135
|
+
case 'prompt_answered_auto':
|
|
136
|
+
case 'prompt_answered_human':
|
|
137
|
+
case 'agent_idle':
|
|
138
|
+
case 'verify_started':
|
|
139
|
+
return null;
|
|
140
|
+
default:
|
|
141
|
+
return assertNever(event);
|
|
142
|
+
}
|
|
143
|
+
case 'failed':
|
|
144
|
+
case 'not_started':
|
|
145
|
+
// Not the end of the story. Re-instructing an agent whose work did not
|
|
146
|
+
// pass reopens the same task, and the number of times that happens is the
|
|
147
|
+
// fix-loop count Phase 4 Eval reports. Re-running the gates alone reopens
|
|
148
|
+
// it too — a task can fail on a flaky gate and pass on the retry.
|
|
149
|
+
switch (event) {
|
|
150
|
+
case 'message_sent':
|
|
151
|
+
return 'running';
|
|
152
|
+
case 'verify_started':
|
|
153
|
+
return 'verifying';
|
|
154
|
+
case 'cancel':
|
|
155
|
+
return 'cancelled';
|
|
156
|
+
case 'send_failed':
|
|
157
|
+
case 'prompt_detected':
|
|
158
|
+
case 'prompt_answered_auto':
|
|
159
|
+
case 'prompt_answered_human':
|
|
160
|
+
case 'agent_idle':
|
|
161
|
+
case 'verify_passed':
|
|
162
|
+
case 'verify_failed':
|
|
163
|
+
case 'verify_not_started':
|
|
164
|
+
return null;
|
|
165
|
+
default:
|
|
166
|
+
return assertNever(event);
|
|
167
|
+
}
|
|
168
|
+
case 'succeeded':
|
|
169
|
+
case 'cancelled':
|
|
170
|
+
// Closed for good. `succeeded` in particular is a verdict a verification
|
|
171
|
+
// run produced; letting any later event walk it back would make "this
|
|
172
|
+
// task passed" a claim with no fixed meaning.
|
|
173
|
+
return null;
|
|
174
|
+
default:
|
|
175
|
+
return assertNever(current);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Compile-time exhaustiveness guard; unreachable at runtime. */
|
|
179
|
+
function assertNever(value) {
|
|
180
|
+
const _exhaustive = value;
|
|
181
|
+
void _exhaustive;
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The only writer of `tasks.status` (Issue #1548, Phase 3-1).
|
|
4
|
+
*
|
|
5
|
+
* `applyTaskEvent` reads the current status, asks the state machine what the
|
|
6
|
+
* event means, and — in one transaction — writes the new status and appends the
|
|
7
|
+
* event. Phase 2-1 had each firing point call `updateTaskStatus` with a status
|
|
8
|
+
* it chose itself; `updateTaskStatus` is no longer reachable from the
|
|
9
|
+
* `@/lib/db` barrel so that this is the only door.
|
|
10
|
+
*
|
|
11
|
+
* A rejected transition still writes a `task_events` row (`to_status = NULL`).
|
|
12
|
+
* The event happened; the machine declined to act on it. That distinction is
|
|
13
|
+
* what tells a wiring bug apart from a race, and it is invisible if rejected
|
|
14
|
+
* events are dropped.
|
|
15
|
+
*
|
|
16
|
+
* The UPDATE and the INSERT are one transaction because a status with no event
|
|
17
|
+
* behind it, or an event whose status never landed, would each make the log
|
|
18
|
+
* lie about the table it exists to explain. better-sqlite3 is synchronous, so a
|
|
19
|
+
* transaction here also serialises concurrent callers with no further work.
|
|
20
|
+
*
|
|
21
|
+
* @module lib/tasks/task-transition-service
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.applyTaskEvent = applyTaskEvent;
|
|
25
|
+
exports.applyEventToActiveTask = applyEventToActiveTask;
|
|
26
|
+
const tasks_db_1 = require("../../lib/db/tasks-db");
|
|
27
|
+
const task_events_db_1 = require("../../lib/db/task-events-db");
|
|
28
|
+
const logger_1 = require("../../lib/logger");
|
|
29
|
+
const task_state_machine_1 = require("./task-state-machine");
|
|
30
|
+
const logger = (0, logger_1.createLogger)('lib/tasks/task-transition-service');
|
|
31
|
+
/**
|
|
32
|
+
* Apply `event` to a task.
|
|
33
|
+
*
|
|
34
|
+
* @param payload - Structured detail for the log. `runId` is also written to
|
|
35
|
+
* `tasks.last_verification_run_id` on an accepted transition, so the task's
|
|
36
|
+
* pointer to the run that last judged it and the event naming that run cannot
|
|
37
|
+
* disagree.
|
|
38
|
+
* @returns null when the task does not exist — a deleted worktree takes its
|
|
39
|
+
* tasks with it, and a poller still holding the id must not crash for it
|
|
40
|
+
*/
|
|
41
|
+
function applyTaskEvent(db, taskId, event, payload) {
|
|
42
|
+
const apply = db.transaction(() => {
|
|
43
|
+
const task = (0, tasks_db_1.getTask)(db, taskId);
|
|
44
|
+
if (!task) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const fromStatus = task.status;
|
|
48
|
+
const toStatus = (0, task_state_machine_1.transitionTask)(fromStatus, event);
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const eventId = (0, task_events_db_1.insertTaskEvent)(db, {
|
|
51
|
+
taskId,
|
|
52
|
+
event,
|
|
53
|
+
fromStatus,
|
|
54
|
+
toStatus,
|
|
55
|
+
payload,
|
|
56
|
+
createdAt: now,
|
|
57
|
+
});
|
|
58
|
+
if (toStatus === null) {
|
|
59
|
+
return { task, fromStatus, toStatus: null, eventId };
|
|
60
|
+
}
|
|
61
|
+
const updated = (0, tasks_db_1.updateTaskStatus)(db, taskId, toStatus, payload?.runId === undefined ? {} : { lastVerificationRunId: payload.runId });
|
|
62
|
+
return { task: updated, fromStatus, toStatus, eventId };
|
|
63
|
+
});
|
|
64
|
+
const result = apply();
|
|
65
|
+
if (result === null) {
|
|
66
|
+
logger.warn('task-event-unknown-task', { taskId, event });
|
|
67
|
+
}
|
|
68
|
+
else if (result.toStatus === null) {
|
|
69
|
+
logger.warn('task-event-rejected', { taskId, event, fromStatus: result.fromStatus });
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Raise `event` on whichever task is currently governing one agent instance.
|
|
75
|
+
*
|
|
76
|
+
* The no-op is the important case. Prompts, auto-answers and human replies
|
|
77
|
+
* happen constantly in sessions that were never sent a contract, and every
|
|
78
|
+
* firing point calls this unconditionally — so "no active task" has to mean
|
|
79
|
+
* "nothing happens", not "nothing to do, but raise something anyway". Anything
|
|
80
|
+
* else would make Phase 3-1 a behaviour change for contract-less use.
|
|
81
|
+
*
|
|
82
|
+
* Never throws: these callers are pollers and API routes whose real job is the
|
|
83
|
+
* message itself, and a task-log failure must not take that down with it.
|
|
84
|
+
*
|
|
85
|
+
* @param instanceId - Agent instance id; the tool id itself for the primary
|
|
86
|
+
* @returns The result, or null when no active task governs this instance
|
|
87
|
+
*/
|
|
88
|
+
function applyEventToActiveTask(db, worktreeId, cliToolId, instanceId, event, payload) {
|
|
89
|
+
try {
|
|
90
|
+
const task = (0, tasks_db_1.getActiveTaskForInstance)(db, worktreeId, cliToolId, instanceId);
|
|
91
|
+
if (!task) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return applyTaskEvent(db, task.id, event, payload);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.warn('task-event-failed', {
|
|
98
|
+
worktreeId,
|
|
99
|
+
cliToolId,
|
|
100
|
+
instanceId,
|
|
101
|
+
event,
|
|
102
|
+
error: error instanceof Error ? error.message : String(error),
|
|
103
|
+
});
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|