commandmate 0.42.2 → 0.44.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 +176 -176
- package/.next/app-path-routes-manifest.json +34 -34
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +15 -15
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js.nft.json +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 +103 -1
- 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.js.nft.json +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.nft.json +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/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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 -1
- 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.nft.json +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.js.nft.json +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 +3 -1
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +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 -103
- 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 +3 -1
- 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 +3 -1
- 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 +3 -1
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 -103
- 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 +103 -1
- 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.js.nft.json +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.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 +103 -1
- 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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +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.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +9 -9
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +34 -34
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +4 -3
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/252.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +3 -3
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5775.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- 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/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +1 -1
- package/.next/server/chunks/6927.js +1 -0
- package/.next/server/chunks/7491.js +3 -0
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +4 -3
- package/.next/server/chunks/8918.js +108 -6
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/{8052.js → 9353.js} +4 -2
- package/.next/server/chunks/9390.js +3 -0
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/chunks/967.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-340774f1a24f2b45.js} +1 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
- package/.next/static/chunks/8165-3853772f6ae1299b.js +1 -0
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
- package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-0fc249fb7de75a27.js} +1 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +1 -0
- package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +58 -620
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +23 -149
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +24 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +155 -6
- package/dist/cli/commands/reply.d.ts +40 -0
- package/dist/cli/commands/reply.d.ts.map +1 -0
- package/dist/cli/commands/reply.js +133 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/commands/wait.d.ts +5 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +10 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +13 -0
- package/dist/cli/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +366 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/types/api-responses.d.ts +11 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/reply-ledger.d.ts +95 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
- package/dist/cli/utils/reply-ledger.js +187 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
- package/dist/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
- package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +5 -1
- package/dist/lib/detection/tools/verified-against.d.ts +15 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +17 -1
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +14 -1
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/locales/en/worktree.json +72 -20
- package/dist/server/locales/ja/worktree.json +72 -20
- package/dist/server/server.js +23 -0
- package/dist/server/src/config/cli-tool-timing-config.js +19 -1
- package/dist/server/src/config/detection-evidence-config.js +3 -0
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/config/schedule-config.js +55 -1
- package/dist/server/src/lib/auto-yes-poller.js +69 -4
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
- package/dist/server/src/lib/cli-tools/base.js +6 -2
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +81 -2
- package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
- package/dist/server/src/lib/cli-tools/index.js +3 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
- package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
- package/dist/server/src/lib/cli-tools/opencode.js +29 -5
- package/dist/server/src/lib/cli-tools/types.js +5 -1
- package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/cmate-validator.js +13 -1
- package/dist/server/src/lib/detection/cli-patterns.js +172 -3
- package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
- package/dist/server/src/lib/detection/status-detector.js +10 -1
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
- package/dist/server/src/lib/detection/tools/registry.js +2 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
- package/dist/server/src/lib/detection/upstream-faults.js +8 -0
- package/dist/server/src/lib/detection/version-probes.js +14 -1
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
- package/dist/server/src/lib/hooks/sources/registry.js +2 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
- package/dist/server/src/lib/job-executor.js +2 -1
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
- package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
- package/dist/server/src/lib/relay/relay-delivery.js +4 -1
- package/dist/server/src/lib/session/agent-event-state.js +24 -0
- package/dist/server/src/lib/session/claude-executor.js +186 -12
- package/dist/server/src/lib/session/claude-session.js +131 -15
- package/dist/server/src/lib/session/current-output-builder.js +27 -3
- package/dist/server/src/lib/session/send-user-message.js +4 -0
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/session/structured-prompt.js +54 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +73 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +281 -10
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- package/dist/server/src/types/cli-tool-contracts.js +10 -2
- package/dist/types/cli-tool-contracts.d.ts +16 -5
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +10 -2
- package/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +19 -7
- package/release-notes/0.43.0.json +130 -0
- package/release-notes/0.44.0.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +14 -0
- package/scripts/opencode-v2/launch.sh +226 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/4443.js +0 -3
- package/.next/server/chunks/5164.js +0 -1
- package/.next/server/chunks/5742.js +0 -1
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
- package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
- package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
- package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
- package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
- /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"systemMessage": "システムメッセージ",
|
|
66
66
|
"systemMessageLabel": "システムメッセージ",
|
|
67
67
|
"openFile": "ファイルを開く: {path}",
|
|
68
|
+
"imageLoading": "画像を読み込み中…",
|
|
69
|
+
"imageUnavailable": "画像を表示できません",
|
|
70
|
+
"openImage": "画像を開く: {path}",
|
|
71
|
+
"videoLabel": "動画: {path}",
|
|
68
72
|
"conversationLabel": "会話: {preview}",
|
|
69
73
|
"filePathMissing": "このパスは worktree にありません"
|
|
70
74
|
},
|
|
@@ -117,7 +121,10 @@
|
|
|
117
121
|
"command-code": "Command Code またはプロバイダーからログアウト",
|
|
118
122
|
"antigravity": "ログアウト"
|
|
119
123
|
},
|
|
120
|
-
"quit":
|
|
124
|
+
"quit": {
|
|
125
|
+
"codex": "Codex CLI を終了",
|
|
126
|
+
"opencode-v2": "OpenCode V2 を終了"
|
|
127
|
+
},
|
|
121
128
|
"diff": "Git の差分を表示(未追跡ファイルを含む)",
|
|
122
129
|
"mention": "次のやり取りにファイル/フォルダを添付",
|
|
123
130
|
"mcp": "MCP サーバーと利用可能なツールを管理",
|
|
@@ -126,7 +133,8 @@
|
|
|
126
133
|
"claude": "リポジトリ向けの CLAUDE.md ガイドを生成",
|
|
127
134
|
"copilot": "このリポジトリ向けの Copilot 指示ファイルを初期化",
|
|
128
135
|
"opencode": "AGENTS.md のガイド付きセットアップを実行",
|
|
129
|
-
"command-code": "このプロジェクト向けの AGENTS.md を生成"
|
|
136
|
+
"command-code": "このプロジェクト向けの AGENTS.md を生成",
|
|
137
|
+
"opencode-v2": "AGENTS.md のガイド付きセットアップを実行"
|
|
130
138
|
},
|
|
131
139
|
"feedback": {
|
|
132
140
|
"codex": "Codex チームにフィードバックを送信",
|
|
@@ -149,7 +157,8 @@
|
|
|
149
157
|
"copilot": "機能を拡張するスキルを管理",
|
|
150
158
|
"opencode": "利用可能なスキルを一覧・実行",
|
|
151
159
|
"command-code": "エージェントスキルを一覧・表示",
|
|
152
|
-
"antigravity": "利用できるスキルを一覧表示"
|
|
160
|
+
"antigravity": "利用できるスキルを一覧表示",
|
|
161
|
+
"opencode-v2": "利用可能なスキルを一覧"
|
|
153
162
|
},
|
|
154
163
|
"hooks": "フック設定を確認・管理",
|
|
155
164
|
"sessions": "会話履歴を閲覧",
|
|
@@ -160,7 +169,8 @@
|
|
|
160
169
|
"codex": "CLI を終了",
|
|
161
170
|
"copilot": "CLI を終了",
|
|
162
171
|
"command-code": "Command Code を終了",
|
|
163
|
-
"antigravity": "CLI を終了"
|
|
172
|
+
"antigravity": "CLI を終了",
|
|
173
|
+
"opencode-v2": "OpenCode V2 を終了"
|
|
164
174
|
},
|
|
165
175
|
"models": "AI モデルを切り替え",
|
|
166
176
|
"agents": {
|
|
@@ -168,7 +178,8 @@
|
|
|
168
178
|
"claude": "サブエージェントの作成・管理を Claude に依頼するか .claude/agents/ を直接編集するよう促す案内を表示",
|
|
169
179
|
"codex": "稼働中のすべてのエージェントセッションを一覧・切り替え",
|
|
170
180
|
"command-code": "エージェント構成を管理",
|
|
171
|
-
"antigravity": "利用できるカスタムエージェントを一覧表示"
|
|
181
|
+
"antigravity": "利用できるカスタムエージェントを一覧表示",
|
|
182
|
+
"opencode-v2": "エージェントを切り替え"
|
|
172
183
|
},
|
|
173
184
|
"themes": "TUI のテーマを変更",
|
|
174
185
|
"editor": "長文メッセージ用のエディタを開く",
|
|
@@ -182,7 +193,8 @@
|
|
|
182
193
|
"bug": "バグを報告、または会話を共有",
|
|
183
194
|
"cd": {
|
|
184
195
|
"claude": "このセッションの作業ディレクトリを変更",
|
|
185
|
-
"codex": "現在の作業ディレクトリを変更"
|
|
196
|
+
"codex": "現在の作業ディレクトリを変更",
|
|
197
|
+
"opencode-v2": "作業ディレクトリを変更"
|
|
186
198
|
},
|
|
187
199
|
"chrome": "Claude in Chrome の設定",
|
|
188
200
|
"claude-api": "プロジェクトの言語向けの Claude API リファレンスと Managed Agents リファレンスを読み込み",
|
|
@@ -192,7 +204,8 @@
|
|
|
192
204
|
"dataviz": "チャート・グラフ・ダッシュボードの設計ガイダンス",
|
|
193
205
|
"debug": {
|
|
194
206
|
"claude": "デバッグログを有効化し、セッションのデバッグログを読んで問題を切り分け",
|
|
195
|
-
"opencode": "デバッグ情報を表示"
|
|
207
|
+
"opencode": "デバッグ情報を表示",
|
|
208
|
+
"opencode-v2": "デバッグ情報を表示"
|
|
196
209
|
},
|
|
197
210
|
"deep-research": "質問に対して web 検索を展開し、出典を突き合わせて引用付きレポートを作成",
|
|
198
211
|
"design-login": "claude.ai アカウントで /design-sync のデザインシステムアクセスを認可",
|
|
@@ -320,7 +333,10 @@
|
|
|
320
333
|
"rubber-duck": "現在の作業への独立した批評を取得",
|
|
321
334
|
"search": "会話タイムラインを検索",
|
|
322
335
|
"session": "セッションを表示・管理",
|
|
323
|
-
"settings":
|
|
336
|
+
"settings": {
|
|
337
|
+
"copilot": "設定 UI を開く、または個別の値を表示・設定",
|
|
338
|
+
"opencode-v2": "設定を開く"
|
|
339
|
+
},
|
|
324
340
|
"share": "セッションを Markdown ファイルや GitHub gist として共有",
|
|
325
341
|
"undo": "直前のターンを巻き戻してファイル変更を取り消し",
|
|
326
342
|
"update": "CLI を最新バージョンに更新",
|
|
@@ -351,7 +367,10 @@
|
|
|
351
367
|
"plan-review": "このセッションの最新プランをレビュー表示で開く",
|
|
352
368
|
"plans": "保存済みプランの閲覧・レビュー・注釈",
|
|
353
369
|
"pr-comments": "現在のブランチの PR コメントをすべて取得",
|
|
354
|
-
"reload":
|
|
370
|
+
"reload": {
|
|
371
|
+
"command-code": "CLI を再起動してこのセッションを再開し、保留中の更新を適用",
|
|
372
|
+
"opencode-v2": "設定を再読み込み"
|
|
373
|
+
},
|
|
355
374
|
"session-file": "現在のセッション ID とセッションファイルのパスを表示",
|
|
356
375
|
"taste": "taste 学習と利用状況を管理",
|
|
357
376
|
"todos": "セッションの TODO リストを管理",
|
|
@@ -368,7 +387,10 @@
|
|
|
368
387
|
"daemon": "ローカルのバックグラウンドサーバを管理",
|
|
369
388
|
"warnings": "保持されている警告と診断情報を表示",
|
|
370
389
|
"credits": "残りの G1 クレジットと購入リンクを表示",
|
|
371
|
-
"open":
|
|
390
|
+
"open": {
|
|
391
|
+
"antigravity": "ファイルを開く、または開いた・編集したファイルを表示",
|
|
392
|
+
"opencode-v2": "セッションまたはプロジェクトを開く"
|
|
393
|
+
},
|
|
372
394
|
"schedule": "指示を定期実行、または一度きりのタイマーで実行",
|
|
373
395
|
"browser": "ブラウザエージェントで Web 上の作業を実行",
|
|
374
396
|
"grill-me": "計画をすり合わせるために質問してもらう",
|
|
@@ -379,7 +401,16 @@
|
|
|
379
401
|
"automation": "定期実行するバックグラウンド自動処理を対話形式で作成",
|
|
380
402
|
"migrate-workflows": "旧形式のワークフローをスキルへ移行",
|
|
381
403
|
"artifact": "アーティファクトを表示・レビュー",
|
|
382
|
-
"codesearch": "ワークスペース内のコードを検索"
|
|
404
|
+
"codesearch": "ワークスペース内のコードを検索",
|
|
405
|
+
"continue": "別のセッションに切り替え",
|
|
406
|
+
"pair": "この OpenCode に別のデバイスをペアリング",
|
|
407
|
+
"project": "セッションまたはプロジェクトを開く",
|
|
408
|
+
"projects": "セッションまたはプロジェクトを開く",
|
|
409
|
+
"q": "OpenCode V2 を終了",
|
|
410
|
+
"stats": "使用量の統計を表示",
|
|
411
|
+
"thinking": "モデルのバリアントを切り替え",
|
|
412
|
+
"web": "この OpenCode に別のデバイスをペアリング",
|
|
413
|
+
"worktrees": "ワークスペースを管理"
|
|
383
414
|
}
|
|
384
415
|
},
|
|
385
416
|
"session": {
|
|
@@ -464,7 +495,10 @@
|
|
|
464
495
|
"buttonAriaLabel": "CommandMate を v{version} にアップデート",
|
|
465
496
|
"buttonReleaseAriaLabel": "v{version} のリリースページを開く",
|
|
466
497
|
"buttonUpdating": "更新中…",
|
|
467
|
-
"statusDialogTitle": "アップデートの状態"
|
|
498
|
+
"statusDialogTitle": "アップデートの状態",
|
|
499
|
+
"pendingLabel": "v{version} 公開準備中",
|
|
500
|
+
"pendingDescription": "v{version} は npm への反映待ちです。反映されると更新できるようになります。",
|
|
501
|
+
"notYetPublished": "npm への反映待ちです。しばらくしてから再度お試しください。"
|
|
468
502
|
},
|
|
469
503
|
"terminal": {
|
|
470
504
|
"historyLabel": "履歴",
|
|
@@ -1070,11 +1104,26 @@
|
|
|
1070
1104
|
"close": "閉じる (Esc)",
|
|
1071
1105
|
"closeAria": "この画面を閉じる (Esc)"
|
|
1072
1106
|
},
|
|
1073
|
-
"
|
|
1074
|
-
"
|
|
1075
|
-
"
|
|
1076
|
-
"
|
|
1077
|
-
"
|
|
1107
|
+
"planReview": {
|
|
1108
|
+
"groupLabel": "プランのレビュー",
|
|
1109
|
+
"commentLabel": "プランへのコメント",
|
|
1110
|
+
"commentPlaceholder": "直してほしい点を書く(コメントを追加 → レビューを送信)",
|
|
1111
|
+
"comment": "コメントを追加",
|
|
1112
|
+
"submit": "レビューを送信 (Ctrl+R)",
|
|
1113
|
+
"approve": "承認 (Ctrl+A)",
|
|
1114
|
+
"cancel": "取り消し (Esc)",
|
|
1115
|
+
"approveConfirmLabel": "プランの承認の確認",
|
|
1116
|
+
"approveConfirmText": "承認するとプランが実行されます。承認しますか?",
|
|
1117
|
+
"approveConfirmYes": "承認して実行",
|
|
1118
|
+
"approveConfirmNo": "やめる",
|
|
1119
|
+
"refusal": {
|
|
1120
|
+
"ambiguousAnswer": "番号や yes / no だけの入力は送っていません。計画には番号付きの選択肢がありません。承認か取り消しを使うか、コメントとして書き直してください。",
|
|
1121
|
+
"busy": "レビュー画面のフォーカスが本文以外にあるため、何も送っていません。ターミナルで本文にフォーカスを戻してから、もう一度送ってください。",
|
|
1122
|
+
"nothingToSubmit": "送るコメントがありません。先にコメントを追加してください。",
|
|
1123
|
+
"invalidRequest": "この画面では送れない操作です。何も送っていません。",
|
|
1124
|
+
"notActive": "計画のレビュー画面が表示されていないため、何も送っていません。",
|
|
1125
|
+
"generic": "送信できませんでした。"
|
|
1126
|
+
}
|
|
1078
1127
|
},
|
|
1079
1128
|
"selectionKeys": {
|
|
1080
1129
|
"numbersToolbarLabel": "選択肢の番号キー",
|
|
@@ -1203,10 +1252,12 @@
|
|
|
1203
1252
|
"cycleAria": "エージェントの権限モードを切り替える (shift+tab)",
|
|
1204
1253
|
"cycleFromAria": "エージェントの権限モードを切り替える。現在は {mode}。(shift+tab)",
|
|
1205
1254
|
"note": {
|
|
1206
|
-
"codexModelCoupled": "Codex はモードと連動してモデルと推論の強さも変わります。"
|
|
1255
|
+
"codexModelCoupled": "Codex はモードと連動してモデルと推論の強さも変わります。",
|
|
1256
|
+
"opencodeAgentSwitch": "OpenCode V2 では Build(編集あり)と Plan(読み取りのみ)のエージェントが切り替わります。"
|
|
1207
1257
|
},
|
|
1208
1258
|
"noteShort": {
|
|
1209
|
-
"codexModelCoupled": "モデルも変わる"
|
|
1259
|
+
"codexModelCoupled": "モデルも変わる",
|
|
1260
|
+
"opencodeAgentSwitch": "エージェント切替"
|
|
1210
1261
|
},
|
|
1211
1262
|
"mode": {
|
|
1212
1263
|
"default": "default",
|
|
@@ -1216,7 +1267,8 @@
|
|
|
1216
1267
|
"auto": "auto",
|
|
1217
1268
|
"autopilot": "autopilot",
|
|
1218
1269
|
"bypass": "permission bypass",
|
|
1219
|
-
"dont-ask": "don't-ask"
|
|
1270
|
+
"dont-ask": "don't-ask",
|
|
1271
|
+
"build": "build"
|
|
1220
1272
|
}
|
|
1221
1273
|
},
|
|
1222
1274
|
"sessionNote": {
|
package/dist/server/server.js
CHANGED
|
@@ -717,6 +717,29 @@ app.prepare().then(() => {
|
|
|
717
717
|
})();
|
|
718
718
|
// Initialize worktrees after server starts
|
|
719
719
|
await initializeWorktrees();
|
|
720
|
+
// Issue #2934: re-open the event streams of OpenCode V2 (`opencode-v2`)
|
|
721
|
+
// panes that outlived the last process — the counterpart of the Issue #2108
|
|
722
|
+
// block below for v1, whose TUI is its own server; OpenCode V2's is a
|
|
723
|
+
// separate `opencode2 serve` in the same pane. The sweep re-subscribes every
|
|
724
|
+
// instance whose tmux session is alive (port from
|
|
725
|
+
// `~/.commandmate/opencode-v2/ports.json`, password from the instance's
|
|
726
|
+
// `.pw` file) and deletes the password file and port entry of every instance
|
|
727
|
+
// whose session is gone. Same shape and reasons as the #2108 block: not
|
|
728
|
+
// awaited, fail-open, dynamic import, after `initializeWorktrees()`. The log
|
|
729
|
+
// line carries counts only — never a password or a file's content.
|
|
730
|
+
void (async () => {
|
|
731
|
+
try {
|
|
732
|
+
const { reattachOpencodeV2EventStreams } = await Promise.resolve().then(() => __importStar(require('./src/lib/hooks/sources/opencode-v2/reattach')));
|
|
733
|
+
const report = await reattachOpencodeV2EventStreams();
|
|
734
|
+
if (report.known > 0) {
|
|
735
|
+
console.log(`opencode-v2 streams reattached: ${report.reattached}/${report.candidates} ` +
|
|
736
|
+
`live pane(s) (known=${report.known} swept=${report.swept})`);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
catch (error) {
|
|
740
|
+
console.error('Error reattaching opencode-v2 event streams:', error);
|
|
741
|
+
}
|
|
742
|
+
})();
|
|
720
743
|
// Issue #2108: re-open the event streams of opencode panes that outlived
|
|
721
744
|
// the last process. The port each one's server listens on is in
|
|
722
745
|
// `~/.commandmate/opencode-ports.json`, and until this call nothing read it
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* All values are preserved from the original literals (no behavior change).
|
|
21
21
|
*/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.LIVENESS_CONFIRM_DELAY_MS = exports.CLAUDE_RESTART_DELAY_MS = exports.CLAUDE_ENV_SANITIZE_WAIT_MS = exports.COMMAND_CODE_INIT_WAIT_MS = exports.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS = exports.COPILOT_EXIT_WAIT_MS = exports.OPENCODE_INTERRUPT_SECOND_ESCAPE_DELAY_MS = exports.OPENCODE_EXIT_WAIT_MS = exports.CODEX_DIALOG_SETTLE_MS = exports.TUI_EXIT_WAIT_MS = exports.TUI_INTERRUPT_SETTLE_MS = exports.TUI_MESSAGE_PROCESSED_WAIT_MS = exports.TUI_TEXT_INPUT_WAIT_MS = exports.TUI_SESSION_CREATE_WAIT_MS = void 0;
|
|
23
|
+
exports.LIVENESS_CONFIRM_DELAY_MS = exports.CLAUDE_RESTART_DELAY_MS = exports.CLAUDE_ENV_SANITIZE_WAIT_MS = exports.OPENCODE_V2_COMPOSER_WAIT_MS = exports.OPENCODE_V2_EXIT_WAIT_MS = exports.COMMAND_CODE_INIT_WAIT_MS = exports.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS = exports.COPILOT_EXIT_WAIT_MS = exports.OPENCODE_INTERRUPT_SECOND_ESCAPE_DELAY_MS = exports.OPENCODE_EXIT_WAIT_MS = exports.CODEX_DIALOG_SETTLE_MS = exports.TUI_EXIT_WAIT_MS = exports.TUI_INTERRUPT_SETTLE_MS = exports.TUI_MESSAGE_PROCESSED_WAIT_MS = exports.TUI_TEXT_INPUT_WAIT_MS = exports.TUI_SESSION_CREATE_WAIT_MS = void 0;
|
|
24
24
|
/**
|
|
25
25
|
* Wait (ms) after `createSession()` before sending the first keys, giving tmux
|
|
26
26
|
* time to spin up the session.
|
|
@@ -138,6 +138,24 @@ exports.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS = 200;
|
|
|
138
138
|
* rows, then the rules).
|
|
139
139
|
*/
|
|
140
140
|
exports.COMMAND_CODE_INIT_WAIT_MS = 3000;
|
|
141
|
+
/**
|
|
142
|
+
* Wait (ms) after OpenCode V2's `/exit` before its postcondition is checked
|
|
143
|
+
* (Issue #2934).
|
|
144
|
+
*
|
|
145
|
+
* Longer than {@link OPENCODE_EXIT_WAIT_MS} because two processes go away, not
|
|
146
|
+
* one: the TUI quits, then `scripts/opencode-v2/launch.sh`'s trap stops the
|
|
147
|
+
* `opencode2 serve` it started (SIGTERM, then SIGKILL after 3 s). The
|
|
148
|
+
* postcondition that follows (`verifyGracefulExit`) still polls, so this only
|
|
149
|
+
* keeps the first probe from firing while the server is shutting down.
|
|
150
|
+
* Site: opencode-v2 killSession().
|
|
151
|
+
*/
|
|
152
|
+
exports.OPENCODE_V2_EXIT_WAIT_MS = 3000;
|
|
153
|
+
/**
|
|
154
|
+
* Upper bound (ms) on waiting for OpenCode V2's composer before a send
|
|
155
|
+
* (Issue #2934, D6).
|
|
156
|
+
* Site: opencode-v2 sendMessage().
|
|
157
|
+
*/
|
|
158
|
+
exports.OPENCODE_V2_COMPOSER_WAIT_MS = 15000;
|
|
141
159
|
/**
|
|
142
160
|
* Wait (ms) for the `unset CLAUDECODE` command to reach the shell while
|
|
143
161
|
* sanitizing the session environment (empirically determined).
|
|
@@ -79,6 +79,9 @@ exports.IDLE_EVIDENCE_DEFAULT_MODE = {
|
|
|
79
79
|
// whatever this row says, and claiming `enforce` would state a rollout that
|
|
80
80
|
// does not exist. Epic #2249 決定 3 pins the same value from the other side.
|
|
81
81
|
'command-code': 'legacy',
|
|
82
|
+
// Issue #2934: OpenCode V2 Phase 1 declares no `readIdleEvidence` either, so
|
|
83
|
+
// `legacy` is the honest row; its state comes from the SSE stream.
|
|
84
|
+
'opencode-v2': 'legacy',
|
|
82
85
|
};
|
|
83
86
|
/**
|
|
84
87
|
* The kill switch.
|
|
@@ -228,6 +228,7 @@ function validateImageContent(extension, buffer) {
|
|
|
228
228
|
return {
|
|
229
229
|
valid: false,
|
|
230
230
|
error: `File size exceeds ${exports.IMAGE_MAX_SIZE_BYTES / 1024 / 1024}MB limit`,
|
|
231
|
+
reason: 'too-large',
|
|
231
232
|
};
|
|
232
233
|
}
|
|
233
234
|
const normalizedExt = normalizeExtension(extension);
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* [S4-014] UUID v4 format validation
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.UUID_V4_PATTERN = exports.DEFAULT_PERMISSIONS = exports.NO_PERMISSION_FLAGS = exports.OPENCODE_PERMISSIONS = exports.VIBE_LOCAL_PERMISSIONS = exports.GEMINI_PERMISSIONS = exports.COMMAND_CODE_SCHEDULE_PERMISSIONS = exports.COMMAND_CODE_YOLO_PERMISSION = exports.COMMAND_CODE_PERMISSIONS = exports.ANTIGRAVITY_PERMISSIONS = exports.COPILOT_PERMISSIONS = exports.CODEX_SANDBOXES = exports.CLAUDE_PERMISSIONS = exports.MAX_SCHEDULE_CRON_LENGTH = exports.MAX_SCHEDULE_MESSAGE_LENGTH = exports.MAX_SCHEDULE_NAME_LENGTH = void 0;
|
|
13
|
+
exports.UUID_V4_PATTERN = exports.SCHEDULE_UNSUPPORTED_CLI_TOOLS = exports.DEFAULT_PERMISSIONS = exports.NO_PERMISSION_FLAGS = exports.OPENCODE_V2_PERMISSIONS = exports.OPENCODE_V2_AUTO_PERMISSION = exports.OPENCODE_V2_DEFAULT_PERMISSION = exports.OPENCODE_PERMISSIONS = exports.VIBE_LOCAL_PERMISSIONS = exports.GEMINI_PERMISSIONS = exports.COMMAND_CODE_SCHEDULE_PERMISSIONS = exports.COMMAND_CODE_YOLO_PERMISSION = exports.COMMAND_CODE_PERMISSIONS = exports.ANTIGRAVITY_PERMISSIONS = exports.COPILOT_PERMISSIONS = exports.CODEX_SANDBOXES = exports.CLAUDE_PERMISSIONS = exports.MAX_SCHEDULE_CRON_LENGTH = exports.MAX_SCHEDULE_MESSAGE_LENGTH = exports.MAX_SCHEDULE_NAME_LENGTH = void 0;
|
|
14
|
+
exports.isScheduleSupportedCliTool = isScheduleSupportedCliTool;
|
|
14
15
|
exports.getPermissionOptionsForTool = getPermissionOptionsForTool;
|
|
15
16
|
exports.isValidUuidV4 = isValidUuidV4;
|
|
16
17
|
// =============================================================================
|
|
@@ -117,6 +118,38 @@ exports.VIBE_LOCAL_PERMISSIONS = [];
|
|
|
117
118
|
* CommandMate does not pass it. Wiring it up is a separate decision.
|
|
118
119
|
*/
|
|
119
120
|
exports.OPENCODE_PERMISSIONS = [];
|
|
121
|
+
/** OpenCode V2 Permission value that passes no flag (Issue #2974). */
|
|
122
|
+
exports.OPENCODE_V2_DEFAULT_PERMISSION = 'default';
|
|
123
|
+
/** OpenCode V2 Permission value that passes `--auto` (Issue #2974). */
|
|
124
|
+
exports.OPENCODE_V2_AUTO_PERMISSION = 'auto';
|
|
125
|
+
/**
|
|
126
|
+
* Allowed permission values for OpenCode V2 (Issue #2934, #2974).
|
|
127
|
+
*
|
|
128
|
+
* `opencode2 run` has one permission switch, `--auto` ("auto-approve
|
|
129
|
+
* permissions that are not explicitly denied"). The column names both sides of
|
|
130
|
+
* it — `default` passes nothing, `auto` passes `--auto` — so the dropdown can
|
|
131
|
+
* offer the flag-less run as a choice rather than as a blank cell.
|
|
132
|
+
*
|
|
133
|
+
* Measured on 2.0.18 (isolated `HOME` / `XDG_*`,
|
|
134
|
+
* `tests/fixtures/opencode-v2-schedule-2974/`):
|
|
135
|
+
*
|
|
136
|
+
* - with no `permission` config a write goes through without `--auto`;
|
|
137
|
+
* - an `ask` rule is auto-rejected ("permission requested: edit (…);
|
|
138
|
+
* auto-rejecting" on stderr), the stream ends in an `error` frame and the
|
|
139
|
+
* process exits 1 — so the run fails loudly, it never "succeeds" having done
|
|
140
|
+
* nothing (the #2454 failure mode);
|
|
141
|
+
* - `--auto` approves the same `ask` rule and the run exits 0;
|
|
142
|
+
* - `deny` is not a sandbox: with `edit: deny` / `write: deny` and `--auto`
|
|
143
|
+
* the model wrote the file through the `shell` tool.
|
|
144
|
+
*
|
|
145
|
+
* So the default is `default`: an operator who wrote `ask` asked for a human,
|
|
146
|
+
* and without one the schedule is recorded as failed. `auto` is for an operator
|
|
147
|
+
* who wants those rules approved unattended.
|
|
148
|
+
*/
|
|
149
|
+
exports.OPENCODE_V2_PERMISSIONS = [
|
|
150
|
+
exports.OPENCODE_V2_DEFAULT_PERMISSION,
|
|
151
|
+
exports.OPENCODE_V2_AUTO_PERMISSION,
|
|
152
|
+
];
|
|
120
153
|
/**
|
|
121
154
|
* What a CLI tool with no permission flag at all resolves to (Issue #1914).
|
|
122
155
|
*
|
|
@@ -148,7 +181,25 @@ exports.DEFAULT_PERMISSIONS = {
|
|
|
148
181
|
// run still reports success, so an unattended schedule that omits the column
|
|
149
182
|
// would look like it worked and change nothing.
|
|
150
183
|
'command-code': exports.COMMAND_CODE_YOLO_PERMISSION,
|
|
184
|
+
// Issue #2974: no `--auto` -- an `ask` rule then fails the run (exit 1)
|
|
185
|
+
// instead of being approved; see OPENCODE_V2_PERMISSIONS.
|
|
186
|
+
'opencode-v2': exports.OPENCODE_V2_DEFAULT_PERMISSION,
|
|
151
187
|
};
|
|
188
|
+
/**
|
|
189
|
+
* CLI tools that are registered but cannot be the CLI Tool of a CMATE.md
|
|
190
|
+
* schedule (Issue #2934).
|
|
191
|
+
*
|
|
192
|
+
* A tool listed here is a validation error in `cmate-validator`, a skipped row
|
|
193
|
+
* in `cmate-parser`, a rejected input in `cmate-writer` and absent from the
|
|
194
|
+
* schedule dialog. Empty since Issue #2974, which measured and wired OpenCode
|
|
195
|
+
* V2's headless path (`opencode2 run --standalone --format json`); kept as the
|
|
196
|
+
* one place a future tool without a measured headless path is listed.
|
|
197
|
+
*/
|
|
198
|
+
exports.SCHEDULE_UNSUPPORTED_CLI_TOOLS = [];
|
|
199
|
+
/** Whether a CLI tool can be scheduled (see {@link SCHEDULE_UNSUPPORTED_CLI_TOOLS}). */
|
|
200
|
+
function isScheduleSupportedCliTool(cliToolId) {
|
|
201
|
+
return !exports.SCHEDULE_UNSUPPORTED_CLI_TOOLS.includes(cliToolId);
|
|
202
|
+
}
|
|
152
203
|
/**
|
|
153
204
|
* Resolve the allowed Permission dropdown options for a CLI tool (Issue #824).
|
|
154
205
|
*
|
|
@@ -193,6 +244,9 @@ function getPermissionOptionsForTool(cliToolId) {
|
|
|
193
244
|
return exports.VIBE_LOCAL_PERMISSIONS;
|
|
194
245
|
case 'opencode':
|
|
195
246
|
return exports.OPENCODE_PERMISSIONS;
|
|
247
|
+
case 'opencode-v2':
|
|
248
|
+
// Issue #2974: `default` (no flag) or `auto` (`--auto`).
|
|
249
|
+
return exports.OPENCODE_V2_PERMISSIONS;
|
|
196
250
|
default:
|
|
197
251
|
return exports.NO_PERMISSION_FLAGS;
|
|
198
252
|
}
|
|
@@ -64,6 +64,7 @@ const response_checker_1 = require("./polling/response-checker");
|
|
|
64
64
|
const antigravity_permission_receipts_1 = require("./polling/antigravity-permission-receipts");
|
|
65
65
|
const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
|
|
66
66
|
const auto_yes_policy_1 = require("./polling/auto-yes-policy");
|
|
67
|
+
const detect_1 = require("./detection/tools/codex/detect");
|
|
67
68
|
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
68
69
|
const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
|
|
69
70
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
@@ -206,6 +207,45 @@ function isDuplicatePrompt(pollerState, promptKey) {
|
|
|
206
207
|
return false;
|
|
207
208
|
return (Date.now() - pollerState.lastAnsweredAt) < auto_yes_state_1.DUPLICATE_RETRY_EXPIRY_MS;
|
|
208
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Issue #2995: print a "did not answer" line as WARN once per frame.
|
|
212
|
+
*
|
|
213
|
+
* The poller re-reads a static pane every 2s, so a frame Auto-Yes leaves alone
|
|
214
|
+
* (a reply quoting `1. Yes / 2. No`, a launch dialog, a policy-withheld prompt,
|
|
215
|
+
* a foreign session) would otherwise print the same WARN on every tick. The
|
|
216
|
+
* first one stays WARN -- it is what tells a silently stalled worker apart --
|
|
217
|
+
* and repeats for the same frame drop to `debug`. The frame is identified by
|
|
218
|
+
* the event, `promptFrameKey()` and the event's own detail; a different
|
|
219
|
+
* prompt, a different reason, or a tick with no prompt / an answer sent (both
|
|
220
|
+
* clear the key) makes the next line WARN again.
|
|
221
|
+
* `recordPolicySuppression()` is not throttled: `capture --json` and `wait`
|
|
222
|
+
* read the latest record, not the log.
|
|
223
|
+
*/
|
|
224
|
+
/**
|
|
225
|
+
* Issue #2995: what makes two ticks "the same prompt" for `warnOncePerFrame`.
|
|
226
|
+
*
|
|
227
|
+
* `generatePromptKey` alone is type + question, and the question the detector
|
|
228
|
+
* extracts from an agent's reply is often a fixed line above the list, so two
|
|
229
|
+
* different lists would share it. The option rows (and where the cursor sits)
|
|
230
|
+
* plus `approvalTarget` -- the current prompt's own panel, which leaves out
|
|
231
|
+
* scrollback and footers that change while the prompt does not -- separate them.
|
|
232
|
+
* Not the whole pane: a status bar that ticks every second would defeat it.
|
|
233
|
+
*/
|
|
234
|
+
function promptFrameKey(promptData) {
|
|
235
|
+
const options = promptData.type === 'multiple_choice'
|
|
236
|
+
? promptData.options.map((o) => `${o.isDefault ? '>' : ''}${o.number}.${o.label}`).join('\n')
|
|
237
|
+
: '';
|
|
238
|
+
return [(0, prompt_key_1.generatePromptKey)(promptData), options, promptData.approvalTarget ?? ''].join('\u0000');
|
|
239
|
+
}
|
|
240
|
+
function warnOncePerFrame(pollerState, frameKey, event, fields) {
|
|
241
|
+
const key = `${event}\u0000${frameKey}`;
|
|
242
|
+
if (pollerState.lastSkipWarnKey === key) {
|
|
243
|
+
logger.debug(event, { ...fields, repeated: true });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
pollerState.lastSkipWarnKey = key;
|
|
247
|
+
logger.warn(event, fields);
|
|
248
|
+
}
|
|
209
249
|
// =============================================================================
|
|
210
250
|
// Extracted Functions for pollAutoYes (Issue #323: SRP decomposition)
|
|
211
251
|
// =============================================================================
|
|
@@ -403,6 +443,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
403
443
|
if (!promptDetection.isPrompt || !promptDetection.promptData) {
|
|
404
444
|
pollerState.lastAnsweredPromptKey = null;
|
|
405
445
|
pollerState.lastAnsweredAt = null;
|
|
446
|
+
pollerState.lastSkipWarnKey = null;
|
|
406
447
|
if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
|
|
407
448
|
logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
|
|
408
449
|
}
|
|
@@ -410,6 +451,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
410
451
|
}
|
|
411
452
|
// 2. Check for duplicate prompt (Issue #306)
|
|
412
453
|
const promptKey = (0, prompt_key_1.generatePromptKey)(promptDetection.promptData);
|
|
454
|
+
const frameKey = promptFrameKey(promptDetection.promptData);
|
|
413
455
|
if (isDuplicatePrompt(pollerState, promptKey)) {
|
|
414
456
|
return 'duplicate';
|
|
415
457
|
}
|
|
@@ -440,7 +482,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
440
482
|
mode: null,
|
|
441
483
|
promptType: promptDetection.promptData.type,
|
|
442
484
|
});
|
|
443
|
-
|
|
485
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', {
|
|
444
486
|
worktreeId,
|
|
445
487
|
cliToolId,
|
|
446
488
|
instanceId,
|
|
@@ -449,6 +491,27 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
449
491
|
});
|
|
450
492
|
return 'no_answer';
|
|
451
493
|
}
|
|
494
|
+
// 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
|
|
495
|
+
// answer. A digit there is an immediate decision, so the base rules'
|
|
496
|
+
// default would choose the model and effort for the operator. Judged by the
|
|
497
|
+
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
498
|
+
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
499
|
+
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
500
|
+
// recognised the frame and deliberately declined it.
|
|
501
|
+
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(cleanOutput)) {
|
|
502
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
503
|
+
reason: 'unclassified-frame',
|
|
504
|
+
mode: null,
|
|
505
|
+
promptType: promptDetection.promptData.type,
|
|
506
|
+
});
|
|
507
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
|
|
508
|
+
worktreeId,
|
|
509
|
+
cliToolId,
|
|
510
|
+
instanceId,
|
|
511
|
+
promptType: promptDetection.promptData.type,
|
|
512
|
+
});
|
|
513
|
+
return 'no_answer';
|
|
514
|
+
}
|
|
452
515
|
// 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
|
|
453
516
|
// not enough to send an answer. The detection above judges the ROWS, and the
|
|
454
517
|
// rows of an agent's own reply can be indistinguishable from a dialog's --
|
|
@@ -473,7 +536,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
473
536
|
mode: null,
|
|
474
537
|
promptType: promptDetection.promptData.type,
|
|
475
538
|
});
|
|
476
|
-
|
|
539
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
|
|
477
540
|
worktreeId,
|
|
478
541
|
cliToolId,
|
|
479
542
|
instanceId,
|
|
@@ -502,7 +565,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
502
565
|
promptType: promptDetection.promptData.type,
|
|
503
566
|
pattern: resolution.pattern,
|
|
504
567
|
});
|
|
505
|
-
|
|
568
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
506
569
|
worktreeId,
|
|
507
570
|
cliToolId,
|
|
508
571
|
instanceId,
|
|
@@ -524,7 +587,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
524
587
|
// server created. The poller keeps running; it just does not type.
|
|
525
588
|
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName);
|
|
526
589
|
if (ownership === null || ownership.verdict === 'foreign') {
|
|
527
|
-
|
|
590
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000${sessionName}\u0000${ownership ? 'foreign' : 'worktree_not_found'}`, 'poller:auto-yes-skipped-foreign-session', {
|
|
528
591
|
worktreeId,
|
|
529
592
|
cliToolId,
|
|
530
593
|
instanceId,
|
|
@@ -551,6 +614,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
551
614
|
// 7. Record answered prompt key and timestamp
|
|
552
615
|
pollerState.lastAnsweredPromptKey = promptKey;
|
|
553
616
|
pollerState.lastAnsweredAt = Date.now();
|
|
617
|
+
pollerState.lastSkipWarnKey = null;
|
|
554
618
|
logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
|
|
555
619
|
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
556
620
|
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
@@ -736,6 +800,7 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
736
800
|
lastAnsweredPromptKey: null,
|
|
737
801
|
lastAnsweredAt: null,
|
|
738
802
|
stopCheckBaselineLength: -1,
|
|
803
|
+
lastSkipWarnKey: null,
|
|
739
804
|
};
|
|
740
805
|
autoYesPollerStates.set(compositeKey, pollerState);
|
|
741
806
|
// A task may have been recorded moments ago; start from a fresh policy read.
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* | gemini | 0.58.0 | `app.cycleApprovalMode` (docs) | **NOT MEASURED** — see below |
|
|
25
25
|
* | opencode | 1.18.30 | agent switch, not a mode | — (already shipped as #2046's quick keys) |
|
|
26
26
|
* | vibe-local | — | nothing (5 presses, no change) | — (`-y` AUTO-APPROVE is fixed) |
|
|
27
|
+
* | opencode-v2 | 2.0.18 | agent switch (Build ⇄ Plan) | build ⇄ plan (declared since #3038) |
|
|
27
28
|
*
|
|
28
29
|
* ## The three tools this table deliberately leaves out
|
|
29
30
|
*
|
|
@@ -32,6 +33,9 @@
|
|
|
32
33
|
* mode spec would put a second button on the same key with a different
|
|
33
34
|
* promise. The separation is a DECLARATION (no entry here), not a tool-id
|
|
34
35
|
* check in the UI.
|
|
36
|
+
* (OpenCode V2 is NOT left out any more — see {@link OPENCODE_V2_MODE_SPEC}.
|
|
37
|
+
* #2966 left it out for v1's reason; #3038 moved its `shift+tab` from the
|
|
38
|
+
* quick keys to the mode button, so there is still one button per key.)
|
|
35
39
|
* - **vibe-local.** Five presses produced a byte-identical frame. There is no
|
|
36
40
|
* mode to cycle; the wrapper fixes `-y`.
|
|
37
41
|
* - **gemini.** Its bundled `docs/reference/keyboard-shortcuts.md` does bind
|
|
@@ -44,12 +48,13 @@
|
|
|
44
48
|
*
|
|
45
49
|
* ## Why the indicators are patterns on a windowed tail and not positions
|
|
46
50
|
*
|
|
47
|
-
* The
|
|
51
|
+
* The declaring tools put the mode in structurally different places —
|
|
48
52
|
* a dedicated footer row (claude), an independent row above the shortcut hint
|
|
49
53
|
* (Command Code 1.53.1) or *replacing* it (1.49.0), the right end of a status
|
|
50
54
|
* bar (codex), a word spliced into a hint bar whose element count changes with
|
|
51
55
|
* the mode (copilot), and a right-aligned footer segment plus a banner inside
|
|
52
|
-
* the composer box (agy)
|
|
56
|
+
* the composer box (agy), and the agent row under the composer (OpenCode V2).
|
|
57
|
+
* No column index, no row offset and no "nth segment"
|
|
53
58
|
* rule survives that set, so each tool declares what its row LOOKS like and the
|
|
54
59
|
* reader scans a small window of non-blank tail rows for it.
|
|
55
60
|
*
|
|
@@ -290,6 +295,52 @@ const ANTIGRAVITY_MODE_SPEC = {
|
|
|
290
295
|
tailRows: 2,
|
|
291
296
|
noteId: null,
|
|
292
297
|
};
|
|
298
|
+
/**
|
|
299
|
+
* OpenCode V2's agent row, directly under the composer (Issue #3038).
|
|
300
|
+
*
|
|
301
|
+
* `shift+tab` on 2.0.18 toggles the AGENT, not a permission mode — `Build`
|
|
302
|
+
* (edits allowed) ⇄ `Plan` (read only) — on the home screen and inside a session
|
|
303
|
+
* alike, and the composer's last row names it. Measured 2026-09-30 through
|
|
304
|
+
* `scripts/opencode-v2/launch.sh` on a private tmux socket, 80x200
|
|
305
|
+
* (`tests/fixtures/opencode-v2-agent-mode-3038/`):
|
|
306
|
+
*
|
|
307
|
+
* ` ┃ Build · LongCat 2.5 Preview Free OpenCode Zen` (home, 4th row up)
|
|
308
|
+
* ` ┃ Plan · LongCat 2.5 Preview Free OpenCode Zen` (session, 3rd row up)
|
|
309
|
+
*
|
|
310
|
+
* Two rows the patterns must NOT read, both on the same screen:
|
|
311
|
+
*
|
|
312
|
+
* - the completion row a finished turn leaves in the transcript,
|
|
313
|
+
* ` Build · LongCat 2.5 Preview Free · 4.9s · 8.1 tok/s`. On 2.0.18 it
|
|
314
|
+
* has no gutter at all (v1 drew `▣` there); the required `┃` excludes it;
|
|
315
|
+
* - the user's own message, drawn in the same `┃ <text>` gutter. It is above
|
|
316
|
+
* the composer, so the tail window below cannot reach it on a frame where
|
|
317
|
+
* the composer is drawn.
|
|
318
|
+
*
|
|
319
|
+
* Both agents are drawn, so unlike codex / copilot / agy there is no silent
|
|
320
|
+
* base mode here: a frame without the row (a permission or question dialog
|
|
321
|
+
* replaces the composer) reads `unknown`.
|
|
322
|
+
*
|
|
323
|
+
* `build` is its own id rather than `default` — the chip says what the pane
|
|
324
|
+
* says (#2592) — and the `opencodeAgentSwitch` note tells the user this button
|
|
325
|
+
* switches the agent, which its "permission mode" aria label does not.
|
|
326
|
+
*
|
|
327
|
+
* The same key was `OpencodeQuickKeys`' v2 `agentNext` until #3038. It was
|
|
328
|
+
* taken off the strip in the same change, so the key has one button.
|
|
329
|
+
*/
|
|
330
|
+
const OPENCODE_V2_MODE_SPEC = {
|
|
331
|
+
key: 'BTab',
|
|
332
|
+
cycle: ['build', 'plan'],
|
|
333
|
+
indicators: [
|
|
334
|
+
{ mode: 'build', pattern: /^[^\S\n]*┃[^\S\n]+Build[^\S\n]·[^\S\n]/ },
|
|
335
|
+
{ mode: 'plan', pattern: /^[^\S\n]*┃[^\S\n]+Plan[^\S\n]·[^\S\n]/ },
|
|
336
|
+
],
|
|
337
|
+
// The home screen draws `2.0.18` under the footer, which puts the agent row
|
|
338
|
+
// 4th from the bottom; in a session it is 3rd (footer, `╹▀▀▀`, agent row).
|
|
339
|
+
// Four and no more: the fifth row up is the composer's own gutter, and above
|
|
340
|
+
// that is the transcript, where the user's `┃ …` message lives.
|
|
341
|
+
tailRows: 4,
|
|
342
|
+
noteId: 'opencodeAgentSwitch',
|
|
343
|
+
};
|
|
293
344
|
/**
|
|
294
345
|
* The declarations, keyed by tool.
|
|
295
346
|
*
|
|
@@ -304,6 +355,7 @@ const AGENT_MODE_SPECS = {
|
|
|
304
355
|
codex: CODEX_MODE_SPEC,
|
|
305
356
|
copilot: COPILOT_MODE_SPEC,
|
|
306
357
|
antigravity: ANTIGRAVITY_MODE_SPEC,
|
|
358
|
+
'opencode-v2': OPENCODE_V2_MODE_SPEC,
|
|
307
359
|
};
|
|
308
360
|
/**
|
|
309
361
|
* How one CLI cycles its permission mode, or `null` when it does not have one.
|
|
@@ -595,8 +595,10 @@ class BaseCLITool {
|
|
|
595
595
|
* against `NAVIGATION_KEY_VALUES` anyway, because a future edit could still
|
|
596
596
|
* add an override to one of them.
|
|
597
597
|
*
|
|
598
|
-
*
|
|
598
|
+
* FOUR tools override it now:
|
|
599
599
|
* - opencode, with its `ctrl+x` leader and chord letters (#2046);
|
|
600
|
+
* - OpenCode V2, with the same leader and a narrower set measured on 2.0.18
|
|
601
|
+
* (`OPENCODE_V2_NAVIGATION_KEY_VALUES`, #2966);
|
|
600
602
|
* - claude and Command Code, with `CLAUDE_NAVIGATION_KEY_VALUES` — the base
|
|
601
603
|
* pad plus `s`, the key claude's `/model` footer offers for "use this
|
|
602
604
|
* session only" while `Enter` on the same overlay rewrites the user's
|
|
@@ -611,8 +613,10 @@ class BaseCLITool {
|
|
|
611
613
|
* Declare how this tool cycles its permission mode (Issue #2592).
|
|
612
614
|
*
|
|
613
615
|
* The default is `null` — "this tool has no mode on `shift+tab`" — and that is
|
|
614
|
-
* the answer for
|
|
616
|
+
* the answer for four of the nine: opencode (whose `BTab` switches AGENTS,
|
|
615
617
|
* and already has `OpencodeQuickKeys`' `agentPrev` button from #2046),
|
|
618
|
+
* OpenCode V2 (the same: `BTab` toggles Build ⇄ Plan on 2.0.18 and is its
|
|
619
|
+
* quick keys' `agentNext`, #2966),
|
|
616
620
|
* vibe-local (measured: five presses, byte-identical frame) and gemini (its
|
|
617
621
|
* own docs bind `app.cycleApprovalMode`, but sign-in refused the CLI and the
|
|
618
622
|
* footer spelling was never measured — a button is a promise about what
|