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
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RoleArtifactError = exports.MAX_ARTIFACT_NAME_LENGTH = exports.AGENT_ROLE_ANTIGRAVITY_AGENTS_DIR_ENV_VAR = exports.AGENT_ROLE_ARTIFACTS_DIR_ENV_VAR = void 0;
|
|
7
|
+
exports.deriveServerNamespace = deriveServerNamespace;
|
|
8
|
+
exports.buildArtifactName = buildArtifactName;
|
|
9
|
+
exports.resolveArtifactLocation = resolveArtifactLocation;
|
|
10
|
+
exports.renderRoleArtifact = renderRoleArtifact;
|
|
11
|
+
exports.writeLaunchEnvFile = writeLaunchEnvFile;
|
|
12
|
+
exports.removeLaunchEnvFile = removeLaunchEnvFile;
|
|
13
|
+
exports.inspectRoleArtifact = inspectRoleArtifact;
|
|
14
|
+
exports.writeRoleArtifact = writeRoleArtifact;
|
|
15
|
+
/**
|
|
16
|
+
* The generated files that carry a role to each CLI (§5, §6 of
|
|
17
|
+
* `docs/design/agent-roles-adapters.md`): what they contain, where they live, and
|
|
18
|
+
* the only code that writes them.
|
|
19
|
+
*
|
|
20
|
+
* Free of the database on purpose: the launcher side of the tree stays outside
|
|
21
|
+
* `better-sqlite3`'s import graph (`hooks/sources/opencode/launch-settings.ts`).
|
|
22
|
+
*
|
|
23
|
+
* ## The rules
|
|
24
|
+
*
|
|
25
|
+
* - **Immutable.** A name is fixed by the injection fingerprint, so one name means
|
|
26
|
+
* one content. An existing file is reused only if every byte matches, and a
|
|
27
|
+
* difference is an error rather than an overwrite. The one exception is Codex,
|
|
28
|
+
* which writes into the profile it runs under (#4136, {@link codexProfileAsWritten}).
|
|
29
|
+
* - **Inspected.** Many CLIs run on with no role when a file is missing or broken
|
|
30
|
+
* (§8), so the writer reads back what it wrote, and {@link inspectRoleArtifact}
|
|
31
|
+
* is the same check for the moment before a launch.
|
|
32
|
+
* - **Never deleted.** A running process or a resumable conversation may still
|
|
33
|
+
* read one. Copilot's `/agent` and `agy agent` therefore list them; `infer:
|
|
34
|
+
* false` and `subagent: false` narrow the candidates, not the list.
|
|
35
|
+
*
|
|
36
|
+
* Errors carry paths, never file content: the content is the role's body.
|
|
37
|
+
*
|
|
38
|
+
* @module lib/agent-roles/artifacts
|
|
39
|
+
*/
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const crypto_1 = require("crypto");
|
|
42
|
+
const os_1 = require("os");
|
|
43
|
+
const path_1 = require("path");
|
|
44
|
+
const vm_1 = __importDefault(require("vm"));
|
|
45
|
+
const smol_toml_1 = require("smol-toml");
|
|
46
|
+
const yaml_1 = require("yaml");
|
|
47
|
+
const safe_directory_1 = require("../../config/safe-directory");
|
|
48
|
+
const uat_isolation_1 = require("../../config/uat-isolation");
|
|
49
|
+
const hooks_config_1 = require("../../lib/hooks/sources/antigravity/hooks-config");
|
|
50
|
+
const hooks_config_2 = require("../../lib/hooks/sources/codex/hooks-config");
|
|
51
|
+
const hook_settings_1 = require("../../lib/hooks/sources/copilot/hook-settings");
|
|
52
|
+
const fingerprint_1 = require("./fingerprint");
|
|
53
|
+
const toml_basic_1 = require("./toml-basic");
|
|
54
|
+
/** Moves the data root (Claude, Command Code, OpenCode V1 and V2). Honoured in production. */
|
|
55
|
+
exports.AGENT_ROLE_ARTIFACTS_DIR_ENV_VAR = 'CM_AGENT_ROLE_ARTIFACTS_DIR';
|
|
56
|
+
/**
|
|
57
|
+
* Moves Antigravity's agents directory, for tests and isolated runs. `agy` itself
|
|
58
|
+
* reads only `~/.gemini/config/agents`, so a file put elsewhere is one it never finds.
|
|
59
|
+
*/
|
|
60
|
+
exports.AGENT_ROLE_ANTIGRAVITY_AGENTS_DIR_ENV_VAR = 'CM_AGENT_ROLE_ANTIGRAVITY_AGENTS_DIR';
|
|
61
|
+
/** Longest generated name. Becomes Codex's `-p`, Copilot's `--agent`, Antigravity's `name`. */
|
|
62
|
+
exports.MAX_ARTIFACT_NAME_LENGTH = 64;
|
|
63
|
+
/** How much of the injection fingerprint goes into a name. */
|
|
64
|
+
const NAME_FINGERPRINT_LENGTH = 12;
|
|
65
|
+
const NAME_SEGMENT = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
66
|
+
const FULL_FINGERPRINT = /^[0-9a-f]{64}$/;
|
|
67
|
+
class RoleArtifactError extends Error {
|
|
68
|
+
code;
|
|
69
|
+
constructor(code, message) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.code = code;
|
|
72
|
+
this.name = 'RoleArtifactError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.RoleArtifactError = RoleArtifactError;
|
|
76
|
+
/** A label for this server inside a shared home, derived from something stable such as its database path. */
|
|
77
|
+
function deriveServerNamespace(seed) {
|
|
78
|
+
return (0, fingerprint_1.computeFingerprint)(Buffer.from(seed, 'utf8')).slice(0, 8);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* `cm-role-<namespace>-<role id>-<head of the injection fingerprint>`. The
|
|
82
|
+
* injection fingerprint and not the artifact fingerprint: the name is inside the
|
|
83
|
+
* Copilot and Antigravity frontmatter, so naming a file after its own bytes would
|
|
84
|
+
* be circular (§5).
|
|
85
|
+
*/
|
|
86
|
+
function buildArtifactName(input) {
|
|
87
|
+
const { namespace, roleId, injectionFingerprint } = input;
|
|
88
|
+
if (!NAME_SEGMENT.test(namespace))
|
|
89
|
+
throw new RoleArtifactError('invalid-name', 'Invalid server namespace');
|
|
90
|
+
if (!NAME_SEGMENT.test(roleId))
|
|
91
|
+
throw new RoleArtifactError('invalid-name', 'Invalid role id');
|
|
92
|
+
if (!FULL_FINGERPRINT.test(injectionFingerprint)) {
|
|
93
|
+
throw new RoleArtifactError('invalid-name', 'The injection fingerprint must be a full SHA-256 hex');
|
|
94
|
+
}
|
|
95
|
+
const name = `cm-role-${namespace}-${roleId}-${injectionFingerprint.slice(0, NAME_FINGERPRINT_LENGTH)}`;
|
|
96
|
+
assertArtifactName(name);
|
|
97
|
+
return name;
|
|
98
|
+
}
|
|
99
|
+
function assertArtifactName(name) {
|
|
100
|
+
if (!name.startsWith('cm-role-') || !NAME_SEGMENT.test(name)) {
|
|
101
|
+
throw new RoleArtifactError('invalid-name', 'An artifact name is cm-role- plus alphanumerics and hyphens');
|
|
102
|
+
}
|
|
103
|
+
if (name.length > exports.MAX_ARTIFACT_NAME_LENGTH) {
|
|
104
|
+
throw new RoleArtifactError('invalid-name', `An artifact name is at most ${exports.MAX_ARTIFACT_NAME_LENGTH} characters`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function defaultDataRoot() {
|
|
108
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'agent-roles');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Absolute (Issue #4210): the path of a file under this root is handed to the
|
|
112
|
+
* CLI — `--append-system-prompt-file`, `--mod`, OpenCode's `instructions` /
|
|
113
|
+
* `{file:…}` (`./adapters.ts` `buildRoleLaunchArguments`) — and the CLI runs in
|
|
114
|
+
* the worktree (`cli-tools/base.ts` `createLaunchPane`), so a relative root
|
|
115
|
+
* named another file than the one written here.
|
|
116
|
+
*/
|
|
117
|
+
function dataRootFor(options) {
|
|
118
|
+
const fallback = defaultDataRoot();
|
|
119
|
+
if (options.dataRoot)
|
|
120
|
+
return (0, safe_directory_1.resolveSafeAbsoluteDirectory)(options.dataRoot, fallback, 'ArtifactOptions.dataRoot');
|
|
121
|
+
const configured = (options.env ?? process.env)[exports.AGENT_ROLE_ARTIFACTS_DIR_ENV_VAR];
|
|
122
|
+
return (0, safe_directory_1.resolveSafeAbsoluteDirectory)(configured, fallback, exports.AGENT_ROLE_ARTIFACTS_DIR_ENV_VAR);
|
|
123
|
+
}
|
|
124
|
+
/** The path with every symlink that exists on the way followed. What is not there yet is kept as spelled. */
|
|
125
|
+
function physicalPath(target) {
|
|
126
|
+
const rest = [];
|
|
127
|
+
let existing = (0, path_1.resolve)(target);
|
|
128
|
+
for (;;) {
|
|
129
|
+
try {
|
|
130
|
+
return (0, path_1.join)((0, fs_1.realpathSync)(existing), ...rest);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
const parent = (0, path_1.dirname)(existing);
|
|
134
|
+
if (parent === existing)
|
|
135
|
+
return (0, path_1.join)(existing, ...rest);
|
|
136
|
+
rest.unshift((0, path_1.basename)(existing));
|
|
137
|
+
existing = parent;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function accountHomes() {
|
|
142
|
+
const homes = [(0, os_1.homedir)()];
|
|
143
|
+
try {
|
|
144
|
+
homes.push((0, os_1.userInfo)().homedir);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// No account entry for this uid: HOME is all there is to go on.
|
|
148
|
+
}
|
|
149
|
+
return homes;
|
|
150
|
+
}
|
|
151
|
+
/** State directories of this product and the CLIs it drives, as they sit in a home. */
|
|
152
|
+
const KNOWN_HOME_STATE = ['.commandmate', '.codex', '.copilot', '.gemini', '.claude'];
|
|
153
|
+
/**
|
|
154
|
+
* Known shared state, wherever it physically is. Any of these may be a symlink out
|
|
155
|
+
* of the home (a synced or shared directory), and the state is just as shared there.
|
|
156
|
+
*/
|
|
157
|
+
function knownSharedStatePaths() {
|
|
158
|
+
const inHomes = accountHomes().flatMap((home) => KNOWN_HOME_STATE.map((entry) => (0, path_1.join)(home, entry)));
|
|
159
|
+
return [
|
|
160
|
+
defaultDataRoot(),
|
|
161
|
+
...inHomes,
|
|
162
|
+
(0, hooks_config_2.getCodexHome)(),
|
|
163
|
+
(0, hook_settings_1.getCopilotHomeDirectory)(),
|
|
164
|
+
(0, path_1.dirname)((0, hooks_config_1.getAntigravityHooksConfigPath)()),
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
function isSameOrInside(path, parent) {
|
|
168
|
+
return path === parent || path.startsWith(`${parent}${path_1.sep}`);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Whether a data root is a place the user's other servers and CLIs share, judged
|
|
172
|
+
* by where it physically is and not by whether someone named it: the home itself,
|
|
173
|
+
* anything inside one of its dot-directories, or anything inside known shared
|
|
174
|
+
* state wherever a symlink has put it.
|
|
175
|
+
*
|
|
176
|
+
* Not "anywhere under the home". A UAT's run directory normally is, because the
|
|
177
|
+
* checkout is, and it belongs to that run alone (`.commandmate/uat.yaml` puts its
|
|
178
|
+
* database and hook directory there).
|
|
179
|
+
*/
|
|
180
|
+
function isSharedHomeState(root) {
|
|
181
|
+
const real = physicalPath(root);
|
|
182
|
+
const inHomeState = accountHomes().some((home) => {
|
|
183
|
+
const realHome = physicalPath(home);
|
|
184
|
+
if (real === realHome)
|
|
185
|
+
return true;
|
|
186
|
+
return real.startsWith(`${realHome}${path_1.sep}`) && real.slice(realHome.length + 1).startsWith('.');
|
|
187
|
+
});
|
|
188
|
+
return inHomeState || knownSharedStatePaths().some((known) => isSameOrInside(real, physicalPath(known)));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Antigravity has no resolver for this directory, so it is derived from the one
|
|
192
|
+
* that names `hooks.json` beside it rather than spelling `~/.gemini` a second time.
|
|
193
|
+
*/
|
|
194
|
+
function antigravityAgentsDir(options) {
|
|
195
|
+
const fallback = (0, path_1.join)((0, path_1.dirname)((0, hooks_config_1.getAntigravityHooksConfigPath)()), 'agents');
|
|
196
|
+
if (options.antigravityAgentsDir)
|
|
197
|
+
return options.antigravityAgentsDir;
|
|
198
|
+
return (0, safe_directory_1.resolveSafeDirectory)((options.env ?? process.env)[exports.AGENT_ROLE_ANTIGRAVITY_AGENTS_DIR_ENV_VAR], fallback, exports.AGENT_ROLE_ANTIGRAVITY_AGENTS_DIR_ENV_VAR);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Where an adapter's file goes. Codex, Copilot and Antigravity discover theirs in
|
|
202
|
+
* their own homes (D4); the others are handed a path, so theirs stay out of the
|
|
203
|
+
* home altogether.
|
|
204
|
+
*/
|
|
205
|
+
function resolveArtifactLocation(adapter, name, options = {}) {
|
|
206
|
+
assertArtifactName(name);
|
|
207
|
+
switch (adapter) {
|
|
208
|
+
case 'codex': {
|
|
209
|
+
const home = (0, hooks_config_2.getCodexHome)(options.codexHome ? { codexHome: options.codexHome } : {});
|
|
210
|
+
return { path: (0, path_1.join)(home, `${name}.config.toml`), homeDir: home, sharedDirs: [], ownedDirs: [], inSharedHome: true };
|
|
211
|
+
}
|
|
212
|
+
case 'copilot': {
|
|
213
|
+
// Absolute for getCopilotHomeDirectory()'s reason (Issue #4210): the home is
|
|
214
|
+
// handed to copilot as COPILOT_HOME.
|
|
215
|
+
const home = options.copilotHome !== undefined ? (0, path_1.resolve)(options.copilotHome) : (0, hook_settings_1.getCopilotHomeDirectory)();
|
|
216
|
+
const agents = (0, path_1.join)(home, 'agents');
|
|
217
|
+
return { path: (0, path_1.join)(agents, `${name}.agent.md`), homeDir: home, sharedDirs: [agents], ownedDirs: [], inSharedHome: true };
|
|
218
|
+
}
|
|
219
|
+
case 'antigravity': {
|
|
220
|
+
const agents = antigravityAgentsDir(options);
|
|
221
|
+
const own = (0, path_1.join)(agents, name);
|
|
222
|
+
return { path: (0, path_1.join)(own, 'agent.md'), homeDir: null, sharedDirs: [agents], ownedDirs: [own], inSharedHome: true };
|
|
223
|
+
}
|
|
224
|
+
case 'claude':
|
|
225
|
+
case 'command-code':
|
|
226
|
+
case 'opencode':
|
|
227
|
+
case 'opencode-v2': {
|
|
228
|
+
const root = dataRootFor(options);
|
|
229
|
+
const dir = (0, path_1.join)(root, adapter);
|
|
230
|
+
const extension = adapter === 'command-code' ? 'ts' : 'md';
|
|
231
|
+
// Only the default root is ours to tighten. A root someone named may be any
|
|
232
|
+
// directory, up to the home itself, and is left to its owner.
|
|
233
|
+
const rootIsOurs = physicalPath(root) === physicalPath(defaultDataRoot());
|
|
234
|
+
return {
|
|
235
|
+
path: (0, path_1.join)(dir, `${name}.${extension}`),
|
|
236
|
+
homeDir: null,
|
|
237
|
+
sharedDirs: rootIsOurs ? [] : [root],
|
|
238
|
+
ownedDirs: rootIsOurs ? [root, dir] : [dir],
|
|
239
|
+
inSharedHome: isSharedHomeState(root),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Content
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
/**
|
|
248
|
+
* A constant, not the role's name. A rename leaves the injection fingerprint, and
|
|
249
|
+
* so the file name, unchanged; carrying the role name here would make the second
|
|
250
|
+
* launch find different bytes under the same name and refuse.
|
|
251
|
+
*/
|
|
252
|
+
const DEFINITION_DESCRIPTION = 'CommandMate role';
|
|
253
|
+
const COMMAND_CODE_PREFIX = 'export default function (cmd) {\n cmd.hooks({ appendSystemPrompt: () => ';
|
|
254
|
+
const COMMAND_CODE_SUFFIX = ' });\n}\n';
|
|
255
|
+
/**
|
|
256
|
+
* Every byte of an adapter's file. `instructions` is the text the model should
|
|
257
|
+
* get, already wrapped and composed by #4115: for Codex that includes the user's
|
|
258
|
+
* own `developer_instructions`, which the profile would otherwise replace.
|
|
259
|
+
*/
|
|
260
|
+
function renderRoleArtifact(adapter, name, instructions) {
|
|
261
|
+
switch (adapter) {
|
|
262
|
+
case 'codex':
|
|
263
|
+
return Buffer.from((0, toml_basic_1.renderTomlBasicDocument)({ developer_instructions: instructions }), 'utf8');
|
|
264
|
+
case 'copilot':
|
|
265
|
+
return Buffer.from(`---\nname: ${name}\ndescription: ${DEFINITION_DESCRIPTION}\ninfer: false\n---\n${instructions}`, 'utf8');
|
|
266
|
+
case 'antigravity':
|
|
267
|
+
return Buffer.from(`---\nname: ${name}\ndescription: ${DEFINITION_DESCRIPTION}\nsubagent: false\n---\n${instructions}`, 'utf8');
|
|
268
|
+
case 'command-code': {
|
|
269
|
+
// Executed by the CLI, so the text goes in only as a JSON string literal.
|
|
270
|
+
const literal = JSON.stringify(instructions).replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029');
|
|
271
|
+
return Buffer.from(`${COMMAND_CODE_PREFIX}${literal}${COMMAND_CODE_SUFFIX}`, 'utf8');
|
|
272
|
+
}
|
|
273
|
+
case 'claude':
|
|
274
|
+
case 'opencode':
|
|
275
|
+
case 'opencode-v2':
|
|
276
|
+
return Buffer.from(instructions, 'utf8');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function parseDefinition(text) {
|
|
280
|
+
if (!text.startsWith('---\n'))
|
|
281
|
+
return null;
|
|
282
|
+
const close = text.indexOf('\n---\n', 3);
|
|
283
|
+
if (close === -1)
|
|
284
|
+
return null;
|
|
285
|
+
try {
|
|
286
|
+
return { data: (0, yaml_1.parse)(text.slice(4, close)), body: text.slice(close + 5) };
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** Why these bytes would not carry a role through this adapter, or null when they would. */
|
|
293
|
+
function formatProblem(adapter, name, bytes) {
|
|
294
|
+
const text = bytes.toString('utf8');
|
|
295
|
+
switch (adapter) {
|
|
296
|
+
case 'codex': {
|
|
297
|
+
let entries;
|
|
298
|
+
try {
|
|
299
|
+
entries = (0, smol_toml_1.parse)(text);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// Not the parser's message: it quotes the line, and the line is the role's body.
|
|
303
|
+
return 'not the expected TOML';
|
|
304
|
+
}
|
|
305
|
+
const value = entries.developer_instructions;
|
|
306
|
+
return typeof value !== 'string' || value.trim() === '' ? 'developer_instructions is missing or empty' : null;
|
|
307
|
+
}
|
|
308
|
+
case 'copilot':
|
|
309
|
+
case 'antigravity': {
|
|
310
|
+
const definition = parseDefinition(text);
|
|
311
|
+
if (!definition || typeof definition.data !== 'object' || definition.data === null) {
|
|
312
|
+
return 'no readable frontmatter';
|
|
313
|
+
}
|
|
314
|
+
const data = definition.data;
|
|
315
|
+
if (data.name !== name)
|
|
316
|
+
return 'the frontmatter name is not this artifact';
|
|
317
|
+
if (adapter === 'copilot' && data.infer !== false)
|
|
318
|
+
return 'infer: false is missing';
|
|
319
|
+
if (adapter === 'antigravity' && data.subagent !== false)
|
|
320
|
+
return 'subagent: false is missing';
|
|
321
|
+
return definition.body.trim() === '' ? 'the definition has no body' : null;
|
|
322
|
+
}
|
|
323
|
+
case 'command-code': {
|
|
324
|
+
// The CLI swallows a broken mod (§6.3), so this is the only check there is.
|
|
325
|
+
// Compiled, never run; `export default` would not compile as a script.
|
|
326
|
+
if (!text.startsWith(COMMAND_CODE_PREFIX) || !text.endsWith(COMMAND_CODE_SUFFIX)) {
|
|
327
|
+
return 'not the generated mod';
|
|
328
|
+
}
|
|
329
|
+
const literal = text.slice(COMMAND_CODE_PREFIX.length, text.length - COMMAND_CODE_SUFFIX.length);
|
|
330
|
+
try {
|
|
331
|
+
const value = JSON.parse(literal);
|
|
332
|
+
new vm_1.default.Script(`(function (cmd) { cmd.hooks({ appendSystemPrompt: () => ${literal} }); })`);
|
|
333
|
+
return typeof value === 'string' && value.trim() !== '' ? null : 'the mod carries no text';
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return 'the mod does not parse';
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
case 'claude':
|
|
340
|
+
case 'opencode':
|
|
341
|
+
case 'opencode-v2':
|
|
342
|
+
return text.trim() === '' ? 'the file is empty' : null;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Filesystem
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
function lstatOrNull(path) {
|
|
349
|
+
try {
|
|
350
|
+
return (0, fs_1.lstatSync)(path);
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
const { code } = error;
|
|
354
|
+
// ENOTDIR: something on the way is a file, so this path does not exist either.
|
|
355
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
356
|
+
return null;
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function currentUid() {
|
|
361
|
+
return typeof process.getuid === 'function' ? process.getuid() : null;
|
|
362
|
+
}
|
|
363
|
+
/** Read an existing artifact, refusing anything we could not have written. Null when absent. */
|
|
364
|
+
function readExistingArtifact(path) {
|
|
365
|
+
const stat = lstatOrNull(path);
|
|
366
|
+
if (!stat)
|
|
367
|
+
return null;
|
|
368
|
+
if (stat.isSymbolicLink())
|
|
369
|
+
throw new RoleArtifactError('symlink', `${path} is a symlink`);
|
|
370
|
+
if (!stat.isFile())
|
|
371
|
+
throw new RoleArtifactError('not-regular-file', `${path} is not a regular file`);
|
|
372
|
+
const uid = currentUid();
|
|
373
|
+
if (uid !== null && stat.uid !== uid) {
|
|
374
|
+
throw new RoleArtifactError('foreign-owner', `${path} belongs to another user`);
|
|
375
|
+
}
|
|
376
|
+
if ((stat.mode & 0o077) !== 0) {
|
|
377
|
+
throw new RoleArtifactError('insecure-permissions', `${path} is accessible to other users`);
|
|
378
|
+
}
|
|
379
|
+
// O_NOFOLLOW: the check above and this read are two steps.
|
|
380
|
+
const fd = (0, fs_1.openSync)(path, fs_1.constants.O_RDONLY | fs_1.constants.O_NOFOLLOW);
|
|
381
|
+
try {
|
|
382
|
+
return (0, fs_1.readFileSync)(fd);
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
(0, fs_1.closeSync)(fd);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Check a directory that exists; one that does not has nothing to check.
|
|
390
|
+
*
|
|
391
|
+
* @param repair - Whether a directory of our own may be tightened. False when the
|
|
392
|
+
* run only reads: a read-only caller refuses instead, and changes nothing.
|
|
393
|
+
*/
|
|
394
|
+
function checkDirectory(dir, owned, repair) {
|
|
395
|
+
const stat = lstatOrNull(dir);
|
|
396
|
+
if (!stat)
|
|
397
|
+
return;
|
|
398
|
+
if (stat.isSymbolicLink())
|
|
399
|
+
throw new RoleArtifactError('symlink', `${dir} is a symlink`);
|
|
400
|
+
if (!stat.isDirectory())
|
|
401
|
+
throw new RoleArtifactError('not-regular-file', `${dir} is not a directory`);
|
|
402
|
+
const uid = currentUid();
|
|
403
|
+
if (uid !== null && stat.uid !== uid) {
|
|
404
|
+
throw new RoleArtifactError('foreign-owner', `${dir} belongs to another user`);
|
|
405
|
+
}
|
|
406
|
+
if (owned) {
|
|
407
|
+
if ((stat.mode & 0o077) === 0)
|
|
408
|
+
return;
|
|
409
|
+
if (!repair)
|
|
410
|
+
throw new RoleArtifactError('insecure-permissions', `${dir} is accessible to other users`);
|
|
411
|
+
(0, fs_1.chmodSync)(dir, 0o700);
|
|
412
|
+
}
|
|
413
|
+
else if ((stat.mode & 0o022) !== 0) {
|
|
414
|
+
// Readable is the CLI's business. Writable by others is someone else being able
|
|
415
|
+
// to swap the file between this check and the launch.
|
|
416
|
+
throw new RoleArtifactError('insecure-permissions', `${dir} is writable by other users`);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/** A home may be reached through a symlink, so it is followed; what is below it is not. */
|
|
420
|
+
function checkDirectories(location, repair) {
|
|
421
|
+
if (location.homeDir !== null) {
|
|
422
|
+
let mode = null;
|
|
423
|
+
try {
|
|
424
|
+
mode = Number((0, fs_1.statSync)(location.homeDir).mode);
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
// Absent, or a link to nothing: nothing readable is behind it, and creating it will say so.
|
|
428
|
+
}
|
|
429
|
+
if (mode !== null && (mode & 0o022) !== 0) {
|
|
430
|
+
throw new RoleArtifactError('insecure-permissions', `${location.homeDir} is writable by other users`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
for (const dir of location.sharedDirs)
|
|
434
|
+
checkDirectory(dir, false, repair);
|
|
435
|
+
for (const dir of location.ownedDirs)
|
|
436
|
+
checkDirectory(dir, true, repair);
|
|
437
|
+
}
|
|
438
|
+
function createMissingDirectories(location) {
|
|
439
|
+
const dirs = [...(location.homeDir === null ? [] : [location.homeDir]), ...location.sharedDirs, ...location.ownedDirs];
|
|
440
|
+
for (const dir of dirs)
|
|
441
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true, mode: 0o700 });
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Create `path` with exactly these bytes, or fail if anything is already there.
|
|
445
|
+
* `link` and not `rename`: rename replaces a file that appeared meanwhile, and two
|
|
446
|
+
* servers can generate the same name at once.
|
|
447
|
+
*
|
|
448
|
+
* @returns false when another writer got there first
|
|
449
|
+
*/
|
|
450
|
+
function publishExclusively(path, bytes) {
|
|
451
|
+
const temporary = (0, path_1.join)((0, path_1.dirname)(path), `.cm-role-${(0, crypto_1.randomBytes)(6).toString('hex')}.tmp`);
|
|
452
|
+
const fd = (0, fs_1.openSync)(temporary, fs_1.constants.O_WRONLY | fs_1.constants.O_CREAT | fs_1.constants.O_EXCL | fs_1.constants.O_NOFOLLOW, 0o600);
|
|
453
|
+
try {
|
|
454
|
+
try {
|
|
455
|
+
let written = 0;
|
|
456
|
+
while (written < bytes.length)
|
|
457
|
+
written += (0, fs_1.writeSync)(fd, bytes, written);
|
|
458
|
+
(0, fs_1.fsyncSync)(fd);
|
|
459
|
+
if (((0, fs_1.fstatSync)(fd).mode & 0o077) !== 0) {
|
|
460
|
+
throw new RoleArtifactError('insecure-permissions', `${temporary} was not created private`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
(0, fs_1.closeSync)(fd);
|
|
465
|
+
}
|
|
466
|
+
try {
|
|
467
|
+
(0, fs_1.linkSync)(temporary, path);
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
if (error.code === 'EEXIST')
|
|
472
|
+
return false;
|
|
473
|
+
throw error;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
finally {
|
|
477
|
+
(0, fs_1.unlinkSync)(temporary);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// ---------------------------------------------------------------------------
|
|
481
|
+
// The composed environment (not an artifact)
|
|
482
|
+
// ---------------------------------------------------------------------------
|
|
483
|
+
/**
|
|
484
|
+
* Write a composed `OPENCODE_CONFIG_CONTENT` to a private file for one launch, read
|
|
485
|
+
* back with `$(cat …)` on the launch line (§7.1). It may hold the user's secrets, so
|
|
486
|
+
* unlike an artifact it has no fingerprint, is never reused, and is removed when the
|
|
487
|
+
* launch is over.
|
|
488
|
+
*
|
|
489
|
+
* @throws {RoleArtifactError} It could not be written
|
|
490
|
+
* @throws {UatIsolationLaunchRefusedError} The run may not write there
|
|
491
|
+
*/
|
|
492
|
+
function writeLaunchEnvFile(adapter, content, options = {}) {
|
|
493
|
+
const root = dataRootFor(options);
|
|
494
|
+
const dir = (0, path_1.join)(root, 'launch-env');
|
|
495
|
+
const path = (0, path_1.join)(dir, `${(0, crypto_1.randomBytes)(12).toString('hex')}.json`);
|
|
496
|
+
const env = options.env ?? process.env;
|
|
497
|
+
if ((0, uat_isolation_1.sharedHookWritePolicy)(adapter, [path], env) === 'read-only' && isSharedHomeState(root)) {
|
|
498
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError(adapter, `the file ${path} may not be written by this run`, uat_isolation_1.UAT_SAME_BUILD_FIX);
|
|
499
|
+
}
|
|
500
|
+
const rootIsOurs = physicalPath(root) === physicalPath(defaultDataRoot());
|
|
501
|
+
const location = {
|
|
502
|
+
path,
|
|
503
|
+
homeDir: null,
|
|
504
|
+
sharedDirs: rootIsOurs ? [] : [root],
|
|
505
|
+
ownedDirs: rootIsOurs ? [root, dir] : [dir],
|
|
506
|
+
inSharedHome: false,
|
|
507
|
+
};
|
|
508
|
+
checkDirectories(location, true);
|
|
509
|
+
try {
|
|
510
|
+
createMissingDirectories(location);
|
|
511
|
+
if (!publishExclusively(path, Buffer.from(content, 'utf8'))) {
|
|
512
|
+
throw new RoleArtifactError('write-failed', `${path} already exists`);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
if (error instanceof RoleArtifactError)
|
|
517
|
+
throw error;
|
|
518
|
+
throw new RoleArtifactError('write-failed', `Could not write ${path}: ${error.code ?? 'unknown error'}`);
|
|
519
|
+
}
|
|
520
|
+
return path;
|
|
521
|
+
}
|
|
522
|
+
/** Remove what {@link writeLaunchEnvFile} wrote. Never throws: the launch is already over. */
|
|
523
|
+
function removeLaunchEnvFile(path) {
|
|
524
|
+
try {
|
|
525
|
+
(0, fs_1.unlinkSync)(path);
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Already gone, or not ours to fix now.
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Checks 1 and 2 of §5, for the moment before a launch: the file is where this
|
|
533
|
+
* adapter keeps it, behind directories that could not have been swapped, is what
|
|
534
|
+
* the writer said, and reads as this adapter's format. Changes nothing.
|
|
535
|
+
*
|
|
536
|
+
* @param options - The same options the file was written with
|
|
537
|
+
* @throws {RoleArtifactError}
|
|
538
|
+
*/
|
|
539
|
+
function inspectRoleArtifact(input, options = {}) {
|
|
540
|
+
const { adapter, name, path, expectedFingerprint } = input;
|
|
541
|
+
const location = resolveArtifactLocation(adapter, name, options);
|
|
542
|
+
if (location.path !== path) {
|
|
543
|
+
throw new RoleArtifactError('unexpected-location', `${path} is not where this adapter keeps ${name}`);
|
|
544
|
+
}
|
|
545
|
+
checkDirectories(location, false);
|
|
546
|
+
inspectFile(adapter, name, path, expectedFingerprint);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* The bytes CommandMate wrote for this Codex profile, given what is in it now.
|
|
550
|
+
*
|
|
551
|
+
* `codex -p <profile>` saves into the profile itself: answering the folder-trust
|
|
552
|
+
* screen adds `[projects."<path>"]` there and leaves `config.toml` alone (measured
|
|
553
|
+
* on 0.166.0, #4136). That is the CLI using its own file, so it must not lock the
|
|
554
|
+
* role out, and CommandMate does not rewrite the file to undo it. What the role
|
|
555
|
+
* depends on is `developer_instructions`, so that alone decides. Everything else
|
|
556
|
+
* in the file has the standing of `config.toml`: only this user can write either.
|
|
557
|
+
*
|
|
558
|
+
* @returns null when no such text can be read from the file
|
|
559
|
+
*/
|
|
560
|
+
function codexProfileAsWritten(bytes) {
|
|
561
|
+
try {
|
|
562
|
+
const value = (0, smol_toml_1.parse)(bytes.toString('utf8')).developer_instructions;
|
|
563
|
+
return typeof value === 'string' ? Buffer.from((0, toml_basic_1.renderTomlBasicDocument)({ developer_instructions: value }), 'utf8') : null;
|
|
564
|
+
}
|
|
565
|
+
catch {
|
|
566
|
+
return null;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
function inspectFile(adapter, name, path, expectedFingerprint) {
|
|
570
|
+
const bytes = readExistingArtifact(path);
|
|
571
|
+
if (bytes === null)
|
|
572
|
+
throw new RoleArtifactError('missing', `${path} does not exist`);
|
|
573
|
+
if ((0, fingerprint_1.computeFingerprint)(bytes) !== expectedFingerprint) {
|
|
574
|
+
const asWritten = adapter === 'codex' ? codexProfileAsWritten(bytes) : null;
|
|
575
|
+
if (asWritten === null || (0, fingerprint_1.computeFingerprint)(asWritten) !== expectedFingerprint) {
|
|
576
|
+
throw new RoleArtifactError('content-mismatch', `${path} is not the expected content`);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
const problem = formatProblem(adapter, name, bytes);
|
|
580
|
+
if (problem)
|
|
581
|
+
throw new RoleArtifactError('format-invalid', `${path}: ${problem}`);
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Make sure the artifact exists with exactly this content, writing it only if it
|
|
585
|
+
* is absent and the run may write there.
|
|
586
|
+
*
|
|
587
|
+
* In `CM_UAT_ISOLATION=1` nothing is changed in the user's shared state
|
|
588
|
+
* (`config/uat-isolation.ts`): an identical file behind sound directories is
|
|
589
|
+
* reused, and anything else refuses the launch. A data root that really is
|
|
590
|
+
* elsewhere (see {@link isSharedHomeState}) belongs to the run and may be written.
|
|
591
|
+
*
|
|
592
|
+
* @throws {RoleArtifactError} The file cannot be used
|
|
593
|
+
* @throws {UatIsolationLaunchRefusedError} The run may not write it
|
|
594
|
+
*/
|
|
595
|
+
function writeRoleArtifact(input, options = {}) {
|
|
596
|
+
const { adapter, name, instructions } = input;
|
|
597
|
+
assertArtifactName(name);
|
|
598
|
+
// §5 check 3: an empty role does not become "no role".
|
|
599
|
+
if (instructions.trim() === '') {
|
|
600
|
+
throw new RoleArtifactError('empty-instructions', 'A role artifact needs instructions');
|
|
601
|
+
}
|
|
602
|
+
const location = resolveArtifactLocation(adapter, name, options);
|
|
603
|
+
const bytes = renderRoleArtifact(adapter, name, instructions);
|
|
604
|
+
const artifactFingerprint = (0, fingerprint_1.computeFingerprint)(bytes);
|
|
605
|
+
const written = (reused) => ({
|
|
606
|
+
adapter,
|
|
607
|
+
name,
|
|
608
|
+
path: location.path,
|
|
609
|
+
artifactFingerprint,
|
|
610
|
+
reused,
|
|
611
|
+
});
|
|
612
|
+
const inspect = () => inspectFile(adapter, name, location.path, artifactFingerprint);
|
|
613
|
+
const policy = (0, uat_isolation_1.sharedHookWritePolicy)(adapter, [location.path], options.env ?? process.env);
|
|
614
|
+
const readOnly = policy === 'read-only' && location.inSharedHome;
|
|
615
|
+
// Before the file is read: a good file behind a swapped directory is not ours.
|
|
616
|
+
checkDirectories(location, !readOnly);
|
|
617
|
+
if (readExistingArtifact(location.path) !== null) {
|
|
618
|
+
inspect();
|
|
619
|
+
return written(true);
|
|
620
|
+
}
|
|
621
|
+
if (readOnly) {
|
|
622
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError(adapter, `the role artifact ${location.path} does not exist and this run may not write it`, uat_isolation_1.UAT_SAME_BUILD_FIX);
|
|
623
|
+
}
|
|
624
|
+
let published;
|
|
625
|
+
try {
|
|
626
|
+
createMissingDirectories(location);
|
|
627
|
+
published = publishExclusively(location.path, bytes);
|
|
628
|
+
}
|
|
629
|
+
catch (error) {
|
|
630
|
+
if (error instanceof RoleArtifactError)
|
|
631
|
+
throw error;
|
|
632
|
+
throw new RoleArtifactError('write-failed', `Could not write ${location.path}: ${error.code ?? 'unknown error'}`);
|
|
633
|
+
}
|
|
634
|
+
// Read back either way. If another writer won the race this is also what proves
|
|
635
|
+
// its bytes are ours.
|
|
636
|
+
inspect();
|
|
637
|
+
return written(!published);
|
|
638
|
+
}
|