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,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Whether a prompt push notification still describes something a human has to
|
|
4
|
+
* do (Issue #1999).
|
|
5
|
+
*
|
|
6
|
+
* Auto-Yes is a standing declaration that this session's prompts get answered
|
|
7
|
+
* without a human, so a phone that buzzes for every one of them tells the
|
|
8
|
+
* reader the opposite of the truth: by the time the notification is opened the
|
|
9
|
+
* answer has already been sent. During a parallel orchestration — several
|
|
10
|
+
* workers all running under Auto-Yes — that is most of the traffic, which is
|
|
11
|
+
* what makes the phone unusable rather than merely noisy.
|
|
12
|
+
*
|
|
13
|
+
* ## Why the gate is here and not inside `notifyPushSubscribers`
|
|
14
|
+
*
|
|
15
|
+
* `NotificationEvent` carries `instanceId` but no `cliToolId`, and every
|
|
16
|
+
* Auto-Yes lookup is keyed by `buildCompositeKey(worktreeId, cliToolId,
|
|
17
|
+
* instanceId)`. An alias instance (`claude-2`) does not name its tool, so the
|
|
18
|
+
* tool cannot be recovered from the event — the fan-out does not hold enough to
|
|
19
|
+
* ask the question with. Both producers do, so the gate runs there.
|
|
20
|
+
*
|
|
21
|
+
* It also has to run *before* the fan-out for a second, independent reason:
|
|
22
|
+
* `shouldSendWaitingPush` records the episode at the moment it decides to send
|
|
23
|
+
* (`notification-dedup`), so a notification dropped after that call would still
|
|
24
|
+
* consume the episode's one slot and take the escalation reminder down with it.
|
|
25
|
+
*
|
|
26
|
+
* ## What still notifies
|
|
27
|
+
*
|
|
28
|
+
* Everything that is not "Auto-Yes will deal with this in a moment":
|
|
29
|
+
*
|
|
30
|
+
* - **No Auto-Yes, or Auto-Yes off.** `getAutoYesState` collapses every stop
|
|
31
|
+
* into `enabled === false`: it calls `disableAutoYes(…, 'expired', …)` on an
|
|
32
|
+
* expired state before returning it, and `disableAutoYes` writes
|
|
33
|
+
* `enabled: false` for `stop_pattern_matched` and `consecutive_errors`
|
|
34
|
+
* alike. One `enabled` read therefore covers all four rows of the Issue's
|
|
35
|
+
* table, and a stop reason nobody remembered to enumerate here fails towards
|
|
36
|
+
* notifying rather than towards silence.
|
|
37
|
+
* - **The contract policy withheld the answer** (#1547 / #1684). Auto-Yes is
|
|
38
|
+
* on but has decided *not* to answer this prompt, so nothing moves until a
|
|
39
|
+
* human acts.
|
|
40
|
+
* - **The escalation reminder** (#1790). See below.
|
|
41
|
+
*
|
|
42
|
+
* ## Which suppression record belongs to which wait
|
|
43
|
+
*
|
|
44
|
+
* `getLastPolicySuppression` keeps the *last* withheld answer per session and
|
|
45
|
+
* never clears it, so the record outlives the wait it was about. #1684 defines
|
|
46
|
+
* the reading: a record is the reason the session is stopped right now when its
|
|
47
|
+
* `at` lines up with the current wait. Here that is `at >= waitingSince` — the
|
|
48
|
+
* suppression was recorded at or after this episode opened. A record from an
|
|
49
|
+
* earlier episode is older than `since` and is ignored.
|
|
50
|
+
*
|
|
51
|
+
* The poller re-evaluates a suppressed prompt on every poll (the duplicate
|
|
52
|
+
* guard only remembers *answered* prompts), so `at` stays current for as long
|
|
53
|
+
* as the prompt is on screen. At the opening edge the record may not exist yet
|
|
54
|
+
* — the poller writes it on its own interval — and the wait is then treated as
|
|
55
|
+
* one Auto-Yes is about to answer. That is deliberate: it is the common case,
|
|
56
|
+
* it resolves in seconds, and the reminder below is what catches it when it
|
|
57
|
+
* does not.
|
|
58
|
+
*
|
|
59
|
+
* ## The reminder is never muted
|
|
60
|
+
*
|
|
61
|
+
* `runEscalationTick` has already established that the wait is still open — it
|
|
62
|
+
* re-reads `getWaitingEpisode` and drops anything Auto-Yes answered — so a wait
|
|
63
|
+
* that reaches the threshold is one Auto-Yes did not resolve after ten minutes
|
|
64
|
+
* of re-evaluating it every couple of seconds. The suppression record cannot be
|
|
65
|
+
* relied on to explain why: a prompt the resolver has no answer for (free text,
|
|
66
|
+
* or a type it does not recognise) returns `suppressedBy: null`, so nothing is
|
|
67
|
+
* recorded and that stall is invisible to the check above. Muting the reminder
|
|
68
|
+
* as well would make Auto-Yes a permanent mute for exactly the pipelines that
|
|
69
|
+
* got stuck.
|
|
70
|
+
*
|
|
71
|
+
* @module lib/push/prompt-push-gate
|
|
72
|
+
*/
|
|
73
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
74
|
+
exports.decidePromptPush = decidePromptPush;
|
|
75
|
+
exports.isPromptPushSuppressed = isPromptPushSuppressed;
|
|
76
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
77
|
+
const logger_1 = require("../../lib/logger");
|
|
78
|
+
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
79
|
+
const logger = (0, logger_1.createLogger)('push/prompt-gate');
|
|
80
|
+
/**
|
|
81
|
+
* Decide whether this prompt notification is worth a human's attention.
|
|
82
|
+
*
|
|
83
|
+
* Reads Auto-Yes state and the policy-suppression record; writes neither.
|
|
84
|
+
* Separated from {@link isPromptPushSuppressed} so a test can assert the reason
|
|
85
|
+
* rather than only the outcome.
|
|
86
|
+
*/
|
|
87
|
+
function decidePromptPush(input) {
|
|
88
|
+
const { worktreeId, cliToolId, instanceId, waitingSince } = input;
|
|
89
|
+
const state = (0, auto_yes_state_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
|
|
90
|
+
if (state === null || !state.enabled) {
|
|
91
|
+
return { suppress: false, reason: 'auto-yes-inactive', stopReason: state?.stopReason };
|
|
92
|
+
}
|
|
93
|
+
const suppression = (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId);
|
|
94
|
+
if (suppression !== null && suppression.at >= waitingSince) {
|
|
95
|
+
return { suppress: false, reason: 'policy-withheld', suppressedBy: suppression.reason };
|
|
96
|
+
}
|
|
97
|
+
if (input.escalated === true) {
|
|
98
|
+
return { suppress: false, reason: 'escalation-reminder' };
|
|
99
|
+
}
|
|
100
|
+
return { suppress: true, reason: 'auto-yes-answering' };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* {@link decidePromptPush}, logged.
|
|
104
|
+
*
|
|
105
|
+
* The single call both prompt-push producers make. A suppression is logged at
|
|
106
|
+
* `info` because a notification that never arrived is indistinguishable from a
|
|
107
|
+
* broken notifier from the outside, and the operator needs the worktree, the
|
|
108
|
+
* instance, the wait and the reason to tell them apart
|
|
109
|
+
* (`docs/design/discoverability-principle.md`). The notifying decisions are
|
|
110
|
+
* logged at `debug`: they end in a notification the operator can already see,
|
|
111
|
+
* so the line is only there for the "why did this one ring?" question.
|
|
112
|
+
*/
|
|
113
|
+
function isPromptPushSuppressed(input) {
|
|
114
|
+
const decision = decidePromptPush(input);
|
|
115
|
+
const context = {
|
|
116
|
+
worktreeId: input.worktreeId,
|
|
117
|
+
cliToolId: input.cliToolId,
|
|
118
|
+
instanceId: input.instanceId ?? input.cliToolId,
|
|
119
|
+
waitingSince: input.waitingSince,
|
|
120
|
+
escalated: input.escalated === true,
|
|
121
|
+
reason: decision.reason,
|
|
122
|
+
...(decision.stopReason !== undefined ? { stopReason: decision.stopReason } : {}),
|
|
123
|
+
...(decision.suppressedBy !== undefined ? { suppressedBy: decision.suppressedBy } : {}),
|
|
124
|
+
};
|
|
125
|
+
if (decision.suppress)
|
|
126
|
+
logger.info('prompt-push-suppressed', context);
|
|
127
|
+
else
|
|
128
|
+
logger.debug('prompt-push-allowed', context);
|
|
129
|
+
return decision.suppress;
|
|
130
|
+
}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Web Push fan-out (Issue #1125).
|
|
4
4
|
*
|
|
5
|
-
* Thin layer over detection: given an agent event (prompt-waiting / completion
|
|
6
|
-
* fan out a minimal notification to every opted-in
|
|
5
|
+
* Thin layer over detection: given an agent event (prompt-waiting / completion /
|
|
6
|
+
* failure, Issue #2000), fan out a minimal notification to every opted-in
|
|
7
|
+
* subscription. Expired
|
|
7
8
|
* endpoints (404/410 Gone) are auto-removed. This module NEVER logs endpoints or
|
|
8
9
|
* VAPID secrets.
|
|
9
10
|
*
|
|
@@ -38,6 +39,7 @@ const notifications_json_1 = __importDefault(require("../../../locales/en/notifi
|
|
|
38
39
|
const notifications_json_2 = __importDefault(require("../../../locales/ja/notifications.json"));
|
|
39
40
|
const vapid_1 = require("./vapid");
|
|
40
41
|
const notification_dedup_1 = require("./notification-dedup");
|
|
42
|
+
const prompt_card_state_1 = require("./prompt-card-state");
|
|
41
43
|
const logger = (0, logger_1.createLogger)('push/sender');
|
|
42
44
|
const MAX_EXCERPT_LENGTH = 120;
|
|
43
45
|
/** The notification bodies, per locale. Keyed by SupportedLocale so a new locale
|
|
@@ -94,6 +96,46 @@ function buildWaitingBody(event, messages, excerpt, now) {
|
|
|
94
96
|
? messages.promptWaitingWithExcerpt.replace('{excerpt}', excerpt)
|
|
95
97
|
: messages.promptWaiting;
|
|
96
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* The body for a failure notification, in the reader's language (Issue #2000).
|
|
101
|
+
*
|
|
102
|
+
* Every wording names the failure explicitly ("不合格" / "failed", "障害" /
|
|
103
|
+
* "fault", "起動できません" / "could not start") so the acceptance criterion —
|
|
104
|
+
* a reader tells success from failure from the body alone — holds without
|
|
105
|
+
* having to open the app. A `reason` nobody added copy for would be a type
|
|
106
|
+
* error at {@link FAILURE_BODY_KEYS}, not a blank notification.
|
|
107
|
+
*/
|
|
108
|
+
const FAILURE_BODY_KEYS = {
|
|
109
|
+
'verification-failed': {
|
|
110
|
+
withExcerpt: 'failureVerificationWithExcerpt',
|
|
111
|
+
plain: 'failureVerification',
|
|
112
|
+
},
|
|
113
|
+
'upstream-fault': {
|
|
114
|
+
withExcerpt: 'failureUpstreamWithExcerpt',
|
|
115
|
+
plain: 'failureUpstream',
|
|
116
|
+
},
|
|
117
|
+
'session-start-failed': {
|
|
118
|
+
withExcerpt: 'failureSessionStartWithExcerpt',
|
|
119
|
+
plain: 'failureSessionStart',
|
|
120
|
+
},
|
|
121
|
+
'session-start-unavailable': {
|
|
122
|
+
withExcerpt: 'failureSessionUnavailableWithExcerpt',
|
|
123
|
+
plain: 'failureSessionUnavailable',
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
function buildFailureBody(event, messages, excerpt) {
|
|
127
|
+
// An event that claims `kind: 'failure'` without saying which failure is a
|
|
128
|
+
// producer bug. Falling back to the verification wording would misreport it,
|
|
129
|
+
// so the generic "something failed" copy is used instead.
|
|
130
|
+
const reason = event.failure?.reason;
|
|
131
|
+
if (reason === undefined) {
|
|
132
|
+
return excerpt ? messages.failureWithExcerpt.replace('{excerpt}', excerpt) : messages.failure;
|
|
133
|
+
}
|
|
134
|
+
const keys = FAILURE_BODY_KEYS[reason];
|
|
135
|
+
return excerpt
|
|
136
|
+
? messages[keys.withExcerpt].replace('{excerpt}', excerpt)
|
|
137
|
+
: messages[keys.plain];
|
|
138
|
+
}
|
|
97
139
|
/** Build the minimal notification payload for an event, in the reader's language. */
|
|
98
140
|
function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Date.now()) {
|
|
99
141
|
const excerpt = buildExcerpt(event.excerpt);
|
|
@@ -101,10 +143,17 @@ function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Da
|
|
|
101
143
|
const title = `${event.worktreeName}${agentSuffix}`;
|
|
102
144
|
const messages = PUSH_MESSAGES[resolvePushLocale(locale)];
|
|
103
145
|
const body = event.kind === 'prompt'
|
|
104
|
-
?
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
146
|
+
? // Issue #2001: the resolution's body replaces the stale card's, so it
|
|
147
|
+
// has to answer the question that card asked. It quotes no excerpt —
|
|
148
|
+
// the prompt is over, and repeating it would read as a new one.
|
|
149
|
+
event.resolved === true
|
|
150
|
+
? messages.promptResolved
|
|
151
|
+
: buildWaitingBody(event, messages, excerpt, now)
|
|
152
|
+
: event.kind === 'failure'
|
|
153
|
+
? buildFailureBody(event, messages, excerpt)
|
|
154
|
+
: excerpt
|
|
155
|
+
? messages.completionWithExcerpt.replace('{excerpt}', excerpt)
|
|
156
|
+
: messages.completion;
|
|
108
157
|
return {
|
|
109
158
|
kind: event.kind,
|
|
110
159
|
title,
|
|
@@ -117,6 +166,7 @@ function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Da
|
|
|
117
166
|
tag: `${event.worktreeId}:${event.kind}`,
|
|
118
167
|
timestamp: now,
|
|
119
168
|
...(event.waitingKind ? { waitingKind: event.waitingKind } : {}),
|
|
169
|
+
...(event.resolved === true ? { resolved: true } : {}),
|
|
120
170
|
};
|
|
121
171
|
}
|
|
122
172
|
async function sendToOne(sub, payload) {
|
|
@@ -141,8 +191,23 @@ async function sendToOne(sub, payload) {
|
|
|
141
191
|
* everything else — every completion, and any prompt event that predates the
|
|
142
192
|
* episode store — keeps the content hash and its 30 s window. Both record as
|
|
143
193
|
* they decide, so this must be called exactly once per event.
|
|
194
|
+
*
|
|
195
|
+
* Issue #2000: a failure hashes its {@link FailureContext.signature} instead of
|
|
196
|
+
* its excerpt. The producers already collapse a failure to one notification per
|
|
197
|
+
* incident (`failure-push-notifier`), so this is the second net rather than the
|
|
198
|
+
* first — but the excerpt is the wrong key for it either way: a retry storm
|
|
199
|
+
* prints a different attempt counter every few seconds, which would defeat a
|
|
200
|
+
* content hash, while two *distinct* incidents can share a line of prose.
|
|
144
201
|
*/
|
|
145
202
|
function passesDedup(event) {
|
|
203
|
+
// Issue #2001: a resolution is guarded by the card state instead, which is
|
|
204
|
+
// exact — `resolution-push-notifier` clears the mark as it sends, so a second
|
|
205
|
+
// resolution for the same card decides `no-card` and never reaches here.
|
|
206
|
+
// Running the content hash for it would be worse than redundant: its key is
|
|
207
|
+
// `${worktreeId}:prompt`, the same slot a legacy (pre-#1790) prompt event
|
|
208
|
+
// uses, so the two would suppress each other on a 30 s window neither wants.
|
|
209
|
+
if (event.resolved === true)
|
|
210
|
+
return true;
|
|
146
211
|
if (event.kind === 'prompt' && typeof event.waitingSince === 'number') {
|
|
147
212
|
return (0, notification_dedup_1.shouldSendWaitingPush)({
|
|
148
213
|
worktreeId: event.worktreeId,
|
|
@@ -154,7 +219,7 @@ function passesDedup(event) {
|
|
|
154
219
|
return (0, notification_dedup_1.shouldSendNotification)({
|
|
155
220
|
worktreeId: event.worktreeId,
|
|
156
221
|
kind: event.kind,
|
|
157
|
-
content: event.excerpt,
|
|
222
|
+
content: event.kind === 'failure' ? event.failure?.signature : event.excerpt,
|
|
158
223
|
});
|
|
159
224
|
}
|
|
160
225
|
/**
|
|
@@ -178,6 +243,16 @@ async function notifyPushSubscribers(event, now = Date.now()) {
|
|
|
178
243
|
const subscriptions = (0, push_subscriptions_db_1.getPushSubscriptionsForKind)(db, event.kind);
|
|
179
244
|
if (subscriptions.length === 0)
|
|
180
245
|
return;
|
|
246
|
+
// Issue #2001: this is the only line in the process that knows a prompt card
|
|
247
|
+
// is really going to reach a device — past the VAPID check, past the dedup,
|
|
248
|
+
// past an empty subscription table. Recording it anywhere earlier would tell
|
|
249
|
+
// `resolution-push-notifier` to clear cards that were never shown, which is
|
|
250
|
+
// exactly the extra push Epic #2002 is trying not to spend. The resolution
|
|
251
|
+
// itself does not mark; it clears, and it does so in its own module so each
|
|
252
|
+
// direction has one writer.
|
|
253
|
+
if (event.kind === 'prompt' && event.resolved !== true) {
|
|
254
|
+
(0, prompt_card_state_1.markPromptCardShown)(event.worktreeId, now);
|
|
255
|
+
}
|
|
181
256
|
web_push_1.default.setVapidDetails(config.subject, config.publicKey, config.privateKey);
|
|
182
257
|
// Devices can be registered in different languages, so the body is built per
|
|
183
258
|
// distinct locale rather than once for the whole fan-out.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Clear the notification a resolved wait left on the reader's *other* devices
|
|
4
|
+
* (Issue #2001).
|
|
5
|
+
*
|
|
6
|
+
* A prompt notification fans out to every subscribed device, and each device's
|
|
7
|
+
* copy is its own object: the `tag` (`<worktreeId>:prompt`) collapses cards
|
|
8
|
+
* *within* one device, and `notificationclick`'s `close()` closes the card on
|
|
9
|
+
* the phone that was tapped. FCM and APNs hold no cross-device state. So a
|
|
10
|
+
* reader with an iPhone and an Android answers on one and the other keeps a
|
|
11
|
+
* card that is now a lie — and the longer Epic #2002 succeeds at only notifying
|
|
12
|
+
* when something needs doing, the more misleading a stale "needs doing" card is.
|
|
13
|
+
*
|
|
14
|
+
* The only channel that reaches the other device is another push. This module
|
|
15
|
+
* decides whether to spend one.
|
|
16
|
+
*
|
|
17
|
+
* ## Why the resolution *shows* a notification instead of only closing one
|
|
18
|
+
*
|
|
19
|
+
* The Issue proposed a silent push whose Service Worker calls
|
|
20
|
+
* `getNotifications({tag})` → `close()` and never calls `showNotification`, and
|
|
21
|
+
* asked whether iOS permits it. Measured against the specs and the three engine
|
|
22
|
+
* implementations, the answer is that **no engine permits it** — this is not an
|
|
23
|
+
* iOS restriction. Every subscription in this app is created with
|
|
24
|
+
* `userVisibleOnly: true` (`NotificationsSettings`), which is the only value
|
|
25
|
+
* Chrome, Firefox and Safari accept from a web page, and it is a promise that
|
|
26
|
+
* each delivered push leaves a notification on screen. Chrome answers a push
|
|
27
|
+
* event that ends with nothing displayed by showing its own "This site has been
|
|
28
|
+
* updated in the background" card; Firefox charges it to a per-subscription
|
|
29
|
+
* silent-push quota and drops the subscription when that runs out; WebKit
|
|
30
|
+
* revokes the push subscription outright. The full citation list, the rejected
|
|
31
|
+
* alternatives and the numbers are in
|
|
32
|
+
* `docs/design/cross-device-notification-dismissal.md`.
|
|
33
|
+
*
|
|
34
|
+
* So the resolution is a real notification that *replaces* the stale one: same
|
|
35
|
+
* `tag`, silent, `renotify: false`, and a body that says the wait is over. The
|
|
36
|
+
* card count on the device does not go up, the phone does not make a sound, and
|
|
37
|
+
* the contract is kept on every engine rather than gambled with on three.
|
|
38
|
+
*
|
|
39
|
+
* ## Why it does not undo #1999 and #2000
|
|
40
|
+
*
|
|
41
|
+
* An extra push per resolved wait would give back a slice of what those two
|
|
42
|
+
* Issues removed, so three conditions have to hold before one is spent, and
|
|
43
|
+
* each is a reason code in the log:
|
|
44
|
+
*
|
|
45
|
+
* - **A card was actually fanned out** (`prompt-card-state`). A wait Auto-Yes
|
|
46
|
+
* answered never rang anybody (#1999), so there is nothing to clear and
|
|
47
|
+
* nothing is sent. This is the condition that keeps #1999's saving intact.
|
|
48
|
+
* - **Nothing in the worktree is still waiting.** The card is per worktree, so
|
|
49
|
+
* a second instance still waiting means it is still true.
|
|
50
|
+
* - **At least {@link MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR} devices are
|
|
51
|
+
* subscribed.** With one device the problem this Issue describes cannot
|
|
52
|
+
* exist, so a single-device install sends exactly as many pushes as it did
|
|
53
|
+
* before this module was written — zero extra.
|
|
54
|
+
*
|
|
55
|
+
* `completion` and `failure` cards are deliberately left alone; the reasoning
|
|
56
|
+
* for each is in the design note under "which kinds are cleared".
|
|
57
|
+
*
|
|
58
|
+
* Everything here is advisory. It is called from the waiting edge, which runs
|
|
59
|
+
* inside the status probe and inside the poller, and neither may be disturbed
|
|
60
|
+
* by a push that failed.
|
|
61
|
+
*
|
|
62
|
+
* @module lib/push/resolution-push-notifier
|
|
63
|
+
*/
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR = void 0;
|
|
66
|
+
exports.decidePromptResolution = decidePromptResolution;
|
|
67
|
+
exports.notifyPromptResolved = notifyPromptResolved;
|
|
68
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
69
|
+
const push_subscriptions_db_1 = require("../../lib/db/push-subscriptions-db");
|
|
70
|
+
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
71
|
+
const logger_1 = require("../../lib/logger");
|
|
72
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
73
|
+
const prompt_card_state_1 = require("./prompt-card-state");
|
|
74
|
+
const push_sender_1 = require("./push-sender");
|
|
75
|
+
const vapid_1 = require("./vapid");
|
|
76
|
+
const logger = (0, logger_1.createLogger)('push/resolution');
|
|
77
|
+
/**
|
|
78
|
+
* How many devices must be subscribed to the acting bucket before clearing is
|
|
79
|
+
* worth a push.
|
|
80
|
+
*
|
|
81
|
+
* Two, because two is the smallest fleet in which the defect can occur: with
|
|
82
|
+
* one subscription the device that answered is the device that holds the card,
|
|
83
|
+
* and it either closed it by being tapped or is in the reader's hand. Sending
|
|
84
|
+
* anyway would spend a push to replace a card on the one screen that already
|
|
85
|
+
* knows — measurable cost, no information. This bound is also what makes the
|
|
86
|
+
* Issue's "with one device nothing changes" criterion true by construction
|
|
87
|
+
* rather than by inspection.
|
|
88
|
+
*/
|
|
89
|
+
exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR = 2;
|
|
90
|
+
/**
|
|
91
|
+
* Whether this worktree's resolved wait is worth a clearing push.
|
|
92
|
+
*
|
|
93
|
+
* Pure: reads the card state, the episode store and the subscription count and
|
|
94
|
+
* writes none of them, so a test can assert the reason without the fan-out and
|
|
95
|
+
* {@link notifyPromptResolved} can log the same decision it acts on.
|
|
96
|
+
*/
|
|
97
|
+
function decidePromptResolution(worktreeId) {
|
|
98
|
+
if (!(0, vapid_1.isPushConfigured)()) {
|
|
99
|
+
return { send: false, reason: 'push-unconfigured' };
|
|
100
|
+
}
|
|
101
|
+
if (!(0, prompt_card_state_1.hasPromptCard)(worktreeId)) {
|
|
102
|
+
return { send: false, reason: 'no-card' };
|
|
103
|
+
}
|
|
104
|
+
if ((0, waiting_episode_state_1.hasOpenWaitingEpisode)(worktreeId)) {
|
|
105
|
+
return { send: false, reason: 'still-waiting' };
|
|
106
|
+
}
|
|
107
|
+
// A database that cannot answer is treated as a single-device install: the
|
|
108
|
+
// conservative direction here is *not* sending, because the cost of a missed
|
|
109
|
+
// clear is a stale card and the cost of a wrong send is a push to every
|
|
110
|
+
// device plus a card where there was none.
|
|
111
|
+
let deviceCount;
|
|
112
|
+
try {
|
|
113
|
+
deviceCount = (0, push_subscriptions_db_1.countPushSubscriptionsForKind)((0, db_instance_1.getDbInstance)(), 'prompt');
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return { send: false, reason: 'single-device', deviceCount: 0 };
|
|
117
|
+
}
|
|
118
|
+
if (deviceCount < exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR) {
|
|
119
|
+
return { send: false, reason: 'single-device', deviceCount };
|
|
120
|
+
}
|
|
121
|
+
return { send: true, reason: 'cross-device-clear', deviceCount };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The worktree's display name, for the title of the replacement card.
|
|
125
|
+
*
|
|
126
|
+
* The same fallback `waiting-push-notifier` uses, and duplicated rather than
|
|
127
|
+
* shared because that module imports this one — sharing it the other way round
|
|
128
|
+
* would be an import cycle for four lines. Falling back to the id keeps the
|
|
129
|
+
* replacement happening with a less readable title instead of leaving the lie
|
|
130
|
+
* on screen.
|
|
131
|
+
*/
|
|
132
|
+
function resolveWorktreeName(worktreeId) {
|
|
133
|
+
try {
|
|
134
|
+
return (0, worktree_db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId)?.name ?? worktreeId;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return worktreeId;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Replace this worktree's stale prompt card on every subscribed device.
|
|
142
|
+
*
|
|
143
|
+
* Never throws and never rejects: it is called with `void` from the waiting
|
|
144
|
+
* edge, which runs inside the status API probe and inside the response poller.
|
|
145
|
+
*
|
|
146
|
+
* The card mark is dropped for every terminal decision — including the ones
|
|
147
|
+
* that send nothing — because the wait is over either way and a mark left
|
|
148
|
+
* behind would make the *next* worktree-level question answer about a card that
|
|
149
|
+
* no longer exists. `still-waiting` is the one reason that keeps it: that card
|
|
150
|
+
* is still on screen and still accurate.
|
|
151
|
+
*/
|
|
152
|
+
async function notifyPromptResolved(input) {
|
|
153
|
+
const { worktreeId, agentName, at = Date.now() } = input;
|
|
154
|
+
const decision = decidePromptResolution(worktreeId);
|
|
155
|
+
const context = {
|
|
156
|
+
worktreeId,
|
|
157
|
+
instanceId: agentName,
|
|
158
|
+
reason: decision.reason,
|
|
159
|
+
...(decision.deviceCount !== undefined ? { deviceCount: decision.deviceCount } : {}),
|
|
160
|
+
};
|
|
161
|
+
if (decision.reason !== 'still-waiting') {
|
|
162
|
+
(0, prompt_card_state_1.clearPromptCard)(worktreeId);
|
|
163
|
+
}
|
|
164
|
+
if (!decision.send) {
|
|
165
|
+
// `single-device` is logged at info because it is the reason that explains
|
|
166
|
+
// the symptom a reader would report ("my other phone still shows it") in an
|
|
167
|
+
// install that has since added a second device but not re-subscribed it.
|
|
168
|
+
// `no-card` and `still-waiting` are the structural defaults — the first is
|
|
169
|
+
// every Auto-Yes-answered wait — so they stay at debug, exactly as #2000
|
|
170
|
+
// kept its `no-fault` out of the operator's way.
|
|
171
|
+
if (decision.reason === 'single-device')
|
|
172
|
+
logger.info('resolution-push-skipped', context);
|
|
173
|
+
else
|
|
174
|
+
logger.debug('resolution-push-skipped', context);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await (0, push_sender_1.notifyPushSubscribers)({
|
|
179
|
+
worktreeId,
|
|
180
|
+
worktreeName: resolveWorktreeName(worktreeId),
|
|
181
|
+
kind: 'prompt',
|
|
182
|
+
agentName,
|
|
183
|
+
resolved: true,
|
|
184
|
+
}, at);
|
|
185
|
+
logger.info('resolution-push-sent', context);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
logger.warn('resolution-push-failed', {
|
|
189
|
+
...context,
|
|
190
|
+
error: error instanceof Error ? error.message : String(error),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -58,7 +58,9 @@ const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
|
58
58
|
const logger_1 = require("../../lib/logger");
|
|
59
59
|
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
60
60
|
const escalation_settings_1 = require("./escalation-settings");
|
|
61
|
+
const prompt_push_gate_1 = require("./prompt-push-gate");
|
|
61
62
|
const push_sender_1 = require("./push-sender");
|
|
63
|
+
const resolution_push_notifier_1 = require("./resolution-push-notifier");
|
|
62
64
|
const vapid_1 = require("./vapid");
|
|
63
65
|
const logger = (0, logger_1.createLogger)('push/waiting-notifier');
|
|
64
66
|
/** How often outstanding waits are re-checked. Minute granularity is enough. */
|
|
@@ -143,6 +145,18 @@ function handleWaitingTransition(transition) {
|
|
|
143
145
|
if (!transition.waiting || transition.since === null) {
|
|
144
146
|
pending.delete(key);
|
|
145
147
|
stopEscalationTimerIfIdle();
|
|
148
|
+
// Issue #2001: this is the moment the notification on every *other* device
|
|
149
|
+
// stopped being true. It is the only edge that sees it — the poller closes
|
|
150
|
+
// the episode here (`response-checker`) and so does the status probe
|
|
151
|
+
// (`worktree-status-helper`), so hooking the edge covers both producers the
|
|
152
|
+
// way #1790 already does for the opening one. Fire-and-forget: the notifier
|
|
153
|
+
// never rejects, and the `void` keeps the synchronous listener contract
|
|
154
|
+
// `emit` relies on.
|
|
155
|
+
void (0, resolution_push_notifier_1.notifyPromptResolved)({
|
|
156
|
+
worktreeId: transition.worktreeId,
|
|
157
|
+
agentName: transition.instanceId ?? transition.cliToolId,
|
|
158
|
+
at: transition.at,
|
|
159
|
+
});
|
|
146
160
|
return;
|
|
147
161
|
}
|
|
148
162
|
const wait = {
|
|
@@ -152,8 +166,21 @@ function handleWaitingTransition(transition) {
|
|
|
152
166
|
since: transition.since,
|
|
153
167
|
kind: transition.kind,
|
|
154
168
|
};
|
|
169
|
+
// Issue #1999: the wait is tracked and the reminder armed either way — only
|
|
170
|
+
// the notification is gated. Dropping the wait from `pending` instead would
|
|
171
|
+
// discard the escalation that makes the suppression safe, and the gate has to
|
|
172
|
+
// run before `sendWaitingPush` because `shouldSendWaitingPush` records the
|
|
173
|
+
// episode at the moment it decides to send.
|
|
155
174
|
pending.set(key, wait);
|
|
156
175
|
startEscalationTimer();
|
|
176
|
+
if ((0, prompt_push_gate_1.isPromptPushSuppressed)({
|
|
177
|
+
worktreeId: wait.worktreeId,
|
|
178
|
+
cliToolId: wait.cliToolId,
|
|
179
|
+
instanceId: wait.instanceId,
|
|
180
|
+
waitingSince: wait.since,
|
|
181
|
+
})) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
157
184
|
void sendWaitingPush(wait, false, transition.at);
|
|
158
185
|
}
|
|
159
186
|
/**
|
|
@@ -182,6 +209,21 @@ function runEscalationTick(now = Date.now()) {
|
|
|
182
209
|
continue;
|
|
183
210
|
if (now - wait.since < thresholdMs)
|
|
184
211
|
continue;
|
|
212
|
+
// Issue #1999: the same gate, asked with `escalated`. It never suppresses a
|
|
213
|
+
// reminder — the episode check above has already proved Auto-Yes did not
|
|
214
|
+
// resolve this wait — but routing the reminder through it keeps the rule in
|
|
215
|
+
// one place and puts the decision in the log next to the opening edge's.
|
|
216
|
+
// The wait is left in `pending` if it ever does suppress, so a later tick
|
|
217
|
+
// can reconsider rather than losing the reminder outright.
|
|
218
|
+
if ((0, prompt_push_gate_1.isPromptPushSuppressed)({
|
|
219
|
+
worktreeId: wait.worktreeId,
|
|
220
|
+
cliToolId: wait.cliToolId,
|
|
221
|
+
instanceId: wait.instanceId,
|
|
222
|
+
waitingSince: wait.since,
|
|
223
|
+
escalated: true,
|
|
224
|
+
})) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
185
227
|
// Dropped before sending, not after: the reminder is once per episode, and
|
|
186
228
|
// an in-flight fan-out must not be able to earn a second one.
|
|
187
229
|
pending.delete(key);
|