commandmate 0.26.0 → 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 +431 -403
- package/.next/app-path-routes-manifest.json +26 -22
- 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 +26 -22
- 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-9303430933084b56.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-fbdf4621a2911ac1.js +0 -1
- package/.next/static/css/e865c4979a41aa03.css +0 -1
- package/.next/static/hNdNiFes2xLls68SWhAU9/_buildManifest.js +0 -1
- /package/.next/static/{hNdNiFes2xLls68SWhAU9 → t0BoV4H46ZgKmTjSi7GIz}/_ssgManifest.js +0 -0
|
@@ -38,16 +38,34 @@
|
|
|
38
38
|
* behind (detonating on the next send). The decision is now three-valued —
|
|
39
39
|
* submitted / pending / replaced — and a `replaced` verdict clears the input
|
|
40
40
|
* line and THROWS instead of resending Enter (see classifySubmit).
|
|
41
|
+
*
|
|
42
|
+
* Issue #1880 closes the hole on the OTHER side of the send. Everything above
|
|
43
|
+
* verifies what happens after Enter; nothing looked at what was already in the
|
|
44
|
+
* composer before the body was typed. `sendKeys` injects the body as plain
|
|
45
|
+
* keystrokes at the TUI's CURRENT CURSOR POSITION, so residual text is spliced
|
|
46
|
+
* into the body instead of being replaced by it. #1878 measured four shapes of
|
|
47
|
+
* that damage: content mutation (`echo PREFILLED` + body), slash-command
|
|
48
|
+
* demotion (a `/cost` body typed after residual is no longer `/`-initial),
|
|
49
|
+
* order inversion when the cursor sat at column 0, and — worst — total loss of
|
|
50
|
+
* the body when the RESIDUAL started with `/` (`/costZZTOP…` is an
|
|
51
|
+
* `Unknown command`, so the message never reaches the model at all). All four
|
|
52
|
+
* reported `exit 0` / `Message sent.` / `sessionStatus: ready`, i.e. they were
|
|
53
|
+
* indistinguishable from a clean send by every signal a caller has. The
|
|
54
|
+
* composer is therefore emptied and read back BEFORE the body is typed — see
|
|
55
|
+
* {@link clearComposerBeforeSend}.
|
|
41
56
|
*/
|
|
42
57
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
58
|
exports.classifySubmit = classifySubmit;
|
|
44
59
|
exports.isSubmitted = isSubmitted;
|
|
60
|
+
exports.clearComposerBeforeSend = clearComposerBeforeSend;
|
|
45
61
|
exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
|
|
46
62
|
const tmux_1 = require("../tmux/tmux");
|
|
47
63
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
64
|
+
const composer_spec_1 = require("./composer-spec");
|
|
48
65
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
49
66
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
50
67
|
const logger_1 = require("../../lib/logger");
|
|
68
|
+
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
51
69
|
const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
|
|
52
70
|
/**
|
|
53
71
|
* Version-resilient pasted-text placeholder.
|
|
@@ -72,13 +90,77 @@ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
|
|
|
72
90
|
*/
|
|
73
91
|
const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
|
|
74
92
|
/**
|
|
75
|
-
* Prompt input-line markers across the
|
|
93
|
+
* Prompt input-line markers across the marker-drawing TUIs.
|
|
76
94
|
* claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
|
|
77
95
|
* vibe-local: `ctx:N% ❯`. Leading whitespace is tolerated (tmux padding).
|
|
96
|
+
*
|
|
97
|
+
* Issue #1906 scopes this to the tools whose {@link ComposerSpec.reader} is
|
|
98
|
+
* `input-line-marker`. opencode draws no marker at all, so applying it there was
|
|
99
|
+
* wrong in both directions — see {@link readComposer}.
|
|
78
100
|
*/
|
|
79
101
|
const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
|
|
80
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* Lines of pane tail to inspect for the "is the tool generating?" signal.
|
|
104
|
+
*
|
|
105
|
+
* Distinct from `ComposerSpec.verifyCaptureLines`, which sizes the tmux
|
|
106
|
+
* capture: the busy marker of every tool lives in a status bar pinned to the
|
|
107
|
+
* bottom of the pane, so it is read from a short tail even when the capture
|
|
108
|
+
* itself is opencode's whole 200-row frame. Widening it to that frame would
|
|
109
|
+
* match `esc interrupt` printed inside a reply.
|
|
110
|
+
*/
|
|
81
111
|
const VERIFY_WINDOW_LINES = 12;
|
|
112
|
+
/**
|
|
113
|
+
* Read the composer out of a captured frame.
|
|
114
|
+
*
|
|
115
|
+
* Two readers, because the two families of TUI say "this is the input line" in
|
|
116
|
+
* incompatible ways:
|
|
117
|
+
*
|
|
118
|
+
* - **marker tools** (`reader: 'input-line-marker'`) draw a `>` / `❯` / `›` at
|
|
119
|
+
* the start of the row. Scanned bottom-up over the tail window so a status bar
|
|
120
|
+
* below the box does not hide it.
|
|
121
|
+
* - **opencode** draws a box with a gutter and no marker anywhere. Its buffer
|
|
122
|
+
* rows are located structurally by {@link findOpenCodeComposerRows} (#1911's
|
|
123
|
+
* chrome walk), and `Ask anything...` inside that box is opencode's own way of
|
|
124
|
+
* saying the buffer is empty (#1883) rather than a row of text.
|
|
125
|
+
*
|
|
126
|
+
* Before this split, opencode went through the marker reader, which is wrong
|
|
127
|
+
* both ways round. It never matched opencode's composer, so EVERY opencode send
|
|
128
|
+
* was classified `submitted` without evidence — #1471's "the Enter was
|
|
129
|
+
* swallowed" recovery has never once run on opencode. And when a `>` did land in
|
|
130
|
+
* the window from somewhere else (a Markdown quote in a reply), the reader
|
|
131
|
+
* treated that row as the input line and answered from it.
|
|
132
|
+
*
|
|
133
|
+
* Issue #1933 turned "which reader" from a `cliToolId === 'opencode'` test plus
|
|
134
|
+
* a set membership test into {@link ComposerSpec.reader}, so the answer is one
|
|
135
|
+
* declaration the tool owns rather than two tables a new tool has to be added
|
|
136
|
+
* to. `unreadable` is the third arm, and it is the one #1906 found opencode
|
|
137
|
+
* silently occupying: it means every send is classified `submitted` without
|
|
138
|
+
* evidence, so it is a state to declare knowingly, never to fall into.
|
|
139
|
+
*/
|
|
140
|
+
function readComposer(reader, lines, windowLines) {
|
|
141
|
+
if (reader === 'opencode-box') {
|
|
142
|
+
const rows = (0, cli_patterns_1.findOpenCodeComposerRows)(lines);
|
|
143
|
+
if (rows === null)
|
|
144
|
+
return { kind: 'absent' };
|
|
145
|
+
// The placeholder is painted only while the buffer is empty, and only
|
|
146
|
+
// inside the box — hence matched on the raw, still-guttered row (#1883).
|
|
147
|
+
if (rows.some((row) => cli_patterns_1.OPENCODE_IDLE_COMPOSER_PATTERN.test(row)))
|
|
148
|
+
return { kind: 'empty' };
|
|
149
|
+
const first = rows.map(cli_patterns_1.stripOpenCodeGutter).find((row) => row.length > 0);
|
|
150
|
+
if (first === undefined)
|
|
151
|
+
return { kind: 'empty' };
|
|
152
|
+
return { kind: 'text', text: first, rows };
|
|
153
|
+
}
|
|
154
|
+
if (reader !== 'input-line-marker')
|
|
155
|
+
return { kind: 'absent' };
|
|
156
|
+
const inputLine = findInputLine(windowLines);
|
|
157
|
+
if (inputLine === null)
|
|
158
|
+
return { kind: 'absent' };
|
|
159
|
+
const stripped = stripInputMarker(inputLine);
|
|
160
|
+
if (stripped.length === 0)
|
|
161
|
+
return { kind: 'empty' };
|
|
162
|
+
return { kind: 'text', text: stripped, rows: [inputLine] };
|
|
163
|
+
}
|
|
82
164
|
/** Default bounded read-back attempts before giving up (throwing). */
|
|
83
165
|
const DEFAULT_VERIFY_ATTEMPTS = 4;
|
|
84
166
|
/**
|
|
@@ -136,47 +218,59 @@ function inputMatchesBody(strippedInput, message) {
|
|
|
136
218
|
*
|
|
137
219
|
* Version-independent by design — does NOT require the paste placeholder:
|
|
138
220
|
* A. The tool is generating a response -> submitted.
|
|
139
|
-
* B. No
|
|
140
|
-
* C. A paste placeholder is folded
|
|
141
|
-
* D. The body is still verbatim
|
|
142
|
-
* E. A DIFFERENT slash command is
|
|
221
|
+
* B. No composer, or the composer is empty -> submitted.
|
|
222
|
+
* C. A paste placeholder is folded in the composer -> pending (Enter eaten).
|
|
223
|
+
* D. The body is still verbatim in the composer -> pending (resend Enter).
|
|
224
|
+
* E. A DIFFERENT slash command is in the composer -> replaced (TUI popup
|
|
143
225
|
* autocompleted the command; clear the line and throw, never resend Enter).
|
|
144
226
|
* F. Any other non-empty text (idle placeholder/hint) -> submitted (unchanged
|
|
145
227
|
* pre-#1501 permissive default, so normal sends never spuriously fail).
|
|
146
228
|
*
|
|
147
|
-
* C–F are scoped to the
|
|
229
|
+
* C–F are scoped to the composer only, so the user-message echo that a TUI
|
|
148
230
|
* prints into its history above the prompt never causes a false verdict.
|
|
231
|
+
*
|
|
232
|
+
* Issue #1906: "the composer" is read per tool by {@link readComposer} rather
|
|
233
|
+
* than by looking for a `>` in the last twelve rows. For opencode — which draws
|
|
234
|
+
* no marker — that read was unreachable, so every send reached F (in fact B) and
|
|
235
|
+
* this function has never returned anything but `submitted` for it.
|
|
236
|
+
*
|
|
237
|
+
* @param output - Captured pane, ANSI intact. For opencode this must be the
|
|
238
|
+
* whole pane; {@link ComposerSpec.verifyCaptureLines} is what asks tmux for it.
|
|
239
|
+
* @param cliToolId - CLI tool id, for the "generating" detector
|
|
240
|
+
* @param message - The body that was typed
|
|
241
|
+
* @param composer - The tool's composer description (Issue #1933). Defaults to
|
|
242
|
+
* the tool's own, so every existing three-argument caller is unchanged.
|
|
149
243
|
*/
|
|
150
|
-
function classifySubmit(output, cliToolId, message) {
|
|
244
|
+
function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
|
|
151
245
|
const clean = (0, cli_patterns_1.stripAnsi)(output);
|
|
152
|
-
const
|
|
246
|
+
const lines = clean.split('\n');
|
|
247
|
+
const windowLines = lines.slice(-VERIFY_WINDOW_LINES);
|
|
153
248
|
const windowStr = windowLines.join('\n');
|
|
154
|
-
// A. Actively generating a response => the message was accepted.
|
|
249
|
+
// A. Actively generating a response => the message was accepted. Read from the
|
|
250
|
+
// tail window for every tool: each one's busy marker lives in a status bar
|
|
251
|
+
// pinned to the bottom of the pane, and widening it to opencode's whole
|
|
252
|
+
// frame would match `esc interrupt` printed inside a reply.
|
|
155
253
|
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
156
254
|
return 'submitted';
|
|
157
255
|
}
|
|
158
|
-
const
|
|
159
|
-
// B. No
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
const strippedInput = stripInputMarker(inputLine);
|
|
164
|
-
// B. Empty input line => the message left the box => submitted.
|
|
165
|
-
if (strippedInput.length === 0) {
|
|
256
|
+
const composer = readComposer(composerSpec.reader, lines, windowLines);
|
|
257
|
+
// B. No composer visible (scrolled off / dialog / still starting), or the
|
|
258
|
+
// composer is empty => the message left the box => submitted.
|
|
259
|
+
if (composer.kind !== 'text') {
|
|
166
260
|
return 'submitted';
|
|
167
261
|
}
|
|
168
|
-
// C. A paste placeholder is still folded
|
|
169
|
-
if (PASTE_PLACEHOLDER_PATTERN.test(
|
|
262
|
+
// C. A paste placeholder is still folded into the composer => body is there.
|
|
263
|
+
if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row))) {
|
|
170
264
|
return 'pending';
|
|
171
265
|
}
|
|
172
|
-
// D. The typed body is still sitting
|
|
173
|
-
if (inputMatchesBody(
|
|
266
|
+
// D. The typed body is still sitting in the composer => resend Enter.
|
|
267
|
+
if (inputMatchesBody(composer.text, message)) {
|
|
174
268
|
return 'pending';
|
|
175
269
|
}
|
|
176
|
-
// E. A different slash command is
|
|
270
|
+
// E. A different slash command is in the composer => a completion popup
|
|
177
271
|
// replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
|
|
178
272
|
// some TUIs paint on an empty composer are never mistaken for this.)
|
|
179
|
-
if (REPLACEMENT_COMMAND_PATTERN.test(
|
|
273
|
+
if (REPLACEMENT_COMMAND_PATTERN.test(composer.text)) {
|
|
180
274
|
return 'replaced';
|
|
181
275
|
}
|
|
182
276
|
// F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
|
|
@@ -187,8 +281,84 @@ function classifySubmit(output, cliToolId, message) {
|
|
|
187
281
|
* Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
|
|
188
282
|
* A `replaced` verdict is NOT "submitted", so this returns false for it too.
|
|
189
283
|
*/
|
|
190
|
-
function isSubmitted(output, cliToolId, message) {
|
|
191
|
-
return classifySubmit(output, cliToolId, message) === 'submitted';
|
|
284
|
+
function isSubmitted(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
|
|
285
|
+
return classifySubmit(output, cliToolId, message, composerSpec) === 'submitted';
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Empty the composer before the body is typed into it (Issue #1880).
|
|
289
|
+
*
|
|
290
|
+
* Delegates the how to {@link clearComposer} (#1879), which already sends
|
|
291
|
+
* `C-e`+`C-u` — the `C-e` is what makes a column-0 cursor clearable — in a
|
|
292
|
+
* read-back-verified loop, so a multi-row residual is not left half-eaten and
|
|
293
|
+
* claude's dim ghost suggestions do not spin it to its cap. This function is the
|
|
294
|
+
* policy layer on top: which tools take part, and which outcomes are failures.
|
|
295
|
+
*
|
|
296
|
+
* Exactly one outcome is a failure: **a participating tool still reporting
|
|
297
|
+
* `content` after the pass cap**. That is a composer this code demonstrably
|
|
298
|
+
* could not empty, so typing into it would splice the body into whatever is
|
|
299
|
+
* there and then report success — the defect #1880 exists to remove. Everything
|
|
300
|
+
* else proceeds:
|
|
301
|
+
*
|
|
302
|
+
* - `unsupported_tool` — never reached (a tool only enters this path when
|
|
303
|
+
* its `ComposerSpec.clearBeforeSend` is true),
|
|
304
|
+
* but it means "this layer cannot read that box", not "the box is dirty".
|
|
305
|
+
* - `no_composer` — the input box is not on screen (a full-screen dialog, a
|
|
306
|
+
* pager, a session still starting). Nothing was inspected and nothing was
|
|
307
|
+
* sent; refusing here would invent a second way for sends to stall, on a
|
|
308
|
+
* frame that carries no evidence of residual text. On codex this is also the
|
|
309
|
+
* verdict for every dialog frame, which is what keeps a `C-e`+`C-u` volley
|
|
310
|
+
* off an approval screen (Issue #1890).
|
|
311
|
+
* - `empty` / `ghost` — verified clean, with or without passes.
|
|
312
|
+
*
|
|
313
|
+
* A throw from {@link clearComposer} itself is a tmux failure (`capture-pane` or
|
|
314
|
+
* `send-keys` returned non-zero) and is deliberately NOT caught: the very next
|
|
315
|
+
* thing this module does is drive the same tmux binary against the same session,
|
|
316
|
+
* and swallowing it would mean typing into a composer whose contents are
|
|
317
|
+
* unknown while still reporting success.
|
|
318
|
+
*
|
|
319
|
+
* Which tools take part is {@link ComposerSpec.clearBeforeSend} since Issue
|
|
320
|
+
* #1933. The gate is `extractComposerText`'s reach, not a preference: it
|
|
321
|
+
* short-circuits every unmeasured tool to `unsupported_tool`, so for
|
|
322
|
+
* gemini/copilot/opencode/vibe-local/antigravity {@link clearComposer} can never
|
|
323
|
+
* observe an empty box and always returns `cleared: false`. Reading that as "the
|
|
324
|
+
* clear failed" and refusing to send would take every one of those tools offline
|
|
325
|
+
* while claude kept working and the unit tests stayed green — so those tools do
|
|
326
|
+
* not enter the clear path at all: no read-back capture, no `C-e`+`C-u`, no new
|
|
327
|
+
* failure mode. Byte-for-byte the pre-#1880 send. codex joined in #1890, and the
|
|
328
|
+
* fix there was to measure codex's input box, not to relax the gate: adding the
|
|
329
|
+
* next tool means a live 200x1000 capture of its box, its idle placeholder and
|
|
330
|
+
* its dialogs, pinned as fixtures.
|
|
331
|
+
*
|
|
332
|
+
* @throws Error when the composer still holds text after the pass cap.
|
|
333
|
+
*/
|
|
334
|
+
async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
|
|
335
|
+
if (!composerSpec.clearBeforeSend)
|
|
336
|
+
return;
|
|
337
|
+
const result = await (0, composer_clear_1.clearComposer)(sessionName, cliToolId);
|
|
338
|
+
if (result.state === 'content') {
|
|
339
|
+
logger.error('pre-send-composer-clear-failed', {
|
|
340
|
+
sessionName,
|
|
341
|
+
cliToolId,
|
|
342
|
+
passes: result.passes,
|
|
343
|
+
remainingLength: result.remainingText.length,
|
|
344
|
+
remainingText: result.remainingText,
|
|
345
|
+
});
|
|
346
|
+
throw new Error(`Composer for session ${sessionName} still holds unsent text after ${result.passes} clear passes; ` +
|
|
347
|
+
'refusing to type the message, which would be concatenated with it (Issue #1880).');
|
|
348
|
+
}
|
|
349
|
+
if (result.passes > 0) {
|
|
350
|
+
// The only record of what was thrown away. `remainingText` is the FINAL
|
|
351
|
+
// read and is empty on this path by definition, which is why clearComposer
|
|
352
|
+
// reports `discardedText` separately.
|
|
353
|
+
logger.warn('pre-send-composer-cleared', {
|
|
354
|
+
sessionName,
|
|
355
|
+
cliToolId,
|
|
356
|
+
passes: result.passes,
|
|
357
|
+
state: result.state,
|
|
358
|
+
discardedLength: result.discardedText.length,
|
|
359
|
+
discardedText: result.discardedText,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
192
362
|
}
|
|
193
363
|
/**
|
|
194
364
|
* Type a message body and submit it, then verify the submit actually happened.
|
|
@@ -203,9 +373,22 @@ function isSubmitted(output, cliToolId, message) {
|
|
|
203
373
|
* @throws Error when submit cannot be confirmed within the bounded attempts.
|
|
204
374
|
*/
|
|
205
375
|
async function sendMessageWithSubmitVerification(params) {
|
|
206
|
-
const { sessionName, message, cliToolId,
|
|
376
|
+
const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, } = params;
|
|
377
|
+
const submitEnterCount = params.submitEnterCount ?? composer.submitEnterCount;
|
|
378
|
+
// 0. Empty the composer first (Issue #1880). The body below is typed at the
|
|
379
|
+
// TUI's current cursor position, so anything already in the box would be
|
|
380
|
+
// spliced into it. Throws for a claude composer that could not be emptied.
|
|
381
|
+
await clearComposerBeforeSend(sessionName, cliToolId, composer);
|
|
207
382
|
// 1. Type the body only — never send Enter in the same tmux command.
|
|
208
|
-
|
|
383
|
+
//
|
|
384
|
+
// `{ literal: true }` is Issue #1933 受入条件 S9 and it is not decoration.
|
|
385
|
+
// `tmux send-keys` resolves its argument against the key table first, so
|
|
386
|
+
// until this flag existed a message body of exactly `Escape` interrupted
|
|
387
|
+
// the agent (`1b`), `Enter` submitted an empty composer (`0d`) and `C-c`
|
|
388
|
+
// sent SIGINT — and a body starting with `-` was eaten by getopt and sent
|
|
389
|
+
// nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
|
|
390
|
+
// built in `lib/tmux/key-sequence.ts`, which carries the table.
|
|
391
|
+
await (0, tmux_1.sendKeys)(sessionName, message, false, { literal: true });
|
|
209
392
|
// 2. Let the TUI register the input before pressing Enter.
|
|
210
393
|
await new Promise((resolve) => setTimeout(resolve, textInputWaitMs));
|
|
211
394
|
// 3. Submit as a separate command (double Enter for vibe-local's IME mode).
|
|
@@ -220,8 +403,8 @@ async function sendMessageWithSubmitVerification(params) {
|
|
|
220
403
|
const attempts = Math.max(1, verifyAttempts);
|
|
221
404
|
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
222
405
|
await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
|
|
223
|
-
const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -
|
|
224
|
-
const state = classifySubmit(output, cliToolId, message);
|
|
406
|
+
const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
407
|
+
const state = classifySubmit(output, cliToolId, message, composer);
|
|
225
408
|
if (state === 'submitted') {
|
|
226
409
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
227
410
|
return;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.OLLAMA_MODEL_PATTERN = exports.VIBE_LOCAL_CONTEXT_WINDOW_MAX = exports.VIBE_LOCAL_CONTEXT_WINDOW_MIN = exports.CLI_TOOL_DISPLAY_NAMES = exports.MAX_INSTANCE_ID_LENGTH = exports.INSTANCE_ID_PATTERN = exports.MAX_AGENT_ALIAS_LENGTH = exports.MAX_AGENT_INSTANCES = exports.CLI_TOOL_IDS = void 0;
|
|
7
7
|
exports.usesAlternateScreen = usesAlternateScreen;
|
|
8
|
+
exports.capturedLineCountIsCursor = capturedLineCountIsCursor;
|
|
8
9
|
exports.isValidInstanceId = isValidInstanceId;
|
|
9
10
|
exports.getPrimaryInstanceId = getPrimaryInstanceId;
|
|
10
11
|
exports.isPrimaryInstance = isPrimaryInstance;
|
|
@@ -54,6 +55,46 @@ const ALTERNATE_SCREEN_CLI_TOOLS = new Set([
|
|
|
54
55
|
function usesAlternateScreen(cliToolId) {
|
|
55
56
|
return ALTERNATE_SCREEN_CLI_TOOLS.has(cliToolId);
|
|
56
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Whether a stored `last_captured_line` still indexes into THIS capture, i.e.
|
|
60
|
+
* whether it may be used as a "how far have I read" cursor (Issue #1910).
|
|
61
|
+
*
|
|
62
|
+
* Two independent things pin a captured line count so it stops growing with the
|
|
63
|
+
* transcript, and a caller that slices at the stored cursor has to survive both:
|
|
64
|
+
*
|
|
65
|
+
* - **the tool renders in the alternate screen** ({@link usesAlternateScreen}):
|
|
66
|
+
* tmux keeps no scrollback, every capture returns exactly `pane_height` rows,
|
|
67
|
+
* and the count is pinned there from the very first frame (Issue #1268);
|
|
68
|
+
* - **the capture window saturated** (`isCaptureWindowSaturated` in
|
|
69
|
+
* `lib/tmux/tmux-capture-cache.ts`): the pane outgrew the sliding window the
|
|
70
|
+
* capture is taken through, so the count is pinned at the window size and the
|
|
71
|
+
* window merely slides (Issue #1670).
|
|
72
|
+
*
|
|
73
|
+
* Either one makes a previously stored index denote a different line — or no
|
|
74
|
+
* line at all — so `lines.slice(cursor)` silently yields nothing. That is
|
|
75
|
+
* Issue #1910: `commandmate capture <id>` printed a single empty byte for every
|
|
76
|
+
* alternate-screen session that had taken one turn, because the poller had
|
|
77
|
+
* stored the pane height (1000 on copilot / claude, 200 on opencode) and the
|
|
78
|
+
* next frame is exactly that many rows.
|
|
79
|
+
*
|
|
80
|
+
* A caller that reads `false` must fall back to the WHOLE capture: repeating
|
|
81
|
+
* rows the reader has already seen is harmless, dropping new output is not.
|
|
82
|
+
*
|
|
83
|
+
* The two conditions are stated together here rather than at each call site
|
|
84
|
+
* because they are one rule — "is the count a cursor?" — reached from two
|
|
85
|
+
* sides, and #1670 fixed only the second one in
|
|
86
|
+
* `src/lib/session/current-output-builder.ts` while `src/lib/polling/
|
|
87
|
+
* response-checker.ts` (which spells the same expression inline as
|
|
88
|
+
* `lineCountIsCursor`) already had both. Folding that second copy in here is
|
|
89
|
+
* left to the next change that touches the poller.
|
|
90
|
+
*
|
|
91
|
+
* @param cliToolId - CLI tool the capture came from
|
|
92
|
+
* @param captureWindowSaturated - Whether this capture came back clipped by the window
|
|
93
|
+
* @returns True when the stored line count is still a usable cursor
|
|
94
|
+
*/
|
|
95
|
+
function capturedLineCountIsCursor(cliToolId, captureWindowSaturated) {
|
|
96
|
+
return !usesAlternateScreen(cliToolId) && !captureWindowSaturated;
|
|
97
|
+
}
|
|
57
98
|
// ============================================================================
|
|
58
99
|
// Agent Instances (Issue #868: multi-session foundation)
|
|
59
100
|
// ============================================================================
|
|
@@ -19,6 +19,7 @@ const db_instance_1 = require("../db/db-instance");
|
|
|
19
19
|
const db_1 = require("../db");
|
|
20
20
|
const logger_1 = require("../../lib/logger");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
|
+
const session_start_error_1 = require("../session/session-start-error");
|
|
22
23
|
const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
23
24
|
/**
|
|
24
25
|
* Extract error message from unknown error type (DRY)
|
|
@@ -53,10 +54,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
53
54
|
* @param worktreeId - Worktree ID
|
|
54
55
|
* @param worktreePath - Worktree path
|
|
55
56
|
*/
|
|
56
|
-
async
|
|
57
|
+
async launchSession(worktreeId, worktreePath, instanceId) {
|
|
57
58
|
const vibeLocalAvailable = await this.isInstalled();
|
|
58
59
|
if (!vibeLocalAvailable) {
|
|
59
|
-
throw new
|
|
60
|
+
throw new session_start_error_1.SessionStartUnavailableError(this.name, 'vibe-local is not installed or not in PATH');
|
|
60
61
|
}
|
|
61
62
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
62
63
|
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
@@ -129,7 +130,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
129
130
|
sessionName,
|
|
130
131
|
message,
|
|
131
132
|
cliToolId: 'vibe-local',
|
|
132
|
-
|
|
133
|
+
// Issue #1933: the double Enter is `ComposerSpec.submitEnterCount`, so
|
|
134
|
+
// the IME quirk is declared once on the tool rather than re-passed by
|
|
135
|
+
// the one call site that knew about it.
|
|
136
|
+
composer: this.describeComposer(),
|
|
133
137
|
interEnterWaitMs: cli_tool_timing_config_1.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS,
|
|
134
138
|
});
|
|
135
139
|
// Issue #405: Invalidate cache after sending message
|
|
@@ -29,8 +29,24 @@ const antigravity_constants_1 = require("../config/antigravity-constants");
|
|
|
29
29
|
* This Set controls which tools accept the --model option in the CMATE.md schedule table.
|
|
30
30
|
* vibe-local model is managed via DB (worktree.vibe_local_model), not CMATE.md.
|
|
31
31
|
* To add CMATE.md --model support for a new tool, add it here (DR1-006).
|
|
32
|
+
*
|
|
33
|
+
* ## `opencode` (Issue #1914)
|
|
34
|
+
*
|
|
35
|
+
* `claude-executor.ts` has carried an `opencode run -m <model>` branch since
|
|
36
|
+
* Issue #379, and it had never once executed: the only caller that supplies a
|
|
37
|
+
* model for a schedule is `job-executor.resolveModelOption()`, which answered
|
|
38
|
+
* `undefined` for every tool but copilot and vibe-local, and the other reachable
|
|
39
|
+
* caller (`daily-summary-generator`) is gated by `SUMMARY_ALLOWED_TOOLS`, which
|
|
40
|
+
* has no opencode either. Adding the id here is one half of making that branch
|
|
41
|
+
* reachable; `resolveModelOption()` reads this Set for the other half, so the
|
|
42
|
+
* two cannot drift apart again.
|
|
43
|
+
*
|
|
44
|
+
* The value is passed through **verbatim** as `provider/model`, which is the
|
|
45
|
+
* format `opencode run --help` documents for `-m, --model` (measured on
|
|
46
|
+
* opencode 1.18.21). It is not prefixed with `ollama/` — see
|
|
47
|
+
* `buildCliArgs()` for why that prefix went away.
|
|
32
48
|
*/
|
|
33
|
-
exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot']);
|
|
49
|
+
exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot', 'opencode']);
|
|
34
50
|
// =============================================================================
|
|
35
51
|
// Parse Functions
|
|
36
52
|
// =============================================================================
|
|
@@ -78,6 +94,18 @@ function parseCliToolColumn(raw) {
|
|
|
78
94
|
* Validate a Copilot model name using the reject approach (no sanitization).
|
|
79
95
|
* Shared between send API, CLI send, parser, and validator (DR1-003).
|
|
80
96
|
*
|
|
97
|
+
* Issue #1914: this is also what validates an **opencode** `provider/model`
|
|
98
|
+
* value, and the pattern already fits — `MODEL_NAME_PATTERN` allows `/` and `:`
|
|
99
|
+
* and requires a leading alphanumeric, so `ollama/qwen3:8b` and
|
|
100
|
+
* `anthropic/claude-sonnet-4-5` pass while a leading `-` (the CLI-option
|
|
101
|
+
* injection case DR4-001 is about) does not. The name is kept because the export
|
|
102
|
+
* is reached from the send API and `commandmate send`, which are outside this
|
|
103
|
+
* Issue's scope; what is deliberately **not** added is a `provider/model` shape
|
|
104
|
+
* requirement. Two probes against opencode 1.18.21 in an isolated `HOME` — one
|
|
105
|
+
* with `-m totallynotaprovider/some-model`, one with `-m barewordmodel` — both
|
|
106
|
+
* exited 1 with the same opaque `UnknownError`, so the CLI gives no signal that
|
|
107
|
+
* would let this layer reject a bare name without guessing.
|
|
108
|
+
*
|
|
81
109
|
* @param modelName - Model name to validate
|
|
82
110
|
* @returns Validation result with optional reason for rejection
|
|
83
111
|
*/
|
|
@@ -209,6 +209,9 @@ function parseSchedulesSection(rows) {
|
|
|
209
209
|
// Validate permission against allowed values
|
|
210
210
|
let allowedValues;
|
|
211
211
|
switch (resolvedCliToolId) {
|
|
212
|
+
case 'claude':
|
|
213
|
+
allowedValues = schedule_config_1.CLAUDE_PERMISSIONS;
|
|
214
|
+
break;
|
|
212
215
|
case 'codex':
|
|
213
216
|
allowedValues = schedule_config_1.CODEX_SANDBOXES;
|
|
214
217
|
break;
|
|
@@ -220,16 +223,21 @@ function parseSchedulesSection(rows) {
|
|
|
220
223
|
break;
|
|
221
224
|
case 'gemini':
|
|
222
225
|
case 'vibe-local':
|
|
223
|
-
|
|
226
|
+
case 'opencode':
|
|
227
|
+
// Issue #1914: `default` sits with the no-flag tools, not with claude.
|
|
228
|
+
// It used to resolve to CLAUDE_PERMISSIONS, so `opencode` -- which has no
|
|
229
|
+
// permission flag at all -- accepted `acceptEdits`/`bypassPermissions`
|
|
230
|
+
// and handed them to a CLI that has no such option. A tool added to
|
|
231
|
+
// CLI_TOOL_IDS without its own case above now inherits "no permission
|
|
232
|
+
// flags" instead of Claude's --permission-mode vocabulary.
|
|
233
|
+
default:
|
|
234
|
+
// No permission flags for these tools; only empty string is valid
|
|
224
235
|
allowedValues = [];
|
|
225
236
|
if (permission) {
|
|
226
237
|
logger.warn('parse:permission-ignored', { name: sanitizedName, cliToolId: resolvedCliToolId, permission });
|
|
227
238
|
permission = '';
|
|
228
239
|
}
|
|
229
240
|
break;
|
|
230
|
-
default:
|
|
231
|
-
allowedValues = schedule_config_1.CLAUDE_PERMISSIONS;
|
|
232
|
-
break;
|
|
233
241
|
}
|
|
234
242
|
if (allowedValues.length > 0 && permission && !allowedValues.includes(permission)) {
|
|
235
243
|
logger.warn('parse:invalid-permission', { name: sanitizedName, cliToolId: resolvedCliToolId, permission, defaultPermission });
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.setInProgressMessageId = exports.updateSessionState = exports.getSessionState = exports.getMessagesByDateRange = exports.ACTIVE_FILTER = exports.recordAnsweredPrompt = exports.markPendingPromptsAsAnswered = exports.updatePromptData = exports.getMessageById = exports.recomputeLastUserMessage = exports.clearLastUserMessage = exports.updateLastUserMessage = exports.deleteMessagesByInstance = exports.deleteMessagesByCliTool = exports.deleteMessageById = exports.deleteAllMessages = exports.getLastMessage = exports.getLastUserMessage = exports.getMessages = exports.updateMessageContent = exports.createMessage = exports.getLastAssistantMessageAt = exports.getAliasedWorktreeIds = exports.getAllWorktreeAliases = exports.getWorktreeAliases = exports.resolveWorktreeIdWithAlias = exports.recordWorktreeAlias = exports.deleteWorktreesByIds = exports.deleteRepositoryWorktrees = exports.migrateWorktreeIdPreservingChildren = exports.getAllWorktreePathIds = exports.getAllWorktreeIds = exports.getWorktreesByRepository = exports.getWorktreeIdsByRepository = exports.getInitialBranch = exports.saveInitialBranch = exports.updateVibeLocalContextWindow = exports.updateVibeLocalModel = exports.updateSelectedAgents = exports.updateCliToolId = exports.updateStatus = exports.updateFavorite = exports.updateLastViewedAt = exports.updateWorktreeLink = exports.updateWorktreeDescription = exports.upsertWorktree = exports.getWorktreeById = exports.getRepositories = exports.getWorktrees = exports.initDatabase = void 0;
|
|
14
14
|
exports.createAssistantMessage = exports.updateAssistantConversation = exports.createAssistantConversation = exports.getAssistantConversationByRepositoryAndCliTool = exports.getAssistantConversationById = exports.updateDailyReportContent = exports.saveDailyReport = exports.getDailyReport = exports.recoverStuckSendingTimers = exports.clearTimerHistory = exports.cleanupOldTimers = exports.getPendingTimerCountByWorktree = exports.cancelTimersByWorktree = exports.cancelTimer = exports.updateTimerStatus = exports.getPendingTimers = exports.getTimerById = exports.getTimersByWorktree = exports.createTimer = exports.WORKTREE_TODO_STATUSES = exports.isWorktreeTodoStatus = exports.reorderWorktreeTodos = exports.deleteWorktreeTodo = exports.updateWorktreeTodo = exports.createWorktreeTodo = exports.getWorktreeTodoById = exports.getTodosByWorktreeId = exports.deleteTodo = exports.updateTodo = exports.createTodo = exports.getTodoById = exports.getAllTodos = exports.getTodosByRepositoryId = exports.MemoDbError = exports.reorderMemos = exports.deleteMemo = exports.updateMemo = exports.createMemo = exports.getMemoById = exports.getMemosByWorktreeId = exports.InvalidAgentInstanceError = exports.AgentInstanceLimitError = exports.removeAgentInstance = exports.addAgentInstance = exports.setAgentInstances = exports.countAgentInstances = exports.getAgentInstance = exports.getAgentInstances = exports.deleteSessionState = exports.clearInProgressMessageId = void 0;
|
|
15
|
-
exports.listTaskEvents = exports.ACTIVE_TASK_STATUSES = exports.TERMINAL_TASK_STATUSES = exports.TASK_STATUSES = exports.isTerminalTaskStatus = exports.getActiveTaskForInstance = exports.getActiveTask = exports.listTasks = exports.getTask = exports.createTask = exports.VERIFICATION_GATE_SOURCES = exports.VERIFICATION_TRIGGERS = exports.MAX_RUN_HISTORY_DAYS = exports.MAX_RUN_HISTORY_LIMIT = exports.DEFAULT_RUN_HISTORY_LIMIT = exports.listVerificationRunsForPeriod = exports.listRunningVerificationRuns = exports.getRunningVerificationRun = exports.listVerificationRuns = exports.getVerificationRun = exports.finishGateResult = exports.createGateResult = exports.finishVerificationRun = exports.createVerificationRun = exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = exports.getLatestAssistantExecutionByConversation = exports.getAssistantExecutionById = exports.updateAssistantExecution = exports.createAssistantExecution = exports.archiveAssistantMessagesFrom = exports.archiveAllAssistantMessages = exports.getAssistantMessageById = exports.getAssistantMessages = exports.updateAssistantMessageStatus = void 0;
|
|
15
|
+
exports.listTaskEvents = exports.ACTIVE_TASK_STATUSES = exports.TERMINAL_TASK_STATUSES = exports.TASK_STATUSES = exports.isTerminalTaskStatus = exports.getActiveTaskForInstance = exports.getActiveTask = exports.listTasks = exports.getTask = exports.createTask = exports.VERIFICATION_GATE_SOURCES = exports.VERIFICATION_TRIGGERS = exports.MAX_RUN_HISTORY_DAYS = exports.MAX_RUN_HISTORY_LIMIT = exports.DEFAULT_RUN_HISTORY_LIMIT = exports.listVerificationRunsForPeriod = exports.listRunningVerificationRuns = exports.getRunningVerificationRun = exports.listVerificationRuns = exports.getVerificationRun = exports.finishGateResult = exports.createGateResult = exports.finishVerificationRun = exports.createVerificationRun = exports.NEW_SUBSCRIPTION_DEFAULTS = exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.countPushSubscriptionsForKind = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = exports.getLatestAssistantExecutionByConversation = exports.getAssistantExecutionById = exports.updateAssistantExecution = exports.createAssistantExecution = exports.archiveAssistantMessagesFrom = exports.archiveAllAssistantMessages = exports.getAssistantMessageById = exports.getAssistantMessages = exports.updateAssistantMessageStatus = void 0;
|
|
16
16
|
// init-db
|
|
17
17
|
var init_db_1 = require("./init-db");
|
|
18
18
|
Object.defineProperty(exports, "initDatabase", { enumerable: true, get: function () { return init_db_1.initDatabase; } });
|
|
@@ -158,8 +158,12 @@ Object.defineProperty(exports, "upsertPushSubscription", { enumerable: true, get
|
|
|
158
158
|
Object.defineProperty(exports, "getPushSubscriptionByEndpoint", { enumerable: true, get: function () { return push_subscriptions_db_1.getPushSubscriptionByEndpoint; } });
|
|
159
159
|
Object.defineProperty(exports, "getAllPushSubscriptions", { enumerable: true, get: function () { return push_subscriptions_db_1.getAllPushSubscriptions; } });
|
|
160
160
|
Object.defineProperty(exports, "getPushSubscriptionsForKind", { enumerable: true, get: function () { return push_subscriptions_db_1.getPushSubscriptionsForKind; } });
|
|
161
|
+
// Issue #2001: how many devices are in the acting bucket, without reading them.
|
|
162
|
+
Object.defineProperty(exports, "countPushSubscriptionsForKind", { enumerable: true, get: function () { return push_subscriptions_db_1.countPushSubscriptionsForKind; } });
|
|
161
163
|
Object.defineProperty(exports, "updatePushSubscriptionPreferences", { enumerable: true, get: function () { return push_subscriptions_db_1.updatePushSubscriptionPreferences; } });
|
|
162
164
|
Object.defineProperty(exports, "deletePushSubscriptionByEndpoint", { enumerable: true, get: function () { return push_subscriptions_db_1.deletePushSubscriptionByEndpoint; } });
|
|
165
|
+
// Issue #2000: the per-kind state a *new* subscription is created with.
|
|
166
|
+
Object.defineProperty(exports, "NEW_SUBSCRIPTION_DEFAULTS", { enumerable: true, get: function () { return push_subscriptions_db_1.NEW_SUBSCRIPTION_DEFAULTS; } });
|
|
163
167
|
// verification-db (verification gate runs, Issue #1542)
|
|
164
168
|
var verification_db_1 = require("./verification-db");
|
|
165
169
|
Object.defineProperty(exports, "createVerificationRun", { enumerable: true, get: function () { return verification_db_1.createVerificationRun; } });
|
|
@@ -5,6 +5,17 @@
|
|
|
5
5
|
* One row per browser push subscription (device). `endpoint` is the natural key
|
|
6
6
|
* (unique) used for upsert and for 410-Gone auto-removal. Per-type toggles let a
|
|
7
7
|
* device opt in/out of "prompt waiting" and "completion" notifications independently.
|
|
8
|
+
*
|
|
9
|
+
* Issue #2000 — do not read `enabled_completion DEFAULT 1` as the product default.
|
|
10
|
+
* `upsertPushSubscription()` is the only INSERT into this table and it binds both
|
|
11
|
+
* toggle columns explicitly, so neither DEFAULT is ever applied. The live default
|
|
12
|
+
* for a new subscription is `NEW_SUBSCRIPTION_DEFAULTS` in
|
|
13
|
+
* `src/lib/db/push-subscriptions-db.ts`, which #2000 set to
|
|
14
|
+
* `enabledCompletion: false`. The declaration is left at 1 on purpose: SQLite
|
|
15
|
+
* cannot ALTER a column default, so changing it means rebuilding the table and
|
|
16
|
+
* copying every row — real risk to live subscriptions, bought for a value nothing
|
|
17
|
+
* reads. Changing it would also NOT have moved existing rows, which is what the
|
|
18
|
+
* adjudication on #2000 required.
|
|
8
19
|
*/
|
|
9
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
21
|
exports.v41_migrations = void 0;
|
|
@@ -8,13 +8,54 @@
|
|
|
8
8
|
* be logged — callers pass these straight through without logging.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.NEW_SUBSCRIPTION_DEFAULTS = void 0;
|
|
11
12
|
exports.upsertPushSubscription = upsertPushSubscription;
|
|
12
13
|
exports.getPushSubscriptionByEndpoint = getPushSubscriptionByEndpoint;
|
|
13
14
|
exports.getAllPushSubscriptions = getAllPushSubscriptions;
|
|
14
15
|
exports.getPushSubscriptionsForKind = getPushSubscriptionsForKind;
|
|
16
|
+
exports.countPushSubscriptionsForKind = countPushSubscriptionsForKind;
|
|
15
17
|
exports.updatePushSubscriptionPreferences = updatePushSubscriptionPreferences;
|
|
16
18
|
exports.deletePushSubscriptionByEndpoint = deletePushSubscriptionByEndpoint;
|
|
17
19
|
const crypto_1 = require("crypto");
|
|
20
|
+
/**
|
|
21
|
+
* Which stored toggle governs each kind (Issue #2000).
|
|
22
|
+
*
|
|
23
|
+
* The table keeps two columns on purpose. The Issue's own proposal is two
|
|
24
|
+
* buckets — "you need to act" and "for information" — and a prompt waiting, a
|
|
25
|
+
* failed verification, an upstream fault and a session that could not start are
|
|
26
|
+
* all the first one. A third column would have to be migrated, surfaced in the
|
|
27
|
+
* UI and explained, to split a bucket nobody has asked to split. Written as an
|
|
28
|
+
* exhaustive Record so a new kind fails the type check here rather than
|
|
29
|
+
* silently landing in the completion bucket.
|
|
30
|
+
*/
|
|
31
|
+
const KIND_COLUMN = {
|
|
32
|
+
prompt: 'enabled_prompt',
|
|
33
|
+
failure: 'enabled_prompt',
|
|
34
|
+
completion: 'enabled_completion',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Per-kind state a **newly created** subscription starts in (Issue #2000).
|
|
38
|
+
*
|
|
39
|
+
* `enabledCompletion: false` is the whole of the Issue's default change. It is
|
|
40
|
+
* applied here, in the INSERT, and NOT as a schema DEFAULT or a migration:
|
|
41
|
+
*
|
|
42
|
+
* - the INSERT below has always bound these two columns explicitly, so the
|
|
43
|
+
* `DEFAULT 1` v41 declares is dead code on this path (measured: it is the
|
|
44
|
+
* only INSERT into this table in `src/`);
|
|
45
|
+
* - existing rows must not move. Turning a live subscriber's completions off
|
|
46
|
+
* behind their back reads as "notifications broke", which is indistinguishable
|
|
47
|
+
* from a genuine fault. The adjudication on Issue #2000 is explicit: new
|
|
48
|
+
* subscriptions only, existing rows untouched.
|
|
49
|
+
*
|
|
50
|
+
* The `ON CONFLICT` clause below preserves per-type preferences, so a device
|
|
51
|
+
* that re-subscribes with the same endpoint keeps whatever it had — the new
|
|
52
|
+
* default reaches an existing reader only when their endpoint changes (another
|
|
53
|
+
* browser, another device, or a full unsubscribe/re-register).
|
|
54
|
+
*/
|
|
55
|
+
exports.NEW_SUBSCRIPTION_DEFAULTS = {
|
|
56
|
+
enabledPrompt: true,
|
|
57
|
+
enabledCompletion: false,
|
|
58
|
+
};
|
|
18
59
|
function mapRow(row) {
|
|
19
60
|
return {
|
|
20
61
|
id: row.id,
|
|
@@ -50,14 +91,14 @@ function upsertPushSubscription(db, input) {
|
|
|
50
91
|
id, endpoint, p256dh, auth, device_label,
|
|
51
92
|
enabled_prompt, enabled_completion, locale, created_at, updated_at
|
|
52
93
|
)
|
|
53
|
-
VALUES (?, ?, ?, ?, ?,
|
|
94
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
54
95
|
ON CONFLICT(endpoint) DO UPDATE SET
|
|
55
96
|
p256dh = excluded.p256dh,
|
|
56
97
|
auth = excluded.auth,
|
|
57
98
|
device_label = excluded.device_label,
|
|
58
99
|
locale = COALESCE(excluded.locale, push_subscriptions.locale),
|
|
59
100
|
updated_at = excluded.updated_at
|
|
60
|
-
`).run((0, crypto_1.randomUUID)(), input.endpoint, input.p256dh, input.auth, deviceLabel, locale, now, now);
|
|
101
|
+
`).run((0, crypto_1.randomUUID)(), input.endpoint, input.p256dh, input.auth, deviceLabel, exports.NEW_SUBSCRIPTION_DEFAULTS.enabledPrompt ? 1 : 0, exports.NEW_SUBSCRIPTION_DEFAULTS.enabledCompletion ? 1 : 0, locale, now, now);
|
|
61
102
|
const record = getPushSubscriptionByEndpoint(db, input.endpoint);
|
|
62
103
|
if (!record) {
|
|
63
104
|
throw new Error('Failed to persist push subscription');
|
|
@@ -80,12 +121,28 @@ function getAllPushSubscriptions(db) {
|
|
|
80
121
|
}
|
|
81
122
|
/** Subscriptions that have opted into a given notification kind. */
|
|
82
123
|
function getPushSubscriptionsForKind(db, kind) {
|
|
83
|
-
const column = kind
|
|
124
|
+
const column = KIND_COLUMN[kind];
|
|
84
125
|
const rows = db
|
|
85
126
|
.prepare(`SELECT ${SELECT_COLUMNS} FROM push_subscriptions WHERE ${column} = 1 ORDER BY created_at ASC`)
|
|
86
127
|
.all();
|
|
87
128
|
return rows.map(mapRow);
|
|
88
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* How many subscriptions have opted into a given kind (Issue #2001).
|
|
132
|
+
*
|
|
133
|
+
* Separate from {@link getPushSubscriptionsForKind} because the cross-device
|
|
134
|
+
* dismissal asks a question about the *fleet*, not about the rows: "is there a
|
|
135
|
+
* second device that could still be holding a stale card?". Counting in SQL
|
|
136
|
+
* keeps that decision from materialising — and from logging the shape of — a
|
|
137
|
+
* table of endpoints and encryption keys it has no use for.
|
|
138
|
+
*/
|
|
139
|
+
function countPushSubscriptionsForKind(db, kind) {
|
|
140
|
+
const column = KIND_COLUMN[kind];
|
|
141
|
+
const row = db
|
|
142
|
+
.prepare(`SELECT COUNT(*) AS total FROM push_subscriptions WHERE ${column} = 1`)
|
|
143
|
+
.get();
|
|
144
|
+
return row.total;
|
|
145
|
+
}
|
|
89
146
|
/** Update per-type preferences for a subscription. Returns the updated record or null. */
|
|
90
147
|
function updatePushSubscriptionPreferences(db, endpoint, prefs) {
|
|
91
148
|
const assignments = ['updated_at = ?'];
|