commandmate 0.48.0 → 0.49.1
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 +292 -285
- package/.next/app-path-routes-manifest.json +35 -34
- 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.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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 +3 -3
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_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.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +35 -34
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3773.js +1 -0
- package/.next/server/chunks/3801.js +31 -0
- package/.next/server/chunks/4243.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/{9130.js → 5630.js} +1 -1
- package/.next/server/chunks/5775.js +1 -0
- 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/7604.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +16 -16
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8791.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 +4 -4
- 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/1128-914c559913546bbc.js +1 -0
- package/.next/static/chunks/{2407-26139a8a2f1adbe8.js → 2407-675ba6b21844dc3b.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/{2863-f0121af1cbbedb3b.js → 2863-7173dc305dffc4f6.js} +1 -1
- package/.next/static/chunks/3931-1a1abab16248f14d.js +1 -0
- package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
- package/.next/static/chunks/{8165-c68b3dc844210e6a.js → 8165-263172c17ae8e8c3.js} +1 -1
- package/.next/static/chunks/8606-ce17ffa77f39608e.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-8bfac4724277b47f.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/sessions/page-890fd50ec9739973.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- 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 +178 -13
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +3 -5
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +5 -0
- package/dist/cli/commands/message-dispatch.d.ts +25 -5
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +92 -6
- package/dist/cli/commands/relays.d.ts +25 -2
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +69 -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 +63 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +10 -10
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +8 -1
- 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 +21 -0
- package/dist/cli/commands/wait-instance.d.ts.map +1 -0
- package/dist/cli/commands/wait-instance.js +41 -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 +118 -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 +50 -0
- package/dist/cli/commands/wait-verify.d.ts.map +1 -0
- package/dist/cli/commands/wait-verify.js +124 -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 +207 -959
- package/dist/cli/config/duration-constants.d.ts +16 -13
- package/dist/cli/config/duration-constants.d.ts.map +1 -1
- package/dist/cli/config/duration-constants.js +21 -21
- 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 +25 -2
- package/dist/cli/types/api-responses.d.ts +76 -4
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +15 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +7 -1
- package/dist/cli/utils/reply-ledger.d.ts +79 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +141 -1
- package/dist/cli/utils/verify-runner.d.ts +24 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +54 -1
- package/dist/config/auto-yes-duration.d.ts +56 -0
- package/dist/config/auto-yes-duration.d.ts.map +1 -0
- package/dist/config/auto-yes-duration.js +76 -0
- package/dist/lib/session/send-attempt-types.d.ts +23 -1
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +9 -1
- package/dist/server/locales/en/worktree.json +18 -3
- package/dist/server/locales/ja/worktree.json +18 -3
- package/dist/server/src/config/auto-yes-config.js +14 -19
- package/dist/server/src/config/auto-yes-duration.js +76 -0
- package/dist/server/src/lib/auto-yes-poller.js +49 -10
- package/dist/server/src/lib/auto-yes-state.js +9 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +40 -7
- package/dist/server/src/lib/cli-tools/codex.js +60 -11
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
- package/dist/server/src/lib/cli-tools/copilot.js +120 -30
- package/dist/server/src/lib/cli-tools/gemini.js +28 -9
- package/dist/server/src/lib/cli-tools/opencode.js +55 -13
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +580 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +374 -516
- 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/composer-text.js +215 -11
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +8 -191
- package/dist/server/src/lib/detection/upstream-faults.js +56 -5
- package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
- package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +4 -2
- package/dist/server/src/lib/polling/response-checker.js +15 -16
- package/dist/server/src/lib/prompt-answer-errors.js +288 -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-session-lifecycle.js +18 -0
- package/dist/server/src/lib/session/claude-session.js +41 -6
- package/dist/server/src/lib/session/composer-clear.js +109 -4
- package/dist/server/src/lib/session/current-output-builder.js +23 -6
- package/dist/server/src/lib/session/instance-input-lock.js +664 -0
- package/dist/server/src/lib/session/send-attempt-state.js +19 -1
- package/dist/server/src/lib/session/send-attempt-types.js +9 -1
- package/dist/server/src/lib/session/send-user-message.js +82 -13
- package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
- package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
- package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +26 -339
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/gate-runner.js +11 -4
- package/docs/en/user-guide/webapp-guide.md +15 -10
- package/package.json +1 -1
- package/release-notes/0.49.0.json +45 -0
- package/release-notes/0.49.1.json +66 -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/4280.js +0 -1
- package/.next/server/chunks/5845.js +0 -1
- package/.next/server/chunks/6722.js +0 -1
- package/.next/server/chunks/720.js +0 -103
- package/.next/server/chunks/936.js +0 -1
- package/.next/server/chunks/9540.js +0 -1
- package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +0 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
- package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
- package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
- package/.next/static/chunks/9079-406b84d3cc891a87.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-46b4cbf07520d9b6.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +0 -1
- package/.next/static/css/743f79ff19ab91e9.css +0 -1
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → fqfSDqQMweROeHUzOt_m1}/_buildManifest.js +0 -0
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → fqfSDqQMweROeHUzOt_m1}/_ssgManifest.js +0 -0
|
@@ -39,8 +39,9 @@
|
|
|
39
39
|
* @module lib/relay/relay-delivery
|
|
40
40
|
*/
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.recoverBoundRelays = exports.findWorkerReply = void 0;
|
|
42
43
|
exports.resetRelayDeliveryState = resetRelayDeliveryState;
|
|
43
|
-
exports.
|
|
44
|
+
exports.evaluateRelayAfterSend = evaluateRelayAfterSend;
|
|
44
45
|
exports.notifyRelayTurnCompleted = notifyRelayTurnCompleted;
|
|
45
46
|
exports.notifyRelayPromptWaiting = notifyRelayPromptWaiting;
|
|
46
47
|
exports.sweepExpiredRelays = sweepExpiredRelays;
|
|
@@ -49,10 +50,13 @@ exports.runRelayMaintenanceTick = runRelayMaintenanceTick;
|
|
|
49
50
|
const db_instance_1 = require("../../lib/db/db-instance");
|
|
50
51
|
const relay_db_1 = require("../../lib/db/relay-db");
|
|
51
52
|
const chat_db_1 = require("../../lib/db/chat-db");
|
|
52
|
-
const models_1 = require("../../types/models");
|
|
53
53
|
const model_change_push_notifier_1 = require("../../lib/push/model-change-push-notifier");
|
|
54
54
|
const send_user_message_1 = require("../../lib/session/send-user-message");
|
|
55
55
|
const relay_messages_1 = require("../../lib/relay/relay-messages");
|
|
56
|
+
const relay_boot_1 = require("../../lib/relay/relay-boot");
|
|
57
|
+
const relay_bound_reply_1 = require("../../lib/relay/relay-bound-reply");
|
|
58
|
+
Object.defineProperty(exports, "findWorkerReply", { enumerable: true, get: function () { return relay_bound_reply_1.findWorkerReply; } });
|
|
59
|
+
Object.defineProperty(exports, "recoverBoundRelays", { enumerable: true, get: function () { return relay_bound_reply_1.recoverBoundRelays; } });
|
|
56
60
|
const relay_policy_1 = require("../../lib/relay/relay-policy");
|
|
57
61
|
const relay_readiness_1 = require("../../lib/relay/relay-readiness");
|
|
58
62
|
const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
|
|
@@ -62,81 +66,10 @@ const types_1 = require("../../lib/relay/types");
|
|
|
62
66
|
const logger_1 = require("../../lib/logger");
|
|
63
67
|
const global_state_1 = require("../global-state");
|
|
64
68
|
const logger = (0, logger_1.createLogger)('relay-delivery');
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
*
|
|
68
|
-
* A turn can write several rows (a narration then a summary), and the relay
|
|
69
|
-
* wants the last one that is actually the agent talking. Bounded because an
|
|
70
|
-
* unbounded read of a long-lived worktree's history is a large query for one
|
|
71
|
-
* line of answer.
|
|
72
|
-
*/
|
|
73
|
-
const REPLY_LOOKBACK_MESSAGES = 40;
|
|
69
|
+
/** How many passes one pump makes when a pass promoted a reply (Issue #3957). */
|
|
70
|
+
const PUMP_PASSES_MAX = 3;
|
|
74
71
|
/** How many times the scrape path re-reads before it gives up on stability. */
|
|
75
72
|
const SCRAPE_STABILITY_ATTEMPTS = 3;
|
|
76
|
-
/**
|
|
77
|
-
* The `request_id` shape a transcript reader mints for a finished turn.
|
|
78
|
-
*
|
|
79
|
-
* `claude-turn:<uuid>`, `codex-turn:<turn_id>`, `antigravity-turn:<id>`,
|
|
80
|
-
* `command-code-turn:<id>` and opencode's `oc-turn:<message id>`. Matched as a
|
|
81
|
-
* SHAPE rather than as a list of five literals for the reason `ask`'s copy of
|
|
82
|
-
* this line gives (Issue #2386): the sixth reader lands INSIDE the filter
|
|
83
|
-
* instead of silently outside it. A `:` cannot appear in any of the ids
|
|
84
|
-
* themselves, so this cannot match a row that merely contains the text.
|
|
85
|
-
*
|
|
86
|
-
* Copied rather than imported, deliberately. `src/cli/commands/ask.ts` has the
|
|
87
|
-
* same regexp, and importing it here would invert the dependency (lib reaching
|
|
88
|
-
* into the CLI bundle); `AGENT_MARKDOWN_REQUEST_ID_PREFIXES` in
|
|
89
|
-
* `src/types/agent-transcript.ts` is the LIST form this shape is chosen not to
|
|
90
|
-
* be. One regexp in each layer is cheaper than either edge.
|
|
91
|
-
*/
|
|
92
|
-
const TURN_REQUEST_ID_PATTERN = /-turn:/;
|
|
93
|
-
/**
|
|
94
|
-
* Request-id namespaces CommandMate writes ABOUT a session, not for it.
|
|
95
|
-
*
|
|
96
|
-
* `chat_messages` has no `system` role, so "reply from X" (Issue #2377) and
|
|
97
|
-
* "the model changed" (Issue #2357) are both stored as assistant rows and told
|
|
98
|
-
* apart by their request id. Neither is a word the worker said, and handing the
|
|
99
|
-
* relay's own notice back to the session it came from is the smallest possible
|
|
100
|
-
* loop. `ask` steps over exactly these two for the same reason.
|
|
101
|
-
*/
|
|
102
|
-
const SYSTEM_ROW_REQUEST_ID_PREFIXES = [
|
|
103
|
-
chat_db_1.RELAY_SYSTEM_REQUEST_ID_PREFIX,
|
|
104
|
-
chat_db_1.MODEL_CHANGE_REQUEST_ID_PREFIX,
|
|
105
|
-
];
|
|
106
|
-
/**
|
|
107
|
-
* Whether this tool's reply is read out of a transcript rather than off a screen.
|
|
108
|
-
*
|
|
109
|
-
* For the six that answer `true` the ledger is authoritative: a row with no
|
|
110
|
-
* turn marker was written by the SCRAPER, and for these tools a scraped row is
|
|
111
|
-
* never the answer — it is a footer line, a half-drawn frame or the ANSI dump
|
|
112
|
-
* the send path flushes (Issues #2398 / #2400). The relay may therefore hold
|
|
113
|
-
* out for a marked row. For copilot, gemini and vibe-local the scraper's row is
|
|
114
|
-
* the only record there will ever be, and demanding a marker would deliver
|
|
115
|
-
* nothing, ever.
|
|
116
|
-
*
|
|
117
|
-
* A record and not a `Set`, so a ninth entry in `CLI_TOOL_IDS` fails `tsc` here
|
|
118
|
-
* instead of quietly defaulting to "screen-scraped" — the idiom
|
|
119
|
-
* `cli-tools/install-hints` uses for the same reason.
|
|
120
|
-
*
|
|
121
|
-
* Deliberately NOT `isPullTranscriptHistory`: that asks who does the READING,
|
|
122
|
-
* so opencode (whose own server pushes) answers `false` even though its rows
|
|
123
|
-
* carry `oc-turn:` like the other four. It also lives in `lib/polling`, whose
|
|
124
|
-
* module graph reaches this file's triggers — importing it would close a cycle
|
|
125
|
-
* the relay was built to avoid.
|
|
126
|
-
*/
|
|
127
|
-
const TRANSCRIPT_READER_TOOLS = {
|
|
128
|
-
claude: true,
|
|
129
|
-
codex: true,
|
|
130
|
-
antigravity: true,
|
|
131
|
-
'command-code': true,
|
|
132
|
-
opencode: true,
|
|
133
|
-
copilot: false,
|
|
134
|
-
gemini: false,
|
|
135
|
-
'vibe-local': false,
|
|
136
|
-
// Issue #2940: OpenCode V2's replies are written from its server
|
|
137
|
-
// (`GET /api/session/{id}/message`) under `oc-turn:`, like opencode's.
|
|
138
|
-
'opencode-v2': true,
|
|
139
|
-
};
|
|
140
73
|
/**
|
|
141
74
|
* How long the scrape path holds out for the transcript row.
|
|
142
75
|
*
|
|
@@ -162,108 +95,75 @@ function resetRelayDeliveryState() {
|
|
|
162
95
|
inFlight.clear();
|
|
163
96
|
(0, relay_delivery_claims_1.resetRelayDeliveryClaims)();
|
|
164
97
|
globalThis.__relayPumpRunning = false;
|
|
165
|
-
|
|
166
|
-
function senderLabel(db, relay) {
|
|
167
|
-
const worker = (0, relay_session_ref_1.resolveRelaySession)(db, relay.to);
|
|
168
|
-
return { alias: worker.alias, worktreeId: worker.worktreeId };
|
|
169
|
-
}
|
|
170
|
-
/** Whether a row's `request_id` says a transcript reader wrote it. */
|
|
171
|
-
function isTurnRow(requestId) {
|
|
172
|
-
return typeof requestId === 'string' && TURN_REQUEST_ID_PATTERN.test(requestId);
|
|
173
|
-
}
|
|
174
|
-
/** Whether a row is CommandMate's own furniture rather than the worker's words. */
|
|
175
|
-
function isSystemRow(requestId) {
|
|
176
|
-
return typeof requestId === 'string'
|
|
177
|
-
&& SYSTEM_ROW_REQUEST_ID_PREFIXES.some((prefix) => requestId.startsWith(prefix));
|
|
178
|
-
}
|
|
179
|
-
/** Whether this worker's answer is only ever a transcript row. */
|
|
180
|
-
function requiresTurnRow(cliToolId) {
|
|
181
|
-
return TRANSCRIPT_READER_TOOLS[cliToolId] === true;
|
|
98
|
+
globalThis.__relayRecoveredBootId = undefined;
|
|
182
99
|
}
|
|
183
100
|
/**
|
|
184
|
-
* The
|
|
101
|
+
* The bound send was confirmed: judge what was held for it (Issue #3957).
|
|
185
102
|
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
103
|
+
* The EARLIEST turn at or after the boundary is taken — not the newest: when
|
|
104
|
+
* two turns ended before the send was confirmed, the first one after the
|
|
105
|
+
* boundary is the one this request started. It is re-read from the boundary
|
|
106
|
+
* (the held candidates are the record of what was seen, ordered by the same
|
|
107
|
+
* key), and the held list is dropped. The worker's open prompt is judged at the same moment: a dialog
|
|
108
|
+
* that appeared after the boundary and is still open is told now (its opening
|
|
109
|
+
* edge fired while the send was unconfirmed and will not fire again); one
|
|
110
|
+
* already answered is not.
|
|
191
111
|
*
|
|
192
|
-
*
|
|
193
|
-
* shape, never at provenance, so the newest row won whatever had written it:
|
|
194
|
-
* a codex footer line, a partial scrape, or the raw ANSI the send path flushes
|
|
195
|
-
* lands in the ledger with `request_id IS NULL` and, being newest, WAS the
|
|
196
|
-
* reply — forwarded to the requesting agent as the worker's own answer, which
|
|
197
|
-
* it then summarises. #2386 fixed the identical hole in `ask` by demanding the
|
|
198
|
-
* turn marker; the relay looked exempt only because its 15-second pump usually
|
|
199
|
-
* gave the transcript time to land, and a race the timing usually wins is still
|
|
200
|
-
* a race.
|
|
112
|
+
* Never throws; called by the send route right after it settled the send.
|
|
201
113
|
*/
|
|
202
|
-
function
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
114
|
+
function evaluateRelayAfterSend(relayId) {
|
|
115
|
+
try {
|
|
116
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
117
|
+
const binding = (0, relay_db_1.getRelayBinding)(db, relayId);
|
|
118
|
+
if (!binding)
|
|
119
|
+
return;
|
|
120
|
+
const { relay } = binding;
|
|
121
|
+
if (relay.sendState !== 'sent' || !(0, types_1.isOpenRelayState)(relay.state) || relay.inputBoundaryAt === null)
|
|
122
|
+
return;
|
|
123
|
+
const session = (0, relay_session_ref_1.resolveRelaySession)(db, relay.to);
|
|
124
|
+
const worker = {
|
|
125
|
+
worktreeId: session.worktreeId,
|
|
126
|
+
cliToolId: session.cliToolId,
|
|
127
|
+
instanceId: session.instanceId,
|
|
128
|
+
};
|
|
129
|
+
const boundary = relay.inputBoundaryAt;
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const decided = db.transaction(() => {
|
|
132
|
+
(0, relay_db_1.clearRelayHeldCandidates)(db, relayId);
|
|
133
|
+
if (!(0, relay_bound_reply_1.observationStillHolds)(db, worker, binding))
|
|
134
|
+
return false;
|
|
135
|
+
// Re-read from the boundary rather than trusting what was held: the
|
|
136
|
+
// held list was read from `createdAt` (before the boundary existed) and
|
|
137
|
+
// may have spent the scan's bound on rows before it. The order is the
|
|
138
|
+
// same key either way — each turn's first row.
|
|
139
|
+
const [first] = (0, relay_bound_reply_1.findWorkerCompletions)(db, worker, boundary);
|
|
140
|
+
return first ? (0, relay_bound_reply_1.stashBoundReply)(db, worker, binding, first.row, now) : false;
|
|
141
|
+
})();
|
|
142
|
+
const prompted = decided ? false : (0, relay_bound_reply_1.notifyPromptForRelay)(db, worker, relayId);
|
|
143
|
+
if (decided || prompted)
|
|
144
|
+
void pumpRelayDeliveries();
|
|
223
145
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
// #3184: type narrowing only — the stored row's screen `options` are listed;
|
|
230
|
-
// a stored degraded record never carries a decision id, so it has none.
|
|
231
|
-
if (!(0, models_1.isAnswerablePromptData)(data))
|
|
232
|
-
return [];
|
|
233
|
-
if (data.type === 'yes_no') {
|
|
234
|
-
return data.options.map((label) => ({ key: label, label }));
|
|
146
|
+
catch (error) {
|
|
147
|
+
logger.warn('relay-after-send-failed', {
|
|
148
|
+
relayId,
|
|
149
|
+
error: error instanceof Error ? error.message : String(error),
|
|
150
|
+
});
|
|
235
151
|
}
|
|
236
|
-
return data.options.map((option) => ({
|
|
237
|
-
key: String(option.number),
|
|
238
|
-
label: option.label,
|
|
239
|
-
}));
|
|
240
152
|
}
|
|
241
|
-
/**
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
for (const relay of relays) {
|
|
255
|
-
// `createdAt` and not "the last time we looked": a reply written BEFORE the
|
|
256
|
-
// relay existed answered somebody else's question, and delivering it would
|
|
257
|
-
// hand session A the previous turn — the exact failure a bare `capture`
|
|
258
|
-
// after a `wait` has always had.
|
|
259
|
-
const reply = findWorkerReply(db, worker, relay.createdAt);
|
|
260
|
-
if (!reply)
|
|
261
|
-
continue;
|
|
262
|
-
const body = (0, relay_messages_1.buildRelayReplyMessage)(senderLabel(db, relay), reply.content);
|
|
263
|
-
if ((0, relay_db_1.stashRelayPayload)(db, relay.id, 'reply', body, now))
|
|
264
|
-
stashed += 1;
|
|
153
|
+
/** {@link recoverBoundRelays}, once per boot. */
|
|
154
|
+
function ensureRelayRecovery(db) {
|
|
155
|
+
const boot = (0, relay_boot_1.relayServerBootId)();
|
|
156
|
+
if (globalThis.__relayRecoveredBootId === boot)
|
|
157
|
+
return;
|
|
158
|
+
globalThis.__relayRecoveredBootId = boot;
|
|
159
|
+
try {
|
|
160
|
+
(0, relay_bound_reply_1.recoverBoundRelays)(db);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger.warn('relay-recovery-failed', {
|
|
164
|
+
error: error instanceof Error ? error.message : String(error),
|
|
165
|
+
});
|
|
265
166
|
}
|
|
266
|
-
return stashed;
|
|
267
167
|
}
|
|
268
168
|
/** Sleep, so the scrape path can wait out its quiet window. */
|
|
269
169
|
function sleep(ms) {
|
|
@@ -292,7 +192,7 @@ function sleep(ms) {
|
|
|
292
192
|
async function deliverWhenTranscriptCatchesUp(db, worker) {
|
|
293
193
|
const deadline = Date.now() + RELAY_TURN_ROW_GRACE_MS;
|
|
294
194
|
for (;;) {
|
|
295
|
-
if (stashReplyForOpenRelays(db, worker, Date.now()) > 0) {
|
|
195
|
+
if ((0, relay_bound_reply_1.stashReplyForOpenRelays)(db, worker, Date.now()) > 0) {
|
|
296
196
|
void pumpRelayDeliveries();
|
|
297
197
|
return;
|
|
298
198
|
}
|
|
@@ -324,7 +224,7 @@ async function notifyRelayTurnCompleted(worker, options) {
|
|
|
324
224
|
if (waiting.length === 0)
|
|
325
225
|
return;
|
|
326
226
|
if (options.settled) {
|
|
327
|
-
if (stashReplyForOpenRelays(db, worker, Date.now()) > 0)
|
|
227
|
+
if ((0, relay_bound_reply_1.stashReplyForOpenRelays)(db, worker, Date.now()) > 0)
|
|
328
228
|
void pumpRelayDeliveries();
|
|
329
229
|
return;
|
|
330
230
|
}
|
|
@@ -333,7 +233,7 @@ async function notifyRelayTurnCompleted(worker, options) {
|
|
|
333
233
|
// scraped row this announcement is about is not a candidate at all — the
|
|
334
234
|
// relay waits for the marked one instead of watching an unmarked one hold
|
|
335
235
|
// still (Issue #2401).
|
|
336
|
-
if (requiresTurnRow(worker.cliToolId)) {
|
|
236
|
+
if ((0, relay_bound_reply_1.requiresTurnRow)(worker.cliToolId)) {
|
|
337
237
|
await deliverWhenTranscriptCatchesUp(db, worker);
|
|
338
238
|
return;
|
|
339
239
|
}
|
|
@@ -343,12 +243,12 @@ async function notifyRelayTurnCompleted(worker, options) {
|
|
|
343
243
|
// this again anyway.
|
|
344
244
|
let previousId = null;
|
|
345
245
|
for (let attempt = 0; attempt < SCRAPE_STABILITY_ATTEMPTS; attempt += 1) {
|
|
346
|
-
const before = findWorkerReply(db, worker, 0);
|
|
246
|
+
const before = (0, relay_bound_reply_1.findWorkerReply)(db, worker, 0);
|
|
347
247
|
previousId = before?.id ?? null;
|
|
348
248
|
await sleep(relay_policy_1.RELAY_SCRAPE_QUIET_MS);
|
|
349
|
-
const after = findWorkerReply(db, worker, 0);
|
|
249
|
+
const after = (0, relay_bound_reply_1.findWorkerReply)(db, worker, 0);
|
|
350
250
|
if ((after?.id ?? null) === previousId) {
|
|
351
|
-
if (stashReplyForOpenRelays(db, worker, Date.now()) > 0)
|
|
251
|
+
if ((0, relay_bound_reply_1.stashReplyForOpenRelays)(db, worker, Date.now()) > 0)
|
|
352
252
|
void pumpRelayDeliveries();
|
|
353
253
|
return;
|
|
354
254
|
}
|
|
@@ -387,31 +287,11 @@ function notifyRelayPromptWaiting(worker) {
|
|
|
387
287
|
const prompt = (0, chat_db_1.getLatestOpenPromptMessage)(db, worker.worktreeId, worker.cliToolId, worker.instanceId);
|
|
388
288
|
if (!prompt)
|
|
389
289
|
return;
|
|
390
|
-
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
391
|
-
const options = promptOptionsOf(prompt);
|
|
392
|
-
// #3184: type narrowing only, to read `question` off the closed union.
|
|
393
|
-
const question = (0, models_1.isAnswerablePromptData)(prompt.promptData)
|
|
394
|
-
? prompt.promptData.question
|
|
395
|
-
: (prompt.promptData?.question ?? prompt.content);
|
|
396
290
|
let stashed = 0;
|
|
397
291
|
for (const relay of relays) {
|
|
398
|
-
//
|
|
399
|
-
|
|
400
|
-
if ((0, relay_db_1.getRelayPromptSignature)(db, relay.id) === prompt.id)
|
|
401
|
-
continue;
|
|
402
|
-
const body = (0, relay_messages_1.buildRelayPromptMessage)(locale, senderLabel(db, relay), {
|
|
403
|
-
question,
|
|
404
|
-
options,
|
|
405
|
-
});
|
|
406
|
-
if ((0, relay_db_1.stashRelayPayload)(db, relay.id, 'prompt', body)) {
|
|
407
|
-
// The signature is recorded HERE, before the delivery, and not after it:
|
|
408
|
-
// it is what stops every later poll of the same twenty-minute dialog
|
|
409
|
-
// from stashing the same notice again while A is still busy. The state
|
|
410
|
-
// moving to `prompt` is an OPEN state, so the reply that follows once
|
|
411
|
-
// the dialog is answered can still be stashed and delivered.
|
|
412
|
-
(0, relay_db_1.markRelayPromptNotified)(db, relay.id, prompt.id);
|
|
292
|
+
// Issue #3957: a bound relay is told only about a dialog of its own send.
|
|
293
|
+
if ((0, relay_bound_reply_1.stashPromptNotice)(db, worker, relay, prompt))
|
|
413
294
|
stashed += 1;
|
|
414
|
-
}
|
|
415
295
|
}
|
|
416
296
|
if (stashed > 0)
|
|
417
297
|
void pumpRelayDeliveries();
|
|
@@ -445,9 +325,10 @@ function sweepExpiredRelays(db, now = Date.now()) {
|
|
|
445
325
|
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
446
326
|
// A payload that never went out is superseded by the expiry notice: A
|
|
447
327
|
// asked for an answer, and what they are getting is the news that there
|
|
448
|
-
// will not be one.
|
|
328
|
+
// will not be one. Both slots (Issue #3957).
|
|
449
329
|
(0, relay_db_1.clearRelayPending)(db, relay.id, now);
|
|
450
|
-
|
|
330
|
+
(0, relay_db_1.clearRelayPendingReply)(db, relay.id, now);
|
|
331
|
+
const body = (0, relay_messages_1.buildRelayExpiredMessage)(locale, (0, relay_bound_reply_1.senderLabel)(db, relay), relay.expiresAt - relay.createdAt);
|
|
451
332
|
const stashed = (0, relay_db_1.stashRelayPayload)(db, relay.id, 'expired', body, now);
|
|
452
333
|
if (!(0, relay_db_1.markRelayExpired)(db, relay.id, now)) {
|
|
453
334
|
if (stashed)
|
|
@@ -496,7 +377,7 @@ async function deliverOne(db, relayId, kind, body) {
|
|
|
496
377
|
return 'held';
|
|
497
378
|
}
|
|
498
379
|
// Synchronous from here to the send: re-read, then claim.
|
|
499
|
-
const current =
|
|
380
|
+
const current = (0, relay_db_1.getRelayPendingPayload)(db, relayId);
|
|
500
381
|
if (!current || current.kind !== kind || current.body !== body) {
|
|
501
382
|
logger.info('relay-delivery-superseded', { relayId, kind });
|
|
502
383
|
return 'skipped';
|
|
@@ -510,6 +391,7 @@ async function deliverOne(db, relayId, kind, body) {
|
|
|
510
391
|
const relay = current.relay;
|
|
511
392
|
const requester = (0, relay_session_ref_1.resolveRelaySession)(db, relay.from);
|
|
512
393
|
(0, relay_delivery_claims_1.claimRelayDelivery)(relayId);
|
|
394
|
+
let delivered = false;
|
|
513
395
|
try {
|
|
514
396
|
const result = await (0, send_user_message_1.sendUserMessage)(db, {
|
|
515
397
|
worktreeId: requester.worktreeId,
|
|
@@ -533,26 +415,49 @@ async function deliverOne(db, relayId, kind, body) {
|
|
|
533
415
|
// composer, which is the outcome that mattered.
|
|
534
416
|
logger.info('relay-already-closed-on-deliver', { relayId });
|
|
535
417
|
}
|
|
536
|
-
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'replied', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
418
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'replied', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now, { overlap: relay.overlap, holdReason: relay.holdReason });
|
|
537
419
|
}
|
|
538
420
|
else if (kind === 'prompt') {
|
|
539
421
|
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'waiting', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
540
422
|
}
|
|
541
|
-
|
|
423
|
+
// Issue #3957: only the payload that was sent. A reply that replaced it
|
|
424
|
+
// or waits in the second slot survives, and the second slot is promoted
|
|
425
|
+
// now that the notice is out.
|
|
426
|
+
(0, relay_db_1.clearRelayPending)(db, relay.id, now, current.payloadId);
|
|
427
|
+
if (kind === 'prompt' && (0, relay_db_1.promoteRelayPendingReply)(db, relay.id, now)) {
|
|
428
|
+
globalThis.__relayPumpAgain = true;
|
|
429
|
+
}
|
|
542
430
|
logger.info('relay-delivered', { relayId, kind, to: `${requester.worktreeId}/${requester.instanceId}` });
|
|
431
|
+
delivered = true;
|
|
543
432
|
return 'delivered';
|
|
544
433
|
}
|
|
545
434
|
finally {
|
|
435
|
+
// Issue #3957: a prompt notice that did not go out (refused, failed,
|
|
436
|
+
// threw) is back to unclaimed — and a reply that finished while it was
|
|
437
|
+
// being typed waits in the second slot. The reply supersedes the notice
|
|
438
|
+
// exactly as it would have had it arrived a moment later.
|
|
439
|
+
// A failure here must not keep the claim below from being released: a
|
|
440
|
+
// claim left behind refuses every cancel and every expiry of the relay.
|
|
441
|
+
if (!delivered && kind === 'prompt') {
|
|
442
|
+
try {
|
|
443
|
+
if ((0, relay_db_1.replaceRelayPromptWithPendingReply)(db, relay.id, current.payloadId)) {
|
|
444
|
+
logger.info('relay-prompt-superseded-after-failed-delivery', { relayId });
|
|
445
|
+
globalThis.__relayPumpAgain = true;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
logger.warn('relay-prompt-supersede-failed', {
|
|
450
|
+
relayId,
|
|
451
|
+
error: error instanceof Error ? error.message : String(error),
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
}
|
|
546
455
|
// Delivered: a reply is closed now and a prompt notice leaves the relay
|
|
547
456
|
// open on purpose, so either way a later cancel must be judged by the row.
|
|
548
457
|
// Held or failed: nothing reached A, so the relay can be withdrawn again.
|
|
549
458
|
(0, relay_delivery_claims_1.releaseRelayDelivery)(relayId);
|
|
550
459
|
}
|
|
551
460
|
}
|
|
552
|
-
/** The payload this relay carries right now, read straight from the ledger. */
|
|
553
|
-
function findCurrentPayload(db, relayId) {
|
|
554
|
-
return (0, relay_db_1.listRelaysWithPendingPayload)(db).find((item) => item.relay.id === relayId) ?? null;
|
|
555
|
-
}
|
|
556
461
|
/**
|
|
557
462
|
* Deliver every stashed payload that can be delivered now.
|
|
558
463
|
*
|
|
@@ -566,22 +471,30 @@ async function pumpRelayDeliveries() {
|
|
|
566
471
|
globalThis.__relayPumpRunning = true;
|
|
567
472
|
try {
|
|
568
473
|
const db = (0, db_instance_1.getDbInstance)();
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
474
|
+
ensureRelayRecovery(db);
|
|
475
|
+
// Issue #3957: a reply promoted out of the second slot during a pass is
|
|
476
|
+
// delivered by one more pass rather than waiting for the next tick.
|
|
477
|
+
for (let pass = 0; pass < PUMP_PASSES_MAX; pass += 1) {
|
|
478
|
+
globalThis.__relayPumpAgain = false;
|
|
479
|
+
for (const item of (0, relay_db_1.listRelaysWithPendingPayload)(db)) {
|
|
480
|
+
if (inFlight.has(item.relay.id))
|
|
481
|
+
continue;
|
|
482
|
+
inFlight.add(item.relay.id);
|
|
483
|
+
try {
|
|
484
|
+
await deliverOne(db, item.relay.id, item.kind, item.body);
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
logger.warn('relay-delivery-failed', {
|
|
488
|
+
relayId: item.relay.id,
|
|
489
|
+
error: error instanceof Error ? error.message : String(error),
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
finally {
|
|
493
|
+
inFlight.delete(item.relay.id);
|
|
494
|
+
}
|
|
584
495
|
}
|
|
496
|
+
if (!globalThis.__relayPumpAgain)
|
|
497
|
+
break;
|
|
585
498
|
}
|
|
586
499
|
}
|
|
587
500
|
catch (error) {
|
|
@@ -596,6 +509,7 @@ async function pumpRelayDeliveries() {
|
|
|
596
509
|
/** One tick of the background loop: sweep the deadlines, then deliver. */
|
|
597
510
|
async function runRelayMaintenanceTick() {
|
|
598
511
|
try {
|
|
512
|
+
ensureRelayRecovery((0, db_instance_1.getDbInstance)());
|
|
599
513
|
sweepExpiredRelays((0, db_instance_1.getDbInstance)());
|
|
600
514
|
}
|
|
601
515
|
catch (error) {
|
|
@@ -28,9 +28,10 @@
|
|
|
28
28
|
* @module lib/relay/relay-messages
|
|
29
29
|
*/
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.RELAY_HEADER_PREFIX = void 0;
|
|
31
|
+
exports.RELAY_NOTE_PREFIX = exports.RELAY_HEADER_PREFIX = void 0;
|
|
32
32
|
exports.buildRelayHeader = buildRelayHeader;
|
|
33
33
|
exports.buildRelayReplyMessage = buildRelayReplyMessage;
|
|
34
|
+
exports.buildRelayOverlapNote = buildRelayOverlapNote;
|
|
34
35
|
exports.buildRelayPromptMessage = buildRelayPromptMessage;
|
|
35
36
|
exports.buildRelayExpiredMessage = buildRelayExpiredMessage;
|
|
36
37
|
exports.buildRelaySystemLine = buildRelaySystemLine;
|
|
@@ -63,12 +64,38 @@ function buildRelayHeader(sender) {
|
|
|
63
64
|
* nothing" is information, and swallowing the delivery would leave A waiting on
|
|
64
65
|
* a relay that has already closed.
|
|
65
66
|
*/
|
|
66
|
-
function buildRelayReplyMessage(sender, reply) {
|
|
67
|
+
function buildRelayReplyMessage(sender, reply, overlapNote = null) {
|
|
67
68
|
const body = reply.trim();
|
|
69
|
+
// Issue #3957: the note goes on its own line between the header and the
|
|
70
|
+
// reply, so the header stays the first token and the reply stays verbatim.
|
|
71
|
+
if (overlapNote !== null) {
|
|
72
|
+
return `${buildRelayHeader(sender)}\n${overlapNote}\n${body === '' ? '(no reply body)' : body}`;
|
|
73
|
+
}
|
|
68
74
|
return body === ''
|
|
69
75
|
? `${buildRelayHeader(sender)} (no reply body)`
|
|
70
76
|
: `${buildRelayHeader(sender)} ${body}`;
|
|
71
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* The literal the overlap note starts with (Issue #3957). Fixed in both
|
|
80
|
+
* languages, so a reader can find the note without knowing the server's.
|
|
81
|
+
*/
|
|
82
|
+
exports.RELAY_NOTE_PREFIX = '[CommandMate relay]';
|
|
83
|
+
const OVERLAP_NOTE_TEMPLATES = {
|
|
84
|
+
en: 'Note: this reply may have been processed in the same turn as another request (overlap={overlap}).',
|
|
85
|
+
ja: '注意: この返答は、別の依頼と同じターンで処理された可能性があります(overlap={overlap})。',
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* The one-line note a delivered reply carries when it may share a turn with
|
|
89
|
+
* another request (Issue #3957), or null for `none` / not judged.
|
|
90
|
+
*
|
|
91
|
+
* A statement of fact, never an instruction: the line lands in another agent's
|
|
92
|
+
* composer, and "re-ask" or "discard" there would be acted on.
|
|
93
|
+
*/
|
|
94
|
+
function buildRelayOverlapNote(locale, overlap) {
|
|
95
|
+
if (overlap === null || overlap === 'none')
|
|
96
|
+
return null;
|
|
97
|
+
return `${exports.RELAY_NOTE_PREFIX} ${OVERLAP_NOTE_TEMPLATES[locale].replace('{overlap}', overlap)}`;
|
|
98
|
+
}
|
|
72
99
|
/** Collapse whitespace and clip, so a 40-line dialog is one readable line. */
|
|
73
100
|
function squeeze(text, max) {
|
|
74
101
|
const flat = text.replace(/\s+/g, ' ').trim();
|
|
@@ -139,6 +166,14 @@ const SYSTEM_TEMPLATES = {
|
|
|
139
166
|
* Written into `chat_messages` exactly as the model-change row is (#2357), in
|
|
140
167
|
* the readers' language, because a stored row cannot be re-rendered per viewer.
|
|
141
168
|
*/
|
|
142
|
-
function buildRelaySystemLine(locale, kind, alias) {
|
|
143
|
-
|
|
169
|
+
function buildRelaySystemLine(locale, kind, alias, detail = {}) {
|
|
170
|
+
const line = SYSTEM_TEMPLATES[locale][kind].replace('{alias}', alias);
|
|
171
|
+
// Issue #3957: what the delivery proved, as untranslated tokens a reader
|
|
172
|
+
// can grep for in either language.
|
|
173
|
+
const parts = [];
|
|
174
|
+
if (detail.overlap)
|
|
175
|
+
parts.push(`overlap=${detail.overlap}`);
|
|
176
|
+
if (detail.holdReason)
|
|
177
|
+
parts.push(`hold=${detail.holdReason}`);
|
|
178
|
+
return parts.length === 0 ? line : `${line} (${parts.join(', ')})`;
|
|
144
179
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What a bound relay can PROVE about sharing a turn with another request
|
|
4
|
+
* (Issue #3957).
|
|
5
|
+
*
|
|
6
|
+
* Two directions, judged from what the send recorded and what the worker's
|
|
7
|
+
* history holds — never from the reply's own text:
|
|
8
|
+
*
|
|
9
|
+
* - **later** — a turn was already open on the worker when this request's
|
|
10
|
+
* input began (`turn_open_at_send = 1`): the request may have been folded
|
|
11
|
+
* into somebody else's turn.
|
|
12
|
+
* - **earlier** — another input reached the same instance after this one
|
|
13
|
+
* began and before the reply: somebody else's request may have been folded
|
|
14
|
+
* into this one's turn.
|
|
15
|
+
*
|
|
16
|
+
* `earlier` is claimed only when it is proven. A user row's timestamp can be
|
|
17
|
+
* nudged for display ordering, and a transcript reader writes a second copy of
|
|
18
|
+
* this send's own prompt under another id (#2387), so a row counts only when
|
|
19
|
+
* it is not this send's row, does not carry this send's text, and was INSERTED
|
|
20
|
+
* before the reply row (SQLite's rowid order). Anything else in the window is
|
|
21
|
+
* "cannot tell", which makes the result `unknown` rather than `none` — PR 3
|
|
22
|
+
* makes the earlier side exact; PR 2 lets it miss rather than guess.
|
|
23
|
+
*
|
|
24
|
+
* @module lib/relay/relay-overlap
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.judgeRelayOverlap = judgeRelayOverlap;
|
|
28
|
+
const chat_db_1 = require("../../lib/db/chat-db");
|
|
29
|
+
const user_turn_recorder_1 = require("../../lib/history/user-turn-recorder");
|
|
30
|
+
/** Whether another input provably arrived between the boundary and the reply. */
|
|
31
|
+
function judgeEarlier(db, binding, worker, reply) {
|
|
32
|
+
const boundary = binding.relay.inputBoundaryAt;
|
|
33
|
+
if (boundary === null)
|
|
34
|
+
return 'ambiguous';
|
|
35
|
+
const replySeq = db
|
|
36
|
+
.prepare('SELECT rowid AS seq FROM chat_messages WHERE id = ?')
|
|
37
|
+
.get(reply.id);
|
|
38
|
+
if (!replySeq)
|
|
39
|
+
return 'ambiguous';
|
|
40
|
+
const rows = db
|
|
41
|
+
.prepare(`
|
|
42
|
+
SELECT id, content, rowid AS seq FROM chat_messages
|
|
43
|
+
WHERE worktree_id = ? AND role = 'user' ${chat_db_1.ACTIVE_FILTER}
|
|
44
|
+
AND COALESCE(cli_tool_id, 'claude') = ?
|
|
45
|
+
AND COALESCE(instance_id, cli_tool_id, 'claude') = ?
|
|
46
|
+
AND timestamp >= ? AND timestamp < ?
|
|
47
|
+
`)
|
|
48
|
+
.all(worker.worktreeId, worker.cliToolId, worker.instanceId, boundary, reply.timestamp.getTime());
|
|
49
|
+
const own = binding.inputMessageId ? (0, chat_db_1.getMessageById)(db, binding.inputMessageId) : null;
|
|
50
|
+
const ownText = own ? (0, user_turn_recorder_1.normalizeUserTurnContent)(own.content) : null;
|
|
51
|
+
let ambiguous = false;
|
|
52
|
+
for (const row of rows) {
|
|
53
|
+
if (row.id === binding.inputMessageId)
|
|
54
|
+
continue;
|
|
55
|
+
// Without this send's own text, no other row can be told from its echo.
|
|
56
|
+
if (ownText === null || (0, user_turn_recorder_1.normalizeUserTurnContent)(row.content) === ownText) {
|
|
57
|
+
ambiguous = true;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Stamped before the reply but written after it: the order is not proven.
|
|
61
|
+
if (row.seq > replySeq.seq) {
|
|
62
|
+
ambiguous = true;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
return 'proven';
|
|
66
|
+
}
|
|
67
|
+
return ambiguous ? 'ambiguous' : 'none';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Judge one reply against the relay's recorded send.
|
|
71
|
+
*
|
|
72
|
+
* `none` only when `later` was ruled out by a valid observation and nothing in
|
|
73
|
+
* the window could be another input; every other undecided case is `unknown`.
|
|
74
|
+
*/
|
|
75
|
+
function judgeRelayOverlap(db, binding, worker, reply) {
|
|
76
|
+
const { relay } = binding;
|
|
77
|
+
const later = relay.turnOpenAtSend === true;
|
|
78
|
+
const laterRuledOut = relay.turnOpenAtSend === false && relay.obsState === 'valid';
|
|
79
|
+
const earlier = judgeEarlier(db, binding, worker, reply);
|
|
80
|
+
if (later && earlier === 'proven')
|
|
81
|
+
return { overlap: 'both', basis: 'turn-open-at-send+foreign-input' };
|
|
82
|
+
if (later)
|
|
83
|
+
return { overlap: 'later', basis: 'turn-open-at-send' };
|
|
84
|
+
if (earlier === 'proven')
|
|
85
|
+
return { overlap: 'earlier', basis: 'foreign-input' };
|
|
86
|
+
if (laterRuledOut && earlier === 'none')
|
|
87
|
+
return { overlap: 'none', basis: 'no-open-turn+no-other-input' };
|
|
88
|
+
return {
|
|
89
|
+
overlap: 'unknown',
|
|
90
|
+
basis: laterRuledOut ? 'other-input-unproven' : 'turn-state-unknown',
|
|
91
|
+
};
|
|
92
|
+
}
|