commandmate 0.49.2 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +476 -423
- package/.next/app-path-routes-manifest.json +28 -21
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +40 -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 +1 -103
- 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.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route_client-reference-manifest.js +1 -0
- 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.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roles/[id]/route.js +1 -0
- package/.next/server/app/api/roles/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roles/route.js +1 -0
- package/.next/server/app/api/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route_client-reference-manifest.js +1 -0
- 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.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 +3 -3
- 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]/instances/roles/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route_client-reference-manifest.js +1 -0
- 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 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_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 -104
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.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.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.js +2 -2
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page_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 +28 -21
- package/.next/server/chunks/1184.js +5 -0
- package/.next/server/chunks/1501.js +5 -5
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -2
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2819.js +1 -0
- package/.next/server/chunks/2897.js +1 -1
- package/.next/server/chunks/3042.js +2 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3294.js +3 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3505.js +2 -6
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3801.js +7 -7
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/454.js +1 -0
- package/.next/server/chunks/4645.js +1 -0
- package/.next/server/chunks/4911.js +1 -1
- package/.next/server/chunks/5209.js +2 -2
- package/.next/server/chunks/5350.js +216 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6009.js +12 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +2 -2
- package/.next/server/chunks/6569.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +4 -4
- package/.next/server/chunks/696.js +3 -0
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7083.js +1 -0
- package/.next/server/chunks/741.js +1 -0
- package/.next/server/chunks/7662.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8143.js +33 -0
- package/.next/server/chunks/8581.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +181 -93
- package/.next/server/chunks/8918.js +3 -105
- package/.next/server/chunks/8955.js +1 -0
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/923.js +1 -0
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9627.js +9 -9
- package/.next/server/chunks/973.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2314-2c9d587a27e8f731.js +1 -0
- package/.next/static/chunks/2407-ee881c99e218975b.js +1 -0
- package/.next/static/chunks/3931-24d7e245a93feb25.js +1 -0
- package/.next/static/chunks/4548-9afa02fd18afa6c7.js +1 -0
- package/.next/static/chunks/{5794-7975b8e51e731b19.js → 5794-38b3b504b3d97e04.js} +1 -1
- package/.next/static/chunks/{6966-d8dc6032410ffaba.js → 6966-dbfa4a43397f8c6d.js} +1 -1
- package/.next/static/chunks/7090-28e83f5a0efdb3b4.js +1 -0
- package/.next/static/chunks/7229.016d007c467a3600.js +1 -0
- package/.next/static/chunks/{8407-35bbfc84793d7004.js → 8407-dd6a8062fc449899.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/agent-role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/settle/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/layout-7bf800fcc5e025b1.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/more/{page-ff5af5ca48774c89.js → page-e8f5780f6e4fb657.js} +1 -1
- package/.next/static/chunks/app/{page-b4863bfe0452e09d.js → page-869f353a4ac4e15b.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/repositories/page-bedb505687010f18.js +1 -0
- package/.next/static/chunks/app/review/page-87c4a9b0de50fa80.js +1 -0
- package/.next/static/chunks/app/sessions/{page-c6eb7c02db2f4c80.js → page-82ca46793789fce4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-570eb79fbbd1a934.js +1 -0
- package/.next/static/chunks/{webpack-838df0273b03af19.js → webpack-16b1a3143fa42ca0.js} +1 -1
- package/.next/static/css/d4f2c9522cf1b449.css +1 -0
- package/.next/static/z4d8-5MaLkoD-4EhueZwk/_buildManifest.js +1 -0
- package/.next/trace +14 -13
- package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
- package/.next/types/app/api/repositories/[id]/role-defaults/route.ts +347 -0
- package/.next/types/app/api/roles/[id]/route.ts +347 -0
- package/.next/types/app/api/roles/route.ts +347 -0
- package/.next/types/app/api/settings/agent-role-defaults/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/settle/route.ts +347 -0
- package/.next/types/routes.d.ts +8 -1
- package/.next/types/validator.ts +63 -0
- package/dist/cli/commands/instances.d.ts +1 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +290 -33
- package/dist/cli/commands/message-dispatch.d.ts +25 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +26 -6
- 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 +7 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +179 -6
- 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 +9 -2
- package/dist/cli/commands/roles.d.ts +11 -0
- package/dist/cli/commands/roles.d.ts.map +1 -0
- package/dist/cli/commands/roles.js +392 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +526 -38
- 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/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 +91 -3
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/types/api-responses.d.ts +106 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +38 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +15 -1
- package/dist/cli/utils/agent-instances.d.ts +29 -1
- package/dist/cli/utils/agent-instances.d.ts.map +1 -1
- package/dist/cli/utils/agent-instances.js +67 -7
- package/dist/cli/utils/agent-roles.d.ts +75 -0
- package/dist/cli/utils/agent-roles.d.ts.map +1 -0
- package/dist/cli/utils/agent-roles.js +238 -0
- 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 +140 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +222 -0
- package/dist/cli/utils/api-client.d.ts +9 -131
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +43 -258
- package/dist/cli/utils/role-failure.d.ts +31 -0
- package/dist/cli/utils/role-failure.d.ts.map +1 -0
- package/dist/cli/utils/role-failure.js +90 -0
- package/dist/cli/utils/role-input.d.ts +16 -0
- package/dist/cli/utils/role-input.d.ts.map +1 -0
- package/dist/cli/utils/role-input.js +78 -0
- package/dist/cli/utils/security-logger.d.ts +17 -0
- package/dist/cli/utils/security-logger.d.ts.map +1 -1
- package/dist/cli/utils/security-logger.js +44 -5
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +16 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +16 -0
- package/dist/lib/session/send-attempt-types.d.ts +4 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.d.ts +22 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.js +32 -2
- package/dist/server/locales/en/worktree.json +30 -4
- package/dist/server/locales/ja/worktree.json +30 -4
- package/dist/server/src/config/safe-directory.js +30 -0
- package/dist/server/src/lib/agent-roles/adapters.js +174 -0
- package/dist/server/src/lib/agent-roles/artifacts.js +638 -0
- package/dist/server/src/lib/agent-roles/composition.js +222 -0
- package/dist/server/src/lib/agent-roles/fingerprint.js +21 -0
- package/dist/server/src/lib/agent-roles/jsonc.js +85 -0
- package/dist/server/src/lib/agent-roles/launch-errors.js +58 -0
- package/dist/server/src/lib/agent-roles/pane-env.js +63 -0
- package/dist/server/src/lib/agent-roles/resolve.js +375 -0
- package/dist/server/src/lib/agent-roles/toml-basic.js +140 -0
- package/dist/server/src/lib/agent-roles/unicode.js +16 -0
- package/dist/server/src/lib/agent-roles/validation.js +61 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -6
- package/dist/server/src/lib/cli-tools/base.js +63 -5
- package/dist/server/src/lib/cli-tools/claude-auto-default-nudge.js +141 -0
- package/dist/server/src/lib/cli-tools/claude.js +15 -3
- package/dist/server/src/lib/cli-tools/codex.js +134 -21
- package/dist/server/src/lib/cli-tools/command-code.js +28 -13
- package/dist/server/src/lib/cli-tools/copilot.js +189 -31
- package/dist/server/src/lib/cli-tools/gemini.js +37 -3
- package/dist/server/src/lib/cli-tools/launch-answer-skips.js +76 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +10 -0
- package/dist/server/src/lib/cli-tools/opencode.js +214 -12
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +65 -12
- 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 +94 -295
- package/dist/server/src/lib/cli-tools/vibe-local.js +111 -0
- package/dist/server/src/lib/db/agent-instances-db.js +53 -0
- package/dist/server/src/lib/db/agent-roles-db.js +409 -0
- package/dist/server/src/lib/db/agent-session-cost-sampler.js +3 -2
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +84 -2
- package/dist/server/src/lib/db/migrations/index.js +6 -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/migrations/v64-agent-roles.js +123 -0
- package/dist/server/src/lib/db/migrations/v65-agent-instance-creation-keys.js +42 -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 +68 -92
- package/dist/server/src/lib/detection/cli-patterns.js +13 -3
- package/dist/server/src/lib/detection/model-info-extractor.js +1 -1
- package/dist/server/src/lib/detection/tools/claude/patterns.js +76 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +5 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +5 -1
- package/dist/server/src/lib/detection/tools/codex/patterns.js +52 -2
- package/dist/server/src/lib/detection/tools/codex/prompt.js +23 -3
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +30 -15
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +268 -7
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +71 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +51 -15
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +195 -11
- package/dist/server/src/lib/detection/tools/run-detection.js +5 -2
- package/dist/server/src/lib/detection/tools/verified-against.js +16 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +92 -0
- package/dist/server/src/lib/git/git-common-dir.js +192 -0
- package/dist/server/src/lib/hooks/hook-settings-generator.js +8 -2
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +31 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +31 -8
- package/dist/server/src/lib/hooks/sources/opencode/client.js +20 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +208 -35
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +117 -2
- package/dist/server/src/lib/job-executor.js +18 -1
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +58 -4
- package/dist/server/src/lib/polling/response-checker.js +32 -7
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery-block.js +150 -0
- package/dist/server/src/lib/relay/relay-delivery.js +416 -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/response-cleaner.js +13 -3
- package/dist/server/src/lib/response-extractor.js +38 -3
- package/dist/server/src/lib/session/agent-session-lifecycle.js +9 -1
- package/dist/server/src/lib/session/claude-executor.js +13 -1
- package/dist/server/src/lib/session/claude-session.js +113 -14
- package/dist/server/src/lib/session/current-output-builder.js +7 -5
- package/dist/server/src/lib/session/instance-input-lock.js +140 -6
- package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
- package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/role-launch.js +722 -0
- package/dist/server/src/lib/session/send-attempt-state.js +137 -3
- package/dist/server/src/lib/session/send-user-message.js +84 -7
- package/dist/server/src/lib/session/session-generation-archive.js +7 -8
- package/dist/server/src/lib/session/session-launch-flight.js +33 -1
- package/dist/server/src/lib/session/structured-prompt.js +12 -7
- package/dist/server/src/lib/session/worktree-session-reconcile.js +15 -0
- package/dist/server/src/lib/session-key-sender.js +6 -1
- package/dist/server/src/lib/test-run-detection.js +53 -0
- package/dist/server/src/lib/tmux/read-mode.js +4 -0
- package/dist/server/src/lib/tmux/session-hook-scripts.js +36 -4
- package/dist/server/src/lib/tui-accumulator.js +14 -5
- package/dist/server/src/lib/verification/env-clean-gate.js +117 -12
- package/dist/server/src/lib/verification/gate-runner.js +9 -8
- package/dist/server/src/lib/verification/verify-config.js +32 -2
- package/dist/server/src/types/agent-roles.js +56 -0
- package/dist/types/agent-roles.d.ts +351 -0
- package/dist/types/agent-roles.d.ts.map +1 -0
- package/dist/types/agent-roles.js +56 -0
- package/docs/en/user-guide/webapp-guide.md +16 -0
- package/package.json +2 -1
- package/release-notes/0.49.3.json +52 -0
- package/release-notes/0.50.0.json +113 -0
- package/.next/server/chunks/1062.js +0 -1
- package/.next/server/chunks/110.js +0 -1
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3756.js +0 -1
- package/.next/server/chunks/4936.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6119.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/7491.js +0 -3
- package/.next/server/chunks/9198.js +0 -144
- package/.next/server/chunks/9360.js +0 -2
- package/.next/server/chunks/9584.js +0 -1
- package/.next/static/chunks/2407-07a237575e1ceb9e.js +0 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +0 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +0 -1
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +0 -1
- package/.next/static/chunks/8165-263172c17ae8e8c3.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-4f64316957b0a8e5.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/repositories/page-71f5a5ac29b0370d.js +0 -1
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
- package/.next/static/css/c1e307d05daf93b6.css +0 -1
- package/.next/static/yGatWDsS532awSs51kXyd/_buildManifest.js +0 -1
- /package/.next/static/{yGatWDsS532awSs51kXyd → z4d8-5MaLkoD-4EhueZwk}/_ssgManifest.js +0 -0
|
@@ -14,6 +14,9 @@ const base_1 = require("./base");
|
|
|
14
14
|
const types_1 = require("./types");
|
|
15
15
|
const tmux_1 = require("../tmux/tmux");
|
|
16
16
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
17
|
+
const readiness_1 = require("../detection/tools/vibe-local/readiness");
|
|
18
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
19
|
+
const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
|
|
17
20
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
18
21
|
const db_instance_1 = require("../db/db-instance");
|
|
19
22
|
const db_1 = require("../db");
|
|
@@ -28,6 +31,52 @@ const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
|
28
31
|
* vibe-local shows a permission check prompt, banner, and model loading.
|
|
29
32
|
*/
|
|
30
33
|
const VIBE_LOCAL_INIT_WAIT_MS = 5000;
|
|
34
|
+
/**
|
|
35
|
+
* How long a send waits for vibe-local's input prompt (Issue #4040).
|
|
36
|
+
*
|
|
37
|
+
* Measured on vibe-local 1.3.3 (`vibe-local -y`, isolated `HOME`, private tmux
|
|
38
|
+
* socket, model `qwen3-coder:30b` not loaded in Ollama before each run): the
|
|
39
|
+
* empty `ctx:N% ❯` row was up 1.15 s, 0.62 s and 0.60 s after the launch
|
|
40
|
+
* keystroke — vibe-local loads the model on the first message, not at launch.
|
|
41
|
+
* gemini's and codex's 15 s therefore covers it with room to spare.
|
|
42
|
+
*/
|
|
43
|
+
const VIBE_LOCAL_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
44
|
+
/** Interval between the send's readiness polls (Issue #4040). */
|
|
45
|
+
const VIBE_LOCAL_PROMPT_POLL_INTERVAL_MS = 500;
|
|
46
|
+
/** Scrollback rows plus the visible pane in a readiness capture (`-S -200 -E -`). */
|
|
47
|
+
const VIBE_LOCAL_PROMPT_CAPTURE_LINES = 200;
|
|
48
|
+
/**
|
|
49
|
+
* Whether {@link VibeLocalTool}'s prompt wait counts this frame towards giving
|
|
50
|
+
* up on a dialog (Issue #4084): the detector reports an active prompt — what
|
|
51
|
+
* the re-check under the input lock refuses — and no turn is being generated.
|
|
52
|
+
* Unlike copilot's wait, there is no folder-trust dialog here to leave out:
|
|
53
|
+
* this wait answers none.
|
|
54
|
+
*/
|
|
55
|
+
function isVibeLocalWaitDialog(output) {
|
|
56
|
+
const status = (0, status_detector_1.detectSessionStatus)(output, 'vibe-local');
|
|
57
|
+
return status.hasActivePrompt && !(0, status_detector_1.isGeneratingStatus)(status);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* What held the pane when the wait for the prompt ran out (Issue #4146), for the
|
|
61
|
+
* refusal `send` reports. Names the screen only: nothing captured goes into it.
|
|
62
|
+
* A dialog here is one read too briefly to be refused as `prompt-waiting`.
|
|
63
|
+
*
|
|
64
|
+
* @param output - The last capture; null when the last read failed
|
|
65
|
+
*/
|
|
66
|
+
function describeVibeLocalPaneHold(output) {
|
|
67
|
+
if (output === null)
|
|
68
|
+
return 'the pane could not be read';
|
|
69
|
+
if (isVibeLocalWaitDialog(output))
|
|
70
|
+
return 'a prompt dialog is open: answer it in the terminal';
|
|
71
|
+
switch ((0, readiness_1.readVibeLocalNotReadyScreen)(output)) {
|
|
72
|
+
case 'no-input-row':
|
|
73
|
+
return 'no input row on the pane: vibe-local may still be starting';
|
|
74
|
+
case 'input-row-holds-text':
|
|
75
|
+
return 'the input row still holds text';
|
|
76
|
+
case 'output-below-input-row':
|
|
77
|
+
return 'output is drawn below the newest input row: vibe-local may still be starting or working';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
31
80
|
/**
|
|
32
81
|
* Vibe Local CLI tool implementation
|
|
33
82
|
* Manages vibe-local interactive sessions using tmux
|
|
@@ -118,6 +167,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
118
167
|
// same pane when the tool is gone; costs one `capture-pane` when it is not.
|
|
119
168
|
await this.requireSession('Vibe Local', worktreeId, instanceId, { relaunch: true });
|
|
120
169
|
try {
|
|
170
|
+
// Issue #4040: nothing is typed (the two Enters included) until the
|
|
171
|
+
// newest prompt row is up and empty — a relaunch or a fresh launch is
|
|
172
|
+
// still drawing its banner when the first send arrives.
|
|
173
|
+
await this.waitForPrompt(sessionName);
|
|
121
174
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
122
175
|
// shared helper. vibe-local's IME mode needs TWO Enter presses (first Enter
|
|
123
176
|
// inserts a newline, the second submits), preserved via submitEnterCount: 2
|
|
@@ -131,6 +184,8 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
131
184
|
// the one call site that knew about it.
|
|
132
185
|
composer: this.describeComposer(),
|
|
133
186
|
interEnterWaitMs: cli_tool_timing_config_1.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS,
|
|
187
|
+
// Issue #4040: the same test, of the newest frame read under the input lock.
|
|
188
|
+
readiness: { label: 'Vibe Local', isReady: readiness_1.isVibeLocalComposerReady },
|
|
134
189
|
});
|
|
135
190
|
// Issue #405: Invalidate cache after sending message
|
|
136
191
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -142,6 +197,62 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
142
197
|
throw new Error(`Failed to send message to Vibe Local: ${errorMessage}`, { cause: error });
|
|
143
198
|
}
|
|
144
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Wait for vibe-local's input prompt before a send (Issue #4040).
|
|
202
|
+
*
|
|
203
|
+
* {@link isVibeLocalComposerReady} is the test — the newest `ctx:N% ❯` row
|
|
204
|
+
* empty with only the footer below it (or a turn being generated under it),
|
|
205
|
+
* never "the row is somewhere on the pane": the scrollback keeps every old
|
|
206
|
+
* one.
|
|
207
|
+
*
|
|
208
|
+
* Issue #4084: a dialog (`hasActivePrompt`, not while a turn is being
|
|
209
|
+
* generated) ends the wait only once it is confirmed — seen on 2 reads in a
|
|
210
|
+
* row spanning `PROMPT_WAIT_DIALOG_CONFIRM_MS` (2 s), the count copilot's
|
|
211
|
+
* wait uses (#4067) — and is then refused as `prompt-waiting` at once, on the
|
|
212
|
+
* wait's own reads. A dialog read once (a frame mid-paint) and then gone does
|
|
213
|
+
* not refuse the send; it used to end the wait on that one read. A dialog
|
|
214
|
+
* that opens after the wait is still refused by the shared sender's re-read
|
|
215
|
+
* under the input lock, on one read. No capture is waited for past the
|
|
216
|
+
* window: one still running at the deadline is not used.
|
|
217
|
+
*
|
|
218
|
+
* @throws Error (`Vibe Local prompt not ready`) when the prompt did not come
|
|
219
|
+
* up within {@link VIBE_LOCAL_PROMPT_WAIT_TIMEOUT_MS}; nothing was typed
|
|
220
|
+
* @throws Error coded `prompt-waiting` ({@link confirmedDialogRefusal}) for a
|
|
221
|
+
* confirmed dialog; nothing was typed
|
|
222
|
+
*/
|
|
223
|
+
async waitForPrompt(sessionName) {
|
|
224
|
+
const deadline = Date.now() + VIBE_LOCAL_PROMPT_WAIT_TIMEOUT_MS;
|
|
225
|
+
const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
226
|
+
let lastOutput = null;
|
|
227
|
+
while (Date.now() < deadline) {
|
|
228
|
+
let confirmed = false;
|
|
229
|
+
try {
|
|
230
|
+
const output = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, VIBE_LOCAL_PROMPT_CAPTURE_LINES), deadline);
|
|
231
|
+
if (output === null)
|
|
232
|
+
break;
|
|
233
|
+
lastOutput = output;
|
|
234
|
+
if ((0, readiness_1.isVibeLocalComposerReady)(output))
|
|
235
|
+
return;
|
|
236
|
+
confirmed = dialog.observe(isVibeLocalWaitDialog(output));
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
// Capture may fail - continue polling. Not a dialog read: the run restarts.
|
|
240
|
+
lastOutput = null;
|
|
241
|
+
dialog.reset();
|
|
242
|
+
logger.debug('vibe-local-prompt-capture-failed', { sessionName, error: (0, errors_1.getErrorMessage)(error) });
|
|
243
|
+
}
|
|
244
|
+
if (confirmed) {
|
|
245
|
+
logger.warn('vibe-local-prompt-wait-dialog', { sessionName, reads: dialog.reads });
|
|
246
|
+
throw (0, prompt_wait_dialog_1.confirmedDialogRefusal)(sessionName, 'Vibe Local');
|
|
247
|
+
}
|
|
248
|
+
const remaining = deadline - Date.now();
|
|
249
|
+
if (remaining <= 0)
|
|
250
|
+
break;
|
|
251
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(VIBE_LOCAL_PROMPT_POLL_INTERVAL_MS, remaining)));
|
|
252
|
+
}
|
|
253
|
+
logger.info('vibe-local-prompt-not-detected');
|
|
254
|
+
throw new Error(`Vibe Local prompt not ready: timed out waiting for the input prompt before sending (${describeVibeLocalPaneHold(lastOutput)})`);
|
|
255
|
+
}
|
|
145
256
|
/**
|
|
146
257
|
* Kill vibe-local session
|
|
147
258
|
*
|
|
@@ -31,6 +31,8 @@ exports.getSessionNotesByWorktree = getSessionNotesByWorktree;
|
|
|
31
31
|
exports.getAllSessionNotes = getAllSessionNotes;
|
|
32
32
|
exports.setSessionNote = setSessionNote;
|
|
33
33
|
exports.pruneSessionNotes = pruneSessionNotes;
|
|
34
|
+
exports.revokeInstanceCreationKeys = revokeInstanceCreationKeys;
|
|
35
|
+
exports.pruneAgentInstanceRoles = pruneAgentInstanceRoles;
|
|
34
36
|
const opencode_instance_settings_1 = require("../../types/opencode-instance-settings");
|
|
35
37
|
const types_1 = require("../../lib/cli-tools/types");
|
|
36
38
|
/**
|
|
@@ -212,6 +214,14 @@ function setAgentInstances(db, worktreeId, instances) {
|
|
|
212
214
|
}
|
|
213
215
|
const now = Date.now();
|
|
214
216
|
const replace = db.transaction(() => {
|
|
217
|
+
// Issue #4132: an id kept with another tool is another row, so this goes by the pair.
|
|
218
|
+
const kept = new Set(instances.map((instance) => `${instance.id}\u0000${instance.cliTool}`));
|
|
219
|
+
const leaving = db.prepare(`
|
|
220
|
+
SELECT instance_id, cli_tool_id FROM agent_instances WHERE worktree_id = ?
|
|
221
|
+
`).all(worktreeId)
|
|
222
|
+
.filter((row) => !kept.has(`${row.instance_id}\u0000${row.cli_tool_id}`))
|
|
223
|
+
.map((row) => row.instance_id);
|
|
224
|
+
revokeInstanceCreationKeys(db, worktreeId, leaving);
|
|
215
225
|
db.prepare(`DELETE FROM agent_instances WHERE worktree_id = ?`).run(worktreeId);
|
|
216
226
|
// Issue #2048: the settings table is keyed on an instance id and this write
|
|
217
227
|
// is a full replace, so an instance dropped from the roster would otherwise
|
|
@@ -224,6 +234,9 @@ function setAgentInstances(db, worktreeId, instances) {
|
|
|
224
234
|
// Issue's third acceptance condition; a mutation that drops this call makes
|
|
225
235
|
// the note of a *removed* instance haunt the next instance to claim its id.
|
|
226
236
|
pruneSessionNotes(db, worktreeId, instances.map((instance) => instance.id));
|
|
237
|
+
// Issue #4114: and the role setting. A rename or a reorder keeps it; leaving
|
|
238
|
+
// the roster ends it, so an id that comes back starts from the defaults.
|
|
239
|
+
pruneAgentInstanceRoles(db, worktreeId, instances.map((instance) => instance.id));
|
|
227
240
|
const insertStmt = db.prepare(`
|
|
228
241
|
INSERT INTO agent_instances
|
|
229
242
|
(worktree_id, instance_id, cli_tool_id, alias, sort_order, created_at)
|
|
@@ -282,6 +295,13 @@ function removeAgentInstance(db, worktreeId, instanceId) {
|
|
|
282
295
|
db.prepare(`
|
|
283
296
|
DELETE FROM session_notes WHERE worktree_id = ? AND instance_id = ?
|
|
284
297
|
`).run(worktreeId, instanceId);
|
|
298
|
+
// Issue #4114: and its role setting, whose re-use would hand the next instance
|
|
299
|
+
// to claim this id a decision made about another.
|
|
300
|
+
db.prepare(`
|
|
301
|
+
DELETE FROM agent_instance_roles WHERE worktree_id = ? AND instance_id = ?
|
|
302
|
+
`).run(worktreeId, instanceId);
|
|
303
|
+
// Issue #4132: and the key that made it.
|
|
304
|
+
revokeInstanceCreationKeys(db, worktreeId, [instanceId]);
|
|
285
305
|
return result.changes > 0;
|
|
286
306
|
}
|
|
287
307
|
/**
|
|
@@ -592,3 +612,36 @@ function pruneSessionNotes(db, worktreeId, keepInstanceIds) {
|
|
|
592
612
|
WHERE worktree_id = ? AND instance_id NOT IN (${placeholders})
|
|
593
613
|
`).run(worktreeId, ...keepInstanceIds).changes;
|
|
594
614
|
}
|
|
615
|
+
/**
|
|
616
|
+
* Remove the role settings of instances that left the roster (Issue #4114). Same
|
|
617
|
+
* rule as {@link pruneSessionNotes}. Launch records are evidence and stay.
|
|
618
|
+
*
|
|
619
|
+
* @param keepInstanceIds - The ids that survive; every other row is deleted
|
|
620
|
+
* @returns How many rows were removed
|
|
621
|
+
*/
|
|
622
|
+
/**
|
|
623
|
+
* Issue #4132: the rows these keys made have left the roster, so an id made again is
|
|
624
|
+
* another row, which those keys must not claim. Each becomes a key given up on, not
|
|
625
|
+
* nothing: a request still on its way with one must not make the row again.
|
|
626
|
+
*/
|
|
627
|
+
function revokeInstanceCreationKeys(db, worktreeId, instanceIds) {
|
|
628
|
+
if (instanceIds.length === 0)
|
|
629
|
+
return;
|
|
630
|
+
const placeholders = instanceIds.map(() => '?').join(', ');
|
|
631
|
+
db.prepare(`
|
|
632
|
+
UPDATE agent_instance_creation_keys SET instance_id = NULL, request_fingerprint = NULL
|
|
633
|
+
WHERE worktree_id = ? AND instance_id IN (${placeholders})
|
|
634
|
+
`).run(worktreeId, ...instanceIds);
|
|
635
|
+
}
|
|
636
|
+
function pruneAgentInstanceRoles(db, worktreeId, keepInstanceIds) {
|
|
637
|
+
if (keepInstanceIds.length === 0) {
|
|
638
|
+
return db.prepare(`
|
|
639
|
+
DELETE FROM agent_instance_roles WHERE worktree_id = ?
|
|
640
|
+
`).run(worktreeId).changes;
|
|
641
|
+
}
|
|
642
|
+
const placeholders = keepInstanceIds.map(() => '?').join(', ');
|
|
643
|
+
return db.prepare(`
|
|
644
|
+
DELETE FROM agent_instance_roles
|
|
645
|
+
WHERE worktree_id = ? AND instance_id NOT IN (${placeholders})
|
|
646
|
+
`).run(worktreeId, ...keepInstanceIds).changes;
|
|
647
|
+
}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INSTANCE_CREATION_KEY_TTL_MS = exports.AgentRoleInUseError = exports.AgentRoleNameChangedError = exports.AgentRoleVersionConflictError = exports.AgentRoleNameConflictError = exports.AgentRoleNotFoundError = exports.AgentRoleValidationError = void 0;
|
|
4
|
+
exports.listAgentRoles = listAgentRoles;
|
|
5
|
+
exports.getAgentRole = getAgentRole;
|
|
6
|
+
exports.createAgentRole = createAgentRole;
|
|
7
|
+
exports.getAgentRoleReferences = getAgentRoleReferences;
|
|
8
|
+
exports.updateAgentRole = updateAgentRole;
|
|
9
|
+
exports.deleteAgentRole = deleteAgentRole;
|
|
10
|
+
exports.getSystemRoleDefaults = getSystemRoleDefaults;
|
|
11
|
+
exports.setSystemRoleDefault = setSystemRoleDefault;
|
|
12
|
+
exports.getRepositoryRoleStates = getRepositoryRoleStates;
|
|
13
|
+
exports.setRepositoryRoleState = setRepositoryRoleState;
|
|
14
|
+
exports.getInstanceRoleState = getInstanceRoleState;
|
|
15
|
+
exports.setInstanceRoleState = setInstanceRoleState;
|
|
16
|
+
exports.hasAnyRoleSetting = hasAnyRoleSetting;
|
|
17
|
+
exports.getInstanceCreationKey = getInstanceCreationKey;
|
|
18
|
+
exports.recordInstanceCreationKey = recordInstanceCreationKey;
|
|
19
|
+
exports.settleInstanceCreationKey = settleInstanceCreationKey;
|
|
20
|
+
exports.recordRoleLaunch = recordRoleLaunch;
|
|
21
|
+
exports.getLatestRoleLaunchRecords = getLatestRoleLaunchRecords;
|
|
22
|
+
/**
|
|
23
|
+
* Role tables (Issue #4114, migration v64).
|
|
24
|
+
*
|
|
25
|
+
* Every write that could leave a reference half done runs in a transaction. The
|
|
26
|
+
* body is never logged and never placed in an error message.
|
|
27
|
+
*
|
|
28
|
+
* @module lib/db/agent-roles-db
|
|
29
|
+
*/
|
|
30
|
+
const crypto_1 = require("crypto");
|
|
31
|
+
const fingerprint_1 = require("../../lib/agent-roles/fingerprint");
|
|
32
|
+
const validation_1 = require("../../lib/agent-roles/validation");
|
|
33
|
+
class AgentRoleValidationError extends Error {
|
|
34
|
+
constructor(message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'AgentRoleValidationError';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.AgentRoleValidationError = AgentRoleValidationError;
|
|
40
|
+
class AgentRoleNotFoundError extends Error {
|
|
41
|
+
roleId;
|
|
42
|
+
constructor(roleId) {
|
|
43
|
+
super(`Role not found: ${roleId}`);
|
|
44
|
+
this.roleId = roleId;
|
|
45
|
+
this.name = 'AgentRoleNotFoundError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.AgentRoleNotFoundError = AgentRoleNotFoundError;
|
|
49
|
+
class AgentRoleNameConflictError extends Error {
|
|
50
|
+
constructor(name) {
|
|
51
|
+
super(`A role named "${name}" already exists`);
|
|
52
|
+
this.name = 'AgentRoleNameConflictError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.AgentRoleNameConflictError = AgentRoleNameConflictError;
|
|
56
|
+
class AgentRoleVersionConflictError extends Error {
|
|
57
|
+
currentBodyVersion;
|
|
58
|
+
constructor(currentBodyVersion) {
|
|
59
|
+
super(`The role is at body version ${currentBodyVersion}`);
|
|
60
|
+
this.currentBodyVersion = currentBodyVersion;
|
|
61
|
+
this.name = 'AgentRoleVersionConflictError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AgentRoleVersionConflictError = AgentRoleVersionConflictError;
|
|
65
|
+
class AgentRoleNameChangedError extends Error {
|
|
66
|
+
currentName;
|
|
67
|
+
constructor(currentName) {
|
|
68
|
+
super('The role was renamed since it was read');
|
|
69
|
+
this.currentName = currentName;
|
|
70
|
+
this.name = 'AgentRoleNameChangedError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.AgentRoleNameChangedError = AgentRoleNameChangedError;
|
|
74
|
+
class AgentRoleInUseError extends Error {
|
|
75
|
+
references;
|
|
76
|
+
constructor(references) {
|
|
77
|
+
super('The role is in use');
|
|
78
|
+
this.references = references;
|
|
79
|
+
this.name = 'AgentRoleInUseError';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.AgentRoleInUseError = AgentRoleInUseError;
|
|
83
|
+
function mapRole(row) {
|
|
84
|
+
return {
|
|
85
|
+
id: row.id,
|
|
86
|
+
name: row.name,
|
|
87
|
+
body: row.body,
|
|
88
|
+
bodyVersion: row.body_version,
|
|
89
|
+
bodyFingerprint: (0, fingerprint_1.computeBodyFingerprint)(row.body),
|
|
90
|
+
bodyBytes: Buffer.byteLength(row.body, 'utf8'),
|
|
91
|
+
createdAt: row.created_at,
|
|
92
|
+
updatedAt: row.updated_at,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function isUniqueNameViolation(error) {
|
|
96
|
+
return error instanceof Error && error.message.includes('UNIQUE constraint failed: agent_roles.name');
|
|
97
|
+
}
|
|
98
|
+
function validatedName(name) {
|
|
99
|
+
const normalized = (0, validation_1.normalizeRoleName)(name);
|
|
100
|
+
if (!normalized.ok)
|
|
101
|
+
throw new AgentRoleValidationError(normalized.problem);
|
|
102
|
+
return normalized.name;
|
|
103
|
+
}
|
|
104
|
+
function assertBody(body) {
|
|
105
|
+
const problem = (0, validation_1.roleBodyProblem)(body);
|
|
106
|
+
if (problem)
|
|
107
|
+
throw new AgentRoleValidationError(problem);
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Roles
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
/** Every role, by name. */
|
|
113
|
+
function listAgentRoles(db) {
|
|
114
|
+
const rows = db.prepare('SELECT * FROM agent_roles ORDER BY name ASC').all();
|
|
115
|
+
return rows.map(mapRole);
|
|
116
|
+
}
|
|
117
|
+
function getAgentRole(db, id) {
|
|
118
|
+
const row = db.prepare('SELECT * FROM agent_roles WHERE id = ?').get(id);
|
|
119
|
+
return row ? mapRole(row) : null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @throws {AgentRoleValidationError} The name or body is not acceptable
|
|
123
|
+
* @throws {AgentRoleNameConflictError} The name is taken
|
|
124
|
+
*/
|
|
125
|
+
function createAgentRole(db, input) {
|
|
126
|
+
const name = validatedName(input.name);
|
|
127
|
+
assertBody(input.body);
|
|
128
|
+
// Short and hex: it becomes part of a generated file name.
|
|
129
|
+
const id = (0, crypto_1.randomBytes)(8).toString('hex');
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
try {
|
|
132
|
+
db.prepare(`INSERT INTO agent_roles (id, name, body, body_version, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?)`).run(id, name, input.body, now, now);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (isUniqueNameViolation(error))
|
|
136
|
+
throw new AgentRoleNameConflictError(name);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
return getAgentRole(db, id);
|
|
140
|
+
}
|
|
141
|
+
/** What points directly at this role. */
|
|
142
|
+
function getAgentRoleReferences(db, roleId) {
|
|
143
|
+
const instances = db
|
|
144
|
+
.prepare(`SELECT worktree_id AS worktreeId, instance_id AS instanceId FROM agent_instance_roles
|
|
145
|
+
WHERE role_id = ? ORDER BY worktree_id, instance_id`)
|
|
146
|
+
.all(roleId);
|
|
147
|
+
const repositories = db
|
|
148
|
+
.prepare(`SELECT d.repository_id AS repositoryId, r.path AS repositoryPath, d.cli_tool_id AS cliToolId
|
|
149
|
+
FROM agent_role_repository_defaults d JOIN repositories r ON r.id = d.repository_id
|
|
150
|
+
WHERE d.role_id = ? ORDER BY r.path, d.cli_tool_id`)
|
|
151
|
+
.all(roleId);
|
|
152
|
+
const system = db
|
|
153
|
+
.prepare(`SELECT cli_tool_id AS cliToolId FROM agent_role_system_defaults WHERE role_id = ? ORDER BY cli_tool_id`)
|
|
154
|
+
.all(roleId);
|
|
155
|
+
return { instances, repositories, system };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Edit a role. The body version moves only when the bytes change, so a rename is
|
|
159
|
+
* not a new version of the text.
|
|
160
|
+
*
|
|
161
|
+
* @param input.expectedBodyVersion - When given, the edit applies only at this version
|
|
162
|
+
* @param input.expectedName - When given, the edit applies only under this name, or
|
|
163
|
+
* when the role already has the name asked for
|
|
164
|
+
* @throws {AgentRoleNotFoundError}
|
|
165
|
+
* @throws {AgentRoleVersionConflictError} Someone else got there first; nothing changed
|
|
166
|
+
* @throws {AgentRoleNameChangedError} Someone else renamed it first; nothing changed
|
|
167
|
+
* @throws {AgentRoleValidationError}
|
|
168
|
+
* @throws {AgentRoleNameConflictError}
|
|
169
|
+
*/
|
|
170
|
+
function updateAgentRole(db, id, input) {
|
|
171
|
+
const name = input.name === undefined ? undefined : validatedName(input.name);
|
|
172
|
+
if (input.body !== undefined)
|
|
173
|
+
assertBody(input.body);
|
|
174
|
+
const newBody = input.body;
|
|
175
|
+
return db.transaction(() => {
|
|
176
|
+
const before = getAgentRole(db, id);
|
|
177
|
+
if (!before)
|
|
178
|
+
throw new AgentRoleNotFoundError(id);
|
|
179
|
+
if (input.expectedBodyVersion !== undefined && input.expectedBodyVersion !== before.bodyVersion) {
|
|
180
|
+
throw new AgentRoleVersionConflictError(before.bodyVersion);
|
|
181
|
+
}
|
|
182
|
+
if (input.expectedName !== undefined && input.expectedName !== before.name && name !== before.name) {
|
|
183
|
+
throw new AgentRoleNameChangedError(before.name);
|
|
184
|
+
}
|
|
185
|
+
const bodyChanged = newBody !== undefined && newBody !== before.body;
|
|
186
|
+
try {
|
|
187
|
+
db.prepare(`UPDATE agent_roles SET name = ?, body = ?, body_version = ?, updated_at = ? WHERE id = ?`).run(name ?? before.name, newBody ?? before.body, bodyChanged ? before.bodyVersion + 1 : before.bodyVersion, Date.now(), id);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (isUniqueNameViolation(error))
|
|
191
|
+
throw new AgentRoleNameConflictError(name ?? before.name);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
before,
|
|
196
|
+
after: getAgentRole(db, id),
|
|
197
|
+
affected: getAgentRoleReferences(db, id),
|
|
198
|
+
};
|
|
199
|
+
})();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Delete a role. With `force`, the settings pointing at it go in the same
|
|
203
|
+
* transaction, so they read as "inherit" afterwards and not as an explicit none.
|
|
204
|
+
* Launch records and generated files stay.
|
|
205
|
+
*
|
|
206
|
+
* @throws {AgentRoleNotFoundError}
|
|
207
|
+
* @throws {AgentRoleInUseError} It has references and `force` was not given
|
|
208
|
+
*/
|
|
209
|
+
function deleteAgentRole(db, id, options = {}) {
|
|
210
|
+
return db.transaction(() => {
|
|
211
|
+
const role = getAgentRole(db, id);
|
|
212
|
+
if (!role)
|
|
213
|
+
throw new AgentRoleNotFoundError(id);
|
|
214
|
+
const affected = getAgentRoleReferences(db, id);
|
|
215
|
+
const inUse = affected.instances.length + affected.repositories.length + affected.system.length > 0;
|
|
216
|
+
if (inUse && !options.force)
|
|
217
|
+
throw new AgentRoleInUseError(affected);
|
|
218
|
+
db.prepare('DELETE FROM agent_instance_roles WHERE role_id = ?').run(id);
|
|
219
|
+
db.prepare('DELETE FROM agent_role_repository_defaults WHERE role_id = ?').run(id);
|
|
220
|
+
db.prepare('DELETE FROM agent_role_system_defaults WHERE role_id = ?').run(id);
|
|
221
|
+
db.prepare('DELETE FROM agent_roles WHERE id = ?').run(id);
|
|
222
|
+
return { role, affected };
|
|
223
|
+
})();
|
|
224
|
+
}
|
|
225
|
+
function assertRoleExists(db, roleId) {
|
|
226
|
+
if (!db.prepare('SELECT 1 FROM agent_roles WHERE id = ?').get(roleId)) {
|
|
227
|
+
throw new AgentRoleNotFoundError(roleId);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Settings
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
function toStoredState(row) {
|
|
234
|
+
if (!row)
|
|
235
|
+
return { state: 'inherit' };
|
|
236
|
+
if (row.role_id === null)
|
|
237
|
+
return { state: 'none' };
|
|
238
|
+
return { state: 'role', roleId: row.role_id, roleName: row.role_name };
|
|
239
|
+
}
|
|
240
|
+
/** @returns The tools with a system default. A missing key means unset. */
|
|
241
|
+
function getSystemRoleDefaults(db) {
|
|
242
|
+
const rows = db
|
|
243
|
+
.prepare(`SELECT d.cli_tool_id, d.role_id, r.name AS role_name
|
|
244
|
+
FROM agent_role_system_defaults d JOIN agent_roles r ON r.id = d.role_id`)
|
|
245
|
+
.all();
|
|
246
|
+
return Object.fromEntries(rows.map((row) => [row.cli_tool_id, { roleId: row.role_id, roleName: row.role_name }]));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* @param roleId - The role, or null for unset (no row)
|
|
250
|
+
* @throws {AgentRoleNotFoundError}
|
|
251
|
+
*/
|
|
252
|
+
function setSystemRoleDefault(db, cliToolId, roleId) {
|
|
253
|
+
if (roleId === null) {
|
|
254
|
+
db.prepare('DELETE FROM agent_role_system_defaults WHERE cli_tool_id = ?').run(cliToolId);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
assertRoleExists(db, roleId);
|
|
258
|
+
db.prepare(`INSERT INTO agent_role_system_defaults (cli_tool_id, role_id, updated_at) VALUES (?, ?, ?)
|
|
259
|
+
ON CONFLICT(cli_tool_id) DO UPDATE SET role_id = excluded.role_id, updated_at = excluded.updated_at`).run(cliToolId, roleId, Date.now());
|
|
260
|
+
}
|
|
261
|
+
/** @returns The tools with a row for this root. A missing key means inherit. */
|
|
262
|
+
function getRepositoryRoleStates(db, repositoryId) {
|
|
263
|
+
const rows = db
|
|
264
|
+
.prepare(`SELECT d.cli_tool_id, d.role_id, r.name AS role_name
|
|
265
|
+
FROM agent_role_repository_defaults d LEFT JOIN agent_roles r ON r.id = d.role_id
|
|
266
|
+
WHERE d.repository_id = ?`)
|
|
267
|
+
.all(repositoryId);
|
|
268
|
+
return Object.fromEntries(rows.map((row) => [row.cli_tool_id, toStoredState(row)]));
|
|
269
|
+
}
|
|
270
|
+
/** @throws {AgentRoleNotFoundError} */
|
|
271
|
+
function setRepositoryRoleState(db, repositoryId, cliToolId, input) {
|
|
272
|
+
if (input.state === 'inherit') {
|
|
273
|
+
db.prepare('DELETE FROM agent_role_repository_defaults WHERE repository_id = ? AND cli_tool_id = ?').run(repositoryId, cliToolId);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const roleId = input.state === 'role' ? input.roleId : null;
|
|
277
|
+
if (roleId !== null)
|
|
278
|
+
assertRoleExists(db, roleId);
|
|
279
|
+
db.prepare(`INSERT INTO agent_role_repository_defaults (repository_id, cli_tool_id, role_id, updated_at) VALUES (?, ?, ?, ?)
|
|
280
|
+
ON CONFLICT(repository_id, cli_tool_id) DO UPDATE SET role_id = excluded.role_id, updated_at = excluded.updated_at`).run(repositoryId, cliToolId, roleId, Date.now());
|
|
281
|
+
}
|
|
282
|
+
function getInstanceRoleState(db, worktreeId, instanceId) {
|
|
283
|
+
const row = db
|
|
284
|
+
.prepare(`SELECT i.role_id, r.name AS role_name
|
|
285
|
+
FROM agent_instance_roles i LEFT JOIN agent_roles r ON r.id = i.role_id
|
|
286
|
+
WHERE i.worktree_id = ? AND i.instance_id = ?`)
|
|
287
|
+
.get(worktreeId, instanceId);
|
|
288
|
+
return toStoredState(row);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Whether the target may hold a setting is for the caller to decide
|
|
292
|
+
* (`agent-roles/management.ts`): this writes what it is told.
|
|
293
|
+
*
|
|
294
|
+
* @throws {AgentRoleNotFoundError}
|
|
295
|
+
*/
|
|
296
|
+
function setInstanceRoleState(db, worktreeId, instanceId, input) {
|
|
297
|
+
if (input.state === 'inherit') {
|
|
298
|
+
db.prepare('DELETE FROM agent_instance_roles WHERE worktree_id = ? AND instance_id = ?').run(worktreeId, instanceId);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const roleId = input.state === 'role' ? input.roleId : null;
|
|
302
|
+
if (roleId !== null)
|
|
303
|
+
assertRoleExists(db, roleId);
|
|
304
|
+
db.prepare(`INSERT INTO agent_instance_roles (worktree_id, instance_id, role_id, updated_at) VALUES (?, ?, ?, ?)
|
|
305
|
+
ON CONFLICT(worktree_id, instance_id) DO UPDATE SET role_id = excluded.role_id, updated_at = excluded.updated_at`).run(worktreeId, instanceId, roleId, Date.now());
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Whether any level holds a setting. With none, every instance of every tool
|
|
309
|
+
* resolves to no role, so a launch need not run git to find that out (#4115).
|
|
310
|
+
*/
|
|
311
|
+
function hasAnyRoleSetting(db) {
|
|
312
|
+
const row = db
|
|
313
|
+
.prepare(`SELECT (EXISTS (SELECT 1 FROM agent_instance_roles)
|
|
314
|
+
OR EXISTS (SELECT 1 FROM agent_role_repository_defaults)
|
|
315
|
+
OR EXISTS (SELECT 1 FROM agent_role_system_defaults)) AS present`)
|
|
316
|
+
.get();
|
|
317
|
+
return row?.present === 1;
|
|
318
|
+
}
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// Creation keys (#4132, migration v65)
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
/** How long a key is remembered. A request's deadline is seconds, so a late one is well inside it. */
|
|
323
|
+
exports.INSTANCE_CREATION_KEY_TTL_MS = 24 * 60 * 60 * 1000;
|
|
324
|
+
function getInstanceCreationKey(db, worktreeId, key) {
|
|
325
|
+
const row = db
|
|
326
|
+
.prepare(`SELECT instance_id, request_fingerprint FROM agent_instance_creation_keys
|
|
327
|
+
WHERE worktree_id = ? AND idempotency_key = ?`)
|
|
328
|
+
.get(worktreeId, key);
|
|
329
|
+
return row ? { instanceId: row.instance_id, requestFingerprint: row.request_fingerprint } : null;
|
|
330
|
+
}
|
|
331
|
+
function writeInstanceCreationKey(db, worktreeId, key, record) {
|
|
332
|
+
const now = Date.now();
|
|
333
|
+
db.prepare('DELETE FROM agent_instance_creation_keys WHERE created_at < ?').run(now - exports.INSTANCE_CREATION_KEY_TTL_MS);
|
|
334
|
+
db.prepare(`INSERT INTO agent_instance_creation_keys (worktree_id, idempotency_key, instance_id, request_fingerprint, created_at)
|
|
335
|
+
VALUES (?, ?, ?, ?, ?)`).run(worktreeId, key, record.instanceId, record.requestFingerprint, now);
|
|
336
|
+
}
|
|
337
|
+
/** Written in the transaction that creates the row, so one never exists without the other. */
|
|
338
|
+
function recordInstanceCreationKey(db, worktreeId, key, instanceId, requestFingerprint) {
|
|
339
|
+
writeInstanceCreationKey(db, worktreeId, key, { instanceId, requestFingerprint });
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* What a key came to. One that has made nothing is marked given up on here, so a request
|
|
343
|
+
* still on its way with it makes nothing either: the answer holds from now on.
|
|
344
|
+
*
|
|
345
|
+
* @returns The instance it made, or null when it made none and never will
|
|
346
|
+
*/
|
|
347
|
+
function settleInstanceCreationKey(db, worktreeId, key) {
|
|
348
|
+
return db.transaction(() => {
|
|
349
|
+
const existing = getInstanceCreationKey(db, worktreeId, key);
|
|
350
|
+
if (existing)
|
|
351
|
+
return existing.instanceId;
|
|
352
|
+
writeInstanceCreationKey(db, worktreeId, key, { instanceId: null, requestFingerprint: null });
|
|
353
|
+
return null;
|
|
354
|
+
})();
|
|
355
|
+
}
|
|
356
|
+
function mapLaunchRecord(row) {
|
|
357
|
+
return {
|
|
358
|
+
id: row.id,
|
|
359
|
+
worktreeId: row.worktree_id,
|
|
360
|
+
instanceId: row.instance_id,
|
|
361
|
+
cliToolId: row.cli_tool_id,
|
|
362
|
+
phase: row.phase,
|
|
363
|
+
sessionGeneration: row.session_generation,
|
|
364
|
+
source: row.source,
|
|
365
|
+
repositoryId: row.repository_id,
|
|
366
|
+
roleId: row.role_id,
|
|
367
|
+
roleName: row.role_name,
|
|
368
|
+
bodyVersion: row.body_version,
|
|
369
|
+
bodyFingerprint: row.body_fingerprint,
|
|
370
|
+
injectionFingerprint: row.injection_fingerprint,
|
|
371
|
+
artifactFingerprint: row.artifact_fingerprint,
|
|
372
|
+
adapterId: row.adapter_id,
|
|
373
|
+
adapterVersion: row.adapter_version,
|
|
374
|
+
wrapperVersion: row.wrapper_version,
|
|
375
|
+
artifactPath: row.artifact_path,
|
|
376
|
+
effectiveAgent: row.effective_agent,
|
|
377
|
+
compositionSourceFingerprint: row.composition_source_fingerprint,
|
|
378
|
+
noRoleReason: row.no_role_reason,
|
|
379
|
+
recordedAt: row.recorded_at,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Add one line of evidence. There is no function that changes one.
|
|
384
|
+
*
|
|
385
|
+
* @throws When this generation already has a record of this phase
|
|
386
|
+
*/
|
|
387
|
+
function recordRoleLaunch(db, record) {
|
|
388
|
+
const id = (0, crypto_1.randomUUID)();
|
|
389
|
+
db.prepare(`INSERT INTO agent_role_launch_records (
|
|
390
|
+
id, worktree_id, instance_id, cli_tool_id, phase, session_generation, source,
|
|
391
|
+
repository_id, role_id, role_name, body_version, body_fingerprint,
|
|
392
|
+
injection_fingerprint, artifact_fingerprint, adapter_id, adapter_version,
|
|
393
|
+
wrapper_version, artifact_path, effective_agent, composition_source_fingerprint,
|
|
394
|
+
no_role_reason, recorded_at
|
|
395
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, record.worktreeId, record.instanceId, record.cliToolId, record.phase, record.sessionGeneration, record.source, record.repositoryId, record.roleId, record.roleName, record.bodyVersion, record.bodyFingerprint, record.injectionFingerprint, record.artifactFingerprint, record.adapterId, record.adapterVersion, record.wrapperVersion, record.artifactPath, record.effectiveAgent, record.compositionSourceFingerprint, record.noRoleReason, Date.now());
|
|
396
|
+
return id;
|
|
397
|
+
}
|
|
398
|
+
/** The latest record of each phase for one instance. Ties on the clock go to the later insert. */
|
|
399
|
+
function getLatestRoleLaunchRecords(db, worktreeId, instanceId) {
|
|
400
|
+
const latest = (phase) => {
|
|
401
|
+
const row = db
|
|
402
|
+
.prepare(`SELECT * FROM agent_role_launch_records
|
|
403
|
+
WHERE worktree_id = ? AND instance_id = ? AND phase = ?
|
|
404
|
+
ORDER BY recorded_at DESC, rowid DESC LIMIT 1`)
|
|
405
|
+
.get(worktreeId, instanceId, phase);
|
|
406
|
+
return row ? mapLaunchRecord(row) : null;
|
|
407
|
+
};
|
|
408
|
+
return { requested: latest('requested'), launched: latest('launched') };
|
|
409
|
+
}
|
|
@@ -41,6 +41,7 @@ exports.stopAgentSessionCostSampler = stopAgentSessionCostSampler;
|
|
|
41
41
|
const agent_session_telemetry_1 = require("../../lib/hooks/agent-session-telemetry");
|
|
42
42
|
const types_1 = require("../../lib/cli-tools/types");
|
|
43
43
|
const logger_1 = require("../../lib/logger");
|
|
44
|
+
const test_run_detection_1 = require("../../lib/test-run-detection");
|
|
44
45
|
const agent_session_cost_db_1 = require("./agent-session-cost-db");
|
|
45
46
|
const logger = (0, logger_1.createLogger)('agent-session-cost-sampler');
|
|
46
47
|
/**
|
|
@@ -160,7 +161,7 @@ function sampleAgentSessionCosts(db, now = Date.now()) {
|
|
|
160
161
|
* needing to know which kind of process it is in.
|
|
161
162
|
*
|
|
162
163
|
* The timer is `unref()`d so it never keeps Node alive, and skipped outright
|
|
163
|
-
*
|
|
164
|
+
* in a test run ({@link isUnderTest}): a suite that opens a database should not acquire a background
|
|
164
165
|
* writer to a file it is about to delete.
|
|
165
166
|
*
|
|
166
167
|
* @param db - Database instance to write into
|
|
@@ -169,7 +170,7 @@ function sampleAgentSessionCosts(db, now = Date.now()) {
|
|
|
169
170
|
function startAgentSessionCostSampler(db) {
|
|
170
171
|
if (globalThis.__agentSessionCostSampler)
|
|
171
172
|
return false;
|
|
172
|
-
if (
|
|
173
|
+
if ((0, test_run_detection_1.isUnderTest)())
|
|
173
174
|
return false;
|
|
174
175
|
const timer = setInterval(() => {
|
|
175
176
|
try {
|