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
|
@@ -20,6 +20,7 @@ const follow_up_command_1 = require("../utils/follow-up-command");
|
|
|
20
20
|
const auto_yes_1 = require("./auto-yes");
|
|
21
21
|
const relays_1 = require("./relays");
|
|
22
22
|
const message_dispatch_1 = require("./message-dispatch");
|
|
23
|
+
const agent_roles_1 = require("../utils/agent-roles");
|
|
23
24
|
/**
|
|
24
25
|
* The message length `send` is verified to deliver whole (Issue #2464): the
|
|
25
26
|
* largest body sent through the paste path to claude, codex, command-code and
|
|
@@ -65,12 +66,16 @@ function resolveAutoYesDurationMs(duration) {
|
|
|
65
66
|
* @param durationMs - Duration already validated by resolveAutoYesDurationMs()
|
|
66
67
|
* @param agent - CLI tool resolved for --instance (Issue #1629), else --agent
|
|
67
68
|
* @param contractPolicy - The policy of the contract this send created (Issue #3723), else null
|
|
69
|
+
* @param onlyIfOff - Refuse if a grant is on by the time it arrives (Issue #4132)
|
|
68
70
|
*/
|
|
69
|
-
async function enableAutoYes(client, worktreeId, options, durationMs, agent, instanceId, contractPolicy = null) {
|
|
71
|
+
async function enableAutoYes(client, worktreeId, options, durationMs, agent, instanceId, contractPolicy = null, onlyIfOff = false) {
|
|
70
72
|
const autoYesBody = {
|
|
71
73
|
enabled: true,
|
|
72
74
|
duration: durationMs,
|
|
73
75
|
};
|
|
76
|
+
if (onlyIfOff) {
|
|
77
|
+
autoYesBody.onlyIfOff = true;
|
|
78
|
+
}
|
|
74
79
|
if (agent) {
|
|
75
80
|
autoYesBody.cliToolId = agent;
|
|
76
81
|
}
|
|
@@ -104,23 +109,102 @@ async function enableAutoYes(client, worktreeId, options, durationMs, agent, ins
|
|
|
104
109
|
for (const line of (0, auto_yes_1.describeContractPolicy)(result?.contractPolicy ?? contractPolicy)) {
|
|
105
110
|
console.error(line);
|
|
106
111
|
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
/** The command that does what this send's --auto-yes asked for, on its own. */
|
|
115
|
+
function enableAutoYesCommand(worktreeId, options, agent, instanceId) {
|
|
116
|
+
return [
|
|
117
|
+
`commandmate auto-yes ${worktreeId} --enable --duration ${options.duration ?? duration_constants_1.DEFAULT_DURATION_FLAG}`,
|
|
118
|
+
...(instanceId ? [`--instance ${instanceId}`] : []),
|
|
119
|
+
...(agent && agent !== instanceId ? [`--agent ${agent}`] : []),
|
|
120
|
+
...(options.stopPattern ? [`--stop-pattern '${options.stopPattern.replace(/'/g, `'\\''`)}'`] : []),
|
|
121
|
+
...(options.autoYesAnswerMode ? [`--answer-mode ${options.autoYesAnswerMode}`] : []),
|
|
122
|
+
].join(' ');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* {@link enableAutoYes} once the message has gone out (Issue #4159). Whatever fails here is
|
|
126
|
+
* a warning and the send stays a success, as with {@link registerInstance}: an error exit
|
|
127
|
+
* reads as "not sent", and a script reading it would send the message twice. A 5xx or no
|
|
128
|
+
* answer may have armed it, and a grant on before this send may still be, so this says "may".
|
|
129
|
+
*/
|
|
130
|
+
async function enableAutoYesAfterSend(client, worktreeId, options, durationMs, agent, instanceId, contractPolicy) {
|
|
131
|
+
try {
|
|
132
|
+
await enableAutoYes(client, worktreeId, options, durationMs, agent, instanceId, contractPolicy);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
136
|
+
console.error(`Warning: the message was sent, but Auto-Yes may not be on with this send's terms (${reason}). `
|
|
137
|
+
+ `Do not send it again. To enable it: ${enableAutoYesCommand(worktreeId, options, agent, instanceId)}`);
|
|
138
|
+
}
|
|
107
139
|
}
|
|
108
140
|
/**
|
|
109
141
|
* Register an ad-hoc --instance session into the agent-instance roster
|
|
110
142
|
* (Issue #1000: --register). No-ops when already registered so `send
|
|
111
143
|
* --register` is safe to repeat across multiple messages to the same instance.
|
|
144
|
+
*
|
|
145
|
+
* This runs after the message went out, so whatever fails here (a roster that keeps moving,
|
|
146
|
+
* Issue #4149; anything else, Issue #4159) is a warning and the send stays a success: an
|
|
147
|
+
* error exit reads as "not sent", and a script reading it would send the message twice.
|
|
112
148
|
*/
|
|
113
149
|
async function registerInstance(client, worktreeId, instanceId, cliTool) {
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
150
|
+
const addCommand = `commandmate instances ${worktreeId} add --agent ${cliTool} --id ${instanceId}`;
|
|
151
|
+
try {
|
|
152
|
+
// Issue #4132: the whole list is replaced, so an add landing after this read has to
|
|
153
|
+
// survive it. Built again on a moved roster, where this one may be there by now.
|
|
154
|
+
const roster = await (0, agent_instances_1.fetchAgentRoster)(client, worktreeId);
|
|
155
|
+
const saved = await (0, agent_instances_1.saveRosterChange)(client, worktreeId, roster, (base) => {
|
|
156
|
+
if (base.some((inst) => inst.id === instanceId))
|
|
157
|
+
return null;
|
|
158
|
+
if (base.length >= agent_instances_1.MAX_AGENT_INSTANCES) {
|
|
159
|
+
console.error(`Warning: the message was sent, but could not register '${instanceId}' in the roster (already at the ${agent_instances_1.MAX_AGENT_INSTANCES}-instance limit). `
|
|
160
|
+
+ `Do not send it again. Make room, then: ${addCommand}`);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const added = { id: instanceId, cliTool, alias: (0, agent_instances_1.defaultAlias)(cliTool, instanceId), order: base.length };
|
|
164
|
+
return [...base, added];
|
|
165
|
+
});
|
|
166
|
+
if (saved !== null)
|
|
167
|
+
console.error(`Instance registered in roster: ${instanceId}`);
|
|
117
168
|
}
|
|
118
|
-
|
|
119
|
-
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error instanceof agent_roles_1.RoleCliError && error.code === 'roster_changed') {
|
|
171
|
+
console.error(`Warning: the message was sent, but '${instanceId}' was not added to the roster: it kept changing. Do not send it again. To register it: ${addCommand}`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// A save answered by a 5xx or not at all may have happened, so this does not say it did not.
|
|
175
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
176
|
+
console.error(`Warning: the message was sent, but registering '${instanceId}' in the roster failed, so it may not be there (${reason}). `
|
|
177
|
+
+ `Do not send it again. Check with \`commandmate instances ${worktreeId}\`. To register it: ${addCommand}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* `--register` with a role: the instance and its role are created together, before
|
|
182
|
+
* anything goes out, so the first start already has it (Issue #4116). Without a role
|
|
183
|
+
* the order stays as it was: sent, then {@link registerInstance}.
|
|
184
|
+
*
|
|
185
|
+
* Repeating the command creates nothing. The role on the send replaces what the
|
|
186
|
+
* instance holds, and is then a condition like any `--role`.
|
|
187
|
+
*
|
|
188
|
+
* @throws The roster changed since it was read (exit 31), or the server refused
|
|
189
|
+
*/
|
|
190
|
+
async function registerInstanceWithRole(client, worktreeId, instanceId, cliTool, role) {
|
|
191
|
+
const url = `/api/worktrees/${worktreeId}/instances/roles`;
|
|
192
|
+
const { instances, rosterRevision } = await client.get(url);
|
|
193
|
+
if (instances.some((instance) => instance.instanceId === instanceId))
|
|
120
194
|
return;
|
|
195
|
+
try {
|
|
196
|
+
await (0, agent_roles_1.roleWrite)(`commandmate instances ${worktreeId}`, () => client.post(url, {
|
|
197
|
+
instance: { id: instanceId, cliTool, alias: (0, agent_instances_1.defaultAlias)(cliTool, instanceId) },
|
|
198
|
+
role,
|
|
199
|
+
expectedRosterRevision: rosterRevision,
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
// Another send got there first; what remains is the same as a repeat.
|
|
204
|
+
if (error instanceof api_client_1.ApiError && error.payload?.error === 'instance_exists')
|
|
205
|
+
return;
|
|
206
|
+
throw error;
|
|
121
207
|
}
|
|
122
|
-
const next = [...existing, { id: instanceId, cliTool, alias: (0, agent_instances_1.defaultAlias)(cliTool, instanceId), order: existing.length }];
|
|
123
|
-
await (0, agent_instances_1.saveAgentInstances)(client, worktreeId, next);
|
|
124
208
|
console.error(`Instance registered in roster: ${instanceId}`);
|
|
125
209
|
}
|
|
126
210
|
/**
|
|
@@ -158,6 +242,8 @@ async function createContractTask(client, worktreeId, options, agent, instanceId
|
|
|
158
242
|
try {
|
|
159
243
|
const response = await client.post(`/api/worktrees/${worktreeId}/tasks`, body);
|
|
160
244
|
const created = (0, api_client_1.assertResponseShape)(response, ['task', 'message'], 'POST /api/worktrees/:id/tasks');
|
|
245
|
+
if (typeof created.roleWarning === 'string')
|
|
246
|
+
console.error(`Warning: ${created.roleWarning}`);
|
|
161
247
|
return {
|
|
162
248
|
taskId: created.task.id,
|
|
163
249
|
message: created.message,
|
|
@@ -172,9 +258,179 @@ async function createContractTask(client, worktreeId, options, agent, instanceId
|
|
|
172
258
|
}
|
|
173
259
|
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
174
260
|
}
|
|
261
|
+
// Issue #4115/#4116: the role settings moved since this process started.
|
|
262
|
+
const roleFailure = (0, agent_roles_1.roleFailureFromApi)(error);
|
|
263
|
+
if (roleFailure)
|
|
264
|
+
throw roleFailure;
|
|
175
265
|
throw error;
|
|
176
266
|
}
|
|
177
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* The tool and instance a request naming neither is answered for: the worktree's
|
|
270
|
+
* default, whose primary instance has the tool's own id (#868).
|
|
271
|
+
*/
|
|
272
|
+
async function effectiveTarget(client, worktreeId, agent, instanceId) {
|
|
273
|
+
const cliToolId = agent ?? (await (0, instances_1.resolveInstanceTarget)(client, worktreeId, undefined, undefined)).cliToolId;
|
|
274
|
+
return { cliToolId, instanceId: instanceId ?? cliToolId };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* The target of a conditional send that makes several requests about it (Issue #4116),
|
|
278
|
+
* named in all of them. Left to the server, each resolves the default for itself: a
|
|
279
|
+
* default moved from A to B between two of them has a read of A, a grant on B, a save on
|
|
280
|
+
* A and a message to B. So a refusal could then withdraw B's grant on A's evidence.
|
|
281
|
+
*/
|
|
282
|
+
async function pinCommandTarget(client, worktreeId, target) {
|
|
283
|
+
const pinned = await effectiveTarget(client, worktreeId, target.agent, target.instanceId);
|
|
284
|
+
return { ...target, agent: pinned.cliToolId, instanceId: pinned.instanceId };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* `--contract` with a role (Issue #4116): the task check compares the process with
|
|
288
|
+
* the SETTINGS, so `--role A` to a process running A while the setting says B would be
|
|
289
|
+
* refused for a setting this very command is replacing. A plain `send --role` saves,
|
|
290
|
+
* then checks; refused here, this does the same and checks again. Only then, because
|
|
291
|
+
* the contract is read first: a broken contract saves nothing.
|
|
292
|
+
*
|
|
293
|
+
* The save has what `POST /send` has before its own: the roster and the tool read
|
|
294
|
+
* again, against what this command was resolved to. Anything moved is exit 31 with
|
|
295
|
+
* nothing saved, up to the PUT itself, which carries the revision read (#4132). A change
|
|
296
|
+
* after that is seen only in its answer, which is then told. From the save on, anything
|
|
297
|
+
* that ends this command leaves the setting saved, so it is said right then. A PUT with
|
|
298
|
+
* no usable answer may have saved too, which {@link roleWrite} says.
|
|
299
|
+
*/
|
|
300
|
+
async function createContractTaskWithRole(client, worktreeId, options, agent, instanceId, role) {
|
|
301
|
+
if (role === undefined)
|
|
302
|
+
return createContractTask(client, worktreeId, options, agent, instanceId);
|
|
303
|
+
const target = await effectiveTarget(client, worktreeId, agent, instanceId);
|
|
304
|
+
const url = `/api/worktrees/${worktreeId}/instances/roles`;
|
|
305
|
+
const resolved = await client.get(url);
|
|
306
|
+
const toolOf = (settings) => settings.instances.find((instance) => instance.instanceId === target.instanceId)?.cliToolId;
|
|
307
|
+
try {
|
|
308
|
+
return await createContractTask(client, worktreeId, options, agent, instanceId);
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
if (!(error instanceof agent_roles_1.RoleCliError) || error.code !== 'ROLE_CONDITION_UNMET')
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
const rosterChanged = (message, details = {}) => new agent_roles_1.RoleCliError('roster_changed', message, types_1.RoleExitCode.CONFLICT, details);
|
|
315
|
+
const now = await client.get(url);
|
|
316
|
+
const toolThen = toolOf(resolved) ?? target.cliToolId;
|
|
317
|
+
if (now.rosterRevision !== resolved.rosterRevision || (toolOf(now) ?? toolThen) !== target.cliToolId) {
|
|
318
|
+
throw rosterChanged('The roster changed while this contract was being checked; nothing was saved or typed. Send it again.');
|
|
319
|
+
}
|
|
320
|
+
let saved;
|
|
321
|
+
try {
|
|
322
|
+
saved = await (0, agent_roles_1.roleWrite)(`commandmate instances ${worktreeId}`, async () => (0, api_client_1.assertResponseShape)(await client.put(url, { instanceId: target.instanceId, role, expectedRosterRevision: now.rosterRevision }), ['instances'], 'PUT /api/worktrees/:id/instances/roles'));
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
if (!(error instanceof agent_roles_1.RoleCliError) || error.code !== 'roster_changed')
|
|
326
|
+
throw error;
|
|
327
|
+
// Worth a read to say what moved. If it cannot be read, the refusal has said enough.
|
|
328
|
+
const latest = await client.get(url).catch(() => null);
|
|
329
|
+
const toolNow = latest && toolOf(latest);
|
|
330
|
+
throw rosterChanged(latest === null || toolNow === target.cliToolId
|
|
331
|
+
? 'The roster changed right before the save; nothing was saved or typed. Send it again.'
|
|
332
|
+
: `The role was not saved for ${target.instanceId}, which is now ${toolNow ?? 'not on the roster'}, not ${target.cliToolId}; `
|
|
333
|
+
+ 'nothing was typed. Send it again.');
|
|
334
|
+
}
|
|
335
|
+
const savedTool = toolOf(saved);
|
|
336
|
+
if (savedTool !== target.cliToolId) {
|
|
337
|
+
throw rosterChanged(`The role was saved for ${target.instanceId}, which is now ${savedTool ?? 'not on the roster'}, not ${target.cliToolId}; `
|
|
338
|
+
+ `nothing was typed. Check it with: commandmate instances ${worktreeId}`, { roleSettings: { saved: true } });
|
|
339
|
+
}
|
|
340
|
+
console.error(`Role saved for ${target.instanceId} ahead of the contract's check; it stays saved if this send goes no further.`);
|
|
341
|
+
return createContractTask(client, worktreeId, options, agent, instanceId);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Whether a failed send is known to have typed nothing: the server's word, or a 4xx
|
|
345
|
+
* refused before an attempt. Not known otherwise (no answer, a 5xx saying nothing).
|
|
346
|
+
*/
|
|
347
|
+
function knownNotSent(error, outcome) {
|
|
348
|
+
if (outcome !== null)
|
|
349
|
+
return outcome !== 'unknown';
|
|
350
|
+
if (!(error instanceof api_client_1.ApiError))
|
|
351
|
+
return false;
|
|
352
|
+
const reported = error.payload?.sendOutcome;
|
|
353
|
+
if (reported !== undefined)
|
|
354
|
+
return reported === 'not_sent';
|
|
355
|
+
return error.statusCode !== undefined && error.statusCode < 500;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* This target's Auto-Yes as the server reads it now, or null when it could not be read.
|
|
359
|
+
* Always names both: a read naming no tool answers another question.
|
|
360
|
+
*/
|
|
361
|
+
async function readAutoYes(client, worktreeId, target) {
|
|
362
|
+
try {
|
|
363
|
+
const query = new URLSearchParams({ cliToolId: target.cliToolId, instanceId: target.instanceId });
|
|
364
|
+
return await client.get(`/api/worktrees/${worktreeId}/auto-yes?${query.toString()}`);
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/** The name the server gives a grant (Issue #4132). An older server gives none. */
|
|
371
|
+
function grantIdOf(state) {
|
|
372
|
+
// The type is what the route should answer. An answer of another type is no name.
|
|
373
|
+
const grantId = state?.grantId;
|
|
374
|
+
return typeof grantId === 'string' ? grantId : undefined;
|
|
375
|
+
}
|
|
376
|
+
/** The command that stops one instance's Auto-Yes. An id that is no tool's own needs the tool as well. */
|
|
377
|
+
function stopAutoYesCommand(worktreeId, instanceId, cliToolId) {
|
|
378
|
+
const agent = cliToolId !== undefined && cliToolId !== instanceId ? ` --agent ${cliToolId}` : '';
|
|
379
|
+
return `commandmate auto-yes ${worktreeId} --disable --instance ${instanceId ?? '<instance-id>'}${agent}`;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Turn off the grant this send armed, and no other (Issue #4116). It is read right
|
|
383
|
+
* before, and the request itself says which grant it means (`expectedGrantId`, Issue
|
|
384
|
+
* #4132), so a grant someone armed since is theirs and stays, even with the same expiry.
|
|
385
|
+
* A server too old to name its grants cannot be asked for that: with only the read to go on,
|
|
386
|
+
* a grant armed right after it would be stopped too, so it is left on (Issue #4159).
|
|
387
|
+
* `{ enabled: false }` naming nobody would stop
|
|
388
|
+
* every instance of the worktree, so tool and instance are always named. A grant answered
|
|
389
|
+
* for another target than the one read beforehand may be overwriting one that was on,
|
|
390
|
+
* and that read says nothing about it. Anything not certain is left on, with the command
|
|
391
|
+
* that stops it.
|
|
392
|
+
*/
|
|
393
|
+
async function withdrawArmedAutoYes(client, worktreeId, target, armed) {
|
|
394
|
+
const cliToolId = armed?.cliToolId ?? target?.cliToolId;
|
|
395
|
+
const instanceId = armed?.instanceId ?? target?.instanceId;
|
|
396
|
+
const manual = stopAutoYesCommand(worktreeId, instanceId, cliToolId);
|
|
397
|
+
const leave = (why) => console.error(`Warning: Auto-Yes stays on (${why}). To turn it off: ${manual}`);
|
|
398
|
+
if (target && (cliToolId !== target.cliToolId || instanceId !== target.instanceId)) {
|
|
399
|
+
leave(`the server armed ${cliToolId}/${instanceId}, not the ${target.cliToolId}/${target.instanceId} this send read`);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (!cliToolId || !instanceId || typeof armed?.expiresAt !== 'number') {
|
|
403
|
+
leave('the grant this send armed could not be identified');
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
const now = await readAutoYes(client, worktreeId, { cliToolId, instanceId });
|
|
407
|
+
if (now === null || typeof now.enabled !== 'boolean') {
|
|
408
|
+
leave('it could not be read back');
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (!now.enabled)
|
|
412
|
+
return;
|
|
413
|
+
const grantId = grantIdOf(armed);
|
|
414
|
+
if (grantId === undefined) {
|
|
415
|
+
leave('this server does not name its grants, so turning it off could stop one armed since');
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
if (now.expiresAt !== armed.expiresAt
|
|
419
|
+
|| (armed.answerMode !== undefined && now.answerMode !== armed.answerMode)
|
|
420
|
+
|| grantIdOf(now) !== grantId) {
|
|
421
|
+
leave('it was updated after this send armed it');
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
await client.post(`/api/worktrees/${worktreeId}/auto-yes?expectedGrantId=${encodeURIComponent(grantId)}`, { enabled: false, cliToolId, instanceId });
|
|
426
|
+
console.error('Auto-yes withdrawn: the message was not sent.');
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
leave(error instanceof api_client_1.ApiError && error.apiCode === 'AUTO_YES_GRANT_CHANGED'
|
|
430
|
+
? 'it was updated after this send armed it'
|
|
431
|
+
: 'the request to turn it off failed');
|
|
432
|
+
}
|
|
433
|
+
}
|
|
178
434
|
/**
|
|
179
435
|
* Report a task transition to the server, best effort.
|
|
180
436
|
*
|
|
@@ -281,8 +537,52 @@ function validateSendModel(options, agent) {
|
|
|
281
537
|
}
|
|
282
538
|
}
|
|
283
539
|
}
|
|
540
|
+
/**
|
|
541
|
+
* The `--expect-*` flags as the `/send` field that carries them to the last check
|
|
542
|
+
* before the first key, or undefined when none was given (Issue #4116).
|
|
543
|
+
*/
|
|
544
|
+
function expectedRoleOf(options) {
|
|
545
|
+
const { expectRoleGeneration, expectRoleFingerprint, expectNoRole } = options;
|
|
546
|
+
if (expectRoleGeneration === undefined && expectRoleFingerprint === undefined && !expectNoRole)
|
|
547
|
+
return undefined;
|
|
548
|
+
if ((expectRoleFingerprint === undefined) === !expectNoRole) {
|
|
549
|
+
throw (0, agent_roles_1.usageError)('Give the pinned role with one of --expect-role-fingerprint <fingerprint> or --expect-no-role.');
|
|
550
|
+
}
|
|
551
|
+
return {
|
|
552
|
+
injectionFingerprint: expectRoleFingerprint ?? null,
|
|
553
|
+
...(expectRoleGeneration !== undefined ? { sessionGeneration: expectRoleGeneration } : {}),
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* `--new-conversation` applies to a stopped OpenCode V1 session and nothing else
|
|
558
|
+
* (Issue #4133). `POST /send` ignores the field anywhere else, without saying so, so
|
|
559
|
+
* this is the only place that can refuse it. Read before anything with a side effect.
|
|
560
|
+
*
|
|
561
|
+
* What remains: a start between this read and the send. Closing that takes the API.
|
|
562
|
+
*
|
|
563
|
+
* @throws A usage error (exit 2) for anything but a session known to be stopped
|
|
564
|
+
*/
|
|
565
|
+
async function assertNewConversationApplies(client, worktreeId, agent, instanceId) {
|
|
566
|
+
if (agent !== 'opencode') {
|
|
567
|
+
throw (0, agent_roles_1.usageError)(`--new-conversation applies only to OpenCode V1 (opencode), the one tool that resumes a remembered conversation; this send addresses ${agent ?? 'no tool'}. Nothing was sent.`);
|
|
568
|
+
}
|
|
569
|
+
const instance = instanceId ?? agent;
|
|
570
|
+
const query = new URLSearchParams({ cliTool: agent, instance });
|
|
571
|
+
const { isRunning, startingSince } = await client.get(`/api/worktrees/${worktreeId}/current-output?${query.toString()}`);
|
|
572
|
+
// Ahead of isRunning, which can be false during a launch: that is not "stopped".
|
|
573
|
+
// Absent on a server that predates the field, and then isRunning is all there is.
|
|
574
|
+
if (startingSince !== undefined && startingSince !== null) {
|
|
575
|
+
throw (0, agent_roles_1.usageError)(`--new-conversation applies when a session starts, and ${instance} is still starting. Nothing was sent. Stop it first: commandmate instances ${worktreeId} kill ${instance}`);
|
|
576
|
+
}
|
|
577
|
+
if (isRunning === true) {
|
|
578
|
+
throw (0, agent_roles_1.usageError)(`--new-conversation applies when a session starts, and ${instance} is running. Nothing was sent. Stop it first: commandmate instances ${worktreeId} kill ${instance}`);
|
|
579
|
+
}
|
|
580
|
+
if (isRunning !== false) {
|
|
581
|
+
throw (0, agent_roles_1.usageError)(`--new-conversation needs ${instance} stopped, and the server did not say whether it is. Nothing was sent.`);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
284
584
|
/** The `/send` request body. */
|
|
285
|
-
function buildSendBody(content, agent, instanceId, options) {
|
|
585
|
+
function buildSendBody(content, agent, instanceId, options, role) {
|
|
286
586
|
// [DR2-05] Send API uses "content" not "message"
|
|
287
587
|
const sendBody = { content };
|
|
288
588
|
if (agent) {
|
|
@@ -302,10 +602,22 @@ function buildSendBody(content, agent, instanceId, options) {
|
|
|
302
602
|
if (options.ignoreStructuredPrompt) {
|
|
303
603
|
sendBody.ignoreStructuredPromptGuard = true;
|
|
304
604
|
}
|
|
605
|
+
// Issue #4115/#4116: sent only when asked for, so a plain send stays the body it was.
|
|
606
|
+
if (role.assignment !== undefined) {
|
|
607
|
+
sendBody.role = role.assignment;
|
|
608
|
+
}
|
|
609
|
+
if (role.expected !== undefined) {
|
|
610
|
+
sendBody.expectedRole = role.expected;
|
|
611
|
+
}
|
|
612
|
+
// Issue #4133: sent only when asked for, and checked by the CLI first.
|
|
613
|
+
if (options.newConversation) {
|
|
614
|
+
sendBody.newConversation = true;
|
|
615
|
+
}
|
|
305
616
|
return sendBody;
|
|
306
617
|
}
|
|
307
618
|
function createSendCommand() {
|
|
308
619
|
const cmd = new commander_1.Command('send');
|
|
620
|
+
const bothRoleFlags = (0, agent_roles_1.watchRoleFlagConflict)(cmd);
|
|
309
621
|
cmd
|
|
310
622
|
.description('Send a message to a worktree agent')
|
|
311
623
|
.argument('<worktree-id>', 'Worktree ID')
|
|
@@ -313,6 +625,12 @@ function createSendCommand() {
|
|
|
313
625
|
.option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
|
|
314
626
|
.option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
|
|
315
627
|
.option('--register', 'Register the --instance session into the agent-instance roster (needs --agent unless the instance id is itself a CLI tool id)')
|
|
628
|
+
.option('--role <role>', 'Role ID or name this instance must hold: saved for it, and a condition of this send (see below)')
|
|
629
|
+
.option('--no-role', 'Like --role, for explicitly no role')
|
|
630
|
+
.option('--expect-role-generation <generation>', 'Only send to this process, as read from `capture --json` roleLaunch.sessionGeneration')
|
|
631
|
+
.option('--expect-role-fingerprint <fingerprint>', 'Only send to a process started with this injection fingerprint (roleLaunch.injectionFingerprint)')
|
|
632
|
+
.option('--expect-no-role', 'Only send to a process started with no role')
|
|
633
|
+
.option('--new-conversation', 'OpenCode V1, session stopped: start a new conversation instead of continuing the remembered one (see below)')
|
|
316
634
|
.option('--model <model>', 'Specify AI model for a Copilot, Antigravity or Claude agent. For Antigravity and Claude it is a launch'
|
|
317
635
|
+ ' flag: it applies only when this send starts the session, and a running session answers 400')
|
|
318
636
|
.option('--auto-yes', 'Enable auto-yes before sending (session-wide, no policy guard; for unattended runs prefer --contract with an autoYes policy)')
|
|
@@ -342,21 +660,111 @@ waits until the composer shows all of it. If it never does, nothing is
|
|
|
342
660
|
submitted and send exits 99 with "Message body did not arrive intact" -- it
|
|
343
661
|
does not print "Message sent.". For a longer brief, write it to a file in the
|
|
344
662
|
worktree and send a short message that tells the agent to read that file.
|
|
663
|
+
|
|
664
|
+
--role / --no-role (Issue #4116): a role is fixed when the process starts, so this is
|
|
665
|
+
a condition, not a switch. The setting is saved for the instance first. A session that
|
|
666
|
+
is not running starts with it; a running one gets the message only if it was started
|
|
667
|
+
with exactly what that setting injects. A different role, or a process whose start
|
|
668
|
+
this server has no record of (after a server restart), is exit 32 with nothing typed,
|
|
669
|
+
and the setting stays saved: stop the session (\`instances <wt> kill <id>\`) and send
|
|
670
|
+
again, with no --role needed. A role names an instance on the roster: an ad-hoc id
|
|
671
|
+
needs --register as well.
|
|
672
|
+
|
|
673
|
+
--register --role creates the instance and its role together BEFORE sending, so the
|
|
674
|
+
first start has it. Repeating that command creates nothing: --role replaces what the
|
|
675
|
+
instance holds and is a condition as above. A changed roster is exit 31, nothing sent.
|
|
676
|
+
--register without a role keeps its old order (sent, then registered) and never
|
|
677
|
+
touches a role already there. The message has gone out by then, so a roster that kept
|
|
678
|
+
changing, or any other failure to register, is a warning and exit 0 (Issues #4149, #4159):
|
|
679
|
+
do not send it again; the warning has the command that registers it.
|
|
680
|
+
|
|
681
|
+
--expect-* pin this send to what the caller read earlier, saving nothing; the server
|
|
682
|
+
reads them again right before the first key, so a process replaced in between gets
|
|
683
|
+
nothing (exit 32). \`launch-worker\` passes what its starting message fixed. With
|
|
684
|
+
--contract too, the contract is recorded as a failed task.
|
|
685
|
+
|
|
686
|
+
--auto-yes applied after the message (--model on a tool that arms after it, or a grant
|
|
687
|
+
already on) cannot take the send back: if it fails, that is a warning and exit 0, so do not
|
|
688
|
+
send it again; the warning has the command that enables it (Issue #4159). Armed before the
|
|
689
|
+
message, a failure is an error with nothing sent.
|
|
690
|
+
|
|
691
|
+
With a role or a pin, --auto-yes, --contract or --reply-to names the default target it
|
|
692
|
+
read in every request, so a default changed meanwhile does not split them. --auto-yes does not outlive a refusal: a grant this send armed is
|
|
693
|
+
withdrawn when nothing was typed, and a grant already on is left as it was until the
|
|
694
|
+
message is in. Only the grant it armed: one updated since is left on, with the command
|
|
695
|
+
that stops it. --auto-yes --reply-to with --instance is held to the same, with its relay
|
|
696
|
+
refused or the send refused (Issue #4144); naming no target, there is nothing to read
|
|
697
|
+
first, so a grant it armed stays on, with the command that stops it. --auto-yes with no role, pin or
|
|
698
|
+
--reply-to reads nothing first, by decision (Issue #4159): it cannot tell a grant it armed from
|
|
699
|
+
one already on, so a refused send leaves it on, with the command that stops it. Reading first
|
|
700
|
+
would add a request to every such send, and would move the new terms of a grant already on to
|
|
701
|
+
after the message. A server too old to name its grants is not asked to withdraw one either:
|
|
702
|
+
it stays on, with the same command. --contract --role saves the role before the contract's own check if that
|
|
703
|
+
check would refuse it, so it behaves like send --role; a broken contract saves nothing.
|
|
704
|
+
A refusal that comes after the save says the setting stayed saved, whatever refused it.
|
|
705
|
+
A save of its own (--contract --role, --register --role) answered by a 5xx or not at all
|
|
706
|
+
may have happened: it says that is not known, and how to check. A 4xx to that request saved
|
|
707
|
+
nothing. A plain send --role saves inside the send, and its own 400 or 409 can come after the
|
|
708
|
+
save: it then says the setting stayed saved.
|
|
709
|
+
What can be checked first (--model on a running session, the image path) saves nothing.
|
|
710
|
+
|
|
711
|
+
--new-conversation (Issue #4133): OpenCode V1 goes on with the conversation it remembers,
|
|
712
|
+
even under another role, and stopping the session does not forget it. This starts a new one,
|
|
713
|
+
and is for the send that starts the session: another tool, or a session running or starting
|
|
714
|
+
when this checks, is exit 2 with nothing sent. A start between that check and the send is
|
|
715
|
+
not caught.
|
|
716
|
+
|
|
717
|
+
Exit codes: 2 usage, or an unknown or ambiguous role, or a tool roles do not apply to
|
|
718
|
+
(nothing sent); 31 a roster conflict (nothing sent); 32 the role condition does not
|
|
719
|
+
hold or the start was refused because of its role (nothing typed).
|
|
345
720
|
`)
|
|
346
721
|
.action(async (worktreeId, message, options) => {
|
|
347
722
|
try {
|
|
348
723
|
const autoYesDurationMs = validateSendArgs(worktreeId, message, options);
|
|
724
|
+
if (bothRoleFlags())
|
|
725
|
+
throw (0, agent_roles_1.usageError)('Give --role or --no-role, not both.');
|
|
726
|
+
const expectedRole = expectedRoleOf(options);
|
|
349
727
|
const client = new api_client_1.ApiClient({ token: options.token });
|
|
350
728
|
// Issue #1629: --instance names an agent instance, not a CLI tool, and
|
|
351
729
|
// the roster is the only place that pairs the two. Resolve it once, up
|
|
352
730
|
// front, so the task row, the send and auto-yes all name the same tool
|
|
353
731
|
// as the session that actually starts.
|
|
354
|
-
const
|
|
355
|
-
const { agent, instanceId } = commandTarget;
|
|
732
|
+
const namedTarget = await (0, command_target_1.resolveCommandTarget)(client, worktreeId, options.instance, options.agent);
|
|
356
733
|
// Issue #2376: the RESOLVED id, never the string the user typed.
|
|
357
734
|
// `--instance "Codex 2"` has to reach /send as `codex-2`; no route but
|
|
358
735
|
// /resolve-target knows how to read an alias.
|
|
359
|
-
validateSendModel(options, agent);
|
|
736
|
+
validateSendModel(options, namedTarget.agent);
|
|
737
|
+
// Issue #4116: fixed here, before any side effect, so a default that cannot be
|
|
738
|
+
// read stops the command with nothing done. A send with no role or pin, or that
|
|
739
|
+
// is one request, is left to the server's reading as it always was.
|
|
740
|
+
const conditional = options.role !== undefined || expectedRole !== undefined;
|
|
741
|
+
// Issue #4133: --new-conversation too, so the send goes where its check looked.
|
|
742
|
+
const pinsTarget = Boolean(options.newConversation)
|
|
743
|
+
|| (conditional && Boolean(options.autoYes || options.contract || options.replyTo));
|
|
744
|
+
const commandTarget = pinsTarget ? await pinCommandTarget(client, worktreeId, namedTarget) : namedTarget;
|
|
745
|
+
const { agent, instanceId } = commandTarget;
|
|
746
|
+
if (options.newConversation)
|
|
747
|
+
await assertNewConversationApplies(client, worktreeId, agent, instanceId);
|
|
748
|
+
// Issue #4116: named before anything with a side effect, so a role that does
|
|
749
|
+
// not exist leaves no task row and no armed Auto-Yes behind.
|
|
750
|
+
if (options.role !== undefined && agent !== undefined)
|
|
751
|
+
(0, agent_roles_1.assertRoleTool)(agent);
|
|
752
|
+
const roleAssignment = await (0, agent_roles_1.roleAssignmentFromFlag)(client, options.role);
|
|
753
|
+
// Issue #4133: a --reply-to that cannot be resolved exits 2 on the spot, from
|
|
754
|
+
// several depths. With a contract that has to be before the task row exists, and
|
|
755
|
+
// with --auto-yes before the grant (Issue #4144). Only opening the relay can still
|
|
756
|
+
// be refused after them: that closes the task and withdraws the grant.
|
|
757
|
+
const relayTarget = {
|
|
758
|
+
worktreeId,
|
|
759
|
+
instance: pinsTarget ? instanceId : options.instance,
|
|
760
|
+
agent: pinsTarget ? agent : options.agent,
|
|
761
|
+
};
|
|
762
|
+
const relayEndpoints = options.replyTo && (options.contract || options.autoYes)
|
|
763
|
+
? await (0, message_dispatch_1.resolveRelayEndpoints)(client, { ...relayTarget, replyTo: options.replyTo })
|
|
764
|
+
: undefined;
|
|
765
|
+
if (roleAssignment !== undefined && options.register && instanceId) {
|
|
766
|
+
await registerInstanceWithRole(client, worktreeId, instanceId, options.agent ?? instanceId, roleAssignment);
|
|
767
|
+
}
|
|
360
768
|
// Issue #1545: resolve the contract before anything with a side effect,
|
|
361
769
|
// so an invalid contract cannot leave auto-yes enabled for a message
|
|
362
770
|
// that was never sent.
|
|
@@ -365,7 +773,7 @@ worktree and send a short message that tells the agent to read that file.
|
|
|
365
773
|
let contractPolicy = null;
|
|
366
774
|
let content = message;
|
|
367
775
|
if (options.contract) {
|
|
368
|
-
const task = await
|
|
776
|
+
const task = await createContractTaskWithRole(client, worktreeId, options, agent, instanceId, roleAssignment);
|
|
369
777
|
taskId = task.taskId;
|
|
370
778
|
content = task.message;
|
|
371
779
|
contractPolicy = task.contractPolicy;
|
|
@@ -387,7 +795,46 @@ worktree and send a short message that tells the agent to read that file.
|
|
|
387
795
|
// claude model is a launch flag with no interaction to protect, and a
|
|
388
796
|
// contract send must have Auto-Yes on BEFORE the worker starts working.
|
|
389
797
|
const deferAutoYes = Boolean(options.model) && agent !== 'claude';
|
|
390
|
-
|
|
798
|
+
const registerRelay = async (onFailure) => {
|
|
799
|
+
const registered = await (0, message_dispatch_1.registerRelayForMessage)(client, {
|
|
800
|
+
...relayTarget,
|
|
801
|
+
replyTo: options.replyTo,
|
|
802
|
+
allowRelayChain: options.allowRelayChain,
|
|
803
|
+
endpoints: relayEndpoints,
|
|
804
|
+
onFailure,
|
|
805
|
+
});
|
|
806
|
+
// stderr, not stdout: `--contract` already owns this command's stdout
|
|
807
|
+
// (it prints the task id there), and two commands writing two ids to
|
|
808
|
+
// one stream is how a `$(…)` capture ends up with both. `ask --async`
|
|
809
|
+
// is the form that hands the relay id back on stdout.
|
|
810
|
+
console.error(`Relay registered: ${registered.id}`);
|
|
811
|
+
return registered;
|
|
812
|
+
};
|
|
813
|
+
// Issue #4116: a send with a role can be refused after Auto-Yes went on, and a
|
|
814
|
+
// grant left behind answers a process this send never reached. So it looks
|
|
815
|
+
// first. Already on: that grant goes on answering, untouched, and this send's
|
|
816
|
+
// terms replace it only once the message is in. Off: armed now, and withdrawn
|
|
817
|
+
// on a refusal. Its relay goes first too, because a refused relay exits on the
|
|
818
|
+
// spot. A send saying nothing about a role reads nothing and is as it was, unless
|
|
819
|
+
// it has a relay to open after arming, which can be refused too (Issue #4144). It
|
|
820
|
+
// pins no target, so with none named there is nothing to read: the state stays
|
|
821
|
+
// unknown, and so does the grant's fate on a refusal.
|
|
822
|
+
let relay;
|
|
823
|
+
if (options.replyTo && conditional)
|
|
824
|
+
relay = await registerRelay(failTask);
|
|
825
|
+
const armsNow = options.autoYes && !deferAutoYes;
|
|
826
|
+
const autoYesTarget = armsNow && (conditional || options.replyTo) ? { cliToolId: agent, instanceId } : null;
|
|
827
|
+
const priorState = autoYesTarget?.cliToolId && autoYesTarget.instanceId
|
|
828
|
+
? await readAutoYes(client, worktreeId, { cliToolId: autoYesTarget.cliToolId, instanceId: autoYesTarget.instanceId })
|
|
829
|
+
: null;
|
|
830
|
+
let priorAutoYes = autoYesTarget === null
|
|
831
|
+
? false
|
|
832
|
+
: typeof priorState?.enabled === 'boolean' ? priorState.enabled : null;
|
|
833
|
+
// Off when read, so it can only be armed if it is off still: overwriting a grant armed
|
|
834
|
+
// since would make it this send's to withdraw.
|
|
835
|
+
const onlyIfOff = conditional || (autoYesTarget !== null && priorAutoYes === false);
|
|
836
|
+
let armedGrant;
|
|
837
|
+
if (armsNow && priorAutoYes !== true) {
|
|
391
838
|
// Issue #3290: the server can refuse this — 409 when the session by
|
|
392
839
|
// that name belongs to another CommandMate server — and the command
|
|
393
840
|
// then stops here, after --contract created the task row and before
|
|
@@ -396,57 +843,98 @@ worktree and send a short message that tells the agent to read that file.
|
|
|
396
843
|
// that never went out, which is the state #1608 removed for a bad
|
|
397
844
|
// --duration.
|
|
398
845
|
try {
|
|
399
|
-
await enableAutoYes(client, worktreeId, options, autoYesDurationMs, agent, instanceId, contractPolicy);
|
|
846
|
+
armedGrant = await enableAutoYes(client, worktreeId, options, autoYesDurationMs, agent, instanceId, contractPolicy, onlyIfOff);
|
|
400
847
|
}
|
|
401
848
|
catch (error) {
|
|
402
|
-
|
|
403
|
-
|
|
849
|
+
// Issue #4132: a grant armed since that read. It is theirs: it stays as it
|
|
850
|
+
// is, and this is now the send that found one on.
|
|
851
|
+
if (!onlyIfOff || !(error instanceof api_client_1.ApiError) || error.apiCode !== 'AUTO_YES_ALREADY_ENABLED') {
|
|
852
|
+
await failTask();
|
|
853
|
+
if (relay)
|
|
854
|
+
await (0, relays_1.cancelRelayQuietly)(client, relay.id);
|
|
855
|
+
throw error;
|
|
856
|
+
}
|
|
857
|
+
priorAutoYes = true;
|
|
404
858
|
}
|
|
405
859
|
}
|
|
860
|
+
const applyAutoYesAfterSend = options.autoYes && (deferAutoYes || priorAutoYes === true);
|
|
861
|
+
/** Issue #4116, #4144: what a send that read the state armed, once it failed. */
|
|
862
|
+
const withdrawAutoYes = async (notSent) => {
|
|
863
|
+
const stop = stopAutoYesCommand(worktreeId, armedGrant?.instanceId ?? instanceId, armedGrant?.cliToolId ?? agent);
|
|
864
|
+
// Issue #4159: read nothing first, so it may be a grant that was on before (see --help).
|
|
865
|
+
if (autoYesTarget === null) {
|
|
866
|
+
if (armsNow)
|
|
867
|
+
console.error(`Warning: Auto-Yes stays on (this send did not read it first, so it may have been on already). To turn it off: ${stop}`);
|
|
868
|
+
return;
|
|
869
|
+
}
|
|
870
|
+
if (priorAutoYes === true)
|
|
871
|
+
return;
|
|
872
|
+
if (priorAutoYes === null || !notSent) {
|
|
873
|
+
const why = priorAutoYes === null ? 'it was not known to be off' : 'the message may have gone in';
|
|
874
|
+
console.error(`Warning: Auto-Yes stays on (${why}). To turn it off: ${stop}`);
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
await withdrawArmedAutoYes(client, worktreeId, autoYesTarget, armedGrant);
|
|
878
|
+
};
|
|
406
879
|
// Issue #2377: the relay is registered BEFORE the message goes out, so a
|
|
407
880
|
// session that answers immediately cannot finish its turn in the window
|
|
408
881
|
// between the send and the ledger row — the completion trigger reads the
|
|
409
882
|
// ledger, and a row that does not exist yet is a reply nobody collects.
|
|
410
|
-
// A refusal exits 2 here, having sent nothing.
|
|
411
|
-
|
|
412
|
-
if (options.replyTo) {
|
|
413
|
-
relay = await (
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
instance: options.instance,
|
|
417
|
-
agent: options.agent,
|
|
418
|
-
allowRelayChain: options.allowRelayChain,
|
|
883
|
+
// A refusal exits 2 here, having sent nothing. Any failure here is before the
|
|
884
|
+
// message, so the grant armed above has nothing to answer (Issue #4144).
|
|
885
|
+
if (options.replyTo && !conditional) {
|
|
886
|
+
relay = await registerRelay(async () => {
|
|
887
|
+
await failTask();
|
|
888
|
+
await withdrawAutoYes(true);
|
|
419
889
|
});
|
|
420
|
-
// stderr, not stdout: `--contract` already owns this command's stdout
|
|
421
|
-
// (it prints the task id there), and two commands writing two ids to
|
|
422
|
-
// one stream is how a `$(…)` capture ends up with both. `ask --async`
|
|
423
|
-
// is the form that hands the relay id back on stdout.
|
|
424
|
-
console.error(`Relay registered: ${relay.id}`);
|
|
425
890
|
}
|
|
426
|
-
const sendBody = buildSendBody(content, agent, instanceId, options
|
|
891
|
+
const sendBody = buildSendBody(content, agent, instanceId, options, {
|
|
892
|
+
assignment: roleAssignment,
|
|
893
|
+
expected: expectedRole,
|
|
894
|
+
});
|
|
427
895
|
// Issue #3957: a bound relay's id rides on the send, which reserves it
|
|
428
896
|
// and records where the body went in.
|
|
429
|
-
await (0, message_dispatch_1.postMessage)(client, worktreeId, sendBody, {
|
|
897
|
+
const sent = await (0, message_dispatch_1.postMessage)(client, worktreeId, sendBody, {
|
|
430
898
|
relay,
|
|
431
|
-
onFailure:
|
|
899
|
+
onFailure: async (error, outcome) => {
|
|
900
|
+
await failTask();
|
|
901
|
+
await withdrawAutoYes(knownNotSent(error, outcome));
|
|
902
|
+
// Issue #4116: no answer, so the send may have got as far as the save.
|
|
903
|
+
// A 5xx with a body that says nothing of the setting is no better an answer.
|
|
904
|
+
const saidNothing = error instanceof api_client_1.ApiError
|
|
905
|
+
&& (!error.payload || ((error.statusCode ?? 500) >= 500 && error.payload.roleSettings === undefined));
|
|
906
|
+
if (roleAssignment !== undefined && saidNothing) {
|
|
907
|
+
console.error(`Note: whether the role setting was saved is not known. Check it with: commandmate instances ${worktreeId}`);
|
|
908
|
+
}
|
|
909
|
+
},
|
|
432
910
|
promptWaitingFallback: promptWaitingFallback(worktreeId, commandTarget),
|
|
433
911
|
target: commandTarget,
|
|
434
912
|
});
|
|
435
913
|
console.error('Message sent.');
|
|
914
|
+
if (sent?.replacesDefaultInstructions) {
|
|
915
|
+
console.error(`Note: on ${agent ?? 'this tool'}, the role replaces the tool's default instructions rather than adding to them.`);
|
|
916
|
+
}
|
|
917
|
+
// Not the server's sentence: it names an API field, and this command has no such flag.
|
|
918
|
+
if (sent?.roleResume?.continued) {
|
|
919
|
+
console.error('Note: this conversation continues under a different role, and what the earlier role said stays in its history. '
|
|
920
|
+
+ 'The CLI cannot start a new conversation on a running session, and stopping it does not forget this one: '
|
|
921
|
+
+ `stop it (\`commandmate instances ${worktreeId} kill ${instanceId ?? agent ?? '<instance-id>'}\`) and send with --new-conversation.`);
|
|
922
|
+
}
|
|
436
923
|
if (taskId) {
|
|
437
924
|
await reportTaskStatus(client, taskId, 'running');
|
|
438
925
|
}
|
|
439
926
|
// Issue #1000: register the ad-hoc instance into the roster after the
|
|
440
927
|
// session has started, so a follow-up `commandmate instances` lists it.
|
|
441
|
-
|
|
928
|
+
// Issue #4116: with a role it was registered before the send.
|
|
929
|
+
if (options.register && instanceId && roleAssignment === undefined) {
|
|
442
930
|
await registerInstance(client, worktreeId, instanceId, options.agent ?? instanceId);
|
|
443
931
|
}
|
|
444
932
|
// Issue #576: Enable auto-yes AFTER send when --model is specified
|
|
445
933
|
// This avoids auto-yes interfering with the /model command interaction.
|
|
446
934
|
// A failure here does not fail the task: the message was delivered and
|
|
447
|
-
// the task is running, which is what the row already says.
|
|
448
|
-
if (
|
|
449
|
-
await
|
|
935
|
+
// the task is running, which is what the row already says. Nor the command (Issue #4159).
|
|
936
|
+
if (applyAutoYesAfterSend) {
|
|
937
|
+
await enableAutoYesAfterSend(client, worktreeId, options, autoYesDurationMs, agent, instanceId, contractPolicy);
|
|
450
938
|
}
|
|
451
939
|
}
|
|
452
940
|
catch (error) {
|