commandmate 0.31.2 → 0.31.3
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 +161 -161
- package/.next/app-path-routes-manifest.json +33 -33
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +15 -15
- package/.next/required-server-files.json +1 -1
- 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_client-reference-manifest.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.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 +2 -2
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +2 -2
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.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_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/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_client-reference-manifest.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_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_client-reference-manifest.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_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.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_client-reference-manifest.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_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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +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_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_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_client-reference-manifest.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_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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.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_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_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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- 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 +33 -33
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1191.js +1 -1
- package/.next/server/chunks/1886.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -1
- package/.next/server/chunks/2739.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3484.js +1 -0
- package/.next/server/chunks/358.js +1 -0
- package/.next/server/chunks/4325.js +1 -1
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5120.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/552.js +2 -2
- package/.next/server/chunks/595.js +8 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/chunks/9130.js +2 -2
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/9696.js +2 -2
- package/.next/server/chunks/9798.js +2 -2
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1783-11c9b4d8a52ebd91.js → 2813-de885de8a4b11910.js} +1 -1
- package/.next/static/chunks/4718-07ec4e10186928db.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-91b639c90795baa9.js +1 -0
- package/.next/static/css/acc4b9c3feb04287.css +1 -0
- package/.next/trace +13 -13
- 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 +1402 -0
- package/dist/server/locales/ja/worktree.json +1402 -0
- package/dist/server/src/lib/db/chat-db.js +44 -1
- 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/tools/antigravity/detect.js +105 -25
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +233 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +24 -24
- 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 +17 -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/types.js +19 -1
- package/dist/server/src/lib/realtime/waiting-broadcast.js +13 -0
- package/dist/server/src/lib/session/agent-event-state.js +344 -12
- package/package.json +1 -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/static/chunks/4718-0d4d93c4c75f336e.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-7a0915e32a2af4d3.js +0 -1
- package/.next/static/css/5c13ea243dfdcb66.css +0 -1
- /package/.next/static/{GiOqe8rfQGQ0NvzB5qr3q → 0hTIackGXw6v7diXJS6yN}/_buildManifest.js +0 -0
- /package/.next/static/{GiOqe8rfQGQ0NvzB5qr3q → 0hTIackGXw6v7diXJS6yN}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What happens when an agent instance changes model (Issue #2357).
|
|
4
|
+
*
|
|
5
|
+
* ## The edge, and its three receivers
|
|
6
|
+
*
|
|
7
|
+
* `agent-event-state` judges the model edge — the merged hook/frame value moving
|
|
8
|
+
* from one model to another, with the first sighting, the value going quiet
|
|
9
|
+
* and a spelling change all ruled out there — and hands it out through
|
|
10
|
+
* `onAgentModelChange`. This module is that subscription, and it is the ONE
|
|
11
|
+
* subscription: the three things the Issue asks for on the receiving side are
|
|
12
|
+
* fanned out from here, in the order that leaves the most durable trace first.
|
|
13
|
+
*
|
|
14
|
+
* 1. **The history row.** One assistant row in `chat_messages`, in the
|
|
15
|
+
* readers' language, so the chat transcript and the History tab both keep
|
|
16
|
+
* "the model changed from A to B" where the conversation is. Written
|
|
17
|
+
* first, because it is the receiver that survives a phone being off.
|
|
18
|
+
* 2. **The room frames.** The row is pushed as a `message` frame — the same
|
|
19
|
+
* frame `sendUserMessage` publishes — so a transcript that is open shows
|
|
20
|
+
* the line without waiting for its poll; then the `model_changed` frame
|
|
21
|
+
* itself, which is what the phone's session row turns amber on.
|
|
22
|
+
* 3. **The push.** `notifyModelChangePush`, fire-and-forget; it has its own
|
|
23
|
+
* dedup and its own logging.
|
|
24
|
+
*
|
|
25
|
+
* Each receiver is wrapped separately: a database that cannot be written must
|
|
26
|
+
* not cost the reader the socket frame, and a socket with no owner must not
|
|
27
|
+
* cost them the push.
|
|
28
|
+
*
|
|
29
|
+
* ## Why `publish` is injected, and who arms this
|
|
30
|
+
*
|
|
31
|
+
* The same shape as `waiting-broadcast`, and armed by it: `ws-server` owns the
|
|
32
|
+
* rooms and calls `startWaitingStatusBroadcast(handleBroadcast)` from
|
|
33
|
+
* `setupWebSocket`, which is the one place in the process that knows which
|
|
34
|
+
* bundle's `rooms` a frame has to reach. That call now arms this subscription
|
|
35
|
+
* too, with the same publisher, and `stopWaitingStatusBroadcast` (from
|
|
36
|
+
* `closeWebSocket`) disarms both — so the listener's lifetime is the server's,
|
|
37
|
+
* and a suite that stands a server up and tears it down leaves nothing pointed
|
|
38
|
+
* at a dead room map.
|
|
39
|
+
*
|
|
40
|
+
* ## Authorization
|
|
41
|
+
*
|
|
42
|
+
* None is bypassed: the publisher is the room broadcaster, and a socket only
|
|
43
|
+
* joins a room through the authenticated `subscribe` path.
|
|
44
|
+
*
|
|
45
|
+
* @module lib/realtime/model-change-broadcast
|
|
46
|
+
*/
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.buildModelChangedEvent = buildModelChangedEvent;
|
|
49
|
+
exports.handleAgentModelChange = handleAgentModelChange;
|
|
50
|
+
exports.startModelChangeBroadcast = startModelChangeBroadcast;
|
|
51
|
+
exports.stopModelChangeBroadcast = stopModelChangeBroadcast;
|
|
52
|
+
exports.isModelChangeBroadcastActive = isModelChangeBroadcastActive;
|
|
53
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
54
|
+
const chat_db_1 = require("../../lib/db/chat-db");
|
|
55
|
+
const logger_1 = require("../../lib/logger");
|
|
56
|
+
const model_change_push_notifier_1 = require("../../lib/push/model-change-push-notifier");
|
|
57
|
+
const types_1 = require("../../lib/realtime/types");
|
|
58
|
+
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
59
|
+
const logger = (0, logger_1.createLogger)('model-change-broadcast');
|
|
60
|
+
/**
|
|
61
|
+
* Translate a model edge into the frame clients receive.
|
|
62
|
+
*
|
|
63
|
+
* Field for field the producer's record; `instance` is already resolved there
|
|
64
|
+
* (`instanceId ?? cliToolId`), so a client can match it against its own pane
|
|
65
|
+
* without re-deriving the convention.
|
|
66
|
+
*/
|
|
67
|
+
function buildModelChangedEvent(change) {
|
|
68
|
+
return {
|
|
69
|
+
type: types_1.MODEL_CHANGED_EVENT_TYPE,
|
|
70
|
+
worktreeId: change.worktreeId,
|
|
71
|
+
cliTool: change.cliToolId,
|
|
72
|
+
instance: change.instanceId,
|
|
73
|
+
from: change.from,
|
|
74
|
+
to: change.to,
|
|
75
|
+
source: change.source,
|
|
76
|
+
at: change.at,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Write the history row and hand back the `message` frame for it, or null
|
|
81
|
+
* when the database could not take it.
|
|
82
|
+
*
|
|
83
|
+
* Never throws. The sentence is localized once, for the readers' registered
|
|
84
|
+
* language (`resolveReadersLocale`) — a stored row cannot be re-rendered per
|
|
85
|
+
* viewer the way the push body is.
|
|
86
|
+
*/
|
|
87
|
+
function recordModelChangeHistory(change) {
|
|
88
|
+
try {
|
|
89
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
90
|
+
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
91
|
+
const message = (0, chat_db_1.createModelChangeMessage)(db, {
|
|
92
|
+
worktreeId: change.worktreeId,
|
|
93
|
+
cliToolId: change.cliToolId,
|
|
94
|
+
instanceId: change.instanceId,
|
|
95
|
+
content: (0, model_change_push_notifier_1.buildModelChangedSentence)(locale, change.from, change.to),
|
|
96
|
+
at: change.at,
|
|
97
|
+
});
|
|
98
|
+
return { type: 'message', worktreeId: change.worktreeId, message };
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
logger.warn('model-change-history-failed', {
|
|
102
|
+
worktreeId: change.worktreeId,
|
|
103
|
+
instanceId: change.instanceId,
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
});
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Deliver one edge to all three receivers. Exported so a suite can drive the
|
|
111
|
+
* fan-out without a live subscription; never throws.
|
|
112
|
+
*/
|
|
113
|
+
function handleAgentModelChange(change, publish) {
|
|
114
|
+
logger.info('model-changed', {
|
|
115
|
+
worktreeId: change.worktreeId,
|
|
116
|
+
cliToolId: change.cliToolId,
|
|
117
|
+
instanceId: change.instanceId,
|
|
118
|
+
from: change.from,
|
|
119
|
+
to: change.to,
|
|
120
|
+
source: change.source,
|
|
121
|
+
});
|
|
122
|
+
const messageFrame = recordModelChangeHistory(change);
|
|
123
|
+
try {
|
|
124
|
+
if (messageFrame)
|
|
125
|
+
publish(change.worktreeId, messageFrame);
|
|
126
|
+
publish(change.worktreeId, buildModelChangedEvent(change));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.warn('model-change-broadcast-failed', {
|
|
130
|
+
worktreeId: change.worktreeId,
|
|
131
|
+
instanceId: change.instanceId,
|
|
132
|
+
error: error instanceof Error ? error.message : String(error),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Fire-and-forget: `notifyModelChangePush` contains its own failures and
|
|
136
|
+
// logs its own decision, and nothing here has anything to do with the result.
|
|
137
|
+
void (0, model_change_push_notifier_1.notifyModelChangePush)(change);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Subscribe to the model edge and fan it out.
|
|
141
|
+
*
|
|
142
|
+
* Idempotent: calling it again replaces the previous subscription rather than
|
|
143
|
+
* adding a second one, so a re-entered `setupWebSocket` cannot double-send.
|
|
144
|
+
*
|
|
145
|
+
* @param publish - Room broadcaster, normally `ws-server`'s internal one.
|
|
146
|
+
* @returns The unsubscribe function (also reachable as
|
|
147
|
+
* {@link stopModelChangeBroadcast}).
|
|
148
|
+
*/
|
|
149
|
+
function startModelChangeBroadcast(publish) {
|
|
150
|
+
stopModelChangeBroadcast();
|
|
151
|
+
const unsubscribe = (0, agent_event_state_1.onAgentModelChange)((change) => {
|
|
152
|
+
handleAgentModelChange(change, publish);
|
|
153
|
+
});
|
|
154
|
+
globalThis.__modelChangeBroadcastUnsubscribe = unsubscribe;
|
|
155
|
+
return unsubscribe;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Drop the subscription, if any. Safe to call when none is active — and called
|
|
159
|
+
* from `stopWaitingStatusBroadcast`, i.e. from `closeWebSocket`.
|
|
160
|
+
*/
|
|
161
|
+
function stopModelChangeBroadcast() {
|
|
162
|
+
const existing = globalThis.__modelChangeBroadcastUnsubscribe;
|
|
163
|
+
if (existing) {
|
|
164
|
+
existing();
|
|
165
|
+
globalThis.__modelChangeBroadcastUnsubscribe = undefined;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Whether a subscription is currently active. Test seam. */
|
|
169
|
+
function isModelChangeBroadcastActive() {
|
|
170
|
+
return globalThis.__modelChangeBroadcastUnsubscribe !== undefined;
|
|
171
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* the canonical {@link RealtimeEvent}.
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MESSAGES_INVALIDATED_EVENT_TYPE = exports.MAX_CHAT_TURN_PROGRESS_BODY_LENGTH = exports.CHAT_TURN_PROGRESS_MIN_INTERVAL_MS = exports.CHAT_TURN_PROGRESS_EVENT_TYPE = exports.VERSION_MISMATCH_EVENT_TYPE = exports.CLIENT_VERSION_MESSAGE_TYPE = void 0;
|
|
12
|
+
exports.MODEL_CHANGED_EVENT_TYPE = exports.MESSAGES_INVALIDATED_EVENT_TYPE = exports.MAX_CHAT_TURN_PROGRESS_BODY_LENGTH = exports.CHAT_TURN_PROGRESS_MIN_INTERVAL_MS = exports.CHAT_TURN_PROGRESS_EVENT_TYPE = exports.VERSION_MISMATCH_EVENT_TYPE = exports.CLIENT_VERSION_MESSAGE_TYPE = void 0;
|
|
13
13
|
exports.isVersionMismatch = isVersionMismatch;
|
|
14
14
|
exports.truncateChatTurnProgressBody = truncateChatTurnProgressBody;
|
|
15
15
|
exports.parseRealtimeEvent = parseRealtimeEvent;
|
|
@@ -143,6 +143,24 @@ function truncateChatTurnProgressBody(body, maxLength = exports.MAX_CHAT_TURN_PR
|
|
|
143
143
|
* an omitted field would simply never match.
|
|
144
144
|
*/
|
|
145
145
|
exports.MESSAGES_INVALIDATED_EVENT_TYPE = 'messages_invalidated';
|
|
146
|
+
/**
|
|
147
|
+
* "This instance is now on a different model" (Issue #2357).
|
|
148
|
+
*
|
|
149
|
+
* Emitted once per transition from `agent-event-state`'s model edge, on the
|
|
150
|
+
* same room broadcast `session_status_changed` rides — so every client that
|
|
151
|
+
* subscribed to the worktree hears it, and one that never subscribed does not.
|
|
152
|
+
* It is its own type rather than a field on `session_status_changed` because
|
|
153
|
+
* the consumers do not overlap: the phone's session row is the only thing that
|
|
154
|
+
* reacts, and every `session_status_changed` listener would otherwise have to
|
|
155
|
+
* learn to ignore it.
|
|
156
|
+
*
|
|
157
|
+
* `from` and `to` are the resolved values `sessionStatusByInstance[].model`
|
|
158
|
+
* publishes, verbatim — the client shows them, it does not compare them. The
|
|
159
|
+
* suppression rules (`null → value`, `value → null`, a first sighting, a
|
|
160
|
+
* spelling change) are applied by the producer, and there is nothing here for
|
|
161
|
+
* a client to re-judge.
|
|
162
|
+
*/
|
|
163
|
+
exports.MODEL_CHANGED_EVENT_TYPE = 'model_changed';
|
|
146
164
|
/**
|
|
147
165
|
* Parse a raw WebSocket frame into the inner realtime event.
|
|
148
166
|
*
|
|
@@ -37,6 +37,7 @@ exports.buildWaitingStatusEvent = buildWaitingStatusEvent;
|
|
|
37
37
|
exports.startWaitingStatusBroadcast = startWaitingStatusBroadcast;
|
|
38
38
|
exports.stopWaitingStatusBroadcast = stopWaitingStatusBroadcast;
|
|
39
39
|
exports.isWaitingStatusBroadcastActive = isWaitingStatusBroadcastActive;
|
|
40
|
+
const model_change_broadcast_1 = require("../../lib/realtime/model-change-broadcast");
|
|
40
41
|
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
41
42
|
/**
|
|
42
43
|
* Translate a waiting crossing into the frame clients receive.
|
|
@@ -63,6 +64,14 @@ function buildWaitingStatusEvent(transition) {
|
|
|
63
64
|
* Idempotent: calling it again replaces the previous subscription rather than
|
|
64
65
|
* adding a second one, so a re-entered `setupWebSocket` cannot double-send.
|
|
65
66
|
*
|
|
67
|
+
* Issue #2357: this is also where the model edge is armed. `setupWebSocket`
|
|
68
|
+
* calls exactly one function to start the edge → room subscriptions, and it
|
|
69
|
+
* is this one; the model-change fan-out (`model-change-broadcast`) needs the
|
|
70
|
+
* same publisher for the same reason the waiting edge does — the closure has
|
|
71
|
+
* to hold the bundle's own `rooms` — so it is started here with it, and
|
|
72
|
+
* stopped with it below, rather than growing a second arming call in
|
|
73
|
+
* `ws-server` for every edge that comes along.
|
|
74
|
+
*
|
|
66
75
|
* @param publish - Room broadcaster, normally `ws-server`'s internal one.
|
|
67
76
|
* @returns The unsubscribe function (also reachable as
|
|
68
77
|
* {@link stopWaitingStatusBroadcast}).
|
|
@@ -73,12 +82,15 @@ function startWaitingStatusBroadcast(publish) {
|
|
|
73
82
|
publish(transition.worktreeId, buildWaitingStatusEvent(transition));
|
|
74
83
|
});
|
|
75
84
|
globalThis.__waitingStatusBroadcastUnsubscribe = unsubscribe;
|
|
85
|
+
(0, model_change_broadcast_1.startModelChangeBroadcast)(publish);
|
|
76
86
|
return unsubscribe;
|
|
77
87
|
}
|
|
78
88
|
/**
|
|
79
89
|
* Drop the subscription, if any. Safe to call when none is active — and called
|
|
80
90
|
* from `closeWebSocket`, so a suite that stands a server up and tears it down
|
|
81
91
|
* does not leave a listener pointed at a dead room map.
|
|
92
|
+
*
|
|
93
|
+
* Issue #2357: drops the model edge's subscription with it, for the same reason.
|
|
82
94
|
*/
|
|
83
95
|
function stopWaitingStatusBroadcast() {
|
|
84
96
|
const existing = globalThis.__waitingStatusBroadcastUnsubscribe;
|
|
@@ -86,6 +98,7 @@ function stopWaitingStatusBroadcast() {
|
|
|
86
98
|
existing();
|
|
87
99
|
globalThis.__waitingStatusBroadcastUnsubscribe = undefined;
|
|
88
100
|
}
|
|
101
|
+
(0, model_change_broadcast_1.stopModelChangeBroadcast)();
|
|
89
102
|
}
|
|
90
103
|
/** Whether a subscription is currently active. Test seam. */
|
|
91
104
|
function isWaitingStatusBroadcastActive() {
|