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,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
|
+
}
|
|
@@ -65,6 +65,10 @@ function snapshotFingerprint(payload) {
|
|
|
65
65
|
payload.isPromptWaiting ?? false,
|
|
66
66
|
payload.isSelectionListActive ?? false,
|
|
67
67
|
payload.isPagerActive ?? false,
|
|
68
|
+
// Issue #2369: in the fingerprint for the same reason `sessionStatus` is —
|
|
69
|
+
// a redraw whose only change is "the /usage panel closed" has to reach the
|
|
70
|
+
// client, or the Esc card outlives the panel it dismisses.
|
|
71
|
+
payload.isDismissablePanelActive ?? false,
|
|
68
72
|
payload.isUnclassifiedActive ?? false,
|
|
69
73
|
]);
|
|
70
74
|
}
|
|
@@ -94,6 +98,7 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
|
|
|
94
98
|
promptData: payload.promptData ?? null,
|
|
95
99
|
isSelectionListActive: payload.isSelectionListActive ?? false,
|
|
96
100
|
isPagerActive: payload.isPagerActive ?? false,
|
|
101
|
+
isDismissablePanelActive: payload.isDismissablePanelActive ?? false,
|
|
97
102
|
isUnclassifiedActive: payload.isUnclassifiedActive ?? false,
|
|
98
103
|
version: nextVersion(key),
|
|
99
104
|
});
|
|
@@ -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,8 @@ 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");
|
|
41
|
+
const relay_triggers_1 = require("../../lib/relay/relay-triggers");
|
|
40
42
|
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
41
43
|
/**
|
|
42
44
|
* Translate a waiting crossing into the frame clients receive.
|
|
@@ -63,6 +65,14 @@ function buildWaitingStatusEvent(transition) {
|
|
|
63
65
|
* Idempotent: calling it again replaces the previous subscription rather than
|
|
64
66
|
* adding a second one, so a re-entered `setupWebSocket` cannot double-send.
|
|
65
67
|
*
|
|
68
|
+
* Issue #2357: this is also where the model edge is armed. `setupWebSocket`
|
|
69
|
+
* calls exactly one function to start the edge → room subscriptions, and it
|
|
70
|
+
* is this one; the model-change fan-out (`model-change-broadcast`) needs the
|
|
71
|
+
* same publisher for the same reason the waiting edge does — the closure has
|
|
72
|
+
* to hold the bundle's own `rooms` — so it is started here with it, and
|
|
73
|
+
* stopped with it below, rather than growing a second arming call in
|
|
74
|
+
* `ws-server` for every edge that comes along.
|
|
75
|
+
*
|
|
66
76
|
* @param publish - Room broadcaster, normally `ws-server`'s internal one.
|
|
67
77
|
* @returns The unsubscribe function (also reachable as
|
|
68
78
|
* {@link stopWaitingStatusBroadcast}).
|
|
@@ -73,12 +83,25 @@ function startWaitingStatusBroadcast(publish) {
|
|
|
73
83
|
publish(transition.worktreeId, buildWaitingStatusEvent(transition));
|
|
74
84
|
});
|
|
75
85
|
globalThis.__waitingStatusBroadcastUnsubscribe = unsubscribe;
|
|
86
|
+
(0, model_change_broadcast_1.startModelChangeBroadcast)(publish);
|
|
87
|
+
// Issue #2377: and the relay subsystem, for the third time and the same
|
|
88
|
+
// reason. Its two background jobs — "tell the requester their worker stopped
|
|
89
|
+
// on a dialog" and "expire deadlines / retry deliveries a busy composer
|
|
90
|
+
// refused" — are the server's lifetime, not a request's, and this is the one
|
|
91
|
+
// function `setupWebSocket` calls to say the server is up. Unlike the two
|
|
92
|
+
// above it needs no publisher: a relay's delivery is a message written through
|
|
93
|
+
// `sendUserMessage`, which broadcasts its own row.
|
|
94
|
+
(0, relay_triggers_1.startRelayTriggers)();
|
|
76
95
|
return unsubscribe;
|
|
77
96
|
}
|
|
78
97
|
/**
|
|
79
98
|
* Drop the subscription, if any. Safe to call when none is active — and called
|
|
80
99
|
* from `closeWebSocket`, so a suite that stands a server up and tears it down
|
|
81
100
|
* does not leave a listener pointed at a dead room map.
|
|
101
|
+
*
|
|
102
|
+
* Issue #2357: drops the model edge's subscription with it, for the same reason.
|
|
103
|
+
* Issue #2377: and the relay triggers, whose interval would otherwise keep
|
|
104
|
+
* ticking against a database the suite has closed.
|
|
82
105
|
*/
|
|
83
106
|
function stopWaitingStatusBroadcast() {
|
|
84
107
|
const existing = globalThis.__waitingStatusBroadcastUnsubscribe;
|
|
@@ -86,6 +109,8 @@ function stopWaitingStatusBroadcast() {
|
|
|
86
109
|
existing();
|
|
87
110
|
globalThis.__waitingStatusBroadcastUnsubscribe = undefined;
|
|
88
111
|
}
|
|
112
|
+
(0, model_change_broadcast_1.stopModelChangeBroadcast)();
|
|
113
|
+
(0, relay_triggers_1.stopRelayTriggers)();
|
|
89
114
|
}
|
|
90
115
|
/** Whether a subscription is currently active. Test seam. */
|
|
91
116
|
function isWaitingStatusBroadcastActive() {
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Getting B's answer into A's composer (Issue #2377).
|
|
4
|
+
*
|
|
5
|
+
* ## Two moments, one path
|
|
6
|
+
*
|
|
7
|
+
* Something has to notice that B finished. Two things do, and they are the two
|
|
8
|
+
* `lib/polling/structured-history-gate`'s header describes:
|
|
9
|
+
*
|
|
10
|
+
* - **Tools with a transcript** (claude, codex, antigravity, command-code, and
|
|
11
|
+
* opencode over its stream). Their reader answers `true` only for a turn the
|
|
12
|
+
* agent has CLOSED, which is a stronger statement than any amount of quiet,
|
|
13
|
+
* so the capture is delivered as soon as it lands. Both triggers of that
|
|
14
|
+
* capture — the Stop hook and the poller — reach the same function, which is
|
|
15
|
+
* why this module needs one hook and not two.
|
|
16
|
+
* - **Tools without one** (copilot, gemini, vibe-local). What a finished turn
|
|
17
|
+
* leaves behind is the poller's copy of the SCREEN, judged by a string
|
|
18
|
+
* analysis of a frame that may still be being drawn. The Issue asks for
|
|
19
|
+
* 「完了検知 + 数秒の静穏」, and {@link RELAY_SCRAPE_QUIET_MS} is that quiet:
|
|
20
|
+
* the newest row is re-read after the delay and only delivered once it has
|
|
21
|
+
* stopped moving.
|
|
22
|
+
*
|
|
23
|
+
* ## Deciding is not delivering
|
|
24
|
+
*
|
|
25
|
+
* A finished turn produces a STASH, not a send. A is frequently mid-turn when B
|
|
26
|
+
* finishes, and typing into a running composer interrupts it — so the body waits
|
|
27
|
+
* in the ledger (durable, survives a restart) and the pump retries it whenever
|
|
28
|
+
* A is next able to take it. That separation is also what makes the double
|
|
29
|
+
* detection harmless: `stashRelayPayload` is guarded on `pending_kind IS NULL`,
|
|
30
|
+
* so two producers finding one turn cost one delivery.
|
|
31
|
+
*
|
|
32
|
+
* Nothing here throws. Every entry point is called from a poller tick, a hook
|
|
33
|
+
* receiver or a timer, and in all three a failure must cost the relay, never the
|
|
34
|
+
* caller.
|
|
35
|
+
*
|
|
36
|
+
* @module lib/relay/relay-delivery
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.resetRelayDeliveryState = resetRelayDeliveryState;
|
|
40
|
+
exports.findWorkerReply = findWorkerReply;
|
|
41
|
+
exports.notifyRelayTurnCompleted = notifyRelayTurnCompleted;
|
|
42
|
+
exports.notifyRelayPromptWaiting = notifyRelayPromptWaiting;
|
|
43
|
+
exports.sweepExpiredRelays = sweepExpiredRelays;
|
|
44
|
+
exports.pumpRelayDeliveries = pumpRelayDeliveries;
|
|
45
|
+
exports.runRelayMaintenanceTick = runRelayMaintenanceTick;
|
|
46
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
47
|
+
const relay_db_1 = require("../../lib/db/relay-db");
|
|
48
|
+
const chat_db_1 = require("../../lib/db/chat-db");
|
|
49
|
+
const models_1 = require("../../types/models");
|
|
50
|
+
const model_change_push_notifier_1 = require("../../lib/push/model-change-push-notifier");
|
|
51
|
+
const send_user_message_1 = require("../../lib/session/send-user-message");
|
|
52
|
+
const relay_messages_1 = require("../../lib/relay/relay-messages");
|
|
53
|
+
const relay_policy_1 = require("../../lib/relay/relay-policy");
|
|
54
|
+
const relay_readiness_1 = require("../../lib/relay/relay-readiness");
|
|
55
|
+
const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
|
|
56
|
+
const relay_system_line_1 = require("../../lib/relay/relay-system-line");
|
|
57
|
+
const logger_1 = require("../../lib/logger");
|
|
58
|
+
const logger = (0, logger_1.createLogger)('relay-delivery');
|
|
59
|
+
/**
|
|
60
|
+
* How many assistant rows back the reply is looked for.
|
|
61
|
+
*
|
|
62
|
+
* A turn can write several rows (a narration then a summary), and the relay
|
|
63
|
+
* wants the last one that is actually the agent talking. Bounded because an
|
|
64
|
+
* unbounded read of a long-lived worktree's history is a large query for one
|
|
65
|
+
* line of answer.
|
|
66
|
+
*/
|
|
67
|
+
const REPLY_LOOKBACK_MESSAGES = 40;
|
|
68
|
+
/** How many times the scrape path re-reads before it gives up on stability. */
|
|
69
|
+
const SCRAPE_STABILITY_ATTEMPTS = 3;
|
|
70
|
+
const inFlight = (globalThis.__relayDeliveryInFlight ??= new Set());
|
|
71
|
+
/** Forget every in-flight delivery. Test seam. */
|
|
72
|
+
function resetRelayDeliveryState() {
|
|
73
|
+
inFlight.clear();
|
|
74
|
+
globalThis.__relayPumpRunning = false;
|
|
75
|
+
}
|
|
76
|
+
function senderLabel(db, relay) {
|
|
77
|
+
const worker = (0, relay_session_ref_1.resolveRelaySession)(db, relay.to);
|
|
78
|
+
return { alias: worker.alias, worktreeId: worker.worktreeId };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The newest thing B actually said, at or after `since`.
|
|
82
|
+
*
|
|
83
|
+
* Three kinds of row are stepped over, and each exclusion is load-bearing:
|
|
84
|
+
* prompt rows (a question is not an answer, and the confirmation notice is a
|
|
85
|
+
* separate delivery), relay SYSTEM rows (this session's own transcript
|
|
86
|
+
* furniture — delivering "Reply from X" back to X is the smallest possible
|
|
87
|
+
* loop), and empty bodies.
|
|
88
|
+
*/
|
|
89
|
+
function findWorkerReply(db, worker, since) {
|
|
90
|
+
const messages = (0, chat_db_1.getMessages)(db, worker.worktreeId, {
|
|
91
|
+
limit: REPLY_LOOKBACK_MESSAGES,
|
|
92
|
+
cliToolId: worker.cliToolId,
|
|
93
|
+
instanceId: worker.instanceId,
|
|
94
|
+
matchResolvedInstance: true,
|
|
95
|
+
});
|
|
96
|
+
// `getMessages` answers newest-first, so the first candidate IS the newest.
|
|
97
|
+
for (const message of messages) {
|
|
98
|
+
if (message.role !== 'assistant')
|
|
99
|
+
continue;
|
|
100
|
+
if (message.messageType === 'prompt')
|
|
101
|
+
continue;
|
|
102
|
+
if (message.requestId?.startsWith(chat_db_1.RELAY_SYSTEM_REQUEST_ID_PREFIX))
|
|
103
|
+
continue;
|
|
104
|
+
if (message.content.trim() === '')
|
|
105
|
+
continue;
|
|
106
|
+
return message.timestamp.getTime() < since ? null : message;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/** The options of B's open dialog, in the shape the notice lists them. */
|
|
111
|
+
function promptOptionsOf(message) {
|
|
112
|
+
const data = message.promptData;
|
|
113
|
+
if (!(0, models_1.isAnswerablePromptData)(data))
|
|
114
|
+
return [];
|
|
115
|
+
if (data.type === 'yes_no') {
|
|
116
|
+
return data.options.map((label) => ({ key: label, label }));
|
|
117
|
+
}
|
|
118
|
+
return data.options.map((option) => ({
|
|
119
|
+
key: String(option.number),
|
|
120
|
+
label: option.label,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Stash B's finished reply against every relay that is waiting for it.
|
|
125
|
+
*
|
|
126
|
+
* @returns How many relays took a payload from this call
|
|
127
|
+
*/
|
|
128
|
+
function stashReplyForOpenRelays(db, worker, now) {
|
|
129
|
+
const relays = (0, relay_db_1.listOpenRelaysTo)(db, {
|
|
130
|
+
worktreeId: worker.worktreeId,
|
|
131
|
+
instanceId: worker.instanceId,
|
|
132
|
+
});
|
|
133
|
+
if (relays.length === 0)
|
|
134
|
+
return 0;
|
|
135
|
+
let stashed = 0;
|
|
136
|
+
for (const relay of relays) {
|
|
137
|
+
// `createdAt` and not "the last time we looked": a reply written BEFORE the
|
|
138
|
+
// relay existed answered somebody else's question, and delivering it would
|
|
139
|
+
// hand session A the previous turn — the exact failure a bare `capture`
|
|
140
|
+
// after a `wait` has always had.
|
|
141
|
+
const reply = findWorkerReply(db, worker, relay.createdAt);
|
|
142
|
+
if (!reply)
|
|
143
|
+
continue;
|
|
144
|
+
const body = (0, relay_messages_1.buildRelayReplyMessage)(senderLabel(db, relay), reply.content);
|
|
145
|
+
if ((0, relay_db_1.stashRelayPayload)(db, relay.id, 'reply', body, now))
|
|
146
|
+
stashed += 1;
|
|
147
|
+
}
|
|
148
|
+
return stashed;
|
|
149
|
+
}
|
|
150
|
+
/** Sleep, so the scrape path can wait out its quiet window. */
|
|
151
|
+
function sleep(ms) {
|
|
152
|
+
return new Promise((resolve) => {
|
|
153
|
+
setTimeout(resolve, ms);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* B finished a turn. Deliver it, or arrange to.
|
|
158
|
+
*
|
|
159
|
+
* @param worker - The session that finished
|
|
160
|
+
* @param options.settled - True when the completion came from the agent's own
|
|
161
|
+
* transcript, i.e. the turn is closed and no quiet window is needed
|
|
162
|
+
*/
|
|
163
|
+
async function notifyRelayTurnCompleted(worker, options) {
|
|
164
|
+
try {
|
|
165
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
166
|
+
const waiting = (0, relay_db_1.listOpenRelaysTo)(db, {
|
|
167
|
+
worktreeId: worker.worktreeId,
|
|
168
|
+
instanceId: worker.instanceId,
|
|
169
|
+
});
|
|
170
|
+
if (waiting.length === 0)
|
|
171
|
+
return;
|
|
172
|
+
if (options.settled) {
|
|
173
|
+
if (stashReplyForOpenRelays(db, worker, Date.now()) > 0)
|
|
174
|
+
void pumpRelayDeliveries();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// The scrape path. The row that is newest now may be a frame mid-draw, so
|
|
178
|
+
// the delivery waits until the newest row stops changing — bounded, because
|
|
179
|
+
// an agent that keeps writing is an agent whose next completion will trigger
|
|
180
|
+
// this again anyway.
|
|
181
|
+
let previousId = null;
|
|
182
|
+
for (let attempt = 0; attempt < SCRAPE_STABILITY_ATTEMPTS; attempt += 1) {
|
|
183
|
+
const before = findWorkerReply(db, worker, 0);
|
|
184
|
+
previousId = before?.id ?? null;
|
|
185
|
+
await sleep(relay_policy_1.RELAY_SCRAPE_QUIET_MS);
|
|
186
|
+
const after = findWorkerReply(db, worker, 0);
|
|
187
|
+
if ((after?.id ?? null) === previousId) {
|
|
188
|
+
if (stashReplyForOpenRelays(db, worker, Date.now()) > 0)
|
|
189
|
+
void pumpRelayDeliveries();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
logger.info('relay-scrape-never-settled', {
|
|
194
|
+
worktreeId: worker.worktreeId,
|
|
195
|
+
instanceId: worker.instanceId,
|
|
196
|
+
attempts: SCRAPE_STABILITY_ATTEMPTS,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
logger.warn('relay-turn-completed-failed', {
|
|
201
|
+
worktreeId: worker.worktreeId,
|
|
202
|
+
instanceId: worker.instanceId,
|
|
203
|
+
error: error instanceof Error ? error.message : String(error),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* B stopped on a confirmation. Tell A, once per distinct dialog.
|
|
209
|
+
*
|
|
210
|
+
* The relay stays OPEN: answering the prompt lets B finish, and the reply is
|
|
211
|
+
* delivered from the `prompt` state. What changes is that A now knows why
|
|
212
|
+
* nothing has arrived, which is the whole difference between a delegation that
|
|
213
|
+
* is slow and one that is stuck.
|
|
214
|
+
*/
|
|
215
|
+
function notifyRelayPromptWaiting(worker) {
|
|
216
|
+
try {
|
|
217
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
218
|
+
const relays = (0, relay_db_1.listOpenRelaysTo)(db, {
|
|
219
|
+
worktreeId: worker.worktreeId,
|
|
220
|
+
instanceId: worker.instanceId,
|
|
221
|
+
});
|
|
222
|
+
if (relays.length === 0)
|
|
223
|
+
return;
|
|
224
|
+
const prompt = (0, chat_db_1.getLatestOpenPromptMessage)(db, worker.worktreeId, worker.cliToolId, worker.instanceId);
|
|
225
|
+
if (!prompt)
|
|
226
|
+
return;
|
|
227
|
+
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
228
|
+
const options = promptOptionsOf(prompt);
|
|
229
|
+
const question = (0, models_1.isAnswerablePromptData)(prompt.promptData)
|
|
230
|
+
? prompt.promptData.question
|
|
231
|
+
: (prompt.promptData?.question ?? prompt.content);
|
|
232
|
+
let stashed = 0;
|
|
233
|
+
for (const relay of relays) {
|
|
234
|
+
// The dialog's own row id is the signature: a wait that lasts twenty
|
|
235
|
+
// minutes is ONE row, so A is told once however many polls observe it.
|
|
236
|
+
if ((0, relay_db_1.getRelayPromptSignature)(db, relay.id) === prompt.id)
|
|
237
|
+
continue;
|
|
238
|
+
const body = (0, relay_messages_1.buildRelayPromptMessage)(locale, senderLabel(db, relay), {
|
|
239
|
+
question,
|
|
240
|
+
options,
|
|
241
|
+
});
|
|
242
|
+
if ((0, relay_db_1.stashRelayPayload)(db, relay.id, 'prompt', body)) {
|
|
243
|
+
// The signature is recorded HERE, before the delivery, and not after it:
|
|
244
|
+
// it is what stops every later poll of the same twenty-minute dialog
|
|
245
|
+
// from stashing the same notice again while A is still busy. The state
|
|
246
|
+
// moving to `prompt` is an OPEN state, so the reply that follows once
|
|
247
|
+
// the dialog is answered can still be stashed and delivered.
|
|
248
|
+
(0, relay_db_1.markRelayPromptNotified)(db, relay.id, prompt.id);
|
|
249
|
+
stashed += 1;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (stashed > 0)
|
|
253
|
+
void pumpRelayDeliveries();
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
logger.warn('relay-prompt-notify-failed', {
|
|
257
|
+
worktreeId: worker.worktreeId,
|
|
258
|
+
instanceId: worker.instanceId,
|
|
259
|
+
error: error instanceof Error ? error.message : String(error),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Close every relay whose deadline has passed, telling A once.
|
|
265
|
+
*
|
|
266
|
+
* The stash goes in BEFORE the state changes, because `stashRelayPayload` only
|
|
267
|
+
* accepts an open relay — and the once-ness the Issue asks for comes from
|
|
268
|
+
* {@link markRelayExpired} being a guarded update, not from this ordering.
|
|
269
|
+
*/
|
|
270
|
+
function sweepExpiredRelays(db, now = Date.now()) {
|
|
271
|
+
let expired = 0;
|
|
272
|
+
for (const relay of (0, relay_db_1.listExpiredOpenRelays)(db, now)) {
|
|
273
|
+
try {
|
|
274
|
+
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
275
|
+
// A payload that never went out is superseded by the expiry notice: A
|
|
276
|
+
// asked for an answer, and what they are getting is the news that there
|
|
277
|
+
// will not be one.
|
|
278
|
+
(0, relay_db_1.clearRelayPending)(db, relay.id, now);
|
|
279
|
+
const body = (0, relay_messages_1.buildRelayExpiredMessage)(locale, senderLabel(db, relay), relay.expiresAt - relay.createdAt);
|
|
280
|
+
const stashed = (0, relay_db_1.stashRelayPayload)(db, relay.id, 'expired', body, now);
|
|
281
|
+
if (!(0, relay_db_1.markRelayExpired)(db, relay.id, now)) {
|
|
282
|
+
if (stashed)
|
|
283
|
+
(0, relay_db_1.clearRelayPending)(db, relay.id, now);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
expired += 1;
|
|
287
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'expired', (0, relay_session_ref_1.resolveRelaySession)(db, relay.from), (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
logger.warn('relay-expire-failed', {
|
|
291
|
+
relayId: relay.id,
|
|
292
|
+
error: error instanceof Error ? error.message : String(error),
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return expired;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Try to put one stashed payload into A's composer.
|
|
300
|
+
*
|
|
301
|
+
* The order — readiness, then send, then ledger — is deliberate. Marking first
|
|
302
|
+
* would lose the answer whenever the send failed, and the send path has real
|
|
303
|
+
* refusals in it (`prompt_waiting`, a session that went away mid-attempt). A
|
|
304
|
+
* repeat delivery is prevented by the in-flight set within a process and by
|
|
305
|
+
* `markRelayDelivered`'s guarded update across one, which is the idempotency the
|
|
306
|
+
* Issue asks for by name.
|
|
307
|
+
*/
|
|
308
|
+
async function deliverOne(db, relayId, kind, body) {
|
|
309
|
+
const relay = (0, relay_db_1.getRelayById)(db, relayId);
|
|
310
|
+
if (!relay)
|
|
311
|
+
return 'skipped';
|
|
312
|
+
const requester = (0, relay_session_ref_1.resolveRelaySession)(db, relay.from);
|
|
313
|
+
const hold = await (0, relay_readiness_1.findRelayHoldReason)(requester.worktreeId, requester.cliToolId, requester.instanceId);
|
|
314
|
+
if (hold) {
|
|
315
|
+
logger.debug('relay-delivery-held', { relayId, kind, reason: hold });
|
|
316
|
+
return 'held';
|
|
317
|
+
}
|
|
318
|
+
const result = await (0, send_user_message_1.sendUserMessage)(db, {
|
|
319
|
+
worktreeId: requester.worktreeId,
|
|
320
|
+
content: body,
|
|
321
|
+
cliToolId: requester.cliToolId,
|
|
322
|
+
instanceId: requester.instanceId,
|
|
323
|
+
messageType: 'relay',
|
|
324
|
+
// The pointer back at the ledger. Also `session_relays.sent_request_id` for
|
|
325
|
+
// a reply, which carries a UNIQUE index — so a second delivery of the same
|
|
326
|
+
// relay cannot be recorded even if one were somehow attempted.
|
|
327
|
+
requestId: kind === 'reply' ? (0, chat_db_1.relayRequestId)(relay.id) : undefined,
|
|
328
|
+
});
|
|
329
|
+
if (!result.ok) {
|
|
330
|
+
logger.info('relay-delivery-refused', { relayId, kind, stage: result.stage });
|
|
331
|
+
return result.stage === 'prompt_waiting' ? 'held' : 'failed';
|
|
332
|
+
}
|
|
333
|
+
const now = Date.now();
|
|
334
|
+
if (kind === 'reply') {
|
|
335
|
+
if (!(0, relay_db_1.markRelayDelivered)(db, relay.id, (0, chat_db_1.relayRequestId)(relay.id), now)) {
|
|
336
|
+
// Somebody closed it underneath us. The message is already in A's
|
|
337
|
+
// composer, which is the outcome that mattered.
|
|
338
|
+
logger.info('relay-already-closed-on-deliver', { relayId });
|
|
339
|
+
}
|
|
340
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'replied', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
341
|
+
}
|
|
342
|
+
else if (kind === 'prompt') {
|
|
343
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'waiting', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
344
|
+
}
|
|
345
|
+
(0, relay_db_1.clearRelayPending)(db, relay.id, now);
|
|
346
|
+
logger.info('relay-delivered', { relayId, kind, to: `${requester.worktreeId}/${requester.instanceId}` });
|
|
347
|
+
return 'delivered';
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Deliver every stashed payload that can be delivered now.
|
|
351
|
+
*
|
|
352
|
+
* Single-flight: a pump already running is the pump, and a second entry — the
|
|
353
|
+
* timer firing while a first pass awaits a capture — would read the same rows
|
|
354
|
+
* and race its own sends.
|
|
355
|
+
*/
|
|
356
|
+
async function pumpRelayDeliveries() {
|
|
357
|
+
if (globalThis.__relayPumpRunning)
|
|
358
|
+
return;
|
|
359
|
+
globalThis.__relayPumpRunning = true;
|
|
360
|
+
try {
|
|
361
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
362
|
+
for (const item of (0, relay_db_1.listRelaysWithPendingPayload)(db)) {
|
|
363
|
+
if (inFlight.has(item.relay.id))
|
|
364
|
+
continue;
|
|
365
|
+
inFlight.add(item.relay.id);
|
|
366
|
+
try {
|
|
367
|
+
await deliverOne(db, item.relay.id, item.kind, item.body);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
logger.warn('relay-delivery-failed', {
|
|
371
|
+
relayId: item.relay.id,
|
|
372
|
+
error: error instanceof Error ? error.message : String(error),
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
inFlight.delete(item.relay.id);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
logger.warn('relay-pump-failed', {
|
|
382
|
+
error: error instanceof Error ? error.message : String(error),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
globalThis.__relayPumpRunning = false;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/** One tick of the background loop: sweep the deadlines, then deliver. */
|
|
390
|
+
async function runRelayMaintenanceTick() {
|
|
391
|
+
try {
|
|
392
|
+
sweepExpiredRelays((0, db_instance_1.getDbInstance)());
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
logger.warn('relay-sweep-failed', {
|
|
396
|
+
error: error instanceof Error ? error.message : String(error),
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
await pumpRelayDeliveries();
|
|
400
|
+
}
|