commandmate 0.31.2 → 0.32.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 +454 -440
- package/.next/app-path-routes-manifest.json +31 -29
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_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.js.nft.json +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 -32
- 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 -33
- 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 -1
- package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/relays/[relayId]/cancel/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/route.js +1 -0
- package/.next/server/app/api/relays/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +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 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +2 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +2 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/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 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +103 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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]/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 +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/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/apply-default-agents/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_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 +1 -1
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- 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 +31 -29
- package/.next/server/chunks/1191.js +1 -1
- package/.next/server/chunks/1210.js +1 -0
- package/.next/server/chunks/153.js +1 -0
- package/.next/server/chunks/1886.js +1 -1
- package/.next/server/chunks/21.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3077.js +67 -0
- package/.next/server/chunks/3086.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3270.js +1 -0
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -0
- package/.next/server/chunks/3925.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4443.js +2 -1
- package/.next/server/chunks/5043.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5220.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/595.js +8 -0
- package/.next/server/chunks/6286.js +48 -0
- package/.next/server/chunks/6306.js +1 -0
- package/.next/server/chunks/6363.js +1 -0
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6491.js +103 -0
- package/.next/server/chunks/6661.js +1 -0
- package/.next/server/chunks/6838.js +1 -0
- package/.next/server/chunks/7875.js +25 -0
- package/.next/server/chunks/7890.js +1 -0
- package/.next/server/chunks/8063.js +32 -0
- package/.next/server/chunks/8118.js +1 -1
- package/.next/server/chunks/{7587.js → 8554.js} +1 -1
- package/.next/server/chunks/8687.js +1 -0
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8807.js +37 -3
- package/.next/server/chunks/8918.js +6 -4
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +22 -6
- 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/UIUPchtWvcEuQgcbGJv4g/_buildManifest.js +1 -0
- package/.next/static/chunks/{5694.dda65070757534df.js → 3313.53f7ff985c0c8852.js} +1 -1
- package/.next/static/chunks/4718-0053d42fb635e700.js +1 -0
- package/.next/static/chunks/{4974-35592ec312322124.js → 5694-498765336d0b8c2b.js} +1 -1
- package/.next/static/chunks/{7485.442b21101fca7257.js → 7485.52361bc061cc663a.js} +1 -1
- package/.next/static/chunks/8019-cbf130d0e6334d2d.js +1 -0
- package/.next/static/chunks/8361-9bb887203c456edb.js +1 -0
- package/.next/static/chunks/8772-9be53a530950d804.js +1 -0
- package/.next/static/chunks/998-ac0ded6d5eeb4dc0.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/relays/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/templates/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/chat/{page-37d7615d17d7e2a0.js → page-e60d07c4c79602f0.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/more/{page-353a3924e6d7968e.js → page-fc94f86aa881489e.js} +1 -1
- package/.next/static/chunks/app/{page-c2bf871d953a1d6f.js → page-6871cca022b24807.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/repositories/{page-7d0f26df0537254c.js → page-788ded1b72963d94.js} +1 -1
- package/.next/static/chunks/app/review/{page-e3f141b2829973e9.js → page-35b99baaf3c93b38.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-53f188ed9ca49e5f.js → page-fa2d62f3e8436c69.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-80569b720aea59cc.js → page-06799157652e8fa9.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-dbd2690ad72da95b.js → page-2f3987e3a131c8d0.js} +1 -1
- package/.next/static/chunks/app/skills/{page-dacd36f9c11aa7da.js → page-e70bfcf5ed4e4865.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-06e1ff5ce2d126fd.js +1 -0
- package/.next/static/chunks/webpack-1dc9eb5ebb4fa5ff.js +1 -0
- package/.next/static/css/96d94a4ba771efc3.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/cancel/route.ts +347 -0
- package/.next/types/app/api/relays/route.ts +347 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/dist/cli/commands/ask.d.ts +34 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +494 -0
- package/dist/cli/commands/capture.d.ts +20 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +80 -30
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +47 -4
- package/dist/cli/commands/instances.d.ts +67 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +103 -7
- package/dist/cli/commands/peers.d.ts +64 -0
- package/dist/cli/commands/peers.d.ts.map +1 -0
- package/dist/cli/commands/peers.js +196 -0
- package/dist/cli/commands/relays.d.ts +92 -0
- package/dist/cli/commands/relays.d.ts.map +1 -0
- package/dist/cli/commands/relays.js +293 -0
- package/dist/cli/commands/report.d.ts +3 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +29 -1
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +13 -10
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +66 -20
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +30 -0
- package/dist/cli/commands/wait.d.ts +20 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +55 -6
- package/dist/cli/commands/whoami.d.ts +109 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +271 -0
- package/dist/cli/docs/agent-operations.d.ts +25 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +184 -1
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +25 -1
- package/dist/cli/types/api-responses.d.ts +93 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +16 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/lib/cli/command-reference.d.ts +179 -0
- package/dist/lib/cli/command-reference.d.ts.map +1 -0
- package/dist/lib/cli/command-reference.js +210 -0
- package/dist/lib/detection/ansi.d.ts +14 -1
- package/dist/lib/detection/ansi.d.ts.map +1 -1
- package/dist/lib/detection/ansi.js +40 -3
- package/dist/lib/detection/status-reason.d.ts +28 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +28 -0
- package/dist/lib/detection/tools/verified-against.d.ts +24 -24
- package/dist/lib/detection/tools/verified-against.js +24 -24
- package/dist/server/locales/en/worktree.json +1425 -0
- package/dist/server/locales/ja/worktree.json +1425 -0
- package/dist/server/src/lib/auto-yes-poller.js +26 -11
- package/dist/server/src/lib/db/chat-db.js +204 -7
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v60-session-relays.js +110 -0
- package/dist/server/src/lib/db/relay-db.js +343 -0
- package/dist/server/src/lib/detection/ansi.js +40 -3
- package/dist/server/src/lib/detection/cli-patterns.js +157 -23
- package/dist/server/src/lib/detection/model-info-extractor.js +185 -4
- package/dist/server/src/lib/detection/selection-shape.js +72 -1
- package/dist/server/src/lib/detection/status-reason.js +28 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +105 -25
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +239 -0
- package/dist/server/src/lib/detection/tools/command-code/detect.js +33 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +24 -24
- package/dist/server/src/lib/history/user-turn-recorder.js +79 -16
- package/dist/server/src/lib/hooks/hook-settings-generator.js +16 -0
- package/dist/server/src/lib/hooks/sources/claude/model-switch.js +169 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +14 -1
- package/dist/server/src/lib/polling/response-checker.js +55 -2
- package/dist/server/src/lib/polling/structured-history-gate.js +14 -1
- package/dist/server/src/lib/push/index.js +13 -1
- package/dist/server/src/lib/push/model-change-push-notifier.js +174 -0
- package/dist/server/src/lib/push/push-sender.js +48 -20
- package/dist/server/src/lib/realtime/model-change-broadcast.js +171 -0
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/realtime/types.js +19 -1
- package/dist/server/src/lib/realtime/waiting-broadcast.js +25 -0
- package/dist/server/src/lib/relay/relay-delivery.js +400 -0
- package/dist/server/src/lib/relay/relay-messages.js +144 -0
- package/dist/server/src/lib/relay/relay-policy.js +127 -0
- package/dist/server/src/lib/relay/relay-readiness.js +63 -0
- package/dist/server/src/lib/relay/relay-session-ref.js +72 -0
- package/dist/server/src/lib/relay/relay-system-line.js +79 -0
- package/dist/server/src/lib/relay/relay-triggers.js +177 -0
- package/dist/server/src/lib/relay/types.js +25 -0
- package/dist/server/src/lib/session/agent-event-state.js +344 -12
- package/dist/server/src/lib/session/current-output-builder.js +18 -0
- package/dist/server/src/lib/session/send-user-message.js +1 -0
- package/package.json +1 -1
- package/.next/server/chunks/1058.js +0 -1
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/261.js +0 -1
- package/.next/server/chunks/2739.js +0 -1
- package/.next/server/chunks/2839.js +0 -1
- package/.next/server/chunks/3869.js +0 -1
- package/.next/server/chunks/4325.js +0 -1
- package/.next/server/chunks/4393.js +0 -1
- package/.next/server/chunks/5017.js +0 -1
- package/.next/server/chunks/5120.js +0 -1
- package/.next/server/chunks/552.js +0 -25
- package/.next/server/chunks/6130.js +0 -1
- package/.next/server/chunks/6894.js +0 -8
- package/.next/server/chunks/7187.js +0 -1
- package/.next/server/chunks/7472.js +0 -1
- package/.next/server/chunks/7836.js +0 -1
- package/.next/server/chunks/7859.js +0 -21
- package/.next/server/chunks/9696.js +0 -3
- package/.next/server/chunks/9798.js +0 -2
- package/.next/static/GiOqe8rfQGQ0NvzB5qr3q/_buildManifest.js +0 -1
- package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +0 -1
- package/.next/static/chunks/4718-0d4d93c4c75f336e.js +0 -1
- package/.next/static/chunks/6170-951b9f5fe6b4b3b5.js +0 -1
- package/.next/static/chunks/8019-f8e73c1fb5f6f0d3.js +0 -1
- package/.next/static/chunks/8593-fa0eb2802e0ce68a.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/templates/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-7a0915e32a2af4d3.js +0 -1
- package/.next/static/chunks/webpack-9f75198882fdaf08.js +0 -1
- package/.next/static/css/5c13ea243dfdcb66.css +0 -1
- /package/.next/static/{GiOqe8rfQGQ0NvzB5qr3q → UIUPchtWvcEuQgcbGJv4g}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code's `PostModelSwitch` hook, as CommandMate reads it (Issue #2363).
|
|
4
|
+
*
|
|
5
|
+
* #2361 detected a `/model` switch off the pane, because the seven events
|
|
6
|
+
* CommandMate registered never mentioned it: Claude names its model on
|
|
7
|
+
* `SessionStart` and on nothing else. The same probe found the build emitting
|
|
8
|
+
* a pair of dedicated hooks, and this module is the structured half of the
|
|
9
|
+
* answer — the frame reader stays as the fallback (see
|
|
10
|
+
* `lib/session/agent-event-state`'s `FRAME_OVERTAKES_HOOK_MODEL_TOOLS`).
|
|
11
|
+
*
|
|
12
|
+
* ## Measured on claude 2.1.263 (2026-09-06, isolated `CLAUDE_CONFIG_DIR`)
|
|
13
|
+
*
|
|
14
|
+
* Re-taken for this Issue rather than inherited from #2361, whose numbers were
|
|
15
|
+
* a by-product. Payload, delivered verbatim by a `type: "http"` hook injected
|
|
16
|
+
* through `--settings` — the same channel every other event here uses:
|
|
17
|
+
*
|
|
18
|
+
* ```json
|
|
19
|
+
* {
|
|
20
|
+
* "session_id": "…", "transcript_path": "…", "cwd": "…", "prompt_id": "…",
|
|
21
|
+
* "hook_event_name": "PostModelSwitch",
|
|
22
|
+
* "from_model": "claude-haiku-4-5-20251001",
|
|
23
|
+
* "to_model": "claude-sonnet-5",
|
|
24
|
+
* "requested_model": "sonnet",
|
|
25
|
+
* "source": "command",
|
|
26
|
+
* "context_tokens": 0, "prompt_cache_warm": false, "cache_ttl": "5m",
|
|
27
|
+
* "estimated_cache_write_usd": 0, "pricing": "catalog"
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* - **`to_model` is the model id in the `SessionStart` spelling** —
|
|
32
|
+
* `claude-sonnet-5`, `claude-haiku-4-5-20251001`, `claude-opus-5`,
|
|
33
|
+
* `claude-opus-5[1m]` — so the latch in `agent-event-state` compares like
|
|
34
|
+
* with like, and the `[1m]` suffix travels with it.
|
|
35
|
+
* - **`/fast` is a switch**: ON from Haiku reported `to_model:
|
|
36
|
+
* "claude-opus-5[1m]"`, `requested_model: null`, `source: "command"`. That
|
|
37
|
+
* is the fix for the spelling drift #2361 refused to read (the confirmation
|
|
38
|
+
* line says `Opus 5`, the banner `Opus 5 (1M context)`): the hook spells it
|
|
39
|
+
* the one way. `/fast` OFF fires nothing and the model stays on Opus.
|
|
40
|
+
* - **`requested_model` is null** for `/model default` (→ `claude-opus-5[1m]`)
|
|
41
|
+
* and for `/fast`, and is the user's alias (`sonnet`) otherwise. Never read.
|
|
42
|
+
* - **`source`** is `command` for `/model <arg>` and `/fast`, `picker` for the
|
|
43
|
+
* interactive list (measured with `s`). The schema also names `sdk`, `auto`
|
|
44
|
+
* and `resume`; none were reproducible. Not read.
|
|
45
|
+
* - **Nothing fires when the model does not change**: `/model haiku` while on
|
|
46
|
+
* Haiku, `/fast` while already on Opus 1M, the picker's `Esc` (`Kept model
|
|
47
|
+
* as`), and `/effort` all stay silent. `/clear` emits its usual
|
|
48
|
+
* `SessionEnd` + `SessionStart` (no `model` key) and no switch.
|
|
49
|
+
* - **There is no `model` key on this event.** The generic `modelFields:
|
|
50
|
+
* ['model']` lookup answers null for it, which is why the extraction below
|
|
51
|
+
* exists rather than a second entry in that list.
|
|
52
|
+
*
|
|
53
|
+
* ## Why `from_model` is never read
|
|
54
|
+
*
|
|
55
|
+
* It is the model the session was on BEFORE the switch. Reading it as "the
|
|
56
|
+
* model" would move the latch backwards on the very event that reports a
|
|
57
|
+
* forward move. It is also the field the paired `PreModelSwitch` got wrong:
|
|
58
|
+
* in the probe's second session that hook fired **twice per switch**, and on
|
|
59
|
+
* `/fast` the second of the two named `from_model: "claude-sonnet-5"` for a
|
|
60
|
+
* session that was on Haiku (`PostModelSwitch` fired once, and agreed with
|
|
61
|
+
* the screen, every time).
|
|
62
|
+
*
|
|
63
|
+
* ## Why `PreModelSwitch` is not registered
|
|
64
|
+
*
|
|
65
|
+
* Three measured reasons. It is a decision hook — its response body can block
|
|
66
|
+
* or redirect the switch — and the event receiver answers a fixed 202 that
|
|
67
|
+
* decides nothing, so registering it would put a blocking round-trip (5 s at
|
|
68
|
+
* worst, on a wedged server) in front of every `/model` for no information.
|
|
69
|
+
* It fired twice per switch with inconsistent values (above). And its
|
|
70
|
+
* `to_model` is the request, not the outcome — the second of that pair on
|
|
71
|
+
* `/model haiku` said `to_model: "claude-sonnet-5"`; `PostModelSwitch` alone
|
|
72
|
+
* is the event that says what happened. The Issue leaves this to
|
|
73
|
+
* implementation judgement, and this is it.
|
|
74
|
+
*
|
|
75
|
+
* ## Which of the seven words
|
|
76
|
+
*
|
|
77
|
+
* `notification`, with a subtype of its own ({@link modelSwitchDetail}). A
|
|
78
|
+
* model switch is the agent telling the human something and is neither a turn
|
|
79
|
+
* boundary nor a tool call; `agent-event-state` treats a `notification` whose
|
|
80
|
+
* subtype it does not recognise as evidence of nothing (no status, no dialog,
|
|
81
|
+
* no turn), and `status-mapping` answers null for it — measured behaviour, not
|
|
82
|
+
* a hope. The one thing every event does is run the model latch, and that is
|
|
83
|
+
* the whole point of delivering this one.
|
|
84
|
+
*
|
|
85
|
+
* @module lib/hooks/sources/claude/model-switch
|
|
86
|
+
*/
|
|
87
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
88
|
+
exports.claudeModelSwitchMapper = exports.MODEL_SWITCH_DETAIL = exports.CLAUDE_PRE_MODEL_SWITCH_EVENT_NAME = exports.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME = void 0;
|
|
89
|
+
exports.modelSwitchDetail = modelSwitchDetail;
|
|
90
|
+
exports.isModelSwitchDetail = isModelSwitchDetail;
|
|
91
|
+
exports.isClaudeModelSwitchPayload = isClaudeModelSwitchPayload;
|
|
92
|
+
exports.extractClaudeSwitchedModel = extractClaudeSwitchedModel;
|
|
93
|
+
const event_mapper_1 = require("../event-mapper");
|
|
94
|
+
/** Claude's own name for the event; the key written into `--settings`. */
|
|
95
|
+
exports.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME = 'PostModelSwitch';
|
|
96
|
+
/**
|
|
97
|
+
* The paired decision hook, which is deliberately NOT registered — see the
|
|
98
|
+
* module comment. Named here so the test that pins its absence from the
|
|
99
|
+
* injected settings spells it the way this module does.
|
|
100
|
+
*/
|
|
101
|
+
exports.CLAUDE_PRE_MODEL_SWITCH_EVENT_NAME = 'PreModelSwitch';
|
|
102
|
+
/**
|
|
103
|
+
* The subtype a switch is filed under (Issue #2363).
|
|
104
|
+
*
|
|
105
|
+
* A word of CommandMate's own, beside Claude's `permission_prompt` /
|
|
106
|
+
* `idle_prompt` on the same event. Nothing branches on it — the model rides on
|
|
107
|
+
* the normalised event's `model`, not on the subtype — but two things read it:
|
|
108
|
+
* `structuredEvents.lastEventDetail` shows it, and the receiver's
|
|
109
|
+
* de-duplication key carries it. See {@link modelSwitchDetail} for why the
|
|
110
|
+
* target model is appended.
|
|
111
|
+
*/
|
|
112
|
+
exports.MODEL_SWITCH_DETAIL = 'model_switch';
|
|
113
|
+
/** The payload key that names the model the session is now on. */
|
|
114
|
+
const TO_MODEL_FIELD = 'to_model';
|
|
115
|
+
/**
|
|
116
|
+
* `model_switch:<to_model>`, or the bare word when the switch names no target.
|
|
117
|
+
*
|
|
118
|
+
* The target is part of the subtype because the subtype is part of the
|
|
119
|
+
* receiver's de-duplication key: `(instance, event, detail, session_id)` within
|
|
120
|
+
* a 3 s window (`isDuplicateAgentEvent`). With a fixed word, two switches to
|
|
121
|
+
* DIFFERENT models inside that window — the picker's `s` followed by `/fast`,
|
|
122
|
+
* a `/model` typed twice to correct itself — would collapse into one and the
|
|
123
|
+
* second target would be lost until the frame caught up. With the target in
|
|
124
|
+
* the key, only a second delivery of the SAME switch collapses, which is the
|
|
125
|
+
* case the window exists for (a user's own `PostModelSwitch` hook is
|
|
126
|
+
* concatenated with the injected one, and both name the same `to_model`).
|
|
127
|
+
*/
|
|
128
|
+
function modelSwitchDetail(toModel) {
|
|
129
|
+
return toModel === null ? exports.MODEL_SWITCH_DETAIL : `${exports.MODEL_SWITCH_DETAIL}:${toModel}`;
|
|
130
|
+
}
|
|
131
|
+
/** Whether a recorded `detail` is one this module wrote, target or no target. */
|
|
132
|
+
function isModelSwitchDetail(detail) {
|
|
133
|
+
return detail === exports.MODEL_SWITCH_DETAIL || (detail?.startsWith(`${exports.MODEL_SWITCH_DETAIL}:`) ?? false);
|
|
134
|
+
}
|
|
135
|
+
/** True for the one native event this module speaks for. */
|
|
136
|
+
function isClaudeModelSwitchPayload(payload) {
|
|
137
|
+
return (0, event_mapper_1.readStringField)(payload, 'hook_event_name') === exports.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The rule that maps `PostModelSwitch` onto `notification(model_switch:<to_model>)`.
|
|
141
|
+
*
|
|
142
|
+
* Appended after the shared CamelCase table in `./source`, so every spelling
|
|
143
|
+
* that table already claims keeps its word.
|
|
144
|
+
*/
|
|
145
|
+
const claudeModelSwitchMapper = (nativeEventName, payload) => nativeEventName === exports.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME
|
|
146
|
+
? {
|
|
147
|
+
event: 'notification',
|
|
148
|
+
detail: modelSwitchDetail((0, event_mapper_1.readStringField)(payload, TO_MODEL_FIELD)),
|
|
149
|
+
}
|
|
150
|
+
: null;
|
|
151
|
+
exports.claudeModelSwitchMapper = claudeModelSwitchMapper;
|
|
152
|
+
/**
|
|
153
|
+
* The model a `PostModelSwitch` reports, or null for any other payload.
|
|
154
|
+
*
|
|
155
|
+
* `to_model` and only `to_model`: `from_model` is the value being left behind
|
|
156
|
+
* and `requested_model` is an alias that is null for `/model default` and
|
|
157
|
+
* `/fast`. Answers null for a switch that somehow carries no `to_model`, which
|
|
158
|
+
* the caller (`buildNormalizedEvent`) turns into "this event names no model"
|
|
159
|
+
* — the latch is left where it was rather than blanked or reversed.
|
|
160
|
+
*
|
|
161
|
+
* Declared as the source's `extractModel`, which runs before the flat
|
|
162
|
+
* `modelFields` lookup; for every other event it answers null and the lookup
|
|
163
|
+
* proceeds exactly as it did before this Issue.
|
|
164
|
+
*/
|
|
165
|
+
function extractClaudeSwitchedModel(payload) {
|
|
166
|
+
if (!isClaudeModelSwitchPayload(payload))
|
|
167
|
+
return null;
|
|
168
|
+
return (0, event_mapper_1.readStringField)(payload, TO_MODEL_FIELD);
|
|
169
|
+
}
|
|
@@ -41,6 +41,7 @@ const permission_request_payload_1 = require("../../../../lib/hooks/permission-r
|
|
|
41
41
|
const define_source_1 = require("../define-source");
|
|
42
42
|
const event_mapper_1 = require("../event-mapper");
|
|
43
43
|
const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
|
|
44
|
+
const model_switch_1 = require("./model-switch");
|
|
44
45
|
const tool_id_1 = require("./tool-id");
|
|
45
46
|
/**
|
|
46
47
|
* The no-decision body, byte for byte what the #1721 spike returned for D5.
|
|
@@ -129,7 +130,12 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
129
130
|
// word, no predicates — so it is expressed as rules built from the table
|
|
130
131
|
// rather than as a table, and a source that needs conditions (opencode) adds
|
|
131
132
|
// them to the same list.
|
|
132
|
-
|
|
133
|
+
//
|
|
134
|
+
// Issue #2363: plus the one spelling that is Claude's alone. `PostModelSwitch`
|
|
135
|
+
// is filed as `notification(model_switch:<to_model>)` — see `./model-switch`
|
|
136
|
+
// for the measurement and for why its `Pre` twin is not here. Appended after
|
|
137
|
+
// the shared table so nothing that table claims changes its word.
|
|
138
|
+
mappers: [...(0, event_mapper_1.fromNameTable)(hook_event_vocabulary_1.CAMEL_CASE_HOOK_EVENT_NAMES), model_switch_1.claudeModelSwitchMapper],
|
|
133
139
|
nativeEventNameFields: ['hook_event_name'],
|
|
134
140
|
conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
|
|
135
141
|
toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
|
|
@@ -140,6 +146,13 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
140
146
|
// does that. The value arrives with its own suffix (`claude-opus-5[1m]`) and
|
|
141
147
|
// is not parsed here: a display string the tool chose is the tool's to spell.
|
|
142
148
|
modelFields: ['model'],
|
|
149
|
+
// Issue #2363. The second and only other event that names a model, and it
|
|
150
|
+
// names it under a different key: `PostModelSwitch` carries `to_model` (the
|
|
151
|
+
// model the session is now on) and no `model` at all. Read there, and only
|
|
152
|
+
// there — `from_model` is the value being left behind and must never reach
|
|
153
|
+
// the latch. `extractModel` runs before `modelFields`, and answers null for
|
|
154
|
+
// every other event so the flat lookup above is unchanged for them.
|
|
155
|
+
extractModel: model_switch_1.extractClaudeSwitchedModel,
|
|
143
156
|
// S2.
|
|
144
157
|
extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
|
|
145
158
|
// S7. Both parsers are strict and answer null for anything they cannot vouch
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.incompleteResult = incompleteResult;
|
|
5
5
|
exports.buildPromptExtractionResult = buildPromptExtractionResult;
|
|
6
|
+
exports.detectPromptOnCleanFrame = detectPromptOnCleanFrame;
|
|
6
7
|
exports.detectPromptWithOptions = detectPromptWithOptions;
|
|
7
8
|
exports.extractResponse = extractResponse;
|
|
8
9
|
exports.checkForResponse = checkForResponse;
|
|
@@ -11,6 +12,7 @@ const db_instance_1 = require("../../lib/db/db-instance");
|
|
|
11
12
|
const db_1 = require("../../lib/db");
|
|
12
13
|
const ws_server_1 = require("../../lib/ws-server");
|
|
13
14
|
const prompt_detector_1 = require("../../lib/detection/prompt-detector");
|
|
15
|
+
const dialog_1 = require("../../lib/detection/tools/antigravity/dialog");
|
|
14
16
|
const conversation_logger_1 = require("../../lib/conversation-logger");
|
|
15
17
|
const types_1 = require("../../lib/cli-tools/types");
|
|
16
18
|
const claude_output_1 = require("../../lib/claude-output");
|
|
@@ -28,6 +30,7 @@ const prompt_dedup_1 = require("./prompt-dedup");
|
|
|
28
30
|
const prompt_dedup_state_1 = require("./prompt-dedup-state");
|
|
29
31
|
const response_dedup_1 = require("./response-dedup");
|
|
30
32
|
const structured_history_gate_1 = require("./structured-history-gate");
|
|
33
|
+
const relay_triggers_1 = require("../../lib/relay/relay-triggers");
|
|
31
34
|
// Issue #2317 Phase D: while a human holds the pane's geometry, the frame is
|
|
32
35
|
// their terminal (44 rows), not the 1000-row canvas every rule below was
|
|
33
36
|
// measured against. See the block in `checkForResponse` for what that changes.
|
|
@@ -179,6 +182,49 @@ function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, buffer
|
|
|
179
182
|
captureWindowSaturated,
|
|
180
183
|
};
|
|
181
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* The one reading of a frame that every consumer of it shares, for a capture
|
|
187
|
+
* that has ALREADY been through `stripBoxDrawing(stripAnsi(…))`.
|
|
188
|
+
*
|
|
189
|
+
* Split out of {@link detectPromptWithOptions} by Issue #2368 so the Auto-Yes
|
|
190
|
+
* poller can reach it. That poller cleans its own capture once per tick
|
|
191
|
+
* (`captureAndCleanOutput`) and reuses the cleaned string and its line split for
|
|
192
|
+
* the stop-condition delta, the dialog gate and the thinking check, so handing
|
|
193
|
+
* it back through `detectPromptWithOptions` would clean it a SECOND time — and
|
|
194
|
+
* `stripBoxDrawing` is not idempotent (it removes one leading `│` per pass, so a
|
|
195
|
+
* doubly-bordered row loses a second character on the second pass). Taking the
|
|
196
|
+
* already-clean frame here is what keeps the two callers reading identical text.
|
|
197
|
+
*
|
|
198
|
+
* @param cleanOutput - tmux output with ANSI **and** box drawing already removed
|
|
199
|
+
* @param cliToolId - CLI tool identifier for building detection options
|
|
200
|
+
* @param precomputedLines - `cleanOutput.split('\n')` when the caller already has it
|
|
201
|
+
* (Issue #499 Item 4); must be the split of THIS string, not of the raw capture
|
|
202
|
+
* @returns PromptDetectionResult with isPrompt, promptData, and cleanContent
|
|
203
|
+
*/
|
|
204
|
+
function detectPromptOnCleanFrame(cleanOutput, cliToolId, precomputedLines) {
|
|
205
|
+
// Issue #2364: agy's `↑/↓ Navigate` dialogs are read by agy's own reader
|
|
206
|
+
// before the generic pass, on the same spelling `tools/antigravity/detect.ts`
|
|
207
|
+
// reads them on. The generic multiple-choice parser takes one row per option
|
|
208
|
+
// and agy wraps a long command across several rows of one label, so without
|
|
209
|
+
// this the poller stored nothing for the frame the status API published as a
|
|
210
|
+
// prompt — and, on the file-creation menu, stored a question with the diff
|
|
211
|
+
// preview joined into it. One reader for both producers is what makes the
|
|
212
|
+
// stored `prompt` row, the push notification's excerpt and `/current-output`
|
|
213
|
+
// agree about one screen.
|
|
214
|
+
//
|
|
215
|
+
// Issue #2368: and the Auto-Yes poller, which was the one consumer #2364 left
|
|
216
|
+
// on the generic pass. agy's Bash approvals wrap their option labels with no
|
|
217
|
+
// indentation, `isContinuationLine` refuses those rows, and the frame came
|
|
218
|
+
// back `isPrompt: false` — so Auto-Yes sent nothing at all while the status
|
|
219
|
+
// API published the very same screen as an answerable four-option prompt.
|
|
220
|
+
if (cliToolId === 'antigravity') {
|
|
221
|
+
const dialog = (0, dialog_1.detectAntigravityNumberedDialogPrompt)(cleanOutput);
|
|
222
|
+
if (dialog !== null)
|
|
223
|
+
return dialog;
|
|
224
|
+
}
|
|
225
|
+
const promptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
|
|
226
|
+
return (0, prompt_detector_1.detectPrompt)(cleanOutput, precomputedLines ? { ...promptOptions, precomputedLines } : promptOptions);
|
|
227
|
+
}
|
|
182
228
|
/**
|
|
183
229
|
* Internal helper: detect prompt with CLI-tool-specific options.
|
|
184
230
|
*
|
|
@@ -190,8 +236,7 @@ function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, buffer
|
|
|
190
236
|
* @returns PromptDetectionResult with isPrompt, promptData, and cleanContent
|
|
191
237
|
*/
|
|
192
238
|
function detectPromptWithOptions(output, cliToolId) {
|
|
193
|
-
|
|
194
|
-
return (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(output)), promptOptions);
|
|
239
|
+
return detectPromptOnCleanFrame((0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(output)), cliToolId);
|
|
195
240
|
}
|
|
196
241
|
// ============================================================================
|
|
197
242
|
// extractResponse (internal)
|
|
@@ -1030,6 +1075,14 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
|
|
|
1030
1075
|
});
|
|
1031
1076
|
// Broadcast message to WebSocket clients
|
|
1032
1077
|
(0, ws_server_1.broadcastMessage)('message', { worktreeId, message });
|
|
1078
|
+
// Issue #2377: the scrape path's completion edge. `settled: false` is the
|
|
1079
|
+
// whole difference from the gate's own announcement: this row was read off
|
|
1080
|
+
// a SCREEN whose completion was judged by string analysis, so a relay
|
|
1081
|
+
// waiting on this session re-reads after a few seconds of quiet before it
|
|
1082
|
+
// delivers — the Issue's 「完了検知 + 数秒の静穏」 for the three tools that
|
|
1083
|
+
// keep no transcript. Announced here rather than after the `if` because
|
|
1084
|
+
// the suppressed branch means the gate already announced it, settled.
|
|
1085
|
+
(0, relay_triggers_1.onRelayTurnCompleted)(worktreeId, cliToolId, resolvedInstanceId, false);
|
|
1033
1086
|
}
|
|
1034
1087
|
else {
|
|
1035
1088
|
logger.info('structured-history-scrape-suppressed', {
|
|
@@ -81,6 +81,7 @@ const tool_id_2 = require("../../lib/hooks/sources/codex/tool-id");
|
|
|
81
81
|
const tool_id_3 = require("../../lib/hooks/sources/antigravity/tool-id");
|
|
82
82
|
const tool_id_4 = require("../../lib/hooks/sources/command-code/tool-id");
|
|
83
83
|
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
84
|
+
const relay_triggers_1 = require("../../lib/relay/relay-triggers");
|
|
84
85
|
const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate');
|
|
85
86
|
/**
|
|
86
87
|
* One in-flight capture per instance (Issue #2246).
|
|
@@ -286,7 +287,19 @@ async function captureStructuredHistoryTurn(worktreeId, cliToolId, instanceId, c
|
|
|
286
287
|
const resolvedInstanceId = instanceId ?? cliToolId;
|
|
287
288
|
return serializePerInstance(captureKeyOf(worktreeId, cliToolId, resolvedInstanceId), async () => {
|
|
288
289
|
try {
|
|
289
|
-
|
|
290
|
+
const captured = await reader.capture({ worktreeId, cliToolId, instanceId: resolvedInstanceId }, capture);
|
|
291
|
+
// Issue #2377: the moment a relay is waiting for. This is the single
|
|
292
|
+
// point BOTH triggers of a pull capture pass through — the poller's save
|
|
293
|
+
// path and the Stop hook receiver — which is why the relay needs one
|
|
294
|
+
// hook here and not one in each of them. The turn is closed by the
|
|
295
|
+
// agent's own account, so the delivery needs no quiet window.
|
|
296
|
+
//
|
|
297
|
+
// Announced only when the capture actually wrote something: a `false`
|
|
298
|
+
// means the scraper is still the writer for this turn, and the poller's
|
|
299
|
+
// own call below will announce it.
|
|
300
|
+
if (captured)
|
|
301
|
+
(0, relay_triggers_1.onRelayTurnCompleted)(worktreeId, cliToolId, resolvedInstanceId, true);
|
|
302
|
+
return captured;
|
|
290
303
|
}
|
|
291
304
|
catch (error) {
|
|
292
305
|
logger.warn('structured-history-capture-unavailable', {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/** Web Push module barrel (Issue #1125). */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.notifyPromptResolved = exports.decidePromptResolution = exports.MAX_ESCALATION_THRESHOLD_MINUTES = exports.MIN_ESCALATION_THRESHOLD_MINUTES = exports.ESCALATION_SETTINGS_KEY = exports.ESCALATION_THRESHOLD_CHOICES = exports.DEFAULT_ESCALATION_SETTINGS = exports.normalizeEscalationSettings = exports.setPushEscalationSettings = exports.getPushEscalationSettings = exports.ESCALATION_TICK_MS = exports.pendingEscalationCount = exports.runEscalationTick = exports.handleWaitingTransition = exports.isWaitingPushNotifierActive = exports.stopWaitingPushNotifier = exports.startWaitingPushNotifier = exports.UPSTREAM_FAULT_COOLDOWN_MS = exports.clearUpstreamFaultEpisodes = exports.observeUpstreamFaultEdge = exports.notifySessionStartFailurePush = exports.notifyUpstreamFaultPush = exports.notifyVerificationFailurePush = exports.isPromptPushSuppressed = exports.decidePromptPush = exports.resetWaitingPushDedup = exports.shouldSendWaitingPush = exports.DEFAULT_DEDUP_WINDOW_MS = exports.resetNotificationDedup = exports.shouldSendNotification = exports.resolvePushLocale = exports.buildExcerpt = exports.buildPushPayload = exports.notifyPushSubscribers = exports.PUSH_DELIVERY_HEALTH_MAX_AGE_MS = exports.PUSH_DELIVERY_HEALTH_KEY_PREFIX = exports.clearAllPushDeliveryHealth = exports.clearPushDeliveryHealth = exports.recordPushDeliveryFailure = exports.getPushDeliveryHealth = exports.VAPID_ENV_KEYS = exports.VAPID_DEFAULT_SUBJECT = exports.extractVapidSubjectHost = exports.classifyVapidSubject = exports.runVapidSelfCheck = exports.formatVapidReportLines = exports.inspectVapidConfig = exports.getVapidPublicKey = exports.isPushConfigured = exports.getVapidConfig = void 0;
|
|
5
|
-
exports.PROMPT_CARD_MAX_AGE_MS = exports.PROMPT_CARD_KEY_PREFIX = exports.promptCardCount = exports.forgetPromptCardMemory = exports.clearAllPromptCards = exports.clearPromptCard = exports.hasPromptCard = exports.markPromptCardShown = exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR = void 0;
|
|
5
|
+
exports.MODEL_CHANGE_TAG_SUFFIX = exports.resolveReadersLocale = exports.buildModelChangedBodies = exports.buildModelChangedSentence = exports.notifyModelChangePush = exports.PROMPT_CARD_MAX_AGE_MS = exports.PROMPT_CARD_KEY_PREFIX = exports.promptCardCount = exports.forgetPromptCardMemory = exports.clearAllPromptCards = exports.clearPromptCard = exports.hasPromptCard = exports.markPromptCardShown = exports.MIN_DEVICES_FOR_CROSS_DEVICE_CLEAR = void 0;
|
|
6
6
|
var vapid_1 = require("./vapid");
|
|
7
7
|
Object.defineProperty(exports, "getVapidConfig", { enumerable: true, get: function () { return vapid_1.getVapidConfig; } });
|
|
8
8
|
Object.defineProperty(exports, "isPushConfigured", { enumerable: true, get: function () { return vapid_1.isPushConfigured; } });
|
|
@@ -93,3 +93,15 @@ Object.defineProperty(exports, "forgetPromptCardMemory", { enumerable: true, get
|
|
|
93
93
|
Object.defineProperty(exports, "promptCardCount", { enumerable: true, get: function () { return prompt_card_state_1.promptCardCount; } });
|
|
94
94
|
Object.defineProperty(exports, "PROMPT_CARD_KEY_PREFIX", { enumerable: true, get: function () { return prompt_card_state_1.PROMPT_CARD_KEY_PREFIX; } });
|
|
95
95
|
Object.defineProperty(exports, "PROMPT_CARD_MAX_AGE_MS", { enumerable: true, get: function () { return prompt_card_state_1.PROMPT_CARD_MAX_AGE_MS; } });
|
|
96
|
+
// The model edge's push (Issue #2357).
|
|
97
|
+
// NOTE: `realtime/model-change-broadcast` imports these from
|
|
98
|
+
// './model-change-push-notifier' directly, for the reason every block above
|
|
99
|
+
// gives — a suite that stubs the whole '@/lib/push' barrel would otherwise
|
|
100
|
+
// leave the notifier undefined on the path it guards.
|
|
101
|
+
var model_change_push_notifier_1 = require("./model-change-push-notifier");
|
|
102
|
+
Object.defineProperty(exports, "notifyModelChangePush", { enumerable: true, get: function () { return model_change_push_notifier_1.notifyModelChangePush; } });
|
|
103
|
+
Object.defineProperty(exports, "buildModelChangedSentence", { enumerable: true, get: function () { return model_change_push_notifier_1.buildModelChangedSentence; } });
|
|
104
|
+
Object.defineProperty(exports, "buildModelChangedBodies", { enumerable: true, get: function () { return model_change_push_notifier_1.buildModelChangedBodies; } });
|
|
105
|
+
Object.defineProperty(exports, "resolveReadersLocale", { enumerable: true, get: function () { return model_change_push_notifier_1.resolveReadersLocale; } });
|
|
106
|
+
var push_sender_2 = require("./push-sender");
|
|
107
|
+
Object.defineProperty(exports, "MODEL_CHANGE_TAG_SUFFIX", { enumerable: true, get: function () { return push_sender_2.MODEL_CHANGE_TAG_SUFFIX; } });
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The wording of "the model changed", and the push that carries it
|
|
4
|
+
* (Issue #2357).
|
|
5
|
+
*
|
|
6
|
+
* ## What this module owns
|
|
7
|
+
*
|
|
8
|
+
* Three things, and the first is the reason the other two live together:
|
|
9
|
+
*
|
|
10
|
+
* 1. **The sentence.** `Model changed from gpt-5.6-sol to gpt-5-mini`, in the
|
|
11
|
+
* reader's language, from `locales/<locale>/worktree.json` —
|
|
12
|
+
* `agentModel.changed`, next to the session row that shows the value on the
|
|
13
|
+
* phone. It is rendered here rather than in `push-sender` because it is also
|
|
14
|
+
* what the history row says: the model edge writes one row into
|
|
15
|
+
* `chat_messages` and sends one push, and a reader comparing the two must
|
|
16
|
+
* find the same words.
|
|
17
|
+
* 2. **Which language the history row is written in.** A row is stored once,
|
|
18
|
+
* and the server has no request to read a cookie from — the edge fires from
|
|
19
|
+
* the hook route or the status poll, neither of which is the reader. The
|
|
20
|
+
* best evidence it has is the language the readers registered their push
|
|
21
|
+
* subscriptions in, so the newest subscription's locale is used, and the
|
|
22
|
+
* default locale when nobody has registered one.
|
|
23
|
+
* 3. **The push itself.** One per transition, through `notifyPushSubscribers`,
|
|
24
|
+
* on the `enabled_prompt` bucket (see `NotificationEvent.modelChange` for
|
|
25
|
+
* why that bucket and why the transport kind reads `failure`).
|
|
26
|
+
*
|
|
27
|
+
* ## Why the dictionaries are static imports
|
|
28
|
+
*
|
|
29
|
+
* The same constraint `push-sender` documents: this module is reached from the
|
|
30
|
+
* custom server's graph (`ws-server` → `waiting-broadcast` →
|
|
31
|
+
* `model-change-broadcast` → here) and is therefore emitted into `dist/server`
|
|
32
|
+
* as CommonJS, where `next-intl` (ESM-only) cannot be required. The JSON is
|
|
33
|
+
* imported directly and `{from}` / `{to}` are substituted by hand.
|
|
34
|
+
*
|
|
35
|
+
* @module lib/push/model-change-push-notifier
|
|
36
|
+
*/
|
|
37
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.buildModelChangedSentence = buildModelChangedSentence;
|
|
42
|
+
exports.buildModelChangedBodies = buildModelChangedBodies;
|
|
43
|
+
exports.resolveReadersLocale = resolveReadersLocale;
|
|
44
|
+
exports.notifyModelChangePush = notifyModelChangePush;
|
|
45
|
+
const i18n_config_1 = require("../../config/i18n-config");
|
|
46
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
47
|
+
const push_subscriptions_db_1 = require("../../lib/db/push-subscriptions-db");
|
|
48
|
+
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
49
|
+
const logger_1 = require("../../lib/logger");
|
|
50
|
+
const worktree_json_1 = __importDefault(require("../../../locales/en/worktree.json"));
|
|
51
|
+
const worktree_json_2 = __importDefault(require("../../../locales/ja/worktree.json"));
|
|
52
|
+
const push_sender_1 = require("./push-sender");
|
|
53
|
+
const vapid_1 = require("./vapid");
|
|
54
|
+
const logger = (0, logger_1.createLogger)('push/model-change-notifier');
|
|
55
|
+
/**
|
|
56
|
+
* The one sentence, per locale. Keyed by `SupportedLocale` so adding a locale
|
|
57
|
+
* without a dictionary is a type error here rather than an English push in a
|
|
58
|
+
* Japanese install.
|
|
59
|
+
*/
|
|
60
|
+
const MODEL_CHANGED_TEMPLATES = {
|
|
61
|
+
en: worktree_json_1.default.agentModel.changed,
|
|
62
|
+
ja: worktree_json_2.default.agentModel.changed,
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* "Model changed from {from} to {to}", in one language.
|
|
66
|
+
*
|
|
67
|
+
* `from` / `to` are the resolved values `sessionStatusByInstance[].model`
|
|
68
|
+
* publishes, verbatim — the same string the phone's session row shows, so the
|
|
69
|
+
* sentence and the row cannot name the same model two ways.
|
|
70
|
+
*/
|
|
71
|
+
function buildModelChangedSentence(locale, from, to) {
|
|
72
|
+
return MODEL_CHANGED_TEMPLATES[(0, push_sender_1.resolvePushLocale)(locale)]
|
|
73
|
+
.replace('{from}', from)
|
|
74
|
+
.replace('{to}', to);
|
|
75
|
+
}
|
|
76
|
+
/** The sentence in every supported language, for a per-device fan-out. */
|
|
77
|
+
function buildModelChangedBodies(from, to) {
|
|
78
|
+
const bodies = {};
|
|
79
|
+
for (const locale of i18n_config_1.SUPPORTED_LOCALES) {
|
|
80
|
+
bodies[locale] = buildModelChangedSentence(locale, from, to);
|
|
81
|
+
}
|
|
82
|
+
return bodies;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The language the history row should be written in (Issue #2357).
|
|
86
|
+
*
|
|
87
|
+
* The newest push subscription's locale, because that is the only place the
|
|
88
|
+
* server has ever been told what language a reader reads in — registration
|
|
89
|
+
* resolves it the way the UI does (`resolveLocale`, cookie then
|
|
90
|
+
* `Accept-Language`) and stores it on the row. No subscription at all means the
|
|
91
|
+
* default locale, which is what the UI shows a reader who has chosen nothing.
|
|
92
|
+
*
|
|
93
|
+
* Never throws: a database that cannot answer is a reason to write the row in
|
|
94
|
+
* the default language, not a reason to write no row.
|
|
95
|
+
*/
|
|
96
|
+
function resolveReadersLocale(db) {
|
|
97
|
+
try {
|
|
98
|
+
const subscriptions = (0, push_subscriptions_db_1.getAllPushSubscriptions)(db);
|
|
99
|
+
let newest = null;
|
|
100
|
+
for (const sub of subscriptions) {
|
|
101
|
+
const updatedAt = sub.updatedAt.getTime();
|
|
102
|
+
if (newest === null || updatedAt > newest.updatedAt) {
|
|
103
|
+
newest = { updatedAt, locale: sub.locale };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return (0, push_sender_1.resolvePushLocale)(newest?.locale ?? i18n_config_1.DEFAULT_LOCALE);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return i18n_config_1.DEFAULT_LOCALE;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The worktree's display name, for the notification title. Falls back to the
|
|
114
|
+
* id rather than dropping the notification — the same rule
|
|
115
|
+
* `waiting-push-notifier` applies.
|
|
116
|
+
*/
|
|
117
|
+
function resolveWorktreeName(worktreeId) {
|
|
118
|
+
try {
|
|
119
|
+
return (0, worktree_db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId)?.name ?? worktreeId;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return worktreeId;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Notify every opted-in device that this instance changed model (Issue #2357).
|
|
127
|
+
*
|
|
128
|
+
* States the fact and nothing more — no ranking, no "downgraded", because the
|
|
129
|
+
* Issue rules that out and because the server has no table that could say
|
|
130
|
+
* which of two models is the lesser. Never throws; push is advisory and the
|
|
131
|
+
* edge that called this has already been observed.
|
|
132
|
+
*
|
|
133
|
+
* @returns Null when a fan-out was attempted, otherwise why it was not.
|
|
134
|
+
*/
|
|
135
|
+
async function notifyModelChangePush(change) {
|
|
136
|
+
if (!(0, vapid_1.isPushConfigured)()) {
|
|
137
|
+
logger.debug('model-change-push-suppressed', {
|
|
138
|
+
worktreeId: change.worktreeId,
|
|
139
|
+
instanceId: change.instanceId,
|
|
140
|
+
reason: 'unconfigured',
|
|
141
|
+
});
|
|
142
|
+
return 'unconfigured';
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await (0, push_sender_1.notifyPushSubscribers)({
|
|
146
|
+
worktreeId: change.worktreeId,
|
|
147
|
+
worktreeName: resolveWorktreeName(change.worktreeId),
|
|
148
|
+
// The delivery bucket, not the meaning — see `NotificationEvent.modelChange`.
|
|
149
|
+
kind: 'failure',
|
|
150
|
+
agentName: change.instanceId,
|
|
151
|
+
instanceId: change.instanceId,
|
|
152
|
+
modelChange: {
|
|
153
|
+
from: change.from,
|
|
154
|
+
to: change.to,
|
|
155
|
+
body: buildModelChangedBodies(change.from, change.to),
|
|
156
|
+
},
|
|
157
|
+
}, change.at);
|
|
158
|
+
logger.info('model-change-push-raised', {
|
|
159
|
+
worktreeId: change.worktreeId,
|
|
160
|
+
instanceId: change.instanceId,
|
|
161
|
+
from: change.from,
|
|
162
|
+
to: change.to,
|
|
163
|
+
source: change.source,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
logger.warn('model-change-push-failed', {
|
|
168
|
+
worktreeId: change.worktreeId,
|
|
169
|
+
instanceId: change.instanceId,
|
|
170
|
+
error: error instanceof Error ? error.message : String(error),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
@@ -27,6 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
28
|
};
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.MODEL_CHANGE_TAG_SUFFIX = void 0;
|
|
30
31
|
exports.resolvePushLocale = resolvePushLocale;
|
|
31
32
|
exports.buildExcerpt = buildExcerpt;
|
|
32
33
|
exports.buildPushPayload = buildPushPayload;
|
|
@@ -51,6 +52,11 @@ const PUSH_MESSAGES = {
|
|
|
51
52
|
en: notifications_json_1.default.push,
|
|
52
53
|
ja: notifications_json_2.default.push,
|
|
53
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* The `tag` segment a model-change card carries in place of its kind
|
|
57
|
+
* (Issue #2357). Exported so the notifier's tests can name the card they expect.
|
|
58
|
+
*/
|
|
59
|
+
exports.MODEL_CHANGE_TAG_SUFFIX = 'model';
|
|
54
60
|
/**
|
|
55
61
|
* Narrow a stored subscription locale to one we can actually render.
|
|
56
62
|
* Subscriptions registered before v42 have `locale = NULL` and land on
|
|
@@ -147,25 +153,31 @@ function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Da
|
|
|
147
153
|
const excerpt = buildExcerpt(event.excerpt);
|
|
148
154
|
const agentSuffix = event.agentName ? ` (${event.agentName})` : '';
|
|
149
155
|
const title = `${event.worktreeName}${agentSuffix}`;
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
156
|
+
const resolvedLocale = resolvePushLocale(locale);
|
|
157
|
+
const messages = PUSH_MESSAGES[resolvedLocale];
|
|
158
|
+
const body =
|
|
159
|
+
// Issue #2357: read first, because the event's `kind` is the bucket it is
|
|
160
|
+
// delivered to and says nothing about what it is. See `modelChange`.
|
|
161
|
+
event.modelChange
|
|
162
|
+
? event.modelChange.body[resolvedLocale]
|
|
163
|
+
: event.kind === 'prompt'
|
|
164
|
+
? // Issue #2001: the resolution's body replaces the stale card's, so it
|
|
165
|
+
// has to answer the question that card asked. It quotes no excerpt —
|
|
166
|
+
// the prompt is over, and repeating it would read as a new one.
|
|
167
|
+
event.resolved === true
|
|
168
|
+
? messages.promptResolved
|
|
169
|
+
: buildWaitingBody(event, messages, excerpt, now)
|
|
170
|
+
: event.kind === 'failure'
|
|
171
|
+
? buildFailureBody(event, messages, excerpt)
|
|
172
|
+
: // Issue #2045: an update notice is a completion by *bucket*, not by
|
|
173
|
+
// content, so it is the one completion whose body is not "Done".
|
|
174
|
+
event.updateAvailable
|
|
175
|
+
? messages.updateAvailable
|
|
176
|
+
.replace('{agent}', event.updateAvailable.agent)
|
|
177
|
+
.replace('{version}', event.updateAvailable.version)
|
|
178
|
+
: excerpt
|
|
179
|
+
? messages.completionWithExcerpt.replace('{excerpt}', excerpt)
|
|
180
|
+
: messages.completion;
|
|
169
181
|
return {
|
|
170
182
|
kind: event.kind,
|
|
171
183
|
title,
|
|
@@ -176,7 +188,12 @@ function buildPushPayload(event, locale = i18n_config_1.DEFAULT_LOCALE, now = Da
|
|
|
176
188
|
// Unchanged by #1790, and deliberately: the escalation carries the same tag
|
|
177
189
|
// as the notification it follows up, so the Service Worker replaces the
|
|
178
190
|
// stale one instead of stacking a second card for the same wait.
|
|
179
|
-
|
|
191
|
+
// Issue #2357: a model change gets a tag of its own, so it neither replaces
|
|
192
|
+
// a failure card (its transport bucket) nor is replaced by one; two changes
|
|
193
|
+
// of the same worktree do collapse, which is right — the newer is the fact.
|
|
194
|
+
tag: event.modelChange
|
|
195
|
+
? `${event.worktreeId}:${exports.MODEL_CHANGE_TAG_SUFFIX}`
|
|
196
|
+
: `${event.worktreeId}:${event.kind}`,
|
|
180
197
|
timestamp: now,
|
|
181
198
|
...(event.waitingKind ? { waitingKind: event.waitingKind } : {}),
|
|
182
199
|
...(event.resolved === true ? { resolved: true } : {}),
|
|
@@ -252,6 +269,17 @@ function passesDedup(event) {
|
|
|
252
269
|
// uses, so the two would suppress each other on a 30 s window neither wants.
|
|
253
270
|
if (event.resolved === true)
|
|
254
271
|
return true;
|
|
272
|
+
// Issue #2357: keyed on the transition, not on its wording — the body is
|
|
273
|
+
// localized per device and the same change must not send twice because two
|
|
274
|
+
// readers speak different languages. The producer already emits one edge per
|
|
275
|
+
// transition; this is the second net, on the same 30 s window as the rest.
|
|
276
|
+
if (event.modelChange) {
|
|
277
|
+
return (0, notification_dedup_1.shouldSendNotification)({
|
|
278
|
+
worktreeId: event.worktreeId,
|
|
279
|
+
kind: event.kind,
|
|
280
|
+
content: `${exports.MODEL_CHANGE_TAG_SUFFIX}:${event.instanceId ?? event.agentName ?? ''}:${event.modelChange.from}>${event.modelChange.to}`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
255
283
|
if (event.kind === 'prompt' && typeof event.waitingSince === 'number') {
|
|
256
284
|
return (0, notification_dedup_1.shouldSendWaitingPush)({
|
|
257
285
|
worktreeId: event.worktreeId,
|