commandmate 0.20.0 → 0.21.1
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 +252 -238
- package/.next/app-path-routes-manifest.json +38 -36
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +18 -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_client-reference-manifest.js +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.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.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.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_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_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/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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +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.js +2 -2
- 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_client-reference-manifest.js +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_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_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_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 +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_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_client-reference-manifest.js +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 +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_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.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/[skillId]/update/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -0
- 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_client-reference-manifest.js +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +5 -5
- 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 +38 -36
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1503.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2546.js +1 -0
- package/.next/server/chunks/2710.js +2 -2
- package/.next/server/chunks/28.js +2 -2
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/365.js +1 -0
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/3753.js +14 -5
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5737.js +1 -1
- package/.next/server/chunks/5959.js +10 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/848.js +1 -0
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/8584.js +1 -1
- package/.next/server/chunks/8807.js +1 -1
- package/.next/server/chunks/8856.js +1 -1
- package/.next/server/chunks/9058.js +1 -1
- package/.next/server/chunks/9360.js +2 -0
- package/.next/server/chunks/9687.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{8562-6e2ab32452f4fa5b.js → 2053-52d3c82014e1cd54.js} +1 -1
- package/.next/static/chunks/2751-9ef0f4b450bd4ef0.js +1 -0
- package/.next/static/chunks/{6488-3e7539550c3ef358.js → 6488-d3cf14e8d95b2d03.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/templates/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-77b0ee35da06da00.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.ts +347 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts +1 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +112 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +31 -6
- package/dist/cli/commands/send.js +2 -2
- package/dist/cli/commands/skill-format.d.ts +7 -1
- package/dist/cli/commands/skill-format.d.ts.map +1 -1
- package/dist/cli/commands/skill-format.js +67 -0
- package/dist/cli/commands/skill.d.ts +2 -0
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +149 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +53 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +72 -1
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +25 -3
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +3 -0
- package/dist/cli/types/api-responses.d.ts +201 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +31 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +9 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +28 -2
- package/dist/config/history-display-config.d.ts +61 -0
- package/dist/config/history-display-config.d.ts.map +1 -0
- package/dist/config/history-display-config.js +62 -0
- package/dist/server/src/lib/auto-yes-poller.js +49 -0
- package/dist/server/src/lib/db/chat-db.js +75 -1
- package/dist/server/src/lib/db/db.js +4 -3
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +122 -4
- package/dist/server/src/lib/detection/prompt-detector.js +39 -3
- package/dist/server/src/lib/polling/auto-yes-resolver.js +14 -5
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +54 -0
- package/dist/server/src/lib/session/current-output-builder.js +2 -0
- package/dist/server/src/lib/skills/install-apply.js +63 -23
- package/dist/server/src/lib/skills/operation-audit.js +5 -6
- package/dist/server/src/lib/skills/startup-reconcile.js +26 -5
- package/dist/server/src/lib/skills/updater.js +830 -0
- package/package.json +1 -1
- package/.next/server/chunks/3042.js +0 -1
- package/.next/server/chunks/4440.js +0 -2
- package/.next/server/chunks/4548.js +0 -1
- package/.next/server/chunks/5793.js +0 -1
- package/.next/static/chunks/2751-7fabd91275b14ca3.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/skills/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/templates/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/todos/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-6008b904225ebb25.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-5bdd550ed6386f57.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-214ee8b97dca856b.js +0 -1
- /package/.next/static/{C01FQOE5FCmB3I_GhMa4_ → E2SxtJGbNcRMnWbCC3i_-}/_buildManifest.js +0 -0
- /package/.next/static/{C01FQOE5FCmB3I_GhMa4_ → E2SxtJGbNcRMnWbCC3i_-}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/** Multiple choice prompt detection logic extracted from prompt-detector.ts (Issue #575). */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.APPROVAL_TARGET_MAX_LOOKBACK = void 0;
|
|
5
|
+
exports.findApprovalContextStart = findApprovalContextStart;
|
|
6
|
+
exports.joinApprovalTarget = joinApprovalTarget;
|
|
4
7
|
exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
|
|
5
8
|
exports.detectMultipleChoicePrompt = detectMultipleChoicePrompt;
|
|
6
9
|
const tui_detection_frame_1 = require("./tui-detection-frame");
|
|
@@ -56,6 +59,12 @@ const NORMAL_OPTION_PATTERN = /^\s*[^\d]{0,3}(\d+)(?:\.(?!\d)|\s+)\s*(.+)$/;
|
|
|
56
59
|
* Anchored at both ends -- ReDoS safe (S4-001).
|
|
57
60
|
*/
|
|
58
61
|
const SEPARATOR_LINE_PATTERN = /^[-─]+$/;
|
|
62
|
+
/**
|
|
63
|
+
* How many lines above `questionEndIndex` the question text is collected from.
|
|
64
|
+
* Also the point the Issue #1699 approval-context scan starts walking up from,
|
|
65
|
+
* since everything inside this window is already part of `question`.
|
|
66
|
+
*/
|
|
67
|
+
const QUESTION_CONTEXT_LINES = 5;
|
|
59
68
|
/**
|
|
60
69
|
* Pattern for collapsed-output summary lines rendered by Codex/OpenAI TUI.
|
|
61
70
|
* Example: "[… 12 lines] ctrl + a view all"
|
|
@@ -461,7 +470,7 @@ function extractQuestionText(lines, questionEndIndex) {
|
|
|
461
470
|
return 'Please select an option:';
|
|
462
471
|
}
|
|
463
472
|
const questionLines = [];
|
|
464
|
-
for (let i = Math.max(0, questionEndIndex -
|
|
473
|
+
for (let i = Math.max(0, questionEndIndex - QUESTION_CONTEXT_LINES); i <= questionEndIndex; i++) {
|
|
465
474
|
const line = lines[i].trim();
|
|
466
475
|
if (line && !SEPARATOR_LINE_PATTERN.test(line)) {
|
|
467
476
|
questionLines.push(line);
|
|
@@ -489,6 +498,108 @@ function extractInstructionText(lines, questionEndIndex, effectiveEnd) {
|
|
|
489
498
|
const joined = blockLines.join('\n').trim();
|
|
490
499
|
return joined.length > 0 ? joined : undefined;
|
|
491
500
|
}
|
|
501
|
+
/**
|
|
502
|
+
* Lines that mean "the previous turn ended here" when scanning upward.
|
|
503
|
+
*
|
|
504
|
+
* Every supported CLI renders its transcript as marker-prefixed rows — Claude's
|
|
505
|
+
* tool-use `⏺` and result `⎿`, Codex's activity `•`, its approval receipts `✔`
|
|
506
|
+
* / `✗`, the user's own `›` / `❯` / `>` echo, and its output continuation `└`.
|
|
507
|
+
* The lines a prompt panel puts above its question (a header such as "Bash
|
|
508
|
+
* command", the command itself, a one-line description) never carry one, which
|
|
509
|
+
* is what makes this usable as the panel's upper edge after `stripBoxDrawing`
|
|
510
|
+
* has erased the real box border.
|
|
511
|
+
*
|
|
512
|
+
* Horizontal rules count too: Codex draws one between turns.
|
|
513
|
+
*
|
|
514
|
+
* Anchored at the start of the trimmed line — ReDoS safe (no repetition).
|
|
515
|
+
*/
|
|
516
|
+
const TURN_BOUNDARY_PATTERN = /^[⏺⎿●○•✔✓✖✗✘›»❯└├>]/;
|
|
517
|
+
/**
|
|
518
|
+
* How far above the question the approval context may reach (Issue #1699).
|
|
519
|
+
*
|
|
520
|
+
* The boundary marker above is the actual fix; this cap only exists so a frame
|
|
521
|
+
* that happens to contain no marker at all (a bare shell `(y/n)` prompt under
|
|
522
|
+
* plain command output) cannot drag an unbounded scrollback window into the
|
|
523
|
+
* deny surface the way the old fixed 19-line lookback did. Sized for the
|
|
524
|
+
* tallest real permission panel measured: header + blank + a wrapped multi-line
|
|
525
|
+
* command + description + blank.
|
|
526
|
+
*/
|
|
527
|
+
exports.APPROVAL_TARGET_MAX_LOOKBACK = 12;
|
|
528
|
+
/** True when this line belongs to a previous turn rather than the prompt panel. */
|
|
529
|
+
function isTurnBoundaryLine(rawLine) {
|
|
530
|
+
if (rawLine === undefined)
|
|
531
|
+
return false;
|
|
532
|
+
const line = rawLine.trim();
|
|
533
|
+
if (line === '')
|
|
534
|
+
return false;
|
|
535
|
+
return TURN_BOUNDARY_PATTERN.test(line) || SEPARATOR_LINE_PATTERN.test(line);
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* First line index that still belongs to *this* prompt, scanning upward.
|
|
539
|
+
*
|
|
540
|
+
* Walks up from `questionLineIndex - 1` and stops just below the nearest turn
|
|
541
|
+
* boundary; with no boundary in reach it falls back to the lookback cap.
|
|
542
|
+
* Everything above the returned index is a previous turn and must never reach a
|
|
543
|
+
* deny pattern — that poisoning is Issue #1699.
|
|
544
|
+
*
|
|
545
|
+
* Shared by both detector paths: multiple_choice passes its `questionEndIndex`,
|
|
546
|
+
* yes_no the line its pattern matched on.
|
|
547
|
+
*
|
|
548
|
+
* @param lines - Full frame, already ANSI/box stripped
|
|
549
|
+
* @param questionLineIndex - Line the prompt's own question sits on
|
|
550
|
+
* @returns Index of the first line of the current prompt's own block
|
|
551
|
+
*/
|
|
552
|
+
function findApprovalContextStart(lines, questionLineIndex) {
|
|
553
|
+
const floor = Math.max(0, questionLineIndex - exports.APPROVAL_TARGET_MAX_LOOKBACK);
|
|
554
|
+
for (let i = questionLineIndex - 1; i >= floor; i--) {
|
|
555
|
+
if (isTurnBoundaryLine(lines[i])) {
|
|
556
|
+
return i + 1;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
return floor;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Join a slice of the frame into an approval-target string.
|
|
563
|
+
*
|
|
564
|
+
* @returns The trimmed block, or undefined when it is empty
|
|
565
|
+
*/
|
|
566
|
+
function joinApprovalTarget(lines, start, end) {
|
|
567
|
+
const joined = lines
|
|
568
|
+
.slice(start, end)
|
|
569
|
+
.map(l => l.trimEnd())
|
|
570
|
+
.join('\n')
|
|
571
|
+
.trim();
|
|
572
|
+
return joined.length > 0 ? joined : undefined;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Extract what this multiple-choice prompt is asking approval for (Issue #1699).
|
|
576
|
+
*
|
|
577
|
+
* Same lower bound as {@link extractInstructionText} — the panel runs through
|
|
578
|
+
* its options — but the upper bound is the previous turn's boundary instead of
|
|
579
|
+
* a fixed 19-line lookback.
|
|
580
|
+
*
|
|
581
|
+
* Measured against the live Codex captures in `fixtures/codex-live-1628`: the
|
|
582
|
+
* two `✔ You approved codex to run …` receipts and the `• Ran …` echoes that
|
|
583
|
+
* `instructionText` carries all fall outside, while the `$ git add …` the
|
|
584
|
+
* prompt is actually asking about, and the diff an apply-patch prompt is asking
|
|
585
|
+
* about, both stay inside.
|
|
586
|
+
*
|
|
587
|
+
* Residual, deliberately left alone: `question` itself is built from up to
|
|
588
|
+
* {@link QUESTION_CONTEXT_LINES} lines above `questionEndIndex` and is also part
|
|
589
|
+
* of the deny surface. Narrowing that would change prompt dedup keys and what
|
|
590
|
+
* the UI renders, and it is bounded by the options below it either way.
|
|
591
|
+
*
|
|
592
|
+
* @param lines - Array of output lines
|
|
593
|
+
* @param questionEndIndex - Index of the last line before options, or -1 if not found
|
|
594
|
+
* @param effectiveEnd - End index of non-trailing-empty lines
|
|
595
|
+
* @returns Approval target string, or undefined if no question line found
|
|
596
|
+
*/
|
|
597
|
+
function extractApprovalTarget(lines, questionEndIndex, effectiveEnd) {
|
|
598
|
+
if (questionEndIndex < 0) {
|
|
599
|
+
return undefined;
|
|
600
|
+
}
|
|
601
|
+
return joinApprovalTarget(lines, findApprovalContextStart(lines, questionEndIndex), effectiveEnd);
|
|
602
|
+
}
|
|
492
603
|
/**
|
|
493
604
|
* Build the final PromptDetectionResult for a multiple choice prompt.
|
|
494
605
|
* Maps collected options to the output format, checking each option for
|
|
@@ -496,14 +607,17 @@ function extractInstructionText(lines, questionEndIndex, effectiveEnd) {
|
|
|
496
607
|
*
|
|
497
608
|
* @param question - Extracted question text
|
|
498
609
|
* @param collectedOptions - Options collected during Pass 2 scanning
|
|
499
|
-
* @param
|
|
610
|
+
* @param context - Human-facing `instructionText` and machine-facing
|
|
611
|
+
* `approvalTarget` for the prompt block (Issue #1699 split them; an
|
|
612
|
+
* `undefined` here means neither, which is what the pre-#1699 callers meant)
|
|
500
613
|
* @param output - Original output text (used for rawContent truncation)
|
|
501
614
|
* @param truncateRawContentFn - Function to truncate raw content
|
|
502
615
|
* @param submitMode - Optional submit mode for the prompt (Issue #616)
|
|
503
616
|
* @param isAskUserQuestion - Whether this is a Claude Code v2.x AskUserQuestion picker (Issue #807)
|
|
504
617
|
* @returns PromptDetectionResult with isPrompt: true and multiple_choice data
|
|
505
618
|
*/
|
|
506
|
-
function buildMultipleChoiceResult(question, collectedOptions,
|
|
619
|
+
function buildMultipleChoiceResult(question, collectedOptions, context, output, truncateRawContentFn, submitMode, isAskUserQuestion) {
|
|
620
|
+
const { instructionText, approvalTarget } = context ?? {};
|
|
507
621
|
return {
|
|
508
622
|
isPrompt: true,
|
|
509
623
|
promptData: {
|
|
@@ -520,6 +634,7 @@ function buildMultipleChoiceResult(question, collectedOptions, instructionText,
|
|
|
520
634
|
}),
|
|
521
635
|
status: 'pending',
|
|
522
636
|
instructionText,
|
|
637
|
+
...(approvalTarget !== undefined ? { approvalTarget } : {}),
|
|
523
638
|
...(submitMode ? { submitMode } : {}),
|
|
524
639
|
...(isAskUserQuestion ? { isAskUserQuestion: true } : {}),
|
|
525
640
|
},
|
|
@@ -818,9 +933,12 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
|
|
|
818
933
|
}
|
|
819
934
|
const question = extractQuestionText(lines, questionEndIndex);
|
|
820
935
|
const instructionText = extractInstructionText(lines, questionEndIndex, effectiveEnd);
|
|
936
|
+
// Issue #1699: the same block, cut at the previous turn's boundary. Display
|
|
937
|
+
// keeps the wide window; deny patterns are judged against this one.
|
|
938
|
+
const approvalTarget = extractApprovalTarget(lines, questionEndIndex, effectiveEnd);
|
|
821
939
|
// Issue #616: Determine submitMode from confirmation footer (detected in single-pass above)
|
|
822
940
|
const submitMode = hasConfirmationFooter
|
|
823
941
|
? (hasNumberFooter ? 'answer_only' : 'answer_then_enter')
|
|
824
942
|
: undefined;
|
|
825
|
-
return buildMultipleChoiceResult(question, collectedOptions, instructionText, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
|
|
943
|
+
return buildMultipleChoiceResult(question, collectedOptions, { instructionText, approvalTarget }, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
|
|
826
944
|
}
|
|
@@ -78,6 +78,33 @@ const YES_NO_PATTERNS = [
|
|
|
78
78
|
// (yes/no) - no default
|
|
79
79
|
{ regex: /^(.+)\s+\(yes\/no\)\s*$/m },
|
|
80
80
|
];
|
|
81
|
+
/**
|
|
82
|
+
* Where in `lines` a regex match against the joined tail window started and ended.
|
|
83
|
+
*
|
|
84
|
+
* The yes/no patterns are matched against the last 20 lines joined into one
|
|
85
|
+
* string, so a match carries no line number of its own. Issue #1699 needs one:
|
|
86
|
+
* the approval target is bounded relative to the line the prompt is actually on,
|
|
87
|
+
* not relative to the bottom of the pane.
|
|
88
|
+
*/
|
|
89
|
+
function locateMatchLines(tailText, tailStart, match) {
|
|
90
|
+
const offset = match.index ?? 0;
|
|
91
|
+
const countNewlines = (text) => text.split('\n').length - 1;
|
|
92
|
+
const startLine = tailStart + countNewlines(tailText.slice(0, offset));
|
|
93
|
+
return { startLine, endLine: startLine + countNewlines(match[0]) };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* What a yes/no prompt is asking approval for (Issue #1699).
|
|
97
|
+
*
|
|
98
|
+
* Bounded on both sides, unlike `instructionText`: below at the prompt line
|
|
99
|
+
* itself (nothing printed after the question is part of what it approves) and
|
|
100
|
+
* above at the previous turn's boundary. A shell that echoes the command
|
|
101
|
+
* directly above its `(y/n)` — the case the deny patterns were written for —
|
|
102
|
+
* still lands inside; a command approved in an earlier turn does not.
|
|
103
|
+
*/
|
|
104
|
+
function yesNoApprovalTarget(lines, tailText, tailStart, match) {
|
|
105
|
+
const { startLine, endLine } = locateMatchLines(tailText, tailStart, match);
|
|
106
|
+
return (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(lines, (0, prompt_detect_multiple_choice_1.findApprovalContextStart)(lines, startLine), endLine + 1);
|
|
107
|
+
}
|
|
81
108
|
/**
|
|
82
109
|
* Creates a yes/no prompt detection result.
|
|
83
110
|
* Centralizes the repeated construction of yes_no PromptDetectionResult objects
|
|
@@ -86,10 +113,11 @@ const YES_NO_PATTERNS = [
|
|
|
86
113
|
* @param question - The question text
|
|
87
114
|
* @param cleanContent - The clean content string
|
|
88
115
|
* @param rawContent - The raw content string (last 20 lines, trimmed)
|
|
116
|
+
* @param approvalTarget - Issue #1699 deny-match surface for this prompt
|
|
89
117
|
* @param defaultOption - Optional default option ('yes' or 'no')
|
|
90
118
|
* @returns PromptDetectionResult with isPrompt: true and yes_no prompt data
|
|
91
119
|
*/
|
|
92
|
-
function yesNoPromptResult(question, cleanContent, rawContent, defaultOption) {
|
|
120
|
+
function yesNoPromptResult(question, cleanContent, rawContent, approvalTarget, defaultOption) {
|
|
93
121
|
return {
|
|
94
122
|
isPrompt: true,
|
|
95
123
|
promptData: {
|
|
@@ -98,7 +126,12 @@ function yesNoPromptResult(question, cleanContent, rawContent, defaultOption) {
|
|
|
98
126
|
options: ['yes', 'no'],
|
|
99
127
|
status: 'pending',
|
|
100
128
|
...(defaultOption !== undefined && { defaultOption }),
|
|
129
|
+
// Issue #235: the wide window, for the human reading PromptPanel.
|
|
101
130
|
instructionText: rawContent,
|
|
131
|
+
// Issue #1699: the narrow one, for machine judgement. Keeping the two
|
|
132
|
+
// apart is the whole fix — the wide window is a scrollback view and a
|
|
133
|
+
// deny pattern matched against it fires on turns that are already done.
|
|
134
|
+
...(approvalTarget !== undefined && { approvalTarget }),
|
|
102
135
|
},
|
|
103
136
|
cleanContent,
|
|
104
137
|
rawContent,
|
|
@@ -148,6 +181,9 @@ function detectPrompt(output, options) {
|
|
|
148
181
|
lastOutputTail = tailForDedup;
|
|
149
182
|
// [SF-003] [MF-S2-001] Expanded from 10 to 20 lines for rawContent coverage
|
|
150
183
|
const lastLines = lines.slice(-20).join('\n');
|
|
184
|
+
// Absolute index of lastLines[0] in `lines`, so a match inside the joined tail
|
|
185
|
+
// can be mapped back to a line number (Issue #1699).
|
|
186
|
+
const tailStart = Math.max(0, lines.length - 20);
|
|
151
187
|
// Pattern 0: Multiple choice (numbered options with indicator)
|
|
152
188
|
// Example:
|
|
153
189
|
// Do you want to proceed?
|
|
@@ -172,7 +208,7 @@ function detectPrompt(output, options) {
|
|
|
172
208
|
const match = lastLines.match(pattern.regex);
|
|
173
209
|
if (match) {
|
|
174
210
|
const question = match[1].trim();
|
|
175
|
-
return yesNoPromptResult(question, question, trimmedLastLines, pattern.defaultOption);
|
|
211
|
+
return yesNoPromptResult(question, question, trimmedLastLines, yesNoApprovalTarget(lines, lastLines, tailStart, match), pattern.defaultOption);
|
|
176
212
|
}
|
|
177
213
|
}
|
|
178
214
|
// Pattern 5: Approve?
|
|
@@ -183,7 +219,7 @@ function detectPrompt(output, options) {
|
|
|
183
219
|
const content = approveMatch[1].trim();
|
|
184
220
|
// If there's content before "Approve?", include it in the question
|
|
185
221
|
const question = content ? `${content} Approve?` : 'Approve?';
|
|
186
|
-
return yesNoPromptResult(question, content || 'Approve?', trimmedLastLines);
|
|
222
|
+
return yesNoPromptResult(question, content || 'Approve?', trimmedLastLines, yesNoApprovalTarget(lines, lastLines, tailStart, approveMatch));
|
|
187
223
|
}
|
|
188
224
|
// No prompt detected
|
|
189
225
|
// D2-005: Suppress duplicate complete log
|
|
@@ -59,14 +59,23 @@ function resolveBaseAnswer(promptData) {
|
|
|
59
59
|
/**
|
|
60
60
|
* Every piece of prompt text a deny pattern is matched against.
|
|
61
61
|
*
|
|
62
|
-
* `
|
|
63
|
-
*
|
|
64
|
-
*
|
|
62
|
+
* `approvalTarget` is included because that is where the dangerous part usually
|
|
63
|
+
* is — Claude's permission prompts put the command being approved in the lines
|
|
64
|
+
* above the question, not in the question itself.
|
|
65
|
+
*
|
|
66
|
+
* Issue #1699: it used to be `instructionText` that was included here, and that
|
|
67
|
+
* was the bug. `instructionText` is a scrollback window sized for a human to
|
|
68
|
+
* read, so a `rm -rf` approved several turns earlier stayed inside it and went
|
|
69
|
+
* on matching — suppressing every later prompt, including edits that had
|
|
70
|
+
* nothing to do with it, until the line scrolled off the pane. `approvalTarget`
|
|
71
|
+
* is the same block bounded at the previous turn, so what is judged here is
|
|
72
|
+
* what *this* prompt is asking for. Prompts detected before the field existed
|
|
73
|
+
* (an old row replayed from the database) simply match on question and options.
|
|
65
74
|
*/
|
|
66
75
|
function collectDenyMatchTexts(promptData) {
|
|
67
76
|
const texts = [promptData.question];
|
|
68
|
-
if (promptData.
|
|
69
|
-
texts.push(promptData.
|
|
77
|
+
if (promptData.approvalTarget) {
|
|
78
|
+
texts.push(promptData.approvalTarget);
|
|
70
79
|
}
|
|
71
80
|
if (promptData.type === 'multiple_choice') {
|
|
72
81
|
for (const option of promptData.options) {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory record of the last Auto-Yes answer withheld by a contract policy
|
|
4
|
+
* (Issue #1684).
|
|
5
|
+
*
|
|
6
|
+
* Until now a policy suppression (Issue #1547) was visible only in the server
|
|
7
|
+
* log (`poller:auto-yes-suppressed-by-policy`), so an unattended pipeline that
|
|
8
|
+
* stalled on a suppressed prompt looked identical to one that simply had no
|
|
9
|
+
* answer. This module keeps the last suppression per session so
|
|
10
|
+
* `buildCurrentOutput` can publish it and `commandmate capture --json` can show
|
|
11
|
+
* *why* the worker is waiting.
|
|
12
|
+
*
|
|
13
|
+
* Exposure only: nothing reads this to make a decision. The poller keeps
|
|
14
|
+
* re-evaluating a suppressed prompt every poll (the duplicate guard only
|
|
15
|
+
* remembers *answered* prompts), so while the prompt stays on screen the record
|
|
16
|
+
* is refreshed and `at` stays current; consumers combine it with
|
|
17
|
+
* `isPromptWaiting` to tell an active suppression from a historical one.
|
|
18
|
+
*
|
|
19
|
+
* In-memory and not in SQLite for the same reason `agent-event-state` is: the
|
|
20
|
+
* record describes a prompt on a live tmux session, and a session does not
|
|
21
|
+
* survive a server restart for the record to still be about.
|
|
22
|
+
*
|
|
23
|
+
* @module lib/polling/auto-yes-suppression-state
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.recordPolicySuppression = recordPolicySuppression;
|
|
27
|
+
exports.getLastPolicySuppression = getLastPolicySuppression;
|
|
28
|
+
exports.clearPolicySuppressions = clearPolicySuppressions;
|
|
29
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
30
|
+
/** compositeKey -> the most recent policy suppression for that session. */
|
|
31
|
+
const lastPolicySuppressions = new Map();
|
|
32
|
+
/**
|
|
33
|
+
* Record that the policy withheld an answer for `instanceId`'s current prompt.
|
|
34
|
+
*
|
|
35
|
+
* @param at - Epoch ms; defaults to now. Overridable so tests are deterministic.
|
|
36
|
+
*/
|
|
37
|
+
function recordPolicySuppression(worktreeId, cliToolId, instanceId, suppression, at = Date.now()) {
|
|
38
|
+
lastPolicySuppressions.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), {
|
|
39
|
+
...suppression,
|
|
40
|
+
at,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @returns The last policy suppression for this session, or null when the
|
|
45
|
+
* policy has never withheld an answer — the ordinary case for a session
|
|
46
|
+
* running without a contract.
|
|
47
|
+
*/
|
|
48
|
+
function getLastPolicySuppression(worktreeId, cliToolId, instanceId) {
|
|
49
|
+
return lastPolicySuppressions.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
50
|
+
}
|
|
51
|
+
/** Drop every recorded suppression. Test seam. */
|
|
52
|
+
function clearPolicySuppressions() {
|
|
53
|
+
lastPolicySuppressions.clear();
|
|
54
|
+
}
|
|
@@ -14,6 +14,7 @@ const manager_1 = require("../../lib/cli-tools/manager");
|
|
|
14
14
|
const cli_session_1 = require("../../lib/session/cli-session");
|
|
15
15
|
const status_detector_1 = require("../../lib/detection/status-detector");
|
|
16
16
|
const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
|
|
17
|
+
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
17
18
|
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
18
19
|
const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
|
|
19
20
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
@@ -101,6 +102,7 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
|
|
|
101
102
|
enabled: autoYesState?.enabled ?? false,
|
|
102
103
|
expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
|
|
103
104
|
stopReason: autoYesState?.stopReason,
|
|
105
|
+
lastSuppression: (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId),
|
|
104
106
|
},
|
|
105
107
|
isSelectionListActive,
|
|
106
108
|
isPagerActive,
|
|
@@ -47,6 +47,8 @@ exports.inspectSkillDestination = inspectSkillDestination;
|
|
|
47
47
|
exports.hasCommittedSkillPayload = hasCommittedSkillPayload;
|
|
48
48
|
exports.writeSkillPayloadFile = writeSkillPayloadFile;
|
|
49
49
|
exports.applySkillInstall = applySkillInstall;
|
|
50
|
+
exports.directoriesForSkillPayload = directoriesForSkillPayload;
|
|
51
|
+
exports.stageSkillRootPayload = stageSkillRootPayload;
|
|
50
52
|
exports.completeSecondarySkillInstallRoots = completeSecondarySkillInstallRoots;
|
|
51
53
|
exports.cleanupSkillInstallStaging = cleanupSkillInstallStaging;
|
|
52
54
|
const fs_1 = require("fs");
|
|
@@ -397,7 +399,7 @@ function applySkillInstall(input) {
|
|
|
397
399
|
}
|
|
398
400
|
return { relativePath: file.path, bytes, executable: file.executable };
|
|
399
401
|
});
|
|
400
|
-
const directories =
|
|
402
|
+
const directories = directoriesForSkillPayload(input.snapshot.files.map((f) => f.path), input.snapshot.directories);
|
|
401
403
|
// Every destination is proven safe and absent *before* the primary commits, so
|
|
402
404
|
// a secondary that is already blocked cannot leave a committed primary behind.
|
|
403
405
|
for (const prefix of rootPrefixes) {
|
|
@@ -463,7 +465,7 @@ function applySkillInstall(input) {
|
|
|
463
465
|
};
|
|
464
466
|
}
|
|
465
467
|
/** Sorted set of directories a payload implies, plus any the package declared. */
|
|
466
|
-
function
|
|
468
|
+
function directoriesForSkillPayload(filePaths, declared = []) {
|
|
467
469
|
const directories = new Set(declared);
|
|
468
470
|
for (const filePath of filePaths) {
|
|
469
471
|
const parents = filePath.split('/').slice(0, -1);
|
|
@@ -476,30 +478,29 @@ function directoriesFor(filePaths, declared = []) {
|
|
|
476
478
|
return [...directories].sort();
|
|
477
479
|
}
|
|
478
480
|
/**
|
|
479
|
-
* Stage the verified payload
|
|
481
|
+
* Stage the verified payload for one root without publishing it (#1244).
|
|
480
482
|
*
|
|
481
|
-
* The
|
|
482
|
-
*
|
|
483
|
-
*
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
*
|
|
483
|
+
* The staging half of {@link stageAndCommitSkillRoot}, exported so update can
|
|
484
|
+
* reuse the exact write path — exclusive no-follow writes, tree-hash gate,
|
|
485
|
+
* same-filesystem check — and supply its own rename sequence. On any failure the
|
|
486
|
+
* staging directory is removed and {@link SkillInstallError} is thrown; the
|
|
487
|
+
* destination is never touched. The caller owns the returned directory: it must
|
|
488
|
+
* either rename it into place or remove it.
|
|
489
|
+
*
|
|
490
|
+
* @internal Shared between install and update apply; not a public API.
|
|
487
491
|
*/
|
|
488
|
-
function
|
|
492
|
+
function stageSkillRootPayload(input) {
|
|
493
|
+
if (!exports.SKILL_INSTALL_OPERATION_ID_PATTERN.test(input.stagingName)) {
|
|
494
|
+
fail(exports.SkillInstallErrorCode.STAGING_IO, { reason: 'staging-name' });
|
|
495
|
+
}
|
|
489
496
|
const installRootAbs = resolveSkillInstallTargetFor(input.worktreePath, input.rootPrefix, input.skillId);
|
|
490
497
|
assertAncestorsAreRealDirectories(input.worktreeRealPath, input.worktreePath, input.rootPrefix);
|
|
491
|
-
const destinationBefore = inspectSkillDestination(installRootAbs);
|
|
492
|
-
if (destinationBefore.present) {
|
|
493
|
-
fail(destinationBefore.managed
|
|
494
|
-
? exports.SkillInstallErrorCode.DESTINATION_EXISTS
|
|
495
|
-
: exports.SkillInstallErrorCode.DESTINATION_UNMANAGED, destinationBefore.version ? { version: destinationBefore.version } : undefined);
|
|
496
|
-
}
|
|
497
498
|
const stagingRoot = (0, operation_store_1.getSkillInstallStagingRoot)(input.worktreePath, input.rootPrefix);
|
|
498
499
|
makeDirectory(path_1.default.dirname(stagingRoot), 0o755, true);
|
|
499
500
|
makeDirectory(stagingRoot, exports.SKILL_INSTALL_DIR_MODE, true);
|
|
500
501
|
// Not recursive: a staging directory that already exists means another
|
|
501
|
-
// operation is using this
|
|
502
|
-
const stagingDir = path_1.default.join(stagingRoot, input.
|
|
502
|
+
// operation is using this name, and silently adopting it would merge two writes.
|
|
503
|
+
const stagingDir = path_1.default.join(stagingRoot, input.stagingName);
|
|
503
504
|
makeDirectory(stagingDir, exports.SKILL_INSTALL_DIR_MODE, false);
|
|
504
505
|
try {
|
|
505
506
|
for (const directory of input.directories) {
|
|
@@ -520,6 +521,45 @@ function stageAndCommitSkillRoot(input) {
|
|
|
520
521
|
fail(exports.SkillInstallErrorCode.PAYLOAD_MISMATCH, { reason: 'tree-hash' });
|
|
521
522
|
}
|
|
522
523
|
assertSameFilesystem(stagingDir, path_1.default.dirname(installRootAbs));
|
|
524
|
+
}
|
|
525
|
+
catch (error) {
|
|
526
|
+
(0, fs_1.rmSync)(stagingDir, { recursive: true, force: true });
|
|
527
|
+
pruneStagingRoot(stagingRoot);
|
|
528
|
+
throw error;
|
|
529
|
+
}
|
|
530
|
+
return { stagingDir, stagingRoot, installRootAbs };
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Stage the verified payload into one root and atomically publish it (#1460).
|
|
534
|
+
*
|
|
535
|
+
* The single-root commit #1235 built, lifted to take the root prefix as a
|
|
536
|
+
* parameter: staging lives under *that* root's reserved namespace so the rename
|
|
537
|
+
* stays on one filesystem, and every check — ancestor lstat walk, exclusive
|
|
538
|
+
* no-follow writes, tree-hash gate, destination-absent, same-filesystem — is
|
|
539
|
+
* applied per root. Throws {@link SkillInstallError} on any failure, having
|
|
540
|
+
* removed its own staging; the destination is untouched unless the rename ran.
|
|
541
|
+
*/
|
|
542
|
+
function stageAndCommitSkillRoot(input) {
|
|
543
|
+
const installRootAbs = resolveSkillInstallTargetFor(input.worktreePath, input.rootPrefix, input.skillId);
|
|
544
|
+
assertAncestorsAreRealDirectories(input.worktreeRealPath, input.worktreePath, input.rootPrefix);
|
|
545
|
+
const destinationBefore = inspectSkillDestination(installRootAbs);
|
|
546
|
+
if (destinationBefore.present) {
|
|
547
|
+
fail(destinationBefore.managed
|
|
548
|
+
? exports.SkillInstallErrorCode.DESTINATION_EXISTS
|
|
549
|
+
: exports.SkillInstallErrorCode.DESTINATION_UNMANAGED, destinationBefore.version ? { version: destinationBefore.version } : undefined);
|
|
550
|
+
}
|
|
551
|
+
const staged = stageSkillRootPayload({
|
|
552
|
+
worktreePath: input.worktreePath,
|
|
553
|
+
worktreeRealPath: input.worktreeRealPath,
|
|
554
|
+
rootPrefix: input.rootPrefix,
|
|
555
|
+
skillId: input.skillId,
|
|
556
|
+
stagingName: input.operationId,
|
|
557
|
+
payload: input.payload,
|
|
558
|
+
directories: input.directories,
|
|
559
|
+
receiptBytes: input.receiptBytes,
|
|
560
|
+
plannedTreeHash: input.plannedTreeHash,
|
|
561
|
+
});
|
|
562
|
+
try {
|
|
523
563
|
// Re-checked immediately before the rename rather than only at entry: the
|
|
524
564
|
// exclusive lock keeps CommandMate out, but nothing keeps the user's own
|
|
525
565
|
// editor from creating this directory while the payload was being staged.
|
|
@@ -531,18 +571,18 @@ function stageAndCommitSkillRoot(input) {
|
|
|
531
571
|
: exports.SkillInstallErrorCode.DESTINATION_UNMANAGED);
|
|
532
572
|
}
|
|
533
573
|
try {
|
|
534
|
-
(0, fs_1.renameSync)(stagingDir, installRootAbs);
|
|
574
|
+
(0, fs_1.renameSync)(staged.stagingDir, installRootAbs);
|
|
535
575
|
}
|
|
536
576
|
catch {
|
|
537
577
|
fail(exports.SkillInstallErrorCode.COMMIT_FAILED, { reason: 'rename' });
|
|
538
578
|
}
|
|
539
579
|
}
|
|
540
580
|
catch (error) {
|
|
541
|
-
(0, fs_1.rmSync)(stagingDir, { recursive: true, force: true });
|
|
542
|
-
pruneStagingRoot(stagingRoot);
|
|
581
|
+
(0, fs_1.rmSync)(staged.stagingDir, { recursive: true, force: true });
|
|
582
|
+
pruneStagingRoot(staged.stagingRoot);
|
|
543
583
|
throw error;
|
|
544
584
|
}
|
|
545
|
-
pruneStagingRoot(stagingRoot);
|
|
585
|
+
pruneStagingRoot(staged.stagingRoot);
|
|
546
586
|
}
|
|
547
587
|
/**
|
|
548
588
|
* Converge a committed install's secondary roots forward from the primary (#1460).
|
|
@@ -573,7 +613,7 @@ function completeSecondarySkillInstallRoots(worktreePath, worktreeRealPath, skil
|
|
|
573
613
|
}
|
|
574
614
|
return { relativePath: file.path, bytes, executable: file.executable };
|
|
575
615
|
});
|
|
576
|
-
const directories =
|
|
616
|
+
const directories = directoriesForSkillPayload(receipt.files.map((file) => file.path));
|
|
577
617
|
const plannedTreeHash = (0, preview_diff_1.computeSkillTreeHash)([
|
|
578
618
|
...receipt.files.map((file) => ({
|
|
579
619
|
path: file.path,
|
|
@@ -61,11 +61,10 @@ const SELECT_COLUMNS = `
|
|
|
61
61
|
* The journal already holds the actor, target, source and typed error.
|
|
62
62
|
*
|
|
63
63
|
* The version transition (#1248) is derived from the journal rather than passed
|
|
64
|
-
* in, because
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* (#1243/#1244), and whoever adds one has to supply the replaced version here.
|
|
64
|
+
* in, because the journal fully determines it: an install ends at its target
|
|
65
|
+
* version and starts nowhere, an uninstall starts at the version it removes and
|
|
66
|
+
* ends nowhere, and an update (#1244) records the version it replaces on its
|
|
67
|
+
* own target (`fromVersion`) precisely so this derivation stays total.
|
|
69
68
|
*/
|
|
70
69
|
function buildSkillOperationAuditInput(entry, result, recordedAt) {
|
|
71
70
|
const isUninstall = entry.operation === 'uninstall';
|
|
@@ -81,7 +80,7 @@ function buildSkillOperationAuditInput(entry, result, recordedAt) {
|
|
|
81
80
|
worktreeId: entry.target.worktreeId,
|
|
82
81
|
skillId: entry.target.skillId,
|
|
83
82
|
skillVersion: entry.target.version,
|
|
84
|
-
fromVersion: isUninstall ? entry.target.version : null,
|
|
83
|
+
fromVersion: isUninstall ? entry.target.version : (entry.target.fromVersion ?? null),
|
|
85
84
|
toVersion: isUninstall ? null : entry.target.version,
|
|
86
85
|
sourceOrigin: entry.source?.origin ?? null,
|
|
87
86
|
sourceRepository: entry.source?.repository ?? null,
|
|
@@ -32,6 +32,7 @@ const integrity_1 = require("../../lib/skills/integrity");
|
|
|
32
32
|
const install_plan_1 = require("../../lib/skills/install-plan");
|
|
33
33
|
const install_apply_1 = require("../../lib/skills/install-apply");
|
|
34
34
|
const uninstall_apply_1 = require("../../lib/skills/uninstall-apply");
|
|
35
|
+
const updater_1 = require("../../lib/skills/updater");
|
|
35
36
|
const installed_state_1 = require("../../lib/skills/installed-state");
|
|
36
37
|
const operation_audit_1 = require("../../lib/skills/operation-audit");
|
|
37
38
|
const operation_journal_1 = require("../../lib/skills/operation-journal");
|
|
@@ -65,6 +66,19 @@ function buildSkillReconcilerPorts(db, options = {}) {
|
|
|
65
66
|
// and an uninstall's payload is by definition no longer present.
|
|
66
67
|
return isRemovalOperation(entry);
|
|
67
68
|
}
|
|
69
|
+
if (entry.operation === 'update') {
|
|
70
|
+
// An interrupted two-rename switch can leave the root empty (old in
|
|
71
|
+
// the aside directory, or a verified staged payload unpublished), so
|
|
72
|
+
// the probe first converges the root to old-complete or new-complete
|
|
73
|
+
// (#1244) and only then answers whether the *new* receipt landed. The
|
|
74
|
+
// pre-existing old receipt is why the install probe would misread this
|
|
75
|
+
// entry: with no recorded digest it accepts any parseable receipt.
|
|
76
|
+
return (0, updater_1.reconcileSkillUpdateTarget)(worktreePath, entry.target.skillId, {
|
|
77
|
+
operationId: entry.operationId,
|
|
78
|
+
toVersion: entry.target.version,
|
|
79
|
+
receiptDigest: entry.receiptDigest,
|
|
80
|
+
}).committed;
|
|
81
|
+
}
|
|
68
82
|
return isRemovalOperation(entry)
|
|
69
83
|
? (0, uninstall_apply_1.hasRemovedSkillPayload)(worktreePath, entry.target.skillId, entry.receiptDigest)
|
|
70
84
|
: (0, install_apply_1.hasCommittedSkillPayload)(worktreePath, entry.target.skillId, entry.receiptDigest);
|
|
@@ -80,12 +94,19 @@ function buildSkillReconcilerPorts(db, options = {}) {
|
|
|
80
94
|
if (worktreePath === null) {
|
|
81
95
|
throw new Error('worktree path is unavailable for reindex');
|
|
82
96
|
}
|
|
83
|
-
// Converge any secondary root
|
|
84
|
-
//
|
|
85
|
-
// (#
|
|
86
|
-
//
|
|
97
|
+
// Converge any secondary root the operation did not reach, forward from
|
|
98
|
+
// the committed primary (#1460). An install only fills absent roots; an
|
|
99
|
+
// update (#1244) additionally switches a secondary that still holds the
|
|
100
|
+
// provably clean previous version. Best-effort: a root blocked by a user
|
|
101
|
+
// file must not stall the index write, which is what actually makes the
|
|
102
|
+
// operation visible.
|
|
87
103
|
try {
|
|
88
|
-
(
|
|
104
|
+
if (entry.operation === 'update') {
|
|
105
|
+
(0, updater_1.completeSecondarySkillUpdateRoots)(worktreePath, (0, fs_1.realpathSync)(worktreePath), entry.target.skillId);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
(0, install_apply_1.completeSecondarySkillInstallRoots)(worktreePath, (0, fs_1.realpathSync)(worktreePath), entry.target.skillId);
|
|
109
|
+
}
|
|
89
110
|
}
|
|
90
111
|
catch (error) {
|
|
91
112
|
reconcileLogger.warn('skill-secondary-root-convergence-failed', {
|