commandmate 0.49.0 → 0.49.2
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 +251 -248
- package/.next/app-path-routes-manifest.json +22 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- 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/release-notes/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- 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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/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/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/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 +2 -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.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +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.js.nft.json +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 +1 -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 +1 -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]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/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 +144 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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 +103 -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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +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/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.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 +22 -21
- package/.next/server/chunks/1062.js +1 -0
- package/.next/server/chunks/{936.js → 110.js} +1 -1
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/{4280.js → 3756.js} +1 -1
- package/.next/server/chunks/3801.js +31 -0
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/{9130.js → 5630.js} +1 -1
- package/.next/server/chunks/610.js +1 -0
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6808.js +4 -0
- package/.next/server/chunks/7023.js +14 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +8 -8
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +63 -53
- package/.next/server/chunks/8918.js +103 -1
- package/.next/server/chunks/9198.js +144 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-07a237575e1ceb9e.js} +1 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/page-c6eb7c02db2f4c80.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +1 -0
- package/.next/static/css/c1e307d05daf93b6.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +233 -17
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +39 -5
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +100 -8
- package/dist/cli/commands/relays.d.ts +26 -2
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +70 -5
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +22 -5
- package/dist/cli/commands/respond.d.ts +12 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +83 -18
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +14 -8
- package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
- package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
- package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
- package/dist/cli/commands/wait-instance.d.ts +29 -0
- package/dist/cli/commands/wait-instance.d.ts.map +1 -0
- package/dist/cli/commands/wait-instance.js +56 -0
- package/dist/cli/commands/wait-notices.d.ts +87 -0
- package/dist/cli/commands/wait-notices.d.ts.map +1 -0
- package/dist/cli/commands/wait-notices.js +301 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
- package/dist/cli/commands/wait-poll-state.d.ts +136 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-state.js +6 -0
- package/dist/cli/commands/wait-timing.d.ts +46 -0
- package/dist/cli/commands/wait-timing.d.ts.map +1 -0
- package/dist/cli/commands/wait-timing.js +99 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
- package/dist/cli/commands/wait-turn-boundary.js +427 -0
- package/dist/cli/commands/wait-verify.d.ts +51 -0
- package/dist/cli/commands/wait-verify.d.ts.map +1 -0
- package/dist/cli/commands/wait-verify.js +128 -0
- package/dist/cli/commands/wait.d.ts +6 -105
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +240 -968
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +24 -1
- package/dist/cli/types/api-responses.d.ts +49 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +69 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +226 -18
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +80 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +147 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/session/send-attempt-types.d.ts +48 -1
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +18 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +20 -3
- package/dist/server/locales/ja/worktree.json +20 -3
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +54 -11
- package/dist/server/src/lib/cli-tools/antigravity.js +45 -9
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/codex.js +67 -15
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
- package/dist/server/src/lib/cli-tools/command-code.js +7 -3
- package/dist/server/src/lib/cli-tools/copilot.js +125 -33
- package/dist/server/src/lib/cli-tools/gemini.js +37 -10
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +60 -15
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +590 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +512 -620
- package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
- package/dist/server/src/lib/db/migrations/runner.js +37 -4
- package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
- package/dist/server/src/lib/db/relay-bind-db.js +437 -0
- package/dist/server/src/lib/db/relay-db.js +59 -96
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/upstream-faults.js +40 -6
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
- package/dist/server/src/lib/polling/response-checker.js +7 -5
- package/dist/server/src/lib/prompt-answer-errors.js +362 -0
- package/dist/server/src/lib/prompt-answer-sender.js +264 -288
- package/dist/server/src/lib/push/failure-episode-state.js +4 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
- package/dist/server/src/lib/realtime-snippet.js +54 -0
- package/dist/server/src/lib/relay/relay-bind.js +294 -0
- package/dist/server/src/lib/relay/relay-boot.js +51 -0
- package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
- package/dist/server/src/lib/relay/relay-delivery.js +134 -220
- package/dist/server/src/lib/relay/relay-messages.js +39 -4
- package/dist/server/src/lib/relay/relay-overlap.js +92 -0
- package/dist/server/src/lib/relay/relay-system-line.js +3 -2
- package/dist/server/src/lib/relay/types.js +12 -1
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +23 -0
- package/dist/server/src/lib/session/claude-session.js +59 -8
- package/dist/server/src/lib/session/composer-clear.js +54 -1
- package/dist/server/src/lib/session/current-output-builder.js +26 -8
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +664 -0
- package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
- package/dist/server/src/lib/session/send-attempt-state.js +65 -0
- package/dist/server/src/lib/session/send-attempt-types.js +18 -1
- package/dist/server/src/lib/session/send-user-message.js +84 -14
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +12 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +0 -27
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.1.json +66 -0
- package/release-notes/0.49.2.json +49 -0
- package/.next/server/chunks/1210.js +0 -1
- package/.next/server/chunks/1945.js +0 -14
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/4194.js +0 -67
- package/.next/server/chunks/5845.js +0 -1
- package/.next/server/chunks/720.js +0 -103
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9540.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
- package/.next/static/chunks/9079-987939d231704218.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
- package/.next/static/css/db8959555c3d9c96.css +0 -1
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading B's reply out of the ledger and stashing it for A (Issue #2377,
|
|
4
|
+
* bound relays Issue #3957).
|
|
5
|
+
*
|
|
6
|
+
* Split out of `relay-delivery` (Issue #3996): everything here decides WHAT is
|
|
7
|
+
* owed to a relay — the reply, the prompt notice, the bound relay's recovery
|
|
8
|
+
* after a restart — and nothing here sends. The send, the pump and the state
|
|
9
|
+
* they share stay in `relay-delivery`, which re-exports this module's public
|
|
10
|
+
* names, and this module never imports it back.
|
|
11
|
+
*
|
|
12
|
+
* @module lib/relay/relay-bound-reply
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.senderLabel = senderLabel;
|
|
16
|
+
exports.requiresTurnRow = requiresTurnRow;
|
|
17
|
+
exports.findWorkerReply = findWorkerReply;
|
|
18
|
+
exports.stashReplyForOpenRelays = stashReplyForOpenRelays;
|
|
19
|
+
exports.observationStillHolds = observationStillHolds;
|
|
20
|
+
exports.findWorkerCompletions = findWorkerCompletions;
|
|
21
|
+
exports.stashBoundReply = stashBoundReply;
|
|
22
|
+
exports.notifyPromptForRelay = notifyPromptForRelay;
|
|
23
|
+
exports.stashPromptNotice = stashPromptNotice;
|
|
24
|
+
exports.recoverBoundRelays = recoverBoundRelays;
|
|
25
|
+
const crypto_1 = require("crypto");
|
|
26
|
+
const relay_db_1 = require("../../lib/db/relay-db");
|
|
27
|
+
const chat_db_1 = require("../../lib/db/chat-db");
|
|
28
|
+
const models_1 = require("../../types/models");
|
|
29
|
+
const model_change_push_notifier_1 = require("../../lib/push/model-change-push-notifier");
|
|
30
|
+
const relay_messages_1 = require("../../lib/relay/relay-messages");
|
|
31
|
+
const relay_bind_1 = require("../../lib/relay/relay-bind");
|
|
32
|
+
const relay_boot_1 = require("../../lib/relay/relay-boot");
|
|
33
|
+
const relay_overlap_1 = require("../../lib/relay/relay-overlap");
|
|
34
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
35
|
+
const prompt_waiting_composition_1 = require("../../lib/session/prompt-waiting-composition");
|
|
36
|
+
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
37
|
+
const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
|
|
38
|
+
const relay_delivery_claims_1 = require("../../lib/relay/relay-delivery-claims");
|
|
39
|
+
const types_1 = require("../../lib/relay/types");
|
|
40
|
+
const logger_1 = require("../../lib/logger");
|
|
41
|
+
const logger = (0, logger_1.createLogger)('relay-delivery');
|
|
42
|
+
/**
|
|
43
|
+
* How many assistant rows back the reply is looked for.
|
|
44
|
+
*
|
|
45
|
+
* A turn can write several rows (a narration then a summary), and the relay
|
|
46
|
+
* wants the last one that is actually the agent talking. Bounded because an
|
|
47
|
+
* unbounded read of a long-lived worktree's history is a large query for one
|
|
48
|
+
* line of answer.
|
|
49
|
+
*/
|
|
50
|
+
const REPLY_LOOKBACK_MESSAGES = 40;
|
|
51
|
+
/**
|
|
52
|
+
* The `request_id` shape a transcript reader mints for a finished turn.
|
|
53
|
+
*
|
|
54
|
+
* `claude-turn:<uuid>`, `codex-turn:<turn_id>`, `antigravity-turn:<id>`,
|
|
55
|
+
* `command-code-turn:<id>` and opencode's `oc-turn:<message id>`. Matched as a
|
|
56
|
+
* SHAPE rather than as a list of five literals for the reason `ask`'s copy of
|
|
57
|
+
* this line gives (Issue #2386): the sixth reader lands INSIDE the filter
|
|
58
|
+
* instead of silently outside it. A `:` cannot appear in any of the ids
|
|
59
|
+
* themselves, so this cannot match a row that merely contains the text.
|
|
60
|
+
*
|
|
61
|
+
* Copied rather than imported, deliberately. `src/cli/commands/ask.ts` has the
|
|
62
|
+
* same regexp, and importing it here would invert the dependency (lib reaching
|
|
63
|
+
* into the CLI bundle); `AGENT_MARKDOWN_REQUEST_ID_PREFIXES` in
|
|
64
|
+
* `src/types/agent-transcript.ts` is the LIST form this shape is chosen not to
|
|
65
|
+
* be. One regexp in each layer is cheaper than either edge.
|
|
66
|
+
*/
|
|
67
|
+
const TURN_REQUEST_ID_PATTERN = /-turn:/;
|
|
68
|
+
/**
|
|
69
|
+
* Request-id namespaces CommandMate writes ABOUT a session, not for it.
|
|
70
|
+
*
|
|
71
|
+
* `chat_messages` has no `system` role, so "reply from X" (Issue #2377) and
|
|
72
|
+
* "the model changed" (Issue #2357) are both stored as assistant rows and told
|
|
73
|
+
* apart by their request id. Neither is a word the worker said, and handing the
|
|
74
|
+
* relay's own notice back to the session it came from is the smallest possible
|
|
75
|
+
* loop. `ask` steps over exactly these two for the same reason.
|
|
76
|
+
*/
|
|
77
|
+
const SYSTEM_ROW_REQUEST_ID_PREFIXES = [
|
|
78
|
+
chat_db_1.RELAY_SYSTEM_REQUEST_ID_PREFIX,
|
|
79
|
+
chat_db_1.MODEL_CHANGE_REQUEST_ID_PREFIX,
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Whether this tool's reply is read out of a transcript rather than off a screen.
|
|
83
|
+
*
|
|
84
|
+
* For the six that answer `true` the ledger is authoritative: a row with no
|
|
85
|
+
* turn marker was written by the SCRAPER, and for these tools a scraped row is
|
|
86
|
+
* never the answer — it is a footer line, a half-drawn frame or the ANSI dump
|
|
87
|
+
* the send path flushes (Issues #2398 / #2400). The relay may therefore hold
|
|
88
|
+
* out for a marked row. For copilot, gemini and vibe-local the scraper's row is
|
|
89
|
+
* the only record there will ever be, and demanding a marker would deliver
|
|
90
|
+
* nothing, ever.
|
|
91
|
+
*
|
|
92
|
+
* A record and not a `Set`, so a ninth entry in `CLI_TOOL_IDS` fails `tsc` here
|
|
93
|
+
* instead of quietly defaulting to "screen-scraped" — the idiom
|
|
94
|
+
* `cli-tools/install-hints` uses for the same reason.
|
|
95
|
+
*
|
|
96
|
+
* Deliberately NOT `isPullTranscriptHistory`: that asks who does the READING,
|
|
97
|
+
* so opencode (whose own server pushes) answers `false` even though its rows
|
|
98
|
+
* carry `oc-turn:` like the other four. It also lives in `lib/polling`, whose
|
|
99
|
+
* module graph reaches this file's triggers — importing it would close a cycle
|
|
100
|
+
* the relay was built to avoid.
|
|
101
|
+
*/
|
|
102
|
+
const TRANSCRIPT_READER_TOOLS = {
|
|
103
|
+
claude: true,
|
|
104
|
+
codex: true,
|
|
105
|
+
antigravity: true,
|
|
106
|
+
'command-code': true,
|
|
107
|
+
opencode: true,
|
|
108
|
+
copilot: false,
|
|
109
|
+
gemini: false,
|
|
110
|
+
'vibe-local': false,
|
|
111
|
+
// Issue #2940: OpenCode V2's replies are written from its server
|
|
112
|
+
// (`GET /api/session/{id}/message`) under `oc-turn:`, like opencode's.
|
|
113
|
+
'opencode-v2': true,
|
|
114
|
+
};
|
|
115
|
+
function senderLabel(db, relay) {
|
|
116
|
+
const worker = (0, relay_session_ref_1.resolveRelaySession)(db, relay.to);
|
|
117
|
+
return { alias: worker.alias, worktreeId: worker.worktreeId };
|
|
118
|
+
}
|
|
119
|
+
/** Whether a row's `request_id` says a transcript reader wrote it. */
|
|
120
|
+
function isTurnRow(requestId) {
|
|
121
|
+
return typeof requestId === 'string' && TURN_REQUEST_ID_PATTERN.test(requestId);
|
|
122
|
+
}
|
|
123
|
+
/** Whether a row is CommandMate's own furniture rather than the worker's words. */
|
|
124
|
+
function isSystemRow(requestId) {
|
|
125
|
+
return typeof requestId === 'string'
|
|
126
|
+
&& SYSTEM_ROW_REQUEST_ID_PREFIXES.some((prefix) => requestId.startsWith(prefix));
|
|
127
|
+
}
|
|
128
|
+
/** Whether this worker's answer is only ever a transcript row. */
|
|
129
|
+
function requiresTurnRow(cliToolId) {
|
|
130
|
+
return TRANSCRIPT_READER_TOOLS[cliToolId] === true;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The newest thing B actually said, at or after `since`.
|
|
134
|
+
*
|
|
135
|
+
* Four kinds of row are stepped over, and each exclusion is load-bearing:
|
|
136
|
+
* prompt rows (a question is not an answer, and the confirmation notice is a
|
|
137
|
+
* separate delivery), CommandMate's own system rows (delivering "Reply from X"
|
|
138
|
+
* back to X is the smallest possible loop), empty bodies — and, for a tool that
|
|
139
|
+
* keeps a transcript, every row the SCRAPER wrote.
|
|
140
|
+
*
|
|
141
|
+
* That last one is Issue #2401. Until it was added the filter looked only at
|
|
142
|
+
* shape, never at provenance, so the newest row won whatever had written it:
|
|
143
|
+
* a codex footer line, a partial scrape, or the raw ANSI the send path flushes
|
|
144
|
+
* lands in the ledger with `request_id IS NULL` and, being newest, WAS the
|
|
145
|
+
* reply — forwarded to the requesting agent as the worker's own answer, which
|
|
146
|
+
* it then summarises. #2386 fixed the identical hole in `ask` by demanding the
|
|
147
|
+
* turn marker; the relay looked exempt only because its 15-second pump usually
|
|
148
|
+
* gave the transcript time to land, and a race the timing usually wins is still
|
|
149
|
+
* a race.
|
|
150
|
+
*/
|
|
151
|
+
function findWorkerReply(db, worker, since) {
|
|
152
|
+
const messages = (0, chat_db_1.getMessages)(db, worker.worktreeId, {
|
|
153
|
+
limit: REPLY_LOOKBACK_MESSAGES,
|
|
154
|
+
cliToolId: worker.cliToolId,
|
|
155
|
+
instanceId: worker.instanceId,
|
|
156
|
+
matchResolvedInstance: true,
|
|
157
|
+
});
|
|
158
|
+
const requireTurnRow = requiresTurnRow(worker.cliToolId);
|
|
159
|
+
// `getMessages` answers newest-first, so the first candidate IS the newest.
|
|
160
|
+
for (const message of messages) {
|
|
161
|
+
if (message.role !== 'assistant')
|
|
162
|
+
continue;
|
|
163
|
+
if (message.messageType === 'prompt')
|
|
164
|
+
continue;
|
|
165
|
+
if (isSystemRow(message.requestId))
|
|
166
|
+
continue;
|
|
167
|
+
if (requireTurnRow && !isTurnRow(message.requestId))
|
|
168
|
+
continue;
|
|
169
|
+
if (message.content.trim() === '')
|
|
170
|
+
continue;
|
|
171
|
+
return message.timestamp.getTime() < since ? null : message;
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
/** The options of B's open dialog, in the shape the notice lists them. */
|
|
176
|
+
function promptOptionsOf(message) {
|
|
177
|
+
const data = message.promptData;
|
|
178
|
+
// #3184: type narrowing only — the stored row's screen `options` are listed;
|
|
179
|
+
// a stored degraded record never carries a decision id, so it has none.
|
|
180
|
+
if (!(0, models_1.isAnswerablePromptData)(data))
|
|
181
|
+
return [];
|
|
182
|
+
if (data.type === 'yes_no') {
|
|
183
|
+
return data.options.map((label) => ({ key: label, label }));
|
|
184
|
+
}
|
|
185
|
+
return data.options.map((option) => ({
|
|
186
|
+
key: String(option.number),
|
|
187
|
+
label: option.label,
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Stash B's finished reply against every relay that is waiting for it.
|
|
192
|
+
*
|
|
193
|
+
* @returns How many relays took a payload from this call
|
|
194
|
+
*/
|
|
195
|
+
function stashReplyForOpenRelays(db, worker, now) {
|
|
196
|
+
const relays = (0, relay_db_1.listOpenRelaysTo)(db, {
|
|
197
|
+
worktreeId: worker.worktreeId,
|
|
198
|
+
instanceId: worker.instanceId,
|
|
199
|
+
});
|
|
200
|
+
if (relays.length === 0)
|
|
201
|
+
return 0;
|
|
202
|
+
let stashed = 0;
|
|
203
|
+
for (const relay of relays) {
|
|
204
|
+
// Issue #3957: a bound relay is answered from its own send's boundary, and
|
|
205
|
+
// only once that send is confirmed.
|
|
206
|
+
if (relay.bindMode === 'bound') {
|
|
207
|
+
if (stashForBoundRelay(db, worker, relay, now))
|
|
208
|
+
stashed += 1;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
// `createdAt` and not "the last time we looked": a reply written BEFORE the
|
|
212
|
+
// relay existed answered somebody else's question, and delivering it would
|
|
213
|
+
// hand session A the previous turn — the exact failure a bare `capture`
|
|
214
|
+
// after a `wait` has always had.
|
|
215
|
+
const reply = findWorkerReply(db, worker, relay.createdAt);
|
|
216
|
+
if (!reply)
|
|
217
|
+
continue;
|
|
218
|
+
const body = (0, relay_messages_1.buildRelayReplyMessage)(senderLabel(db, relay), reply.content);
|
|
219
|
+
if (stashReply(db, relay.id, { candidateId: reply.id, body, overlap: null, basis: 'legacy' }, now)) {
|
|
220
|
+
stashed += 1;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return stashed;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Stash a decided reply, minding the prompt notice that may hold the slot
|
|
227
|
+
* (Issue #3957).
|
|
228
|
+
*
|
|
229
|
+
* The slot is free: the reply takes it. A prompt notice holds it and is not
|
|
230
|
+
* being typed: the reply REPLACES it — the dialog it describes has been
|
|
231
|
+
* answered, and delivering the stale notice would start a new turn on the
|
|
232
|
+
* requester for nothing. The notice is being typed: the reply waits in the
|
|
233
|
+
* second slot and is promoted once the notice is out. A reply already holds
|
|
234
|
+
* it: nothing (two producers, one delivery).
|
|
235
|
+
*/
|
|
236
|
+
function stashReply(db, relayId, reply, now) {
|
|
237
|
+
const decided = { ...reply, payloadId: (0, crypto_1.randomUUID)() };
|
|
238
|
+
if ((0, relay_db_1.stashRelayPayload)(db, relayId, 'reply', decided.body, now, {
|
|
239
|
+
payloadId: decided.payloadId,
|
|
240
|
+
overlap: decided.overlap ?? undefined,
|
|
241
|
+
})) {
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
const current = (0, relay_db_1.getRelayPendingPayload)(db, relayId);
|
|
245
|
+
if (!current || current.kind !== 'prompt')
|
|
246
|
+
return false;
|
|
247
|
+
if (!(0, relay_delivery_claims_1.isRelayDeliveryClaimed)(relayId)) {
|
|
248
|
+
if ((0, relay_db_1.replaceRelayPromptWithReply)(db, relayId, current.payloadId, decided, now))
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
return (0, relay_db_1.setRelayPendingReply)(db, relayId, decided, now);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Whether the session's observation still matches the one the send recorded.
|
|
255
|
+
*
|
|
256
|
+
* A mismatch is a relaunch or a restart since the boundary; the relay is held
|
|
257
|
+
* with the reason and its observation marked invalid, so no later reply from
|
|
258
|
+
* the new process is matched to it either.
|
|
259
|
+
*/
|
|
260
|
+
function observationStillHolds(db, worker, binding) {
|
|
261
|
+
if (binding.relay.obsState === 'invalid')
|
|
262
|
+
return false;
|
|
263
|
+
const now = (0, relay_boot_1.relayObservationSource)(worker.worktreeId, worker.cliToolId, worker.instanceId);
|
|
264
|
+
if (binding.obsSource === now)
|
|
265
|
+
return true;
|
|
266
|
+
const restarted = (0, relay_boot_1.bootOfObservationSource)(binding.obsSource) !== (0, relay_boot_1.relayServerBootId)();
|
|
267
|
+
(0, relay_db_1.setRelayHold)(db, binding.relay.id, restarted ? relay_bind_1.RELAY_HOLD_REASONS.serverRestarted : relay_bind_1.RELAY_HOLD_REASONS.generationChanged, { invalidate: true });
|
|
268
|
+
logger.info('relay-observation-mismatch', { relayId: binding.relay.id, restarted });
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* A completion reached a bound relay (Issue #3957).
|
|
273
|
+
*
|
|
274
|
+
* Before the send is confirmed it is only HELD — appended to the candidates,
|
|
275
|
+
* never replacing an earlier one — because the send may still fail, and a
|
|
276
|
+
* reply that ended while the body queued for the lock is not this request's.
|
|
277
|
+
* Once `sent`, the reply is read from the boundary and stashed with its
|
|
278
|
+
* overlap. `failed` / `unknown` take nothing.
|
|
279
|
+
*/
|
|
280
|
+
function stashForBoundRelay(db, worker, relay, now) {
|
|
281
|
+
if (relay.sendState === 'awaiting' || relay.sendState === 'input_started') {
|
|
282
|
+
// Every finished turn since the relay opened, oldest first — not only the
|
|
283
|
+
// newest: a transcript reader that backfills two turns saves both and
|
|
284
|
+
// announces once, and holding only the newest would lose the earlier one.
|
|
285
|
+
// From the boundary once it is written: rows before it are never taken,
|
|
286
|
+
// and must not use up the scan's bound. `timestamp` is the turn's ORDER
|
|
287
|
+
// (its first row), the same key the confirmation re-reads by.
|
|
288
|
+
for (const turn of findWorkerCompletions(db, worker, relay.inputBoundaryAt ?? relay.createdAt)) {
|
|
289
|
+
(0, relay_db_1.appendRelayHeldCandidate)(db, relay.id, { messageId: turn.row.id, timestamp: turn.orderAt, requestId: turn.row.requestId ?? null }, now);
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
if (relay.sendState !== 'sent' || relay.inputBoundaryAt === null)
|
|
294
|
+
return false;
|
|
295
|
+
const binding = (0, relay_db_1.getRelayBinding)(db, relay.id);
|
|
296
|
+
if (!binding || !observationStillHolds(db, worker, binding))
|
|
297
|
+
return false;
|
|
298
|
+
// The earliest turn that finished after the boundary, for the same reason.
|
|
299
|
+
const [first] = findWorkerCompletions(db, worker, relay.inputBoundaryAt);
|
|
300
|
+
if (!first)
|
|
301
|
+
return false;
|
|
302
|
+
return stashBoundReply(db, worker, binding, first.row, now);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* How many completion rows one read collects at most (Issue #3957).
|
|
306
|
+
*
|
|
307
|
+
* A safety bound, not a window: the rows are read OLDEST first from the lower
|
|
308
|
+
* bound, so reaching it can only drop the LATEST turns, never the earliest —
|
|
309
|
+
* and the earliest is the only one ever taken. A newest-first window (the
|
|
310
|
+
* 40 rows {@link findWorkerReply} reads) is the opposite: a backfill of more
|
|
311
|
+
* rows than it holds pushes the earliest turn out and the next one is taken.
|
|
312
|
+
*/
|
|
313
|
+
const COMPLETION_SCAN_MAX_ROWS = 500;
|
|
314
|
+
/**
|
|
315
|
+
* Every finished turn of B at or after `since`, oldest first, as one row per
|
|
316
|
+
* turn (Issue #3957).
|
|
317
|
+
*
|
|
318
|
+
* The same row filter as {@link findWorkerReply}, applied in SQL so that user
|
|
319
|
+
* rows, prompt rows and CommandMate's own rows do not use up the bound, and
|
|
320
|
+
* ordered by time then insertion (rowid). A transcript tool's turn is its
|
|
321
|
+
* `-turn:` request id, represented by its NEWEST row (the summary after the
|
|
322
|
+
* narration, read by the request id without a bound — see
|
|
323
|
+
* {@link latestRowOfTurn}); a row with no request id (a scrape-only tool) is a
|
|
324
|
+
* turn of its own.
|
|
325
|
+
*/
|
|
326
|
+
function findWorkerCompletions(db, worker, since) {
|
|
327
|
+
const requireTurnRow = requiresTurnRow(worker.cliToolId);
|
|
328
|
+
const systemClauses = SYSTEM_ROW_REQUEST_ID_PREFIXES.map(() => 'request_id NOT LIKE ?').join(' AND ');
|
|
329
|
+
const rows = db
|
|
330
|
+
.prepare(`
|
|
331
|
+
SELECT id, request_id, timestamp FROM chat_messages
|
|
332
|
+
WHERE worktree_id = ? ${chat_db_1.ACTIVE_FILTER}
|
|
333
|
+
AND COALESCE(cli_tool_id, 'claude') = ?
|
|
334
|
+
AND COALESCE(instance_id, cli_tool_id, 'claude') = ?
|
|
335
|
+
AND role = 'assistant' AND COALESCE(message_type, 'normal') != 'prompt'
|
|
336
|
+
AND (request_id IS NULL OR (${systemClauses}))
|
|
337
|
+
${requireTurnRow ? "AND request_id LIKE '%-turn:%'" : ''}
|
|
338
|
+
AND TRIM(content, ' ' || char(9, 10, 13)) != ''
|
|
339
|
+
AND timestamp >= ?
|
|
340
|
+
ORDER BY timestamp ASC, rowid ASC
|
|
341
|
+
LIMIT ?
|
|
342
|
+
`)
|
|
343
|
+
.all(worker.worktreeId, worker.cliToolId, worker.instanceId, ...SYSTEM_ROW_REQUEST_ID_PREFIXES.map((prefix) => `${prefix}%`), since, COMPLETION_SCAN_MAX_ROWS);
|
|
344
|
+
// Already in turn order: a turn is placed by its first row, and its body is
|
|
345
|
+
// its newest row — kept apart so the order never follows the body.
|
|
346
|
+
const turns = [];
|
|
347
|
+
const seenTurns = new Set();
|
|
348
|
+
for (const row of rows) {
|
|
349
|
+
if (row.request_id !== null) {
|
|
350
|
+
if (seenTurns.has(row.request_id))
|
|
351
|
+
continue;
|
|
352
|
+
seenTurns.add(row.request_id);
|
|
353
|
+
const latest = latestRowOfTurn(db, worker, row.request_id);
|
|
354
|
+
if (latest)
|
|
355
|
+
turns.push({ row: latest, orderAt: row.timestamp });
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
const message = (0, chat_db_1.getMessageById)(db, row.id);
|
|
359
|
+
if (message)
|
|
360
|
+
turns.push({ row: message, orderAt: row.timestamp });
|
|
361
|
+
}
|
|
362
|
+
return turns;
|
|
363
|
+
}
|
|
364
|
+
/** The newest row a turn wrote, by its request id — no row bound. */
|
|
365
|
+
function latestRowOfTurn(db, worker, requestId) {
|
|
366
|
+
const row = db
|
|
367
|
+
.prepare(`
|
|
368
|
+
SELECT id FROM chat_messages
|
|
369
|
+
WHERE worktree_id = ? ${chat_db_1.ACTIVE_FILTER}
|
|
370
|
+
AND COALESCE(cli_tool_id, 'claude') = ?
|
|
371
|
+
AND COALESCE(instance_id, cli_tool_id, 'claude') = ?
|
|
372
|
+
AND role = 'assistant' AND request_id = ?
|
|
373
|
+
AND TRIM(content, ' ' || char(9, 10, 13)) != ''
|
|
374
|
+
ORDER BY timestamp DESC, rowid DESC
|
|
375
|
+
LIMIT 1
|
|
376
|
+
`)
|
|
377
|
+
.get(worker.worktreeId, worker.cliToolId, worker.instanceId, requestId);
|
|
378
|
+
return row ? (0, chat_db_1.getMessageById)(db, row.id) : null;
|
|
379
|
+
}
|
|
380
|
+
/** Judge the overlap of one reply and stash it, note and all. */
|
|
381
|
+
function stashBoundReply(db, worker, binding, reply, now) {
|
|
382
|
+
const verdict = (0, relay_overlap_1.judgeRelayOverlap)(db, binding, worker, reply);
|
|
383
|
+
const note = (0, relay_messages_1.buildRelayOverlapNote)((0, model_change_push_notifier_1.resolveReadersLocale)(db), verdict.overlap);
|
|
384
|
+
const body = (0, relay_messages_1.buildRelayReplyMessage)(senderLabel(db, binding.relay), reply.content, note);
|
|
385
|
+
const stashed = stashReply(db, binding.relay.id, { candidateId: reply.id, body, overlap: verdict.overlap, basis: verdict.basis }, now);
|
|
386
|
+
if (stashed) {
|
|
387
|
+
logger.info('relay-reply-decided', {
|
|
388
|
+
relayId: binding.relay.id,
|
|
389
|
+
candidateId: reply.id,
|
|
390
|
+
overlap: verdict.overlap,
|
|
391
|
+
basis: verdict.basis,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return stashed;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Whether a prompt row may be told to this relay's requester (Issue #3957).
|
|
398
|
+
*
|
|
399
|
+
* A legacy relay: as before. A bound one: only once its send is confirmed,
|
|
400
|
+
* with a valid observation, and only for a dialog that appeared at or after
|
|
401
|
+
* its boundary — one shown before the request went in belongs to somebody
|
|
402
|
+
* else's turn.
|
|
403
|
+
*/
|
|
404
|
+
function promptBelongsToRelay(db, worker, relay, prompt) {
|
|
405
|
+
if (relay.bindMode !== 'bound')
|
|
406
|
+
return true;
|
|
407
|
+
if (relay.sendState !== 'sent' || relay.inputBoundaryAt === null)
|
|
408
|
+
return false;
|
|
409
|
+
if (prompt.timestamp.getTime() < relay.inputBoundaryAt)
|
|
410
|
+
return false;
|
|
411
|
+
const binding = (0, relay_db_1.getRelayBinding)(db, relay.id);
|
|
412
|
+
return binding !== null && observationStillHolds(db, worker, binding);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Re-judge the worker's open dialog for one bound relay just confirmed.
|
|
416
|
+
*
|
|
417
|
+
* "Still open" is the waiting episode, not merely an unanswered row: the
|
|
418
|
+
* opening edge that would have told the relay fired before the send was
|
|
419
|
+
* confirmed, and a dialog closed since must not be reported.
|
|
420
|
+
*/
|
|
421
|
+
function notifyPromptForRelay(db, worker, relayId) {
|
|
422
|
+
const episode = (0, waiting_episode_state_1.getWaitingEpisode)(worker.worktreeId, worker.cliToolId, worker.instanceId);
|
|
423
|
+
if (!episode || episode.kind !== 'prompt')
|
|
424
|
+
return false;
|
|
425
|
+
if ((0, prompt_waiting_composition_1.isApiAnswerableWaitNow)(worker.worktreeId, worker.cliToolId, worker.instanceId, (0, registry_1.getAgentEventSource)(worker.cliToolId).capabilities.eventIdentity)) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
const prompt = (0, chat_db_1.getLatestOpenPromptMessage)(db, worker.worktreeId, worker.cliToolId, worker.instanceId);
|
|
429
|
+
if (!prompt)
|
|
430
|
+
return false;
|
|
431
|
+
const relay = (0, relay_db_1.getRelayById)(db, relayId);
|
|
432
|
+
if (!relay || !(0, types_1.isOpenRelayState)(relay.state))
|
|
433
|
+
return false;
|
|
434
|
+
return stashPromptNotice(db, worker, relay, prompt);
|
|
435
|
+
}
|
|
436
|
+
/** Stash one prompt notice for one relay, once per dialog. */
|
|
437
|
+
function stashPromptNotice(db, worker, relay, prompt) {
|
|
438
|
+
if (!promptBelongsToRelay(db, worker, relay, prompt))
|
|
439
|
+
return false;
|
|
440
|
+
// The dialog's own row id is the signature: a wait that lasts twenty
|
|
441
|
+
// minutes is ONE row, so A is told once however many polls observe it.
|
|
442
|
+
if ((0, relay_db_1.getRelayPromptSignature)(db, relay.id) === prompt.id)
|
|
443
|
+
return false;
|
|
444
|
+
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
445
|
+
const options = promptOptionsOf(prompt);
|
|
446
|
+
// #3184: type narrowing only, to read `question` off the closed union.
|
|
447
|
+
const question = (0, models_1.isAnswerablePromptData)(prompt.promptData)
|
|
448
|
+
? prompt.promptData.question
|
|
449
|
+
: (prompt.promptData?.question ?? prompt.content);
|
|
450
|
+
const body = (0, relay_messages_1.buildRelayPromptMessage)(locale, senderLabel(db, relay), { question, options });
|
|
451
|
+
if (!(0, relay_db_1.stashRelayPayload)(db, relay.id, 'prompt', body))
|
|
452
|
+
return false;
|
|
453
|
+
// The signature is recorded HERE, before the delivery, and not after it:
|
|
454
|
+
// it is what stops every later poll of the same twenty-minute dialog
|
|
455
|
+
// from stashing the same notice again while A is still busy. The state
|
|
456
|
+
// moving to `prompt` is an OPEN state, so the reply that follows once
|
|
457
|
+
// the dialog is answered can still be stashed and delivered.
|
|
458
|
+
(0, relay_db_1.markRelayPromptNotified)(db, relay.id, prompt.id);
|
|
459
|
+
return true;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* After a restart, settle every bound relay the previous boot left mid-send
|
|
463
|
+
* (Issue #3957). Once per boot; cheap when there is nothing to do.
|
|
464
|
+
*
|
|
465
|
+
* - `awaiting`, not reserved: left alone (nobody has sent yet).
|
|
466
|
+
* - `awaiting`, reserved by another boot: that boot died before the boundary,
|
|
467
|
+
* i.e. before the first key — proven unsent, so the relay is cancelled.
|
|
468
|
+
* - `input_started` by another boot: whether the body went in cannot be
|
|
469
|
+
* told; held as `unknown`.
|
|
470
|
+
* - `sent` with a decided payload: delivered as usual.
|
|
471
|
+
* - `sent` without one, observed by another boot: the turn record that
|
|
472
|
+
* reply would be judged against is gone; held, observation invalid.
|
|
473
|
+
*/
|
|
474
|
+
function recoverBoundRelays(db, now = Date.now()) {
|
|
475
|
+
const boot = (0, relay_boot_1.relayServerBootId)();
|
|
476
|
+
let recovered = 0;
|
|
477
|
+
for (const binding of (0, relay_db_1.listOpenBoundRelays)(db)) {
|
|
478
|
+
const { relay } = binding;
|
|
479
|
+
if (relay.sendState === 'awaiting') {
|
|
480
|
+
if (binding.bindAttemptId === null || binding.bindOwner === boot)
|
|
481
|
+
continue;
|
|
482
|
+
if ((0, relay_db_1.failOrphanedRelayBind)(db, relay.id, binding.bindAttemptId, relay_bind_1.RELAY_HOLD_REASONS.serverRestartedBeforeInput, now)) {
|
|
483
|
+
recovered += 1;
|
|
484
|
+
}
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (relay.sendState === 'input_started') {
|
|
488
|
+
if (binding.bindOwner === boot || binding.bindAttemptId === null)
|
|
489
|
+
continue;
|
|
490
|
+
if ((0, relay_db_1.settleRelaySendState)(db, {
|
|
491
|
+
relayId: relay.id,
|
|
492
|
+
attemptId: binding.bindAttemptId,
|
|
493
|
+
from: ['input_started'],
|
|
494
|
+
to: 'unknown',
|
|
495
|
+
holdReason: relay_bind_1.RELAY_HOLD_REASONS.serverRestarted,
|
|
496
|
+
now,
|
|
497
|
+
})) {
|
|
498
|
+
recovered += 1;
|
|
499
|
+
}
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
if (relay.sendState === 'sent') {
|
|
503
|
+
if (binding.pendingKind !== null)
|
|
504
|
+
continue;
|
|
505
|
+
if (binding.pendingReply !== null) {
|
|
506
|
+
if ((0, relay_db_1.promoteRelayPendingReply)(db, relay.id, now))
|
|
507
|
+
recovered += 1;
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
if ((0, relay_boot_1.bootOfObservationSource)(binding.obsSource) === boot || relay.obsState === 'invalid')
|
|
511
|
+
continue;
|
|
512
|
+
(0, relay_db_1.setRelayHold)(db, relay.id, relay_bind_1.RELAY_HOLD_REASONS.serverRestarted, { invalidate: true, now });
|
|
513
|
+
recovered += 1;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
if (recovered > 0)
|
|
517
|
+
logger.info('relay-bound-recovered', { recovered });
|
|
518
|
+
return recovered;
|
|
519
|
+
}
|