commandmate 0.49.1 → 0.49.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +246 -243
- package/.next/app-path-routes-manifest.json +18 -17
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -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]/resolve/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +4 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
- 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 +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +10 -10
- 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 +18 -17
- package/.next/server/chunks/1308.js +1 -0
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/3801.js +8 -8
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4490.js +1 -0
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5350.js +212 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/7926.js +1 -0
- package/.next/server/chunks/8581.js +15 -15
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +89 -88
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9702.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-675ba6b21844dc3b.js → 2407-87ec01332344ec2b.js} +1 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/resolve/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 +56 -5
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +17 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +14 -8
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +4 -1
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +146 -8
- package/dist/cli/commands/report.d.ts +7 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +19 -6
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +29 -5
- package/dist/cli/commands/respond.d.ts +2 -2
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +40 -37
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +8 -4
- package/dist/cli/commands/task.d.ts +22 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +26 -18
- package/dist/cli/commands/wait-instance.d.ts +9 -1
- package/dist/cli/commands/wait-instance.d.ts.map +1 -1
- package/dist/cli/commands/wait-instance.js +15 -0
- package/dist/cli/commands/wait-poll-state.d.ts +18 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.d.ts +2 -1
- package/dist/cli/commands/wait-verify.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.js +5 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +37 -13
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +1 -0
- package/dist/cli/types/api-responses.d.ts +55 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client-deadline.d.ts +28 -0
- package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
- package/dist/cli/utils/api-client-deadline.js +46 -0
- package/dist/cli/utils/api-client-errors.d.ts +118 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +210 -0
- package/dist/cli/utils/api-client.d.ts +33 -109
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +202 -227
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +1 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +7 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.d.ts +25 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +10 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +9 -0
- package/dist/server/locales/ja/worktree.json +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +5 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/claude.js +8 -2
- package/dist/server/src/lib/cli-tools/codex.js +7 -4
- package/dist/server/src/lib/cli-tools/command-code.js +14 -18
- package/dist/server/src/lib/cli-tools/copilot.js +159 -28
- package/dist/server/src/lib/cli-tools/gemini.js +10 -2
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +162 -8
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +57 -14
- package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +143 -187
- package/dist/server/src/lib/cli-tools/vibe-local.js +91 -2
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +114 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
- package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
- package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
- package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
- package/dist/server/src/lib/db/relay-bind-db.js +88 -167
- package/dist/server/src/lib/db/relay-db-base.js +20 -0
- package/dist/server/src/lib/db/relay-db-count.js +49 -0
- package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
- package/dist/server/src/lib/db/relay-db-hold.js +250 -0
- package/dist/server/src/lib/db/relay-db.js +33 -92
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/prompt-answer-errors.js +76 -2
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery.js +359 -79
- package/dist/server/src/lib/relay/relay-messages.js +13 -0
- package/dist/server/src/lib/relay/relay-system-line.js +28 -15
- package/dist/server/src/lib/relay/types.js +14 -2
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
- package/dist/server/src/lib/session/claude-session.js +26 -7
- package/dist/server/src/lib/session/current-output-builder.js +7 -3
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +47 -2
- package/dist/server/src/lib/session/prompt-submit-receipt.js +224 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +16 -3
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/send-attempt-state.js +177 -2
- package/dist/server/src/lib/session/send-attempt-types.js +10 -1
- package/dist/server/src/lib/session/send-user-message.js +80 -8
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +17 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +6 -28
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.2.json +49 -0
- package/release-notes/0.49.3.json +52 -0
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3773.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9198.js +0 -144
- package/.next/static/chunks/3931-1a1abab16248f14d.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-ce17ffa77f39608e.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +0 -1
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* One launch per session at a time (Issue #3981).
|
|
4
|
+
*
|
|
5
|
+
* Two requests could start the same session at once. A (a send to an instance
|
|
6
|
+
* that is not running) creates the pane and is about to type the launch line;
|
|
7
|
+
* B arrives in that window. For seven tools `isRunning` is `has-session`, so B
|
|
8
|
+
* read "running" and went on to type its body into the pane's shell; for claude
|
|
9
|
+
* `isRunning` also checks health, so on an unhealthy-looking pane (empty, `%`)
|
|
10
|
+
* B started the session too and the reuse branch killed A's half-launched pane.
|
|
11
|
+
* Nothing said "this session is already being started".
|
|
12
|
+
*
|
|
13
|
+
* This module is that fact, keyed by tmux session name, and the order it has to
|
|
14
|
+
* be taken in relative to the instance input lock (`./instance-input-lock`):
|
|
15
|
+
*
|
|
16
|
+
* - **The flight is outside, the lock inside.** A launch types its lines in one
|
|
17
|
+
* `exclusive` turn of the lock (`typeLaunchLines`), and its init polls and
|
|
18
|
+
* readiness waits run outside it (#3975). A naive "wait for the launch" would
|
|
19
|
+
* let a send that holds the lock wait for a launch that is waiting for the
|
|
20
|
+
* lock — a cycle that ends only at `INSTANCE_INPUT_LOCK_WAIT_MS`.
|
|
21
|
+
* - **R1: a lock holder never waits for another request's launch.** It gets
|
|
22
|
+
* {@link SessionLaunchInFlightError} (`SESSION_STARTING`, nothing typed)
|
|
23
|
+
* instead, and the launch types once the holder lets go.
|
|
24
|
+
* - **R2: the launch's own keys join a lock the launcher already holds** (codex
|
|
25
|
+
* relaunching inside a send): the lock's `AsyncLocalStorage`, which a launch
|
|
26
|
+
* started here inherits.
|
|
27
|
+
* - **R4: the launch is registered before anything is read.** {@link
|
|
28
|
+
* runSessionLaunch} records it synchronously, before the tool's `hasSession`,
|
|
29
|
+
* its health check or claude's reuse-branch kill run; `POST /send` and
|
|
30
|
+
* `requireSession` look here before they read `isRunning`.
|
|
31
|
+
*
|
|
32
|
+
* - **A wait has a bound** (review P3-1): a caller that joins or waits out
|
|
33
|
+
* another request's launch gives up at the launch's own start budget
|
|
34
|
+
* (`getSessionStartingMaxMs`, counted from when the launch began) with
|
|
35
|
+
* {@link SessionLaunchWaitTimeoutError} (`SESSION_STARTING`, nothing typed),
|
|
36
|
+
* so a launch that stops returning does not hang every send to its session.
|
|
37
|
+
* - **A model is not dropped on a join** (review P3-2): a start that asks for
|
|
38
|
+
* a model the launch in progress is not starting with gets {@link
|
|
39
|
+
* SessionLaunchModelMismatchError}, as a `--model` to a running session
|
|
40
|
+
* gets a 400 (#989 / #2771), instead of joining and running on another model.
|
|
41
|
+
*
|
|
42
|
+
* In memory and on `globalThis` for the reason the lock is: the routes that
|
|
43
|
+
* start sessions are separate bundles under `next dev`.
|
|
44
|
+
*
|
|
45
|
+
* @module lib/session/session-launch-flight
|
|
46
|
+
*/
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.SessionLaunchModelMismatchError = exports.SESSION_LAUNCH_MODEL_MISMATCH_CODE = exports.SessionLaunchWaitTimeoutError = exports.SessionLaunchInFlightError = void 0;
|
|
49
|
+
exports.isSessionLaunchModelMismatchError = isSessionLaunchModelMismatchError;
|
|
50
|
+
exports.isSessionLaunchInFlight = isSessionLaunchInFlight;
|
|
51
|
+
exports.runSessionLaunch = runSessionLaunch;
|
|
52
|
+
exports.forgetSessionLaunch = forgetSessionLaunch;
|
|
53
|
+
exports.settleSessionLaunch = settleSessionLaunch;
|
|
54
|
+
exports.resetSessionLaunchFlightsForTest = resetSessionLaunchFlightsForTest;
|
|
55
|
+
const global_state_1 = require("../../lib/global-state");
|
|
56
|
+
const logger_1 = require("../../lib/logger");
|
|
57
|
+
const session_starting_config_1 = require("../../config/session-starting-config");
|
|
58
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
59
|
+
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
60
|
+
const logger = (0, logger_1.createLogger)('session/session-launch-flight');
|
|
61
|
+
const flights = (0, global_state_1.getOrInitGlobal)('__sessionLaunchFlights', () => new Map());
|
|
62
|
+
/**
|
|
63
|
+
* Another request is starting this session, and the caller holds its input lock
|
|
64
|
+
* (R1). Nothing was typed; retrying after the launch is the whole remedy.
|
|
65
|
+
*
|
|
66
|
+
* A {@link SessionStartTimeoutError}, so every reader of `SESSION_STARTING`
|
|
67
|
+
* (the send service, the route's 503, `classifySendFailure`) answers it as the
|
|
68
|
+
* slow start it is.
|
|
69
|
+
*/
|
|
70
|
+
class SessionLaunchInFlightError extends session_start_error_1.SessionStartTimeoutError {
|
|
71
|
+
constructor(toolName, sessionName) {
|
|
72
|
+
super(toolName, sessionName, 0);
|
|
73
|
+
this.message =
|
|
74
|
+
`${toolName} is being started by another request (tmux session '${sessionName}'), ` +
|
|
75
|
+
'and this send holds its input, so it did not wait for that launch — the message was ' +
|
|
76
|
+
'not delivered and nothing was typed. Retry the send in a few seconds.';
|
|
77
|
+
this.name = 'SessionLaunchInFlightError';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.SessionLaunchInFlightError = SessionLaunchInFlightError;
|
|
81
|
+
/**
|
|
82
|
+
* Another request's launch of this session did not finish within its start
|
|
83
|
+
* budget, and this caller stopped waiting for it (review P3-1). Nothing was
|
|
84
|
+
* typed; the launch is left running.
|
|
85
|
+
*/
|
|
86
|
+
class SessionLaunchWaitTimeoutError extends session_start_error_1.SessionStartTimeoutError {
|
|
87
|
+
constructor(toolName, sessionName, timeoutMs) {
|
|
88
|
+
super(toolName, sessionName, timeoutMs);
|
|
89
|
+
this.message =
|
|
90
|
+
`${toolName} is being started by another request (tmux session '${sessionName}'), and that ` +
|
|
91
|
+
`launch did not finish within ${Math.round(timeoutMs / 1000)}s — the message was not ` +
|
|
92
|
+
'delivered and nothing was typed. Retry the send in a few seconds, or run ' +
|
|
93
|
+
'`commandmate capture <worktree-id>` to see what the launch is waiting on.';
|
|
94
|
+
this.name = 'SessionLaunchWaitTimeoutError';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.SessionLaunchWaitTimeoutError = SessionLaunchWaitTimeoutError;
|
|
98
|
+
/** Code of {@link SessionLaunchModelMismatchError}. */
|
|
99
|
+
exports.SESSION_LAUNCH_MODEL_MISMATCH_CODE = 'SESSION_LAUNCH_MODEL_MISMATCH';
|
|
100
|
+
/**
|
|
101
|
+
* A start asked for a model, and the launch of the session already in
|
|
102
|
+
* progress is starting with another (review P3-2). Nothing was typed. The
|
|
103
|
+
* model is fixed when the process starts (#989 / #2771), so joining would
|
|
104
|
+
* silently run the request on the other model.
|
|
105
|
+
*/
|
|
106
|
+
class SessionLaunchModelMismatchError extends Error {
|
|
107
|
+
code = exports.SESSION_LAUNCH_MODEL_MISMATCH_CODE;
|
|
108
|
+
constructor(toolName, sessionName, requested, launching) {
|
|
109
|
+
super(`${toolName} is being started by another request (tmux session '${sessionName}') with ` +
|
|
110
|
+
`${launching === undefined ? 'its default model' : `model '${launching}'`}, not '${requested}'. ` +
|
|
111
|
+
'The model can only be set when starting a new session — the message was not delivered and ' +
|
|
112
|
+
'nothing was typed. Stop the session and resend with --model to switch models.');
|
|
113
|
+
this.name = 'SessionLaunchModelMismatchError';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.SessionLaunchModelMismatchError = SessionLaunchModelMismatchError;
|
|
117
|
+
/** Duck-typed on `code`, like the session-start errors (bundles do not share classes). */
|
|
118
|
+
function isSessionLaunchModelMismatchError(error) {
|
|
119
|
+
return (error instanceof Error && error.code === exports.SESSION_LAUNCH_MODEL_MISMATCH_CODE);
|
|
120
|
+
}
|
|
121
|
+
/** How long a caller may wait for `flight`, counted from when it began. */
|
|
122
|
+
function launchWaitLimitMs(flight) {
|
|
123
|
+
return flight.cliToolId === undefined
|
|
124
|
+
? (0, session_starting_config_1.getSessionStartingMaxMsAcrossTools)()
|
|
125
|
+
: (0, session_starting_config_1.getSessionStartingMaxMs)(flight.cliToolId);
|
|
126
|
+
}
|
|
127
|
+
/** `flight`'s outcome, or {@link SessionLaunchWaitTimeoutError} once its budget has run out. */
|
|
128
|
+
function waitForFlight(sessionName, toolName, flight) {
|
|
129
|
+
const limitMs = launchWaitLimitMs(flight);
|
|
130
|
+
const remaining = flight.startedAt + limitMs - Date.now();
|
|
131
|
+
const timedOut = () => {
|
|
132
|
+
logger.warn('session-launch-wait-timed-out', { sessionName, limitMs });
|
|
133
|
+
return new SessionLaunchWaitTimeoutError(toolName, sessionName, limitMs);
|
|
134
|
+
};
|
|
135
|
+
if (remaining <= 0)
|
|
136
|
+
return Promise.reject(timedOut());
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const timer = setTimeout(() => reject(timedOut()), remaining);
|
|
139
|
+
timer.unref?.();
|
|
140
|
+
flight.promise.then(() => {
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
resolve();
|
|
143
|
+
}, (error) => {
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
reject(error);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** Whether a launch of `sessionName` is in progress in this process. */
|
|
150
|
+
function isSessionLaunchInFlight(sessionName) {
|
|
151
|
+
return flights.has(sessionName);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Run `launch` as `sessionName`'s only launch.
|
|
155
|
+
*
|
|
156
|
+
* When one is already in progress, the caller joins it (same outcome, waited
|
|
157
|
+
* for within the launch's start budget) instead of starting a second — unless
|
|
158
|
+
* it asks for a model that launch is not starting with, or holds the session's
|
|
159
|
+
* input lock (R1); both are refused at once. Registration happens in the same
|
|
160
|
+
* synchronous step as the check, before `launch` reads anything (R4).
|
|
161
|
+
*
|
|
162
|
+
* @throws SessionLaunchModelMismatchError when another launch is in progress with another model
|
|
163
|
+
* @throws SessionLaunchInFlightError when another launch is in progress and the caller holds the input lock
|
|
164
|
+
* @throws SessionLaunchWaitTimeoutError when the joined launch outlives its start budget
|
|
165
|
+
*/
|
|
166
|
+
function runSessionLaunch(sessionName, toolName, launch, options = {}) {
|
|
167
|
+
const inFlight = flights.get(sessionName);
|
|
168
|
+
if (inFlight !== undefined) {
|
|
169
|
+
if (options.model !== undefined && options.model !== inFlight.model) {
|
|
170
|
+
logger.info('session-launch-model-mismatch-refused', { sessionName });
|
|
171
|
+
return Promise.reject(new SessionLaunchModelMismatchError(toolName, sessionName, options.model, inFlight.model));
|
|
172
|
+
}
|
|
173
|
+
if ((0, instance_input_lock_1.currentInstanceInputTicket)(sessionName) !== null) {
|
|
174
|
+
logger.info('session-launch-in-flight-refused', { sessionName });
|
|
175
|
+
return Promise.reject(new SessionLaunchInFlightError(toolName, sessionName));
|
|
176
|
+
}
|
|
177
|
+
logger.info('session-launch-joined', { sessionName });
|
|
178
|
+
return waitForFlight(sessionName, toolName, inFlight);
|
|
179
|
+
}
|
|
180
|
+
// The entry is in the map before `launch` runs a single line. Called in the
|
|
181
|
+
// caller's async context, so a launcher that holds the lock still owns it
|
|
182
|
+
// inside the launch (R2).
|
|
183
|
+
let settle;
|
|
184
|
+
const promise = new Promise((resolve, reject) => (settle = { resolve, reject }));
|
|
185
|
+
const flight = {
|
|
186
|
+
promise,
|
|
187
|
+
startedAt: Date.now(),
|
|
188
|
+
cliToolId: options.cliToolId,
|
|
189
|
+
model: options.model,
|
|
190
|
+
};
|
|
191
|
+
flights.set(sessionName, flight);
|
|
192
|
+
const clear = () => {
|
|
193
|
+
if (flights.get(sessionName) === flight)
|
|
194
|
+
flights.delete(sessionName);
|
|
195
|
+
};
|
|
196
|
+
promise.then(clear, clear);
|
|
197
|
+
let running;
|
|
198
|
+
try {
|
|
199
|
+
running = launch();
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
running = Promise.reject(error);
|
|
203
|
+
}
|
|
204
|
+
running.then(settle.resolve, settle.reject);
|
|
205
|
+
return promise;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* The session was killed: a launch still running against it is not one a new
|
|
209
|
+
* start may join (Issue #3195's case — a launch killed mid-way keeps running
|
|
210
|
+
* until its readiness wait runs out). The killed launch's own end then leaves
|
|
211
|
+
* a successor's entry alone.
|
|
212
|
+
*/
|
|
213
|
+
function forgetSessionLaunch(sessionName) {
|
|
214
|
+
flights.delete(sessionName);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Wait out a launch of `sessionName` another request has in progress, before
|
|
218
|
+
* reading whether the session is running (R4). Its outcome is not the caller's:
|
|
219
|
+
* a launch that failed is left for the caller's own check to find. The wait
|
|
220
|
+
* ends at the launch's start budget (review P3-1).
|
|
221
|
+
*
|
|
222
|
+
* @returns Whether there was a launch to wait for
|
|
223
|
+
* @throws SessionLaunchInFlightError when there is one and the caller holds the input lock (R1)
|
|
224
|
+
* @throws SessionLaunchWaitTimeoutError when it outlives its start budget
|
|
225
|
+
*/
|
|
226
|
+
async function settleSessionLaunch(sessionName, toolName) {
|
|
227
|
+
const inFlight = flights.get(sessionName);
|
|
228
|
+
if (inFlight === undefined)
|
|
229
|
+
return false;
|
|
230
|
+
if ((0, instance_input_lock_1.currentInstanceInputTicket)(sessionName) !== null) {
|
|
231
|
+
logger.info('session-launch-in-flight-refused', { sessionName });
|
|
232
|
+
throw new SessionLaunchInFlightError(toolName, sessionName);
|
|
233
|
+
}
|
|
234
|
+
await waitForFlight(sessionName, toolName, inFlight).catch((error) => {
|
|
235
|
+
if (error instanceof SessionLaunchWaitTimeoutError)
|
|
236
|
+
throw error;
|
|
237
|
+
});
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
/** Forget every launch in progress. Test-only. */
|
|
241
|
+
function resetSessionLaunchFlightsForTest() {
|
|
242
|
+
flights.clear();
|
|
243
|
+
}
|
|
@@ -36,6 +36,28 @@
|
|
|
36
36
|
* key back from its successor. `clearSessionStarting` without a token — the
|
|
37
37
|
* kill-session route — drops the record whoever wrote it.
|
|
38
38
|
*
|
|
39
|
+
* ## The stops that do not forget (Issue #4032)
|
|
40
|
+
*
|
|
41
|
+
* Only the kill-session route clears without a token. The other stops of a
|
|
42
|
+
* session kill the tmux session directly and call neither this nor
|
|
43
|
+
* `forgetSessionLaunch`:
|
|
44
|
+
*
|
|
45
|
+
* - `session-cleanup`'s `killWorktreeSession`, for the worktrees a repository
|
|
46
|
+
* delete or a `syncWorktreesAndCleanup` removes;
|
|
47
|
+
* - `cleanupGlobalSessions`, the `__global__` sessions, on every
|
|
48
|
+
* `syncWorktreesAndCleanup` — `commandmate sync`, repository scan and
|
|
49
|
+
* restore, and the end of a clone.
|
|
50
|
+
*
|
|
51
|
+
* A launch they cut short stays the session's launch until it settles: a
|
|
52
|
+
* start that comes in meanwhile joins it and gets its outcome (often the
|
|
53
|
+
* failure of the killed launch), and the "starting" record keeps answering.
|
|
54
|
+
* The flight is dropped as soon as the killed launch returns or throws, so a
|
|
55
|
+
* launch that fails fast frees the session early; the launch's own bound
|
|
56
|
+
* (`getSessionStartingMaxMs`, which #3981 put on a join's wait too) is only the
|
|
57
|
+
* longest it can last. A server shutdown drops both maps. Recorded rather than
|
|
58
|
+
* changed (Issue #4032). A stop that should forget calls
|
|
59
|
+
* `clearSessionStarting` without a token after its kill.
|
|
60
|
+
*
|
|
39
61
|
* ## The escape hatches
|
|
40
62
|
*
|
|
41
63
|
* A starting display that never ends would hide a stuck launch, which is worse
|
|
@@ -74,6 +96,8 @@ const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
|
74
96
|
const status_reason_1 = require("../../lib/detection/status-reason");
|
|
75
97
|
const session_starting_config_1 = require("../../config/session-starting-config");
|
|
76
98
|
const global_state_1 = require("../global-state");
|
|
99
|
+
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
100
|
+
const session_launch_flight_1 = require("../../lib/session/session-launch-flight");
|
|
77
101
|
const records = (0, global_state_1.getOrInitGlobal)('__sessionStartingRecords', () => new Map());
|
|
78
102
|
/** On `globalThis` like the map, so tokens keep growing across route bundles. */
|
|
79
103
|
const tokenSeq = (0, global_state_1.getOrInitGlobal)('__sessionStartingTokenSeq', () => ({ last: 0 }));
|
|
@@ -131,7 +155,8 @@ function markSessionStarting(worktreeId, cliToolId, instanceId, at = Date.now())
|
|
|
131
155
|
*
|
|
132
156
|
* With a token, only that launch's record is dropped — a launch that was
|
|
133
157
|
* killed and replaced must not end its successor's display (Issue #3195).
|
|
134
|
-
* Without one (kill-session), the record is dropped whoever wrote it
|
|
158
|
+
* Without one (kill-session), the record is dropped whoever wrote it, and the
|
|
159
|
+
* session's launch in progress stops being one a new start joins (Issue #3981).
|
|
135
160
|
*
|
|
136
161
|
* @param worktreeId - Worktree ID
|
|
137
162
|
* @param cliToolId - Tool that was launched
|
|
@@ -141,13 +166,24 @@ function markSessionStarting(worktreeId, cliToolId, instanceId, at = Date.now())
|
|
|
141
166
|
function clearSessionStarting(worktreeId, cliToolId, instanceId, token) {
|
|
142
167
|
try {
|
|
143
168
|
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
144
|
-
if (token
|
|
145
|
-
|
|
146
|
-
records.delete(key);
|
|
169
|
+
if (token === undefined || records.get(key)?.token === token)
|
|
170
|
+
records.delete(key);
|
|
147
171
|
}
|
|
148
172
|
catch {
|
|
149
173
|
// Nothing was recorded under an id that does not compose into a key.
|
|
150
174
|
}
|
|
175
|
+
if (token !== undefined)
|
|
176
|
+
return;
|
|
177
|
+
// Issue #3981: a killed launch is no longer the session's one launch
|
|
178
|
+
// (`session-launch-flight`); the next start is a launch of its own. Apart
|
|
179
|
+
// from the record above, so a name that does not resolve cannot leave the
|
|
180
|
+
// "starting" display behind (review P3-4).
|
|
181
|
+
try {
|
|
182
|
+
(0, session_launch_flight_1.forgetSessionLaunch)((0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId));
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// No launch was registered under a name that does not resolve.
|
|
186
|
+
}
|
|
151
187
|
}
|
|
152
188
|
/** The record's start time while it still answers, else null (dropping an expired one). */
|
|
153
189
|
function activeSince(key, record, now) {
|
|
@@ -43,6 +43,7 @@ exports.buildStructuredPromptData = buildStructuredPromptData;
|
|
|
43
43
|
exports.buildStructuredPromptHistoryRecord = buildStructuredPromptHistoryRecord;
|
|
44
44
|
exports.isStructuredPromptWaitingData = isStructuredPromptWaitingData;
|
|
45
45
|
const models_1 = require("../../types/models");
|
|
46
|
+
const respond_target_1 = require("../../lib/session/respond-target");
|
|
46
47
|
const decision_labels_1 = require("../../lib/hooks/sources/opencode-v2/decision-labels");
|
|
47
48
|
/**
|
|
48
49
|
* The three verdicts an approval dialog accepts, in the order `respond` numbers
|
|
@@ -157,7 +158,14 @@ const SOURCE_LABEL = {
|
|
|
157
158
|
* is the only guidance a caller of `wait` gets, so it has to say which form
|
|
158
159
|
* actually works.
|
|
159
160
|
*/
|
|
160
|
-
function buildStructuredPromptQuestion(worktreeId, facts) {
|
|
161
|
+
function buildStructuredPromptQuestion(worktreeId, facts, instanceId, agent) {
|
|
162
|
+
// Issue #4031: the `respond` this names goes to the instance whose prompt it
|
|
163
|
+
// is. Issue #4063: `buildCurrentOutput` always passes one — the primary's is
|
|
164
|
+
// the tool's own id (`--instance <tool>`, `resolveSessionTarget`'s rule), on
|
|
165
|
+
// every path (HTTP, WS push, poller, history). Without one (a caller outside
|
|
166
|
+
// that builder) the sentence names no target.
|
|
167
|
+
// Issue #4049: or to the tool, when the caller names one (`respondAgentFor`).
|
|
168
|
+
const target = (0, respond_target_1.respondTargetFlags)(instanceId, agent);
|
|
161
169
|
const parts = [
|
|
162
170
|
`A dialog is open in ${worktreeId}: the agent reported it via ${SOURCE_LABEL[facts.source]}` +
|
|
163
171
|
`${facts.toolName ? ` for ${facts.toolName}` : ''}, but the detection layer published no ` +
|
|
@@ -167,16 +175,16 @@ function buildStructuredPromptQuestion(worktreeId, facts) {
|
|
|
167
175
|
// Issue #1898. The numbers are real here — they address a decision the
|
|
168
176
|
// agent is holding, not a line on a screen — so the guidance says which one
|
|
169
177
|
// to send instead of warning that none of them can be trusted.
|
|
170
|
-
parts.push(`Answer it with \`commandmate respond ${worktreeId} <number
|
|
178
|
+
parts.push(`Answer it with \`commandmate respond ${worktreeId} <number>${target}\`: ` +
|
|
171
179
|
facts.decisionOptions
|
|
172
180
|
.map((option) => `${option.number} = ${option.label} (${option.reply})`)
|
|
173
181
|
.join(', ') +
|
|
174
182
|
`. The reply goes to the agent's own API, so no keys are sent to the terminal ` +
|
|
175
|
-
`and the label works too (\`respond ${worktreeId} "Allow once"\`).`);
|
|
183
|
+
`and the label works too (\`respond ${worktreeId} "Allow once"${target}\`).`);
|
|
176
184
|
}
|
|
177
185
|
else {
|
|
178
186
|
parts.push(`Answer it in the terminal, or send the option NUMBER with ` +
|
|
179
|
-
`\`commandmate respond ${worktreeId} <number
|
|
187
|
+
`\`commandmate respond ${worktreeId} <number>${target}\` — yes/no is not resolved on a numbered ` +
|
|
180
188
|
`dialog (Issue #1681).`);
|
|
181
189
|
}
|
|
182
190
|
if (facts.message) {
|
|
@@ -202,7 +210,7 @@ function buildStructuredPromptQuestion(worktreeId, facts) {
|
|
|
202
210
|
parts.push(`The agent asked${questionCount > 1 ? ` ${questionCount} questions, the first being` : ''}: ` +
|
|
203
211
|
`"${question}" — offering: ${labels.join(' / ')}. ` +
|
|
204
212
|
(answerable
|
|
205
|
-
? `Answer it with \`commandmate respond ${worktreeId} <number
|
|
213
|
+
? `Answer it with \`commandmate respond ${worktreeId} <number>${target}\`: ` +
|
|
206
214
|
labels.map((label, index) => `${index + 1} = ${label}`).join(', ') +
|
|
207
215
|
`. The number is this list's own position and the reply goes to the agent's own ` +
|
|
208
216
|
`API, so no keys are sent to the terminal (the label works too).`
|
|
@@ -212,11 +220,11 @@ function buildStructuredPromptQuestion(worktreeId, facts) {
|
|
|
212
220
|
return parts.join(' ');
|
|
213
221
|
}
|
|
214
222
|
/** The live `promptData` for a structured prompt. */
|
|
215
|
-
function buildStructuredPromptData(worktreeId, facts) {
|
|
223
|
+
function buildStructuredPromptData(worktreeId, facts, instanceId, agent) {
|
|
216
224
|
return {
|
|
217
225
|
type: models_1.UNCLASSIFIED_PROMPT_TYPE,
|
|
218
226
|
status: 'pending',
|
|
219
|
-
question: buildStructuredPromptQuestion(worktreeId, facts),
|
|
227
|
+
question: buildStructuredPromptQuestion(worktreeId, facts, instanceId, agent),
|
|
220
228
|
options: [],
|
|
221
229
|
source: facts.source,
|
|
222
230
|
...(facts.message ? { message: facts.message } : {}),
|
|
@@ -238,11 +246,11 @@ function buildStructuredPromptData(worktreeId, facts) {
|
|
|
238
246
|
};
|
|
239
247
|
}
|
|
240
248
|
/** The prompt-history row for a structured prompt the scraper never saw. */
|
|
241
|
-
function buildStructuredPromptHistoryRecord(worktreeId, facts) {
|
|
249
|
+
function buildStructuredPromptHistoryRecord(worktreeId, facts, instanceId, agent) {
|
|
242
250
|
return {
|
|
243
251
|
type: models_1.UNCLASSIFIED_PROMPT_TYPE,
|
|
244
252
|
status: 'unclassified',
|
|
245
|
-
question: buildStructuredPromptQuestion(worktreeId, facts),
|
|
253
|
+
question: buildStructuredPromptQuestion(worktreeId, facts, instanceId, agent),
|
|
246
254
|
options: [],
|
|
247
255
|
source: facts.source,
|
|
248
256
|
...(facts.message ? { message: facts.message } : {}),
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* it is bound to; the turn model (`agent-event-turn`) knows how each delivery
|
|
8
8
|
* moved the instance's turn. This module joins the two:
|
|
9
9
|
*
|
|
10
|
-
* - {@link resolveEpisodeBinding}
|
|
10
|
+
* - {@link resolveEpisodeBinding} (defined in `waiting-episode-binding-resolve.ts`,
|
|
11
|
+
* imported here) decides what a new episode is bound to, from
|
|
11
12
|
* the turn model as it stands (design §2.4 規則 1). It is registered with the
|
|
12
13
|
* store, so an episode `observeWaitingEdge` opens is bound like any other.
|
|
13
14
|
* - {@link applyTurnOutcomesToEpisode} is the T table (design §2.4): what a
|
|
@@ -19,7 +20,8 @@
|
|
|
19
20
|
* - {@link captureLegacyStopTarget} / {@link settleLegacyStop} are the one
|
|
20
21
|
* closer that cannot be synchronous: `/api/hooks/claude-done` names no
|
|
21
22
|
* session and awaits a capture and a log before it is done (design 規則 6).
|
|
22
|
-
* - {@link planWaitingObservation}
|
|
23
|
+
* - {@link planWaitingObservation} (defined in `waiting-episode-binding-observation.ts`,
|
|
24
|
+
* imported here) / {@link commitWaitingObservation} are the
|
|
23
25
|
* tables O-1 and O-2 (design §2.4 規則 3・4・5): what one observer's reading
|
|
24
26
|
* of a frame does to the open episode. The three observers — the status
|
|
25
27
|
* probe, the response poller and the Auto-Yes poller — fix an
|
|
@@ -89,6 +89,7 @@ const response_poller_1 = require("../../lib/polling/response-poller");
|
|
|
89
89
|
const auto_yes_poller_state_1 = require("../../lib/polling/auto-yes-poller-state");
|
|
90
90
|
const auto_yes_enter_fallback_1 = require("../../lib/polling/auto-yes-enter-fallback");
|
|
91
91
|
const ws_server_1 = require("../../lib/ws-server");
|
|
92
|
+
const send_attempt_state_1 = require("./send-attempt-state");
|
|
92
93
|
const logger_1 = require("../../lib/logger");
|
|
93
94
|
const logger = (0, logger_1.createLogger)('worktree-session-reconcile');
|
|
94
95
|
/**
|
|
@@ -591,6 +592,15 @@ function migrateRuntimeState(db, renames, result) {
|
|
|
591
592
|
catch (error) {
|
|
592
593
|
result.errors.push(`websocket rooms: ${error instanceof Error ? error.message : String(error)}`);
|
|
593
594
|
}
|
|
595
|
+
// --- lastSend (Issue #4065) -------------------------------------------------
|
|
596
|
+
// Dropped, not moved: a record and its order (maxG) describe the sends made
|
|
597
|
+
// under the ID they were made under, and an old request that finishes late
|
|
598
|
+
// records under its own (old) ID. Both sides of every pair start with none.
|
|
599
|
+
// Never throws.
|
|
600
|
+
for (const rename of renames) {
|
|
601
|
+
(0, send_attempt_state_1.forgetSendAttemptsForWorktree)(rename.oldId);
|
|
602
|
+
(0, send_attempt_state_1.forgetSendAttemptsForWorktree)(rename.newId);
|
|
603
|
+
}
|
|
594
604
|
}
|
|
595
605
|
async function reconcileWorktreeSessions(db, renamesOrOldId, newIdOrOptions, maybeOptions) {
|
|
596
606
|
const requested = typeof renamesOrOldId === 'string'
|
|
@@ -29,7 +29,37 @@ const tmux_1 = require("./tmux/tmux");
|
|
|
29
29
|
const worktrees_1 = require("./git/worktrees");
|
|
30
30
|
const worktree_db_1 = require("./db/worktree-db");
|
|
31
31
|
const session_ownership_1 = require("./cli-tools/session-ownership");
|
|
32
|
+
const session_kill_ledger_1 = require("./verification/session-kill-ledger");
|
|
32
33
|
const logger = (0, logger_1.createLogger)('session-cleanup');
|
|
34
|
+
/**
|
|
35
|
+
* Record a session the server's cleanup stopped (Issue #3993). env-clean never
|
|
36
|
+
* excuses a removal on this line — the cleanup runs after a `commandmate sync` a
|
|
37
|
+
* worker can issue — but names it next to the violation. The session name is
|
|
38
|
+
* the primary instance's, which is what {@link killWorktreeSession} stops; when
|
|
39
|
+
* it cannot be resolved the line names none. Best effort: never throws.
|
|
40
|
+
*/
|
|
41
|
+
function recordCleanupKill(worktreeId, cliToolId, sessionName) {
|
|
42
|
+
let name = sessionName;
|
|
43
|
+
if (name === undefined) {
|
|
44
|
+
try {
|
|
45
|
+
name = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
name = undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
(0, session_kill_ledger_1.appendSessionKillRecord)({
|
|
52
|
+
version: session_kill_ledger_1.SESSION_KILL_LEDGER_VERSION,
|
|
53
|
+
at: Date.now(),
|
|
54
|
+
api: 'session-cleanup',
|
|
55
|
+
origin: 'server',
|
|
56
|
+
worktreeId,
|
|
57
|
+
instanceId: cliToolId,
|
|
58
|
+
sessionNames: name ? [name] : [],
|
|
59
|
+
callerCwd: null,
|
|
60
|
+
callerSession: null,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
33
63
|
/**
|
|
34
64
|
* Clean up all CLI tool sessions and pollers for a single worktree
|
|
35
65
|
*
|
|
@@ -65,6 +95,7 @@ async function cleanupWorktreeSessions(worktreeId, killSessionFn) {
|
|
|
65
95
|
if (killed) {
|
|
66
96
|
result.sessionsKilled.push(cliToolId);
|
|
67
97
|
logger.info('session:killed', { worktreeId, cliToolId });
|
|
98
|
+
recordCleanupKill(worktreeId, cliToolId);
|
|
68
99
|
}
|
|
69
100
|
}
|
|
70
101
|
catch (error) {
|
|
@@ -234,6 +265,7 @@ async function cleanupGlobalSessions() {
|
|
|
234
265
|
if (killed) {
|
|
235
266
|
sessionsKilled++;
|
|
236
267
|
logger.info('global-session:killed', { cliToolId, sessionName });
|
|
268
|
+
recordCleanupKill(global_session_constants_1.GLOBAL_SESSION_WORKTREE_ID, cliToolId, sessionName);
|
|
237
269
|
}
|
|
238
270
|
}
|
|
239
271
|
}
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* claude-session.ts -> session-key-sender.ts -> tmux.ts
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.sanitizeSessionEnvironment = sanitizeSessionEnvironment;
|
|
13
12
|
exports.waitForPrompt = waitForPrompt;
|
|
14
13
|
exports.sendMessageToSession = sendMessageToSession;
|
|
15
14
|
exports.stopSession = stopSession;
|
|
@@ -19,11 +18,8 @@ const submit_verified_sender_1 = require("./cli-tools/submit-verified-sender");
|
|
|
19
18
|
const tmux_capture_cache_1 = require("./tmux/tmux-capture-cache");
|
|
20
19
|
const errors_1 = require("./errors");
|
|
21
20
|
const cli_tool_timing_config_1 = require("../config/cli-tool-timing-config");
|
|
22
|
-
const child_process_1 = require("child_process");
|
|
23
|
-
const util_1 = require("util");
|
|
24
21
|
const logger_1 = require("../lib/logger");
|
|
25
22
|
const logger = (0, logger_1.createLogger)('session-key-sender');
|
|
26
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
27
23
|
/**
|
|
28
24
|
* Capture tmux pane output and strip ANSI escape sequences
|
|
29
25
|
*
|
|
@@ -43,29 +39,6 @@ async function getCleanPaneOutput(sessionName, lines = 50) {
|
|
|
43
39
|
*/
|
|
44
40
|
const PROMPT_POLL_INTERVAL = 200;
|
|
45
41
|
// =============================================================================
|
|
46
|
-
// Environment Sanitization
|
|
47
|
-
// =============================================================================
|
|
48
|
-
/**
|
|
49
|
-
* Remove CLAUDECODE environment variable from tmux session environment
|
|
50
|
-
* Prevents Claude Code from detecting nested session and refusing to start
|
|
51
|
-
* (SF-002: SRP - environment sanitization separated from session creation)
|
|
52
|
-
*
|
|
53
|
-
* MF-S3-002: tmux set-environment -g -u operates on the global tmux environment.
|
|
54
|
-
*
|
|
55
|
-
* SEC-SF-001: sessionName is validated by the caller chain:
|
|
56
|
-
* ClaudeTool.startSession() -> BaseCLITool.getSessionName() -> validateSessionName()
|
|
57
|
-
*
|
|
58
|
-
* @param sessionName - tmux session name
|
|
59
|
-
*/
|
|
60
|
-
async function sanitizeSessionEnvironment(sessionName) {
|
|
61
|
-
// 3-1: Remove from tmux global environment
|
|
62
|
-
await execAsync('tmux set-environment -g -u CLAUDECODE 2>/dev/null || true');
|
|
63
|
-
// 3-2: Unset inside the session shell (safety net)
|
|
64
|
-
// 100ms wait: empirically determined time for sendKeys command to reach the shell
|
|
65
|
-
await (0, tmux_1.sendKeys)(sessionName, 'unset CLAUDECODE', true);
|
|
66
|
-
await new Promise(resolve => setTimeout(resolve, cli_tool_timing_config_1.CLAUDE_ENV_SANITIZE_WAIT_MS));
|
|
67
|
-
}
|
|
68
|
-
// =============================================================================
|
|
69
42
|
// Prompt Wait
|
|
70
43
|
// =============================================================================
|
|
71
44
|
/**
|
|
@@ -97,9 +70,13 @@ async function waitForPrompt(sessionName, timeout) {
|
|
|
97
70
|
* @param message - Message content to send
|
|
98
71
|
* @param postPromptDelay - Stability delay after prompt detection (ms)
|
|
99
72
|
* @param promptWaitTimeout - Timeout for waiting for prompt state (ms)
|
|
73
|
+
* @param target - The instance the session runs (Issue #4048). The first
|
|
74
|
+
* prompt's hook check and the remembered body are then taken only from the
|
|
75
|
+
* entry both this and `sessionName` name; omitted, the name alone decides.
|
|
76
|
+
* Never registers or resets anything.
|
|
100
77
|
* @throws {Error} If session doesn't exist
|
|
101
78
|
*/
|
|
102
|
-
async function sendMessageToSession(sessionName, message, postPromptDelay, promptWaitTimeout) {
|
|
79
|
+
async function sendMessageToSession(sessionName, message, postPromptDelay, promptWaitTimeout, target) {
|
|
103
80
|
// Check if session exists
|
|
104
81
|
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
105
82
|
if (!exists) {
|
|
@@ -121,6 +98,7 @@ async function sendMessageToSession(sessionName, message, postPromptDelay, promp
|
|
|
121
98
|
sessionName,
|
|
122
99
|
message,
|
|
123
100
|
cliToolId: 'claude',
|
|
101
|
+
...(target !== undefined ? { target } : {}),
|
|
124
102
|
});
|
|
125
103
|
// Issue #405: Invalidate cache after sending message
|
|
126
104
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|