commandmate 0.31.3 → 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 +487 -473
- package/.next/app-path-routes-manifest.json +37 -35
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- 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 +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route_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 +37 -35
- 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 +3 -3
- 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/{9798.js → 6661.js} +1 -2
- 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/8807.js +37 -3
- package/.next/server/chunks/8918.js +6 -4
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +21 -5
- 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/server/locales/en/worktree.json +23 -0
- package/dist/server/locales/ja/worktree.json +23 -0
- package/dist/server/src/lib/auto-yes-poller.js +26 -11
- package/dist/server/src/lib/db/chat-db.js +161 -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/selection-shape.js +72 -1
- package/dist/server/src/lib/detection/status-reason.js +28 -0
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +13 -7
- package/dist/server/src/lib/detection/tools/command-code/detect.js +33 -0
- package/dist/server/src/lib/history/user-turn-recorder.js +79 -16
- package/dist/server/src/lib/polling/response-checker.js +45 -8
- package/dist/server/src/lib/polling/structured-history-gate.js +14 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/realtime/waiting-broadcast.js +12 -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/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/3484.js +0 -1
- package/.next/server/chunks/358.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/7836.js +0 -1
- package/.next/server/chunks/7859.js +0 -21
- package/.next/server/chunks/9696.js +0 -3
- package/.next/static/0hTIackGXw6v7diXJS6yN/_buildManifest.js +0 -1
- package/.next/static/chunks/2813-de885de8a4b11910.js +0 -1
- package/.next/static/chunks/4718-07ec4e10186928db.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-91b639c90795baa9.js +0 -1
- package/.next/static/chunks/webpack-9f75198882fdaf08.js +0 -1
- package/.next/static/css/acc4b9c3feb04287.css +0 -1
- /package/.next/static/{0hTIackGXw6v7diXJS6yN → UIUPchtWvcEuQgcbGJv4g}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Every sentence a relay puts in front of an agent or a reader (Issue #2377).
|
|
4
|
+
*
|
|
5
|
+
* ## Why the text is here and not in `locales/`
|
|
6
|
+
*
|
|
7
|
+
* Two of the four go into an AGENT's composer, which makes them prompts rather
|
|
8
|
+
* than labels: the `[from …]` header is what tells session A that the paragraph
|
|
9
|
+
* underneath it was written by somebody else, and a key that resolved to its own
|
|
10
|
+
* name — a renamed namespace, a dictionary that failed to load — would hand A an
|
|
11
|
+
* unattributed wall of text from another session and no way to tell. The same
|
|
12
|
+
* argument `buildDelegationBrief` makes in `lib/cli/command-reference`, and the
|
|
13
|
+
* same shape `buildModelChangedSentence` uses for the model-change history row
|
|
14
|
+
* (#2357): both languages written out side by side so a change to one is
|
|
15
|
+
* visibly a change to the other.
|
|
16
|
+
*
|
|
17
|
+
* The UI's own labels — the badges, the chat strip — ARE in `locales/`, because
|
|
18
|
+
* those are labels.
|
|
19
|
+
*
|
|
20
|
+
* ## The header is machine-readable on purpose
|
|
21
|
+
*
|
|
22
|
+
* {@link RELAY_HEADER_PREFIX} opens every delivered body in both languages, so
|
|
23
|
+
* a reader (a human, an agent, a later `capture`) can recognise a relayed
|
|
24
|
+
* message without knowing which language the server was speaking. The body
|
|
25
|
+
* after it is B's own text, untouched — summarising or translating it is out of
|
|
26
|
+
* scope by the Issue's own words.
|
|
27
|
+
*
|
|
28
|
+
* @module lib/relay/relay-messages
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.RELAY_HEADER_PREFIX = void 0;
|
|
32
|
+
exports.buildRelayHeader = buildRelayHeader;
|
|
33
|
+
exports.buildRelayReplyMessage = buildRelayReplyMessage;
|
|
34
|
+
exports.buildRelayPromptMessage = buildRelayPromptMessage;
|
|
35
|
+
exports.buildRelayExpiredMessage = buildRelayExpiredMessage;
|
|
36
|
+
exports.buildRelaySystemLine = buildRelaySystemLine;
|
|
37
|
+
/**
|
|
38
|
+
* The literal every relayed body starts with.
|
|
39
|
+
*
|
|
40
|
+
* `[from ` and not a localized word: it is the one token a consumer may match
|
|
41
|
+
* on, and it has to mean the same thing in both dictionaries.
|
|
42
|
+
*/
|
|
43
|
+
exports.RELAY_HEADER_PREFIX = '[from ';
|
|
44
|
+
/** How long a quoted prompt question may be before it is elided. */
|
|
45
|
+
const PROMPT_SUMMARY_MAX_CHARS = 200;
|
|
46
|
+
/** How many options of a confirmation are listed before the rest are counted. */
|
|
47
|
+
const PROMPT_OPTIONS_MAX = 9;
|
|
48
|
+
/**
|
|
49
|
+
* `[from <alias> / <worktree>]` — the attribution line.
|
|
50
|
+
*
|
|
51
|
+
* Both fields, always: an alias alone is ambiguous across worktrees (every
|
|
52
|
+
* repository's roster tends to contain a `Codex 2`) and a worktree alone does
|
|
53
|
+
* not say which of its sessions answered.
|
|
54
|
+
*/
|
|
55
|
+
function buildRelayHeader(sender) {
|
|
56
|
+
return `${exports.RELAY_HEADER_PREFIX}${sender.alias} / ${sender.worktreeId}]`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* B's reply, attributed.
|
|
60
|
+
*
|
|
61
|
+
* The body is passed through verbatim — no summary, no translation, no
|
|
62
|
+
* re-wrapping. A blank body still gets a header: "they finished and said
|
|
63
|
+
* nothing" is information, and swallowing the delivery would leave A waiting on
|
|
64
|
+
* a relay that has already closed.
|
|
65
|
+
*/
|
|
66
|
+
function buildRelayReplyMessage(sender, reply) {
|
|
67
|
+
const body = reply.trim();
|
|
68
|
+
return body === ''
|
|
69
|
+
? `${buildRelayHeader(sender)} (no reply body)`
|
|
70
|
+
: `${buildRelayHeader(sender)} ${body}`;
|
|
71
|
+
}
|
|
72
|
+
/** Collapse whitespace and clip, so a 40-line dialog is one readable line. */
|
|
73
|
+
function squeeze(text, max) {
|
|
74
|
+
const flat = text.replace(/\s+/g, ' ').trim();
|
|
75
|
+
return flat.length <= max ? flat : `${flat.slice(0, max - 1)}…`;
|
|
76
|
+
}
|
|
77
|
+
const PROMPT_TEMPLATES = {
|
|
78
|
+
en: {
|
|
79
|
+
waiting: 'is waiting for a confirmation:',
|
|
80
|
+
options: 'Options:',
|
|
81
|
+
more: '(+{n} more)',
|
|
82
|
+
},
|
|
83
|
+
ja: {
|
|
84
|
+
waiting: '確認待ちです:',
|
|
85
|
+
options: '選択肢:',
|
|
86
|
+
more: '(他 {n} 件)',
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* "They are blocked on a dialog, and here is what it asks."
|
|
91
|
+
*
|
|
92
|
+
* Deliberately NOT an instruction to answer it. `respond` on somebody else's
|
|
93
|
+
* dialog picks whatever option happens to be highlighted (#1681), and the
|
|
94
|
+
* delegation brief already forbids it; this notice exists so A can decide what
|
|
95
|
+
* to do, which is usually to tell a human.
|
|
96
|
+
*/
|
|
97
|
+
function buildRelayPromptMessage(locale, sender, notice) {
|
|
98
|
+
const t = PROMPT_TEMPLATES[locale];
|
|
99
|
+
const head = `${buildRelayHeader(sender)} ${t.waiting} ${squeeze(notice.question, PROMPT_SUMMARY_MAX_CHARS)}`;
|
|
100
|
+
if (notice.options.length === 0)
|
|
101
|
+
return head;
|
|
102
|
+
const shown = notice.options.slice(0, PROMPT_OPTIONS_MAX);
|
|
103
|
+
const rest = notice.options.length - shown.length;
|
|
104
|
+
const listed = shown.map((o) => `${o.key}) ${squeeze(o.label, 60)}`).join(' ');
|
|
105
|
+
const more = rest > 0 ? ` ${t.more.replace('{n}', String(rest))}` : '';
|
|
106
|
+
return `${head}\n${t.options} ${listed}${more}`;
|
|
107
|
+
}
|
|
108
|
+
const EXPIRED_TEMPLATES = {
|
|
109
|
+
en: 'The reply you were waiting for did not arrive within {hours}h; the relay has expired.',
|
|
110
|
+
ja: '待っていた返信が {hours} 時間以内に届かなかったため、委任は期限切れになりました。',
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The single line an expired relay leaves in A's composer.
|
|
114
|
+
*
|
|
115
|
+
* One line and one only — the Issue's "1行だけ通知". The once-ness is enforced
|
|
116
|
+
* by the ledger (`markRelayExpired` is a guarded update), not by this string.
|
|
117
|
+
*/
|
|
118
|
+
function buildRelayExpiredMessage(locale, sender, ttlMs) {
|
|
119
|
+
const hours = Math.max(1, Math.round(ttlMs / 3_600_000));
|
|
120
|
+
return `${buildRelayHeader(sender)} ${EXPIRED_TEMPLATES[locale].replace('{hours}', String(hours))}`;
|
|
121
|
+
}
|
|
122
|
+
const SYSTEM_TEMPLATES = {
|
|
123
|
+
en: {
|
|
124
|
+
requested: 'Delegated to {alias}; waiting for the reply.',
|
|
125
|
+
replied: 'Reply from {alias}.',
|
|
126
|
+
waiting: '{alias} is waiting for a confirmation.',
|
|
127
|
+
expired: 'The delegation to {alias} expired without a reply.',
|
|
128
|
+
},
|
|
129
|
+
ja: {
|
|
130
|
+
requested: '{alias} へ委任、返信待ち',
|
|
131
|
+
replied: '{alias} から返信',
|
|
132
|
+
waiting: '{alias} が確認待ち',
|
|
133
|
+
expired: '{alias} への委任が返信のないまま期限切れ',
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* The one-line system row the chat surface and History both show.
|
|
138
|
+
*
|
|
139
|
+
* Written into `chat_messages` exactly as the model-change row is (#2357), in
|
|
140
|
+
* the readers' language, because a stored row cannot be re-rendered per viewer.
|
|
141
|
+
*/
|
|
142
|
+
function buildRelaySystemLine(locale, kind, alias) {
|
|
143
|
+
return SYSTEM_TEMPLATES[locale][kind].replace('{alias}', alias);
|
|
144
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The four rules that stop relays from becoming a loop (Issue #2377).
|
|
4
|
+
*
|
|
5
|
+
* A relay is a standing instruction that fires on somebody else's turn, so the
|
|
6
|
+
* failure mode it introduces is not "a wrong answer" but "two agents talking to
|
|
7
|
+
* each other forever, each one's reply being the other's next prompt". None of
|
|
8
|
+
* the guards below is expensive; all four exist because the cheap version of
|
|
9
|
+
* this feature has no natural stopping point.
|
|
10
|
+
*
|
|
11
|
+
* 1. **A relayed message may not open a relay** (`RELAY_CHAIN_BLOCKED`). The
|
|
12
|
+
* default. `--allow-relay-chain` is the deliberate override, and the flag is
|
|
13
|
+
* named after what it permits rather than after what it disables.
|
|
14
|
+
* 2. **Chains are bounded** (`RELAY_HOPS_EXCEEDED`). Even with the override,
|
|
15
|
+
* depth stops at {@link MAX_RELAY_HOPS}.
|
|
16
|
+
* 3. **One open relay per direction** (`RELAY_DUPLICATE_PENDING`). A second
|
|
17
|
+
* standing instruction from A to B says nothing the first does not, and both
|
|
18
|
+
* would fire on the same finished turn.
|
|
19
|
+
* 4. **A session may not relay to itself** (`RELAY_SELF_TARGET`), which is a
|
|
20
|
+
* one-message loop with no second party in it at all.
|
|
21
|
+
*
|
|
22
|
+
* Pure: every decision is a function of values the caller already read. The
|
|
23
|
+
* database work — finding the parent relay, counting the open ones — is
|
|
24
|
+
* `relay-service`'s, so the rules can be tested without a schema.
|
|
25
|
+
*
|
|
26
|
+
* @module lib/relay/relay-policy
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.RELAY_PUMP_INTERVAL_MS = exports.RELAY_SCRAPE_QUIET_MS = exports.MAX_OPEN_RELAYS_PER_PAIR = exports.MAX_RELAY_HOPS = exports.MAX_RELAY_TTL_MS = exports.MIN_RELAY_TTL_MS = exports.DEFAULT_RELAY_TTL_MS = void 0;
|
|
30
|
+
exports.isSameEndpoint = isSameEndpoint;
|
|
31
|
+
exports.decideRelayCreation = decideRelayCreation;
|
|
32
|
+
exports.isRelayRefusal = isRelayRefusal;
|
|
33
|
+
exports.resolveRelayTtlMs = resolveRelayTtlMs;
|
|
34
|
+
/** How long a relay stands before it is swept. 24h, per the Issue. */
|
|
35
|
+
exports.DEFAULT_RELAY_TTL_MS = 24 * 60 * 60 * 1000;
|
|
36
|
+
/** Shortest TTL a caller may ask for: one minute. */
|
|
37
|
+
exports.MIN_RELAY_TTL_MS = 60 * 1000;
|
|
38
|
+
/** Longest TTL a caller may ask for: seven days. */
|
|
39
|
+
exports.MAX_RELAY_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
40
|
+
/**
|
|
41
|
+
* How deep a chain may go.
|
|
42
|
+
*
|
|
43
|
+
* Three, by the Issue. Depth 1 is a relay nothing relayed into; a relay opened
|
|
44
|
+
* while answering one is 2, and so on. A request that would create depth 4 is
|
|
45
|
+
* refused — `--allow-relay-chain` widens the door, it does not remove the wall.
|
|
46
|
+
*/
|
|
47
|
+
exports.MAX_RELAY_HOPS = 3;
|
|
48
|
+
/** How many open relays one from→to direction may hold at once. */
|
|
49
|
+
exports.MAX_OPEN_RELAYS_PER_PAIR = 1;
|
|
50
|
+
/**
|
|
51
|
+
* How long a scrape-only tool must sit still before its pane counts as a reply.
|
|
52
|
+
*
|
|
53
|
+
* copilot, gemini and vibe-local keep no transcript, so what a completed turn
|
|
54
|
+
* leaves behind is the poller's copy of the SCREEN — and the poller's completion
|
|
55
|
+
* judgement is a string analysis of a frame that is still being drawn. Delivering
|
|
56
|
+
* on the first such judgement is how a half-written answer reaches session A as
|
|
57
|
+
* "the reply". The relay therefore waits, re-reads the newest row and delivers
|
|
58
|
+
* only if nothing newer arrived: the Issue's 「完了検知 + 数秒の静穏」.
|
|
59
|
+
*
|
|
60
|
+
* Tools with a transcript skip this entirely — their reader answers `true` only
|
|
61
|
+
* for a turn the agent has closed, which is a stronger statement than any amount
|
|
62
|
+
* of quiet.
|
|
63
|
+
*/
|
|
64
|
+
exports.RELAY_SCRAPE_QUIET_MS = 4_000;
|
|
65
|
+
/** How often the pump retries deliveries and sweeps expired relays. */
|
|
66
|
+
exports.RELAY_PUMP_INTERVAL_MS = 15_000;
|
|
67
|
+
/** Whether two endpoints name the same session. */
|
|
68
|
+
function isSameEndpoint(a, b) {
|
|
69
|
+
return a.worktreeId === b.worktreeId && a.instanceId === b.instanceId;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Apply all four rules and hand back the depth, or the refusal.
|
|
73
|
+
*
|
|
74
|
+
* Order matters only for which sentence an operator sees first, and it is the
|
|
75
|
+
* order they can act on: "you are the same session" is a typo, "this would be a
|
|
76
|
+
* chain" is a flag away, "the chain is too deep" and "you already have one" are
|
|
77
|
+
* decisions about work in flight.
|
|
78
|
+
*/
|
|
79
|
+
function decideRelayCreation(input) {
|
|
80
|
+
if (isSameEndpoint(input.from, input.to)) {
|
|
81
|
+
return {
|
|
82
|
+
code: 'RELAY_SELF_TARGET',
|
|
83
|
+
message: 'A session cannot relay a reply to itself. --reply-to must name a different '
|
|
84
|
+
+ 'worktree or a different agent instance.',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const hops = input.parentHops === null ? 1 : input.parentHops + 1;
|
|
88
|
+
if (input.parentHops !== null && !input.allowRelayChain) {
|
|
89
|
+
return {
|
|
90
|
+
code: 'RELAY_CHAIN_BLOCKED',
|
|
91
|
+
message: 'The last message this session was given arrived over a relay, so opening '
|
|
92
|
+
+ 'another one would chain two deliveries together. Pass --allow-relay-chain '
|
|
93
|
+
+ 'if that is what you mean.',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (hops > exports.MAX_RELAY_HOPS) {
|
|
97
|
+
return {
|
|
98
|
+
code: 'RELAY_HOPS_EXCEEDED',
|
|
99
|
+
message: `Relay chains stop at ${exports.MAX_RELAY_HOPS} hops; this one would be ${hops}. `
|
|
100
|
+
+ 'Report the reply to whoever asked instead of forwarding it again.',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (input.openBetween >= exports.MAX_OPEN_RELAYS_PER_PAIR) {
|
|
104
|
+
return {
|
|
105
|
+
code: 'RELAY_DUPLICATE_PENDING',
|
|
106
|
+
message: 'There is already an open relay between these two sessions. Wait for it, or '
|
|
107
|
+
+ 'withdraw it with `commandmate relays cancel <id>`.',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return { ok: true, hops };
|
|
111
|
+
}
|
|
112
|
+
/** Whether a verdict is a refusal. */
|
|
113
|
+
function isRelayRefusal(verdict) {
|
|
114
|
+
return 'code' in verdict;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Clamp a requested TTL into the supported window.
|
|
118
|
+
*
|
|
119
|
+
* Clamped rather than refused: the TTL is a sweep deadline, not a promise, and
|
|
120
|
+
* an operator who asked for a year gets the longest one that keeps the ledger
|
|
121
|
+
* from accumulating rows nobody will ever collect.
|
|
122
|
+
*/
|
|
123
|
+
function resolveRelayTtlMs(requested) {
|
|
124
|
+
if (requested === undefined || !Number.isFinite(requested))
|
|
125
|
+
return exports.DEFAULT_RELAY_TTL_MS;
|
|
126
|
+
return Math.min(exports.MAX_RELAY_TTL_MS, Math.max(exports.MIN_RELAY_TTL_MS, Math.trunc(requested)));
|
|
127
|
+
}
|