commandmate 0.26.1 → 0.27.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 +435 -407
- package/.next/app-path-routes-manifest.json +30 -26
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +6 -6
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +24 -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 +2 -2
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -0
- package/.next/server/app/api/capabilities/route.js.nft.json +1 -0
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -0
- 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.js +2 -2
- package/.next/server/app/api/fs/browse/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +19 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/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.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +2 -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]/env/route.js +2 -0
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -0
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.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.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]/resolve-target/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -0
- 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 -5
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -6
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 +3 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +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.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 +3 -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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -7
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +30 -26
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1068.js +3 -1
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1538.js +7 -0
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +3 -2
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2546.js +1 -1
- package/.next/server/chunks/2689.js +13 -0
- package/.next/server/chunks/2759.js +8 -0
- package/.next/server/chunks/2839.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3292.js +1 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3480.js +1 -17
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4423.js +1 -0
- package/.next/server/chunks/4444.js +22 -8
- package/.next/server/chunks/4565.js +3 -0
- package/.next/server/chunks/467.js +1 -0
- package/.next/server/chunks/4905.js +5 -0
- package/.next/server/chunks/5017.js +1 -0
- package/.next/server/chunks/5089.js +1 -0
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5220.js +1 -0
- package/.next/server/chunks/5354.js +1 -0
- package/.next/server/chunks/552.js +19 -0
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5998.js +3 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +11 -11
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/7472.js +1 -0
- package/.next/server/chunks/7506.js +1 -0
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/880.js +1 -1
- package/.next/server/chunks/8807.js +5 -5
- package/.next/server/chunks/9067.js +1 -1
- package/.next/server/chunks/9284.js +1 -0
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9508.js +1 -0
- package/.next/server/chunks/9938.js +1 -0
- 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/{2053-dfac2d49227cc942.js → 2053-c0e931eb4391baa1.js} +1 -1
- package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +1 -0
- package/.next/static/chunks/3922.0d2e64daf9f187da.js +1 -0
- package/.next/static/chunks/{5229-35f9acab97a553c5.js → 5229-1f5f19740a8d6c11.js} +1 -1
- package/.next/static/chunks/{6381-0e097c0286155883.js → 6381-b7250e8ca7a44c6c.js} +1 -1
- package/.next/static/chunks/{8649-f551b0010dba4986.js → 8521-c43994fb58501d13.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/chat/{page-439b35c9cb90dbe0.js → page-231df45127e876c2.js} +1 -1
- package/.next/static/chunks/app/login/{page-eefd515d8c37e5ee.js → page-adc51f0f7cbb7ac6.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/more/{page-889b7546a8a553dc.js → page-3266dfa945972649.js} +1 -1
- package/.next/static/chunks/app/{page-a8d04ac0e3e4c9fc.js → page-0305431f43195431.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/repositories/{page-f3c4d8839b1ca203.js → page-ae8fa55749976f79.js} +1 -1
- package/.next/static/chunks/app/review/{page-6dc88649fe88ac16.js → page-8f63aff862fee421.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-2c9ed9e969097688.js → page-4d5382b257077c14.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-19beef6121c4c982.js → page-aaf0bcb1dfb558b9.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-d5b9cef6d21fabda.js → page-dafc486410e839b7.js} +1 -1
- package/.next/static/chunks/app/skills/{page-06ef637e07dd9377.js → page-9e3c91da31514893.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-5fed3984fafcd910.js → page-90f96977c741bbf8.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e4f28966b4fc0ce1.js +1 -0
- package/.next/static/chunks/{webpack-9d892a9ff07c289d.js → webpack-6a9668cf54a26eba.js} +1 -1
- package/.next/static/css/928e5a8830fbf997.css +1 -0
- package/.next/static/t0BoV4H46ZgKmTjSi7GIz/_buildManifest.js +1 -0
- package/.next/trace +13 -12
- package/.next/types/app/api/capabilities/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/clear-composer/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/env/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/resolve-target/route.ts +347 -0
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +40 -2
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +28 -13
- package/dist/cli/commands/instances.d.ts +30 -18
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +32 -36
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +73 -1
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +18 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +21 -15
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +38 -0
- package/dist/cli/commands/wait.d.ts +26 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +390 -43
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +16 -0
- package/dist/cli/config/cli-tool-ids.d.ts +11 -0
- package/dist/cli/config/cli-tool-ids.d.ts.map +1 -1
- package/dist/cli/config/cli-tool-ids.js +12 -1
- package/dist/cli/types/api-responses.d.ts +443 -2
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +18 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +22 -0
- package/dist/cli/utils/server-capabilities.d.ts +56 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -0
- package/dist/cli/utils/server-capabilities.js +166 -0
- package/dist/cli/utils/session-target.d.ts +70 -0
- package/dist/cli/utils/session-target.d.ts.map +1 -0
- package/dist/cli/utils/session-target.js +118 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +79 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/copilot-executable.js +155 -0
- package/dist/lib/cli-tools/types.d.ts +61 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +41 -0
- package/dist/lib/detection/ansi.d.ts +2 -1
- package/dist/lib/detection/ansi.d.ts.map +1 -1
- package/dist/lib/detection/ansi.js +3 -2
- package/dist/lib/detection/tools/verified-against.d.ts +84 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -0
- package/dist/lib/detection/tools/verified-against.js +88 -0
- package/dist/lib/detection/version-probes.d.ts +207 -0
- package/dist/lib/detection/version-probes.d.ts.map +1 -0
- package/dist/lib/detection/version-probes.js +290 -0
- package/dist/lib/security/env-sanitizer.d.ts +198 -0
- package/dist/lib/security/env-sanitizer.d.ts.map +1 -0
- package/dist/lib/security/env-sanitizer.js +232 -0
- package/dist/server/locales/en/notifications.json +17 -6
- package/dist/server/locales/ja/notifications.json +17 -6
- package/dist/server/src/config/activity-bar-config.js +4 -0
- package/dist/server/src/config/cli-tool-timing-config.js +59 -2
- package/dist/server/src/config/copilot-constants.js +11 -1
- package/dist/server/src/config/detection-evidence-config.js +129 -0
- package/dist/server/src/config/schedule-config.js +56 -7
- package/dist/server/src/config/tmux-pane-config.js +18 -1
- package/dist/server/src/lib/auto-yes-poller.js +36 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +4 -2
- package/dist/server/src/lib/cli-tools/base.js +131 -10
- package/dist/server/src/lib/cli-tools/capture-spec.js +56 -0
- package/dist/server/src/lib/cli-tools/claude.js +1 -1
- package/dist/server/src/lib/cli-tools/codex.js +6 -2
- package/dist/server/src/lib/cli-tools/composer-spec.js +96 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +155 -0
- package/dist/server/src/lib/cli-tools/copilot.js +307 -81
- package/dist/server/src/lib/cli-tools/gemini.js +8 -6
- package/dist/server/src/lib/cli-tools/graceful-exit.js +181 -0
- package/dist/server/src/lib/cli-tools/index.js +11 -1
- package/dist/server/src/lib/cli-tools/manager.js +56 -4
- package/dist/server/src/lib/cli-tools/opencode-config.js +195 -24
- package/dist/server/src/lib/cli-tools/opencode.js +233 -30
- package/dist/server/src/lib/cli-tools/session-name.js +57 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +213 -30
- package/dist/server/src/lib/cli-tools/types.js +41 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +7 -3
- package/dist/server/src/lib/cmate-cli-tool-parser.js +29 -1
- package/dist/server/src/lib/cmate-parser.js +12 -4
- package/dist/server/src/lib/db/db.js +5 -1
- package/dist/server/src/lib/db/migrations/v41-push-subscriptions.js +11 -0
- package/dist/server/src/lib/db/push-subscriptions-db.js +60 -3
- package/dist/server/src/lib/detection/ansi.js +3 -2
- package/dist/server/src/lib/detection/cli-patterns.js +901 -67
- package/dist/server/src/lib/detection/composer-text.js +455 -0
- package/dist/server/src/lib/detection/idle-evidence-observation.js +51 -0
- package/dist/server/src/lib/detection/model-info-extractor.js +195 -4
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
- package/dist/server/src/lib/detection/status-detector.js +76 -675
- package/dist/server/src/lib/detection/status-reason.js +57 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +75 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +144 -0
- package/dist/server/src/lib/detection/tools/claude/patterns.js +98 -0
- package/dist/server/src/lib/detection/tools/claude/prompt.js +124 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +343 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +104 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +185 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +89 -0
- package/dist/server/src/lib/detection/tools/dialog-block.js +159 -0
- package/dist/server/src/lib/detection/tools/frame.js +47 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +242 -0
- package/dist/server/src/lib/detection/tools/opencode/prompt.js +85 -0
- package/dist/server/src/lib/detection/tools/registry.js +58 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +202 -0
- package/dist/server/src/lib/detection/tools/types.js +34 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +88 -0
- package/dist/server/src/lib/hooks/agent-event-types.js +19 -1
- package/dist/server/src/lib/hooks/permission-adjudication.js +160 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +81 -14
- package/dist/server/src/lib/hooks/permission-decision-state.js +62 -0
- package/dist/server/src/lib/hooks/permission-request-payload.js +18 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +20 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +403 -50
- package/dist/server/src/lib/hooks/sources/copilot/source.js +40 -4
- package/dist/server/src/lib/hooks/sources/define-source.js +23 -1
- package/dist/server/src/lib/hooks/sources/event-mapper.js +29 -1
- package/dist/server/src/lib/hooks/sources/gemini/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/index.js +3 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +96 -1
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +12 -0
- package/dist/server/src/lib/hooks/sources/opencode/client.js +295 -32
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +120 -42
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +95 -3
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +70 -9
- package/dist/server/src/lib/hooks/sources/opencode/runtime.js +62 -4
- package/dist/server/src/lib/hooks/sources/opencode/source.js +54 -3
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +254 -26
- package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +119 -4
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +40 -2
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +67 -0
- package/dist/server/src/lib/hooks/tool-input-normalization.js +157 -0
- package/dist/server/src/lib/job-executor.js +16 -4
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +184 -0
- package/dist/server/src/lib/polling/response-checker.js +243 -26
- package/dist/server/src/lib/push/failure-episode-state.js +127 -0
- package/dist/server/src/lib/push/failure-push-notifier.js +344 -0
- package/dist/server/src/lib/push/index.js +35 -1
- package/dist/server/src/lib/push/prompt-card-state.js +93 -0
- package/dist/server/src/lib/push/prompt-push-gate.js +130 -0
- package/dist/server/src/lib/push/push-sender.js +82 -7
- package/dist/server/src/lib/push/resolution-push-notifier.js +193 -0
- package/dist/server/src/lib/push/waiting-push-notifier.js +42 -0
- package/dist/server/src/lib/response-cleaner.js +93 -20
- package/dist/server/src/lib/response-extractor.js +98 -5
- package/dist/server/src/lib/security/env-sanitizer.js +179 -5
- package/dist/server/src/lib/session/agent-event-state.js +1038 -189
- package/dist/server/src/lib/session/agent-session-lifecycle.js +8 -0
- package/dist/server/src/lib/session/claude-executor.js +23 -3
- package/dist/server/src/lib/session/claude-session.js +11 -1
- package/dist/server/src/lib/session/composer-clear.js +95 -0
- package/dist/server/src/lib/session/current-output-builder.js +267 -25
- package/dist/server/src/lib/session/provisional-turn.js +310 -0
- package/dist/server/src/lib/session/resolve-session-target.js +156 -0
- package/dist/server/src/lib/session/send-user-message.js +14 -18
- package/dist/server/src/lib/session/session-start-error.js +53 -1
- package/dist/server/src/lib/session/status-evidence.js +217 -0
- package/dist/server/src/lib/session/structured-prompt.js +46 -4
- package/dist/server/src/lib/session/waiting-episode-state.js +24 -0
- package/dist/server/src/lib/tmux/key-sequence.js +120 -0
- package/dist/server/src/lib/tmux/tmux.js +91 -19
- package/dist/server/src/lib/tui-accumulator.js +68 -1
- package/dist/server/src/lib/verification/gate-runner.js +84 -1
- package/dist/server/src/lib/ws-server.js +8 -5
- package/dist/server/src/types/cli-tool-contracts.js +75 -0
- package/dist/server/src/types/terminal-keys.js +37 -0
- package/dist/types/cli-tool-contracts.d.ts +235 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -0
- package/dist/types/cli-tool-contracts.js +75 -0
- package/package.json +3 -2
- package/public/sw.js +65 -2
- package/.next/server/chunks/1841.js +0 -1
- package/.next/server/chunks/233.js +0 -1
- package/.next/server/chunks/3022.js +0 -1
- package/.next/server/chunks/3270.js +0 -1
- package/.next/server/chunks/4455.js +0 -1
- package/.next/server/chunks/5959.js +0 -27
- package/.next/server/chunks/7458.js +0 -6
- package/.next/server/chunks/8730.js +0 -1
- package/.next/server/chunks/9058.js +0 -1
- package/.next/server/chunks/9687.js +0 -3
- package/.next/static/chunks/3898-ef488bfa804507d9.js +0 -1
- package/.next/static/chunks/9263.f2034ec525abcf72.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-fdfca039b7f5837e.js +0 -1
- package/.next/static/css/e865c4979a41aa03.css +0 -1
- package/.next/static/wyFLOpmKpr45BHZ4svYpE/_buildManifest.js +0 -1
- /package/.next/static/{wyFLOpmKpr45BHZ4svYpE → t0BoV4H46ZgKmTjSi7GIz}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The edge of an upstream-fault episode, and the one place it is observed
|
|
4
|
+
* (Issue #2000).
|
|
5
|
+
*
|
|
6
|
+
* ## Why an edge is needed at all
|
|
7
|
+
*
|
|
8
|
+
* `upstreamFault` is a **level**, not an event. `matchUpstreamFault` (#1839) is
|
|
9
|
+
* re-evaluated on every frame that is read, and the frame keeps the banner for
|
|
10
|
+
* as long as it is on screen — so "notify when a fault is visible" means
|
|
11
|
+
* "notify on every poll", which is the precise opposite of what Epic #2002 asks
|
|
12
|
+
* for. The signal has to be converted to an edge before it can ring a phone.
|
|
13
|
+
*
|
|
14
|
+
* ## Why not reuse `session/waiting-episode-state`
|
|
15
|
+
*
|
|
16
|
+
* #1786's store is the right *shape* and the wrong *store*. It is the single
|
|
17
|
+
* writer of the **waiting** edge, read by three surfaces (the status API, the
|
|
18
|
+
* WebSocket frame, the push notifier), and its episode identity is a boolean
|
|
19
|
+
* level per instance. An upstream fault differs on both counts:
|
|
20
|
+
*
|
|
21
|
+
* - its identity includes **which** fault is on the frame, because a session
|
|
22
|
+
* that goes from `retrying` to `limit-reached` has changed what the human
|
|
23
|
+
* has to do about it;
|
|
24
|
+
* - it has exactly one consumer (push), so nothing is gained by putting it on
|
|
25
|
+
* a shared seam, and `observeWaitingEdge`'s listener fan-out would have to
|
|
26
|
+
* grow a second event type to carry it.
|
|
27
|
+
*
|
|
28
|
+
* So this is a deliberate same-shape/second-store, and the shape is copied on
|
|
29
|
+
* purpose: one writer, `globalThis`-held (see the note below), a level in and
|
|
30
|
+
* an edge out, idempotent for an unchanged level.
|
|
31
|
+
*
|
|
32
|
+
* ## Why the edge alone is not enough: the cooldown
|
|
33
|
+
*
|
|
34
|
+
* The fault is judged on the **last 100 rows** of the pane, so a retry storm
|
|
35
|
+
* scrolls its own banner out of scope between polls. Measured shape of a 529
|
|
36
|
+
* storm (#1839): `API Error: Repeated 529 Overloaded errors …` followed by
|
|
37
|
+
* `Retrying in 34s · attempt 9/10`. Those match two different signatures
|
|
38
|
+
* (`overloaded` and `retrying`) and the agent keeps printing between them, so a
|
|
39
|
+
* pure open/close edge can legitimately fire many times for **one** incident —
|
|
40
|
+
* up to once per retry. That is a flood, and a flood is the thing this Epic
|
|
41
|
+
* exists to remove.
|
|
42
|
+
*
|
|
43
|
+
* The cooldown is therefore keyed on the **instance**, not on the fault id: the
|
|
44
|
+
* action a reader takes is the same for all four signatures ("go look at that
|
|
45
|
+
* session"), so telling them twice in ten minutes is not more informative, it
|
|
46
|
+
* is just louder. A genuinely separate incident later than
|
|
47
|
+
* {@link UPSTREAM_FAULT_COOLDOWN_MS} still rings.
|
|
48
|
+
*
|
|
49
|
+
* In-memory, like every other live-session state here: it describes a tmux pane
|
|
50
|
+
* and must not outlive the server that watched it.
|
|
51
|
+
*
|
|
52
|
+
* @module lib/push/failure-episode-state
|
|
53
|
+
*/
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.UPSTREAM_FAULT_COOLDOWN_MS = void 0;
|
|
56
|
+
exports.observeUpstreamFaultEdge = observeUpstreamFaultEdge;
|
|
57
|
+
exports.clearUpstreamFaultEpisodes = clearUpstreamFaultEpisodes;
|
|
58
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
59
|
+
/**
|
|
60
|
+
* How long after notifying about an upstream fault this instance stays quiet
|
|
61
|
+
* about upstream faults.
|
|
62
|
+
*
|
|
63
|
+
* 30 minutes is chosen against the two failure modes rather than against a
|
|
64
|
+
* cadence: shorter re-opens the retry-storm flood described above (a storm runs
|
|
65
|
+
* for minutes and re-matches throughout), and longer starts hiding incidents
|
|
66
|
+
* that really are new. An operator who wants the detail already has
|
|
67
|
+
* `capture --json`'s `upstreamFault` and the `[failure-push]` log lines; this
|
|
68
|
+
* bound only governs how often the *phone* is used.
|
|
69
|
+
*/
|
|
70
|
+
exports.UPSTREAM_FAULT_COOLDOWN_MS = 30 * 60_000;
|
|
71
|
+
const states = globalThis.__upstreamFaultPushState ??
|
|
72
|
+
(globalThis.__upstreamFaultPushState = new Map());
|
|
73
|
+
/**
|
|
74
|
+
* Record this frame's fault level and answer whether it is worth a phone.
|
|
75
|
+
*
|
|
76
|
+
* The single writer of this edge. Idempotent for an unchanged level: repeated
|
|
77
|
+
* frames carrying the same fault return `notify: false` with the episode's
|
|
78
|
+
* original `since`, so a caller may hand it every poll.
|
|
79
|
+
*
|
|
80
|
+
* Records the notification as it decides, exactly like `shouldSendWaitingPush`
|
|
81
|
+
* — so it must be called once per observation, and a caller that drops the
|
|
82
|
+
* notification afterwards has consumed the incident's one slot.
|
|
83
|
+
*/
|
|
84
|
+
function observeUpstreamFaultEdge({ worktreeId, cliToolId, instanceId, faultId, now = Date.now(), cooldownMs = exports.UPSTREAM_FAULT_COOLDOWN_MS, }) {
|
|
85
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
86
|
+
const state = states.get(key);
|
|
87
|
+
if (faultId === null) {
|
|
88
|
+
// The episode closes, but `lastNotifiedAt` is kept: it is what stops the
|
|
89
|
+
// banner scrolling out of the window and straight back in from ringing
|
|
90
|
+
// twice. A state with nothing left to remember is dropped so an idle server
|
|
91
|
+
// does not accumulate one entry per session it ever polled.
|
|
92
|
+
if (state !== undefined) {
|
|
93
|
+
if (state.lastNotifiedAt === null)
|
|
94
|
+
states.delete(key);
|
|
95
|
+
else
|
|
96
|
+
state.current = null;
|
|
97
|
+
}
|
|
98
|
+
return { notify: false, reason: 'no-fault', since: null };
|
|
99
|
+
}
|
|
100
|
+
if (state !== undefined && state.current !== null && state.current.faultId === faultId) {
|
|
101
|
+
return { notify: false, reason: 'same-episode', since: state.current.since };
|
|
102
|
+
}
|
|
103
|
+
const lastNotifiedAt = state?.lastNotifiedAt ?? null;
|
|
104
|
+
const episode = { faultId, since: now };
|
|
105
|
+
if (lastNotifiedAt !== null && now - lastNotifiedAt < cooldownMs) {
|
|
106
|
+
// The episode is still opened — the level has to be tracked either way, or
|
|
107
|
+
// the next poll would read this same fault as new again.
|
|
108
|
+
states.set(key, { current: episode, lastNotifiedAt });
|
|
109
|
+
return {
|
|
110
|
+
notify: false,
|
|
111
|
+
reason: 'cooldown',
|
|
112
|
+
since: now,
|
|
113
|
+
cooldownRemainingMs: cooldownMs - (now - lastNotifiedAt),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
states.set(key, { current: episode, lastNotifiedAt: now });
|
|
117
|
+
return { notify: true, reason: 'new-episode', since: now };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Drop every remembered fault. Test seam.
|
|
121
|
+
*
|
|
122
|
+
* CI runs with `fileParallelism: false`, so one process holds this map for the
|
|
123
|
+
* whole suite: a test that leaves a cooldown behind would mute the next file.
|
|
124
|
+
*/
|
|
125
|
+
function clearUpstreamFaultEpisodes() {
|
|
126
|
+
states.clear();
|
|
127
|
+
}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The one place a failure becomes a push notification (Issue #2000).
|
|
4
|
+
*
|
|
5
|
+
* Epic #2002 re-cut the notification axis from "what happened" to "do you have
|
|
6
|
+
* to act". Three failure signals already existed and none of them reached a
|
|
7
|
+
* phone; this module connects them, and it is the only module that decides
|
|
8
|
+
* whether a failure is worth ringing for:
|
|
9
|
+
*
|
|
10
|
+
* | signal | producer | shape |
|
|
11
|
+
* |---------------------|--------------------------------------------|--------|
|
|
12
|
+
* | verification failed | `lib/verification/gate-runner` | event |
|
|
13
|
+
* | upstream API fault | `lib/polling/response-checker` (#1839 match)| level |
|
|
14
|
+
* | session start failed| `lib/cli-tools/base` (all 7 tools, #2009) | event |
|
|
15
|
+
*
|
|
16
|
+
* The shape column is the whole design. An **event** fires once by construction
|
|
17
|
+
* — a run closes once, a start attempt throws once — so its only guard is the
|
|
18
|
+
* existing 30 s content window in `push-sender`. A **level** is re-read on every
|
|
19
|
+
* poll and needs an edge built for it before it can be notified at all; that is
|
|
20
|
+
* `failure-episode-state`, and its docblock carries the reasoning and the
|
|
21
|
+
* measurement.
|
|
22
|
+
*
|
|
23
|
+
* ## Every decision is logged with a reason code
|
|
24
|
+
*
|
|
25
|
+
* A notification that never arrived is indistinguishable from a broken notifier
|
|
26
|
+
* from the outside (`docs/design/discoverability-principle.md`). So each call
|
|
27
|
+
* ends in exactly one `failure-push-raised` or `failure-push-suppressed` line
|
|
28
|
+
* carrying `reason`, the worktree and the instance. The single exception is
|
|
29
|
+
* `no-fault` — a clean frame — which is the outcome of most polls of most
|
|
30
|
+
* sessions and would drown the log it exists to make readable.
|
|
31
|
+
*
|
|
32
|
+
* ## Why none of this goes through `prompt-push-gate`
|
|
33
|
+
*
|
|
34
|
+
* #1999 mutes prompts that Auto-Yes is about to answer. No such claim can be
|
|
35
|
+
* made about a failure: Auto-Yes answers dialogs, it does not fix a failing
|
|
36
|
+
* gate, restore an upstream API or start a session that refused to start.
|
|
37
|
+
* Muting failures during Auto-Yes would silence exactly the pipelines that got
|
|
38
|
+
* stuck. The flood risk Auto-Yes creates is handled where it actually lives —
|
|
39
|
+
* per-incident edges here, and the contract-task exclusion below.
|
|
40
|
+
*
|
|
41
|
+
* Everything here is advisory and must never throw into its caller: the
|
|
42
|
+
* producers are a poller, a verification runner and a session starter, none of
|
|
43
|
+
* which may fail because a phone could not be reached.
|
|
44
|
+
*
|
|
45
|
+
* @module lib/push/failure-push-notifier
|
|
46
|
+
*/
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.notifyVerificationFailurePush = notifyVerificationFailurePush;
|
|
49
|
+
exports.notifyUpstreamFaultPush = notifyUpstreamFaultPush;
|
|
50
|
+
exports.notifySessionStartFailurePush = notifySessionStartFailurePush;
|
|
51
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
52
|
+
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
53
|
+
const logger_1 = require("../../lib/logger");
|
|
54
|
+
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
55
|
+
const failure_episode_state_1 = require("./failure-episode-state");
|
|
56
|
+
const push_sender_1 = require("./push-sender");
|
|
57
|
+
const vapid_1 = require("./vapid");
|
|
58
|
+
const logger = (0, logger_1.createLogger)('push/failure-notifier');
|
|
59
|
+
/**
|
|
60
|
+
* The worktree's display name, for the notification title.
|
|
61
|
+
*
|
|
62
|
+
* Falls back to the id rather than dropping the notification, exactly as
|
|
63
|
+
* `waiting-push-notifier` does: a database that cannot answer is a reason to
|
|
64
|
+
* send a less readable title, not a reason to leave a failure unreported.
|
|
65
|
+
*/
|
|
66
|
+
function resolveWorktreeName(worktreeId) {
|
|
67
|
+
try {
|
|
68
|
+
return (0, worktree_db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId)?.name ?? worktreeId;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return worktreeId;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Fan one failure notification out, logging the decision. Never throws.
|
|
76
|
+
*
|
|
77
|
+
* Callers reach this only after their own edge/scope decision has said yes, so
|
|
78
|
+
* the only thing left to check here is whether push exists at all.
|
|
79
|
+
*/
|
|
80
|
+
async function raiseFailurePush(input) {
|
|
81
|
+
const context = {
|
|
82
|
+
worktreeId: input.worktreeId,
|
|
83
|
+
instanceId: input.instanceId,
|
|
84
|
+
failureReason: input.reason,
|
|
85
|
+
signature: input.signature,
|
|
86
|
+
...input.logContext,
|
|
87
|
+
};
|
|
88
|
+
if (!(0, vapid_1.isPushConfigured)()) {
|
|
89
|
+
logger.debug('failure-push-suppressed', {
|
|
90
|
+
...context,
|
|
91
|
+
reason: 'push-unconfigured',
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
logger.info('failure-push-raised', context);
|
|
96
|
+
try {
|
|
97
|
+
await (0, push_sender_1.notifyPushSubscribers)({
|
|
98
|
+
worktreeId: input.worktreeId,
|
|
99
|
+
worktreeName: resolveWorktreeName(input.worktreeId),
|
|
100
|
+
kind: 'failure',
|
|
101
|
+
agentName: input.instanceId,
|
|
102
|
+
instanceId: input.instanceId,
|
|
103
|
+
excerpt: input.excerpt,
|
|
104
|
+
failure: { reason: input.reason, signature: input.signature },
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// `notifyPushSubscribers` already contains its own failures; this is the
|
|
109
|
+
// belt for a producer bug (a malformed event) that would otherwise reach a
|
|
110
|
+
// poller's catch and be reported as "no response found".
|
|
111
|
+
logger.warn('failure-push-failed', {
|
|
112
|
+
...context,
|
|
113
|
+
error: error instanceof Error ? error.message : String(error),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Statuses that mean "your work was not shown to pass, and you have to do
|
|
119
|
+
* something about it".
|
|
120
|
+
*
|
|
121
|
+
* `not_started` is excluded because it is the work-evidence gate saying there
|
|
122
|
+
* was nothing to judge, and `cancelled` because somebody already knows. `error`
|
|
123
|
+
* IS included: an unusable `verify.yaml` or a runner that broke leaves the
|
|
124
|
+
* verdict just as absent as a red gate does, and the operator's next move is
|
|
125
|
+
* the same.
|
|
126
|
+
*/
|
|
127
|
+
const NOTIFIABLE_RUN_STATUSES = ['failed', 'error'];
|
|
128
|
+
/**
|
|
129
|
+
* Notify about a verification run that did not pass — unless it judged a
|
|
130
|
+
* contract.
|
|
131
|
+
*
|
|
132
|
+
* ## The contract-task exclusion (adjudicated on Issue #2000)
|
|
133
|
+
*
|
|
134
|
+
* `/orchestrate` runs N workers in parallel and every one of them ends in a
|
|
135
|
+
* verification run. Ringing for each red one is N notifications about work a
|
|
136
|
+
* human deliberately delegated and is not watching gate-by-gate — the exact
|
|
137
|
+
* collision with Epic #2002 that the adjudication names. So the audience test
|
|
138
|
+
* is "was this run about an execution contract".
|
|
139
|
+
*
|
|
140
|
+
* ### The discriminator is the RESOLVED task, not `payload.taskId`
|
|
141
|
+
*
|
|
142
|
+
* The Issue's draft reading was that the API's `payload.taskId` separates them,
|
|
143
|
+
* because `commandmate verify` does not send one. Measured, that is not
|
|
144
|
+
* sufficient: `startVerification` calls `resolveTask`, which falls back to
|
|
145
|
+
* `getVerifiableTask(worktreeId)` (#1545) whenever no `taskId` was named — so a
|
|
146
|
+
* worker's `wait --verify` that happened not to bind a task id still attaches to
|
|
147
|
+
* the worktree's own contract. Keying on `input.taskId` would have let exactly
|
|
148
|
+
* the runs the adjudication excludes through. The resolved `taskId` written on
|
|
149
|
+
* the run row is the fact that says whether a contract was judged, so that is
|
|
150
|
+
* what is read here.
|
|
151
|
+
*/
|
|
152
|
+
async function notifyVerificationFailurePush(input) {
|
|
153
|
+
const instanceId = input.instanceId ?? undefined;
|
|
154
|
+
const context = {
|
|
155
|
+
worktreeId: input.worktreeId,
|
|
156
|
+
instanceId,
|
|
157
|
+
runId: input.runId,
|
|
158
|
+
status: input.status,
|
|
159
|
+
trigger: input.trigger,
|
|
160
|
+
};
|
|
161
|
+
if (!NOTIFIABLE_RUN_STATUSES.includes(input.status)) {
|
|
162
|
+
logger.debug('failure-push-suppressed', {
|
|
163
|
+
...context,
|
|
164
|
+
reason: 'run-not-failed',
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (input.taskId !== null) {
|
|
169
|
+
logger.info('failure-push-suppressed', {
|
|
170
|
+
...context,
|
|
171
|
+
taskId: input.taskId,
|
|
172
|
+
reason: 'contract-task',
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const failed = input.failedGateIds ?? [];
|
|
177
|
+
await raiseFailurePush({
|
|
178
|
+
reason: 'verification-failed',
|
|
179
|
+
worktreeId: input.worktreeId,
|
|
180
|
+
instanceId,
|
|
181
|
+
// The run id, so two runs of the same worktree are two incidents even when
|
|
182
|
+
// the same gates fail with the same wording inside the 30 s window.
|
|
183
|
+
signature: `verification:${input.runId}`,
|
|
184
|
+
excerpt: failed.length > 0 ? failed.join(', ') : undefined,
|
|
185
|
+
logContext: { runId: input.runId, status: input.status, trigger: input.trigger },
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Observe this frame's upstream-fault level and notify on a new incident.
|
|
190
|
+
*
|
|
191
|
+
* Safe to call on every poll — that is what it is for. The edge and the
|
|
192
|
+
* cooldown live in `failure-episode-state`; this function is the logging and
|
|
193
|
+
* fan-out half.
|
|
194
|
+
*/
|
|
195
|
+
async function notifyUpstreamFaultPush(input) {
|
|
196
|
+
// Checked before the edge, not after, so an install without VAPID keys is
|
|
197
|
+
// inert rather than merely quiet — no episode map, no cooldown state, nothing
|
|
198
|
+
// to go stale. `waiting-push-notifier` takes the same position for the same
|
|
199
|
+
// reason. The other two producers are event-shaped and check inside
|
|
200
|
+
// `raiseFailurePush`, where the decision is worth a log line.
|
|
201
|
+
if (!(0, vapid_1.isPushConfigured)())
|
|
202
|
+
return;
|
|
203
|
+
const instanceId = input.instanceId ?? input.cliToolId;
|
|
204
|
+
const edge = (0, failure_episode_state_1.observeUpstreamFaultEdge)({
|
|
205
|
+
worktreeId: input.worktreeId,
|
|
206
|
+
cliToolId: input.cliToolId,
|
|
207
|
+
instanceId: input.instanceId,
|
|
208
|
+
faultId: input.faultId,
|
|
209
|
+
now: input.now,
|
|
210
|
+
});
|
|
211
|
+
if (edge.reason === 'no-fault')
|
|
212
|
+
return;
|
|
213
|
+
if (!edge.notify) {
|
|
214
|
+
const reason = edge.reason === 'cooldown' ? 'upstream-cooldown' : 'upstream-same-episode';
|
|
215
|
+
// `same-episode` at debug, `cooldown` at info: the first is the ordinary
|
|
216
|
+
// steady state of a fault that is still on screen (once per poll), the
|
|
217
|
+
// second is the one an operator asks about — "it is broken again and my
|
|
218
|
+
// phone said nothing".
|
|
219
|
+
const line = {
|
|
220
|
+
worktreeId: input.worktreeId,
|
|
221
|
+
cliToolId: input.cliToolId,
|
|
222
|
+
instanceId,
|
|
223
|
+
faultId: input.faultId,
|
|
224
|
+
since: edge.since,
|
|
225
|
+
reason,
|
|
226
|
+
...(edge.cooldownRemainingMs !== undefined
|
|
227
|
+
? { cooldownRemainingMs: edge.cooldownRemainingMs }
|
|
228
|
+
: {}),
|
|
229
|
+
};
|
|
230
|
+
if (edge.reason === 'cooldown')
|
|
231
|
+
logger.info('failure-push-suppressed', line);
|
|
232
|
+
else
|
|
233
|
+
logger.debug('failure-push-suppressed', line);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
await raiseFailurePush({
|
|
237
|
+
reason: 'upstream-fault',
|
|
238
|
+
worktreeId: input.worktreeId,
|
|
239
|
+
instanceId,
|
|
240
|
+
// The episode's own start, so a genuinely new incident past the cooldown is
|
|
241
|
+
// a different signature even when the same banner text comes back.
|
|
242
|
+
signature: `upstream:${input.faultId}:${edge.since}`,
|
|
243
|
+
excerpt: input.matchedText,
|
|
244
|
+
logContext: { cliToolId: input.cliToolId, faultId: input.faultId, since: edge.since },
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Decide what a session-start failure is, from the error alone.
|
|
249
|
+
*
|
|
250
|
+
* ## The excerpt never carries captured output
|
|
251
|
+
*
|
|
252
|
+
* A notification body leaves this machine. `SessionStartFailedError` is the one
|
|
253
|
+
* shape whose detail may be quoted, and it earns that by construction: its
|
|
254
|
+
* `detectedPattern` is a fixed string from `cli-patterns.ts` that this
|
|
255
|
+
* repository authored, never anything the CLI printed (`session-start-error`
|
|
256
|
+
* spells the argument out). Every other shape — a bare `Error` from a tool's own
|
|
257
|
+
* launch path, whose message interpolates raw tmux/CLI text — contributes only
|
|
258
|
+
* the tool NAME, which is the fact the Issue's acceptance asks the body to
|
|
259
|
+
* carry.
|
|
260
|
+
*
|
|
261
|
+
* @param input - The failure, as reported by the seam
|
|
262
|
+
* @param instanceId - Resolved instance id; part of every signature
|
|
263
|
+
*/
|
|
264
|
+
function classifySessionStartFailure(input, instanceId) {
|
|
265
|
+
// #1637: the session and its process are both alive and still initializing.
|
|
266
|
+
// Notifying here would be the "nothing needs repairing" case ringing a phone.
|
|
267
|
+
if ((0, session_start_error_1.isSessionStartTimeoutError)(input.error)) {
|
|
268
|
+
return { notify: false, reason: 'session-still-starting' };
|
|
269
|
+
}
|
|
270
|
+
if ((0, session_start_error_1.isSessionStartUnavailableError)(input.error)) {
|
|
271
|
+
return {
|
|
272
|
+
notify: true,
|
|
273
|
+
reason: 'session-start-unavailable',
|
|
274
|
+
// Just the name: the dictionary supplies "is not installed" in the
|
|
275
|
+
// reader's language, which an English error message could not.
|
|
276
|
+
excerpt: input.toolName,
|
|
277
|
+
// Not the message — copilot's carries an install hint that would make two
|
|
278
|
+
// attempts at the same missing binary look like two incidents.
|
|
279
|
+
signature: `session-start:${instanceId}:not-installed`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (readErrorCode(input.error) === session_start_error_1.SESSION_START_FAILED_CODE) {
|
|
283
|
+
const detectedPattern = input.error.detectedPattern;
|
|
284
|
+
const pattern = typeof detectedPattern === 'string' ? detectedPattern : '';
|
|
285
|
+
return {
|
|
286
|
+
notify: true,
|
|
287
|
+
reason: 'session-start-failed',
|
|
288
|
+
excerpt: pattern ? `${input.toolName}: ${pattern}` : input.toolName,
|
|
289
|
+
// Unchanged from #2000, so a claude start that keeps hitting the same
|
|
290
|
+
// pattern still collapses to one notification exactly as it did.
|
|
291
|
+
signature: `session-start:${instanceId}:${pattern}`,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
notify: true,
|
|
296
|
+
reason: 'session-start-failed',
|
|
297
|
+
excerpt: input.toolName,
|
|
298
|
+
signature: `session-start:${instanceId}:start-error`,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function readErrorCode(error) {
|
|
302
|
+
if (typeof error !== 'object' || error === null)
|
|
303
|
+
return undefined;
|
|
304
|
+
const code = error.code;
|
|
305
|
+
return typeof code === 'string' ? code : undefined;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Notify that a CLI session could not be started. Never throws.
|
|
309
|
+
*
|
|
310
|
+
* Called from exactly one place — `BaseCLITool.startSession`, the method all
|
|
311
|
+
* seven tools inherit (Issue #2009). Before that it was called from
|
|
312
|
+
* `claude-session`'s throw site, which is why six of the seven agents failed
|
|
313
|
+
* silently: the other six never had a line to call it from.
|
|
314
|
+
*
|
|
315
|
+
* No edge of its own, and deliberately: this is raised from a `throw`, so its
|
|
316
|
+
* rate is bounded by how often something asks to start the session rather than
|
|
317
|
+
* by a poll interval. The 30 s content window in `push-sender` collapses the
|
|
318
|
+
* burst a retrying caller produces; a human who retries minutes later gets a
|
|
319
|
+
* second notification, which is correct — that is a second failed attempt.
|
|
320
|
+
*/
|
|
321
|
+
async function notifySessionStartFailurePush(input) {
|
|
322
|
+
const instanceId = input.instanceId ?? input.cliToolId;
|
|
323
|
+
const verdict = classifySessionStartFailure(input, instanceId);
|
|
324
|
+
if (!verdict.notify) {
|
|
325
|
+
// At info, not debug: "the agent did not come up and my phone said nothing"
|
|
326
|
+
// is a question an operator actually asks, and this is the line that answers
|
|
327
|
+
// it. It is once per start attempt, not once per poll, so it cannot flood.
|
|
328
|
+
logger.info('failure-push-suppressed', {
|
|
329
|
+
worktreeId: input.worktreeId,
|
|
330
|
+
instanceId,
|
|
331
|
+
cliToolId: input.cliToolId,
|
|
332
|
+
reason: verdict.reason,
|
|
333
|
+
});
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
await raiseFailurePush({
|
|
337
|
+
reason: verdict.reason,
|
|
338
|
+
worktreeId: input.worktreeId,
|
|
339
|
+
instanceId,
|
|
340
|
+
signature: verdict.signature,
|
|
341
|
+
excerpt: verdict.excerpt,
|
|
342
|
+
logContext: { cliToolId: input.cliToolId },
|
|
343
|
+
});
|
|
344
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/** Web Push module barrel (Issue #1125). */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.MAX_ESCALATION_THRESHOLD_MINUTES = exports.MIN_ESCALATION_THRESHOLD_MINUTES = exports.ESCALATION_SETTINGS_KEY = exports.ESCALATION_THRESHOLD_CHOICES = exports.DEFAULT_ESCALATION_SETTINGS = exports.normalizeEscalationSettings = exports.setPushEscalationSettings = exports.getPushEscalationSettings = exports.ESCALATION_TICK_MS = exports.pendingEscalationCount = exports.runEscalationTick = exports.handleWaitingTransition = exports.isWaitingPushNotifierActive = exports.stopWaitingPushNotifier = exports.startWaitingPushNotifier = exports.resetWaitingPushDedup = exports.shouldSendWaitingPush = exports.DEFAULT_DEDUP_WINDOW_MS = exports.resetNotificationDedup = exports.shouldSendNotification = exports.resolvePushLocale = exports.buildExcerpt = exports.buildPushPayload = exports.notifyPushSubscribers = exports.getVapidPublicKey = exports.isPushConfigured = exports.getVapidConfig = void 0;
|
|
4
|
+
exports.promptCardCount = exports.clearAllPromptCards = exports.clearPromptCard = exports.hasPromptCard = exports.markPromptCardShown = exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR = exports.notifyPromptResolved = exports.decidePromptResolution = exports.MAX_ESCALATION_THRESHOLD_MINUTES = exports.MIN_ESCALATION_THRESHOLD_MINUTES = exports.ESCALATION_SETTINGS_KEY = exports.ESCALATION_THRESHOLD_CHOICES = exports.DEFAULT_ESCALATION_SETTINGS = exports.normalizeEscalationSettings = exports.setPushEscalationSettings = exports.getPushEscalationSettings = exports.ESCALATION_TICK_MS = exports.pendingEscalationCount = exports.runEscalationTick = exports.handleWaitingTransition = exports.isWaitingPushNotifierActive = exports.stopWaitingPushNotifier = exports.startWaitingPushNotifier = exports.UPSTREAM_FAULT_COOLDOWN_MS = exports.clearUpstreamFaultEpisodes = exports.observeUpstreamFaultEdge = exports.notifySessionStartFailurePush = exports.notifyUpstreamFaultPush = exports.notifyVerificationFailurePush = exports.isPromptPushSuppressed = exports.decidePromptPush = exports.resetWaitingPushDedup = exports.shouldSendWaitingPush = exports.DEFAULT_DEDUP_WINDOW_MS = exports.resetNotificationDedup = exports.shouldSendNotification = exports.resolvePushLocale = exports.buildExcerpt = exports.buildPushPayload = exports.notifyPushSubscribers = exports.getVapidPublicKey = exports.isPushConfigured = exports.getVapidConfig = void 0;
|
|
5
5
|
var vapid_1 = require("./vapid");
|
|
6
6
|
Object.defineProperty(exports, "getVapidConfig", { enumerable: true, get: function () { return vapid_1.getVapidConfig; } });
|
|
7
7
|
Object.defineProperty(exports, "isPushConfigured", { enumerable: true, get: function () { return vapid_1.isPushConfigured; } });
|
|
@@ -17,6 +17,26 @@ Object.defineProperty(exports, "resetNotificationDedup", { enumerable: true, get
|
|
|
17
17
|
Object.defineProperty(exports, "DEFAULT_DEDUP_WINDOW_MS", { enumerable: true, get: function () { return notification_dedup_1.DEFAULT_DEDUP_WINDOW_MS; } });
|
|
18
18
|
Object.defineProperty(exports, "shouldSendWaitingPush", { enumerable: true, get: function () { return notification_dedup_1.shouldSendWaitingPush; } });
|
|
19
19
|
Object.defineProperty(exports, "resetWaitingPushDedup", { enumerable: true, get: function () { return notification_dedup_1.resetWaitingPushDedup; } });
|
|
20
|
+
// Whether a prompt wait is worth notifying about at all (Issue #1999).
|
|
21
|
+
// NOTE: the two producers import this from './prompt-push-gate' directly. A
|
|
22
|
+
// suite that stubs the whole '@/lib/push' barrel would otherwise leave the gate
|
|
23
|
+
// undefined on the path it guards.
|
|
24
|
+
var prompt_push_gate_1 = require("./prompt-push-gate");
|
|
25
|
+
Object.defineProperty(exports, "decidePromptPush", { enumerable: true, get: function () { return prompt_push_gate_1.decidePromptPush; } });
|
|
26
|
+
Object.defineProperty(exports, "isPromptPushSuppressed", { enumerable: true, get: function () { return prompt_push_gate_1.isPromptPushSuppressed; } });
|
|
27
|
+
// Failure notifications (Issue #2000).
|
|
28
|
+
// NOTE: the producers import these from './failure-push-notifier' directly, for
|
|
29
|
+
// the reason the prompt gate above gives — a suite that stubs the whole
|
|
30
|
+
// '@/lib/push' barrel would otherwise leave the notifier undefined on the very
|
|
31
|
+
// path it guards.
|
|
32
|
+
var failure_push_notifier_1 = require("./failure-push-notifier");
|
|
33
|
+
Object.defineProperty(exports, "notifyVerificationFailurePush", { enumerable: true, get: function () { return failure_push_notifier_1.notifyVerificationFailurePush; } });
|
|
34
|
+
Object.defineProperty(exports, "notifyUpstreamFaultPush", { enumerable: true, get: function () { return failure_push_notifier_1.notifyUpstreamFaultPush; } });
|
|
35
|
+
Object.defineProperty(exports, "notifySessionStartFailurePush", { enumerable: true, get: function () { return failure_push_notifier_1.notifySessionStartFailurePush; } });
|
|
36
|
+
var failure_episode_state_1 = require("./failure-episode-state");
|
|
37
|
+
Object.defineProperty(exports, "observeUpstreamFaultEdge", { enumerable: true, get: function () { return failure_episode_state_1.observeUpstreamFaultEdge; } });
|
|
38
|
+
Object.defineProperty(exports, "clearUpstreamFaultEpisodes", { enumerable: true, get: function () { return failure_episode_state_1.clearUpstreamFaultEpisodes; } });
|
|
39
|
+
Object.defineProperty(exports, "UPSTREAM_FAULT_COOLDOWN_MS", { enumerable: true, get: function () { return failure_episode_state_1.UPSTREAM_FAULT_COOLDOWN_MS; } });
|
|
20
40
|
// Waiting-edge driven notifications (Issue #1790).
|
|
21
41
|
var waiting_push_notifier_1 = require("./waiting-push-notifier");
|
|
22
42
|
Object.defineProperty(exports, "startWaitingPushNotifier", { enumerable: true, get: function () { return waiting_push_notifier_1.startWaitingPushNotifier; } });
|
|
@@ -35,3 +55,17 @@ Object.defineProperty(exports, "ESCALATION_THRESHOLD_CHOICES", { enumerable: tru
|
|
|
35
55
|
Object.defineProperty(exports, "ESCALATION_SETTINGS_KEY", { enumerable: true, get: function () { return escalation_settings_1.ESCALATION_SETTINGS_KEY; } });
|
|
36
56
|
Object.defineProperty(exports, "MIN_ESCALATION_THRESHOLD_MINUTES", { enumerable: true, get: function () { return escalation_settings_1.MIN_ESCALATION_THRESHOLD_MINUTES; } });
|
|
37
57
|
Object.defineProperty(exports, "MAX_ESCALATION_THRESHOLD_MINUTES", { enumerable: true, get: function () { return escalation_settings_1.MAX_ESCALATION_THRESHOLD_MINUTES; } });
|
|
58
|
+
// Cross-device dismissal of a resolved wait (Issue #2001).
|
|
59
|
+
// NOTE: `waiting-push-notifier` reaches the notifier through its own module
|
|
60
|
+
// path, for the reason the two blocks above give — a suite that stubs the whole
|
|
61
|
+
// '@/lib/push' barrel would otherwise leave the closing edge inert.
|
|
62
|
+
var resolution_push_notifier_1 = require("./resolution-push-notifier");
|
|
63
|
+
Object.defineProperty(exports, "decidePromptResolution", { enumerable: true, get: function () { return resolution_push_notifier_1.decidePromptResolution; } });
|
|
64
|
+
Object.defineProperty(exports, "notifyPromptResolved", { enumerable: true, get: function () { return resolution_push_notifier_1.notifyPromptResolved; } });
|
|
65
|
+
Object.defineProperty(exports, "MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR", { enumerable: true, get: function () { return resolution_push_notifier_1.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR; } });
|
|
66
|
+
var prompt_card_state_1 = require("./prompt-card-state");
|
|
67
|
+
Object.defineProperty(exports, "markPromptCardShown", { enumerable: true, get: function () { return prompt_card_state_1.markPromptCardShown; } });
|
|
68
|
+
Object.defineProperty(exports, "hasPromptCard", { enumerable: true, get: function () { return prompt_card_state_1.hasPromptCard; } });
|
|
69
|
+
Object.defineProperty(exports, "clearPromptCard", { enumerable: true, get: function () { return prompt_card_state_1.clearPromptCard; } });
|
|
70
|
+
Object.defineProperty(exports, "clearAllPromptCards", { enumerable: true, get: function () { return prompt_card_state_1.clearAllPromptCards; } });
|
|
71
|
+
Object.defineProperty(exports, "promptCardCount", { enumerable: true, get: function () { return prompt_card_state_1.promptCardCount; } });
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which worktrees currently have a prompt notification card sitting on a
|
|
4
|
+
* subscriber's phone (Issue #2001).
|
|
5
|
+
*
|
|
6
|
+
* ## Why this has to exist at all
|
|
7
|
+
*
|
|
8
|
+
* The cross-device dismissal costs one extra push per resolved wait, and Epic
|
|
9
|
+
* #2002 exists to make the phone quieter — #1999 removed the Auto-Yes prompts
|
|
10
|
+
* and #2000 narrowed the default kinds. A resolution push sent for a wait that
|
|
11
|
+
* never rang would hand a chunk of that back for nothing. So the resolution is
|
|
12
|
+
* conditional on a card actually being out there, and something has to know.
|
|
13
|
+
*
|
|
14
|
+
* Nothing already did. `notification-dedup` remembers which *episode* was
|
|
15
|
+
* notified, keyed per instance, and it never forgets — it is a "have I said
|
|
16
|
+
* this already" store, not a "is it still on screen" one. The card is a
|
|
17
|
+
* different object: it is keyed by **worktree**, because that is the shape of
|
|
18
|
+
* the Service Worker `tag` (`<worktreeId>:prompt`, built in `push-sender`), so
|
|
19
|
+
* two instances waiting in one worktree leave exactly one card, and the second
|
|
20
|
+
* instance's notification replaces the first one's rather than stacking.
|
|
21
|
+
*
|
|
22
|
+
* ## Where it is written
|
|
23
|
+
*
|
|
24
|
+
* Marked in `notifyPushSubscribers`, past the point where the fan-out knows a
|
|
25
|
+
* payload is really going to at least one device — so a dedup drop, a missing
|
|
26
|
+
* VAPID config or an empty subscription table records nothing, and the
|
|
27
|
+
* resolution for that wait is correctly skipped. Cleared by
|
|
28
|
+
* `resolution-push-notifier` when the wait closes, whether or not it decided to
|
|
29
|
+
* send. There is exactly one writer per direction.
|
|
30
|
+
*
|
|
31
|
+
* ## Accuracy, and what it deliberately does not model
|
|
32
|
+
*
|
|
33
|
+
* This tracks what the *server* sent, not what each device still displays. A
|
|
34
|
+
* reader who taps or swipes the card away on one phone has closed it there and
|
|
35
|
+
* the server cannot know. That is the residual imprecision documented in
|
|
36
|
+
* `docs/design/cross-device-notification-dismissal.md`: on such a device the
|
|
37
|
+
* resolution arrives as a new (silent, accurate) card instead of replacing one.
|
|
38
|
+
* Modelling per-device state would need the devices to report back, which is a
|
|
39
|
+
* round trip per notification for a card that costs nothing to replace.
|
|
40
|
+
*
|
|
41
|
+
* In-memory via `globalThis`, like every other live-session store here (see the
|
|
42
|
+
* note in `agent-event-state` for the `next dev` bundling reason). One entry
|
|
43
|
+
* per worktree that has an outstanding card, so the map is bounded by the
|
|
44
|
+
* number of worktrees, and each entry is removed when its wait closes.
|
|
45
|
+
*
|
|
46
|
+
* @module lib/push/prompt-card-state
|
|
47
|
+
*/
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.markPromptCardShown = markPromptCardShown;
|
|
50
|
+
exports.hasPromptCard = hasPromptCard;
|
|
51
|
+
exports.clearPromptCard = clearPromptCard;
|
|
52
|
+
exports.clearAllPromptCards = clearAllPromptCards;
|
|
53
|
+
exports.promptCardCount = promptCardCount;
|
|
54
|
+
/** worktreeId -> epoch ms the most recent prompt card was fanned out. */
|
|
55
|
+
const cards = globalThis.__promptPushCards ??
|
|
56
|
+
(globalThis.__promptPushCards = new Map());
|
|
57
|
+
/**
|
|
58
|
+
* Record that a prompt notification for this worktree has left the server.
|
|
59
|
+
*
|
|
60
|
+
* Idempotent by overwrite: a second prompt in the same worktree (another
|
|
61
|
+
* instance, or the #1790 reminder) replaces the same card on the device, so it
|
|
62
|
+
* refreshes the timestamp rather than adding an entry.
|
|
63
|
+
*/
|
|
64
|
+
function markPromptCardShown(worktreeId, at = Date.now()) {
|
|
65
|
+
cards.set(worktreeId, at);
|
|
66
|
+
}
|
|
67
|
+
/** Whether a prompt card for this worktree was fanned out and not yet cleared. */
|
|
68
|
+
function hasPromptCard(worktreeId) {
|
|
69
|
+
return cards.has(worktreeId);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Forget this worktree's card.
|
|
73
|
+
*
|
|
74
|
+
* @returns True when there was one to forget — the caller uses it to tell "the
|
|
75
|
+
* wait is over and we cleared it" from "the wait is over and it never rang".
|
|
76
|
+
*/
|
|
77
|
+
function clearPromptCard(worktreeId) {
|
|
78
|
+
return cards.delete(worktreeId);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Drop every remembered card. Test seam.
|
|
82
|
+
*
|
|
83
|
+
* CI runs with `fileParallelism: false`, so one process holds this map for the
|
|
84
|
+
* whole suite: a card left behind would make the next file's first resolution
|
|
85
|
+
* decide `cross-device-clear` when its own fixture never sent a prompt.
|
|
86
|
+
*/
|
|
87
|
+
function clearAllPromptCards() {
|
|
88
|
+
cards.clear();
|
|
89
|
+
}
|
|
90
|
+
/** How many worktrees have an outstanding card. Test seam. */
|
|
91
|
+
function promptCardCount() {
|
|
92
|
+
return cards.size;
|
|
93
|
+
}
|