commandmate 0.49.3 → 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 +454 -408
- package/.next/app-path-routes-manifest.json +19 -13
- 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 +32 -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 +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.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 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -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 +11 -11
- 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 +19 -13
- 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 +2 -2
- 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/5350.js +6 -2
- 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/{9702.js → 7083.js} +1 -1
- 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 +97 -10
- package/.next/server/chunks/8918.js +3 -105
- package/.next/server/chunks/8955.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 +5 -5
- 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/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 +7 -1
- package/.next/types/validator.ts +54 -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/relays.d.ts +5 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +37 -1
- 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/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 +54 -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-errors.d.ts +23 -1
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -1
- package/dist/cli/utils/api-client-errors.js +14 -2
- package/dist/cli/utils/api-client.d.ts +8 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +13 -1
- 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/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 +25 -6
- package/dist/server/locales/ja/worktree.json +25 -6
- 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 +7 -1
- package/dist/server/src/lib/cli-tools/codex.js +134 -21
- package/dist/server/src/lib/cli-tools/command-code.js +24 -1
- package/dist/server/src/lib/cli-tools/copilot.js +36 -7
- 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 +58 -7
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +24 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +25 -1
- 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/db-instance.js +7 -37
- package/dist/server/src/lib/db/migrations/index.js +4 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- 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-db.js +35 -0
- 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/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 +16 -7
- 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 +22 -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-delivery-block.js +150 -0
- package/dist/server/src/lib/relay/relay-delivery.js +59 -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 +109 -13
- package/dist/server/src/lib/session/instance-input-lock.js +93 -4
- package/dist/server/src/lib/session/role-launch.js +722 -0
- package/dist/server/src/lib/session/send-attempt-state.js +7 -0
- package/dist/server/src/lib/session/send-user-message.js +6 -0
- 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/worktree-session-reconcile.js +5 -0
- 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.50.0.json +113 -0
- package/.next/server/chunks/1308.js +0 -1
- package/.next/server/chunks/4490.js +0 -1
- package/.next/server/chunks/4936.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6119.js +0 -1
- package/.next/server/chunks/7491.js +0 -3
- package/.next/server/chunks/7926.js +0 -1
- package/.next/server/chunks/9360.js +0 -2
- package/.next/server/chunks/9584.js +0 -1
- package/.next/static/LNfVZiq6FZwKsV7L9Mi6M/_buildManifest.js +0 -1
- package/.next/static/chunks/2407-87ec01332344ec2b.js +0 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +0 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.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-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.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-96fc12d400b49b13.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +0 -1
- package/.next/static/css/c1e307d05daf93b6.css +0 -1
- /package/.next/static/{LNfVZiq6FZwKsV7L9Mi6M → 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
|
+
}
|