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
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
* - resolveScheduleCommandOptions(): CMATE.md row -> executor options (Issue #2044)
|
|
17
17
|
* - TOOLS_WITH_MODEL_SUPPORT: Set of tools supporting --model in CMATE.md
|
|
18
18
|
* - TOOLS_WITH_RUN_OPTIONS: Set of tools whose column accepts a flag list
|
|
19
|
+
* - TOOLS_WITH_VARIANT_ON_MODEL: tools whose variant rides on the model (Issue #2982)
|
|
20
|
+
* - validateVariantHasModel(): refuse a model-less variant for those tools (Issue #2982)
|
|
19
21
|
*/
|
|
20
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.OPENCODE_COLUMN_SYNTAX = exports.TOOLS_WITH_RUN_OPTIONS = exports.TOOLS_WITH_MODEL_SUPPORT = void 0;
|
|
23
|
+
exports.OPENCODE_V2_COLUMN_SYNTAX = exports.OPENCODE_COLUMN_SYNTAX = exports.TOOLS_WITH_VARIANT_ON_MODEL = exports.TOOLS_WITH_RUN_OPTIONS = exports.TOOLS_WITH_MODEL_SUPPORT = void 0;
|
|
24
|
+
exports.validateVariantHasModel = validateVariantHasModel;
|
|
22
25
|
exports.tokenizeCliToolColumn = tokenizeCliToolColumn;
|
|
23
26
|
exports.parseCliToolColumn = parseCliToolColumn;
|
|
24
27
|
exports.validateCopilotModelName = validateCopilotModelName;
|
|
@@ -57,8 +60,14 @@ const opencode_constants_1 = require("../config/opencode-constants");
|
|
|
57
60
|
* format `opencode run --help` documents for `-m, --model` (measured on
|
|
58
61
|
* opencode 1.18.21). It is not prefixed with `ollama/` — see
|
|
59
62
|
* `buildCliArgs()` for why that prefix went away.
|
|
63
|
+
*
|
|
64
|
+
* ## `opencode-v2` (Issue #2982)
|
|
65
|
+
*
|
|
66
|
+
* `opencode2 run -m` takes the same `provider/model` value (plus an optional
|
|
67
|
+
* `#variant`, see {@link TOOLS_WITH_VARIANT_ON_MODEL}), and the executor's
|
|
68
|
+
* `opencode-v2` case has built `-m` since #2974.
|
|
60
69
|
*/
|
|
61
|
-
exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot', 'opencode']);
|
|
70
|
+
exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot', 'opencode', 'opencode-v2']);
|
|
62
71
|
/**
|
|
63
72
|
* CLI Tools whose CMATE.md column is a **flag list** rather than one fixed shape
|
|
64
73
|
* (Issue #2044).
|
|
@@ -73,8 +82,28 @@ exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot', 'opencode']);
|
|
|
73
82
|
* CommandMate can drive (`--agent`, `--variant`, `-c`, `--title`), and a
|
|
74
83
|
* schedule that wants `--agent plan --variant high` cannot say so in three
|
|
75
84
|
* tokens. Membership here is what {@link parseCliToolColumn} branches on.
|
|
85
|
+
*
|
|
86
|
+
* Issue #2982: `opencode-v2` joins with the same five column flags. Its
|
|
87
|
+
* `opencode2 run` has `-m`, `--agent`, `-c` and `--title` with v1's meaning;
|
|
88
|
+
* `--variant` is the one difference, see {@link TOOLS_WITH_VARIANT_ON_MODEL}.
|
|
76
89
|
*/
|
|
77
|
-
exports.TOOLS_WITH_RUN_OPTIONS = new Set(['opencode']);
|
|
90
|
+
exports.TOOLS_WITH_RUN_OPTIONS = new Set(['opencode', 'opencode-v2']);
|
|
91
|
+
/**
|
|
92
|
+
* Tools whose CLI has no `--variant` flag and takes the variant as a suffix of
|
|
93
|
+
* the model instead: `-m provider/model#variant` (Issue #2982).
|
|
94
|
+
*
|
|
95
|
+
* `opencode2 run` (2.0.18, measured in #2974) answers `--variant` with
|
|
96
|
+
* "Unrecognized flag" and exit 1. The column still spells the variant as
|
|
97
|
+
* `--variant <name>` — the same grammar, dialog field and writer order as v1 —
|
|
98
|
+
* and `claude-executor.ts` composes `model#variant`. Two consequences are
|
|
99
|
+
* enforced by {@link validateVariantHasModel}:
|
|
100
|
+
*
|
|
101
|
+
* - a variant **without a model** has nothing to ride on, and is an error
|
|
102
|
+
* rather than a silently dropped option;
|
|
103
|
+
* - `#` in the model itself is not a way around it: `MODEL_NAME_PATTERN`
|
|
104
|
+
* already refuses `#`, so `--model x#high` is rejected as an invalid model.
|
|
105
|
+
*/
|
|
106
|
+
exports.TOOLS_WITH_VARIANT_ON_MODEL = new Set(['opencode-v2']);
|
|
78
107
|
/**
|
|
79
108
|
* The opencode column grammar, as one line, for error messages.
|
|
80
109
|
*
|
|
@@ -82,6 +111,28 @@ exports.TOOLS_WITH_RUN_OPTIONS = new Set(['opencode']);
|
|
|
82
111
|
* the flags the loop accepts are edited together.
|
|
83
112
|
*/
|
|
84
113
|
exports.OPENCODE_COLUMN_SYNTAX = 'opencode [--model <provider/model>] [--agent <name>] [--variant <name>] [--continue] [--title <text>]';
|
|
114
|
+
/**
|
|
115
|
+
* The opencode-v2 column grammar, as one line, for error messages (Issue #2982).
|
|
116
|
+
*
|
|
117
|
+
* Same flags as {@link OPENCODE_COLUMN_SYNTAX}; `--variant` is nested inside
|
|
118
|
+
* the `--model` bracket because it is only valid alongside a model.
|
|
119
|
+
*/
|
|
120
|
+
exports.OPENCODE_V2_COLUMN_SYNTAX = 'opencode-v2 [--model <provider/model> [--variant <name>]] [--agent <name>] [--continue] [--title <text>]';
|
|
121
|
+
/**
|
|
122
|
+
* Error for a variant given without a model, for the tools in
|
|
123
|
+
* {@link TOOLS_WITH_VARIANT_ON_MODEL} (Issue #2982). Shared by the column
|
|
124
|
+
* parser and `cmate-writer.validateScheduleInput()` so the file and the
|
|
125
|
+
* form refuse the same row with the same words.
|
|
126
|
+
*
|
|
127
|
+
* @returns The error message, or undefined when the combination is fine
|
|
128
|
+
*/
|
|
129
|
+
function validateVariantHasModel(cliToolId, model, variant) {
|
|
130
|
+
if (!exports.TOOLS_WITH_VARIANT_ON_MODEL.has(cliToolId))
|
|
131
|
+
return undefined;
|
|
132
|
+
if (!variant?.trim() || model?.trim())
|
|
133
|
+
return undefined;
|
|
134
|
+
return `${cliToolId} option "--variant" needs "--model" (sent as -m <provider/model>#<variant>)`;
|
|
135
|
+
}
|
|
85
136
|
// =============================================================================
|
|
86
137
|
// Parse Functions
|
|
87
138
|
// =============================================================================
|
|
@@ -154,7 +205,8 @@ function tokenizeCliToolColumn(raw) {
|
|
|
154
205
|
* - **a missing value** — `--agent --title x` would make `--title` the agent
|
|
155
206
|
* name, and a value starting with `-` is the DR4-001 injection shape anyway.
|
|
156
207
|
*
|
|
157
|
-
* @param cliToolId -
|
|
208
|
+
* @param cliToolId - `opencode` or `opencode-v2` (Issue #2982); echoed into
|
|
209
|
+
* error messages and picks the syntax hint
|
|
158
210
|
* @param tokens - Tokens after the tool id
|
|
159
211
|
* @returns The parsed options, or an error
|
|
160
212
|
*/
|
|
@@ -218,10 +270,15 @@ function parseOpencodeRunFlags(cliToolId, tokens) {
|
|
|
218
270
|
parsed.continueSession = true;
|
|
219
271
|
break;
|
|
220
272
|
}
|
|
221
|
-
default:
|
|
222
|
-
|
|
273
|
+
default: {
|
|
274
|
+
const syntax = cliToolId === 'opencode-v2' ? exports.OPENCODE_V2_COLUMN_SYNTAX : exports.OPENCODE_COLUMN_SYNTAX;
|
|
275
|
+
return { cliToolId, error: `${cliToolId} only supports: ${syntax}` };
|
|
276
|
+
}
|
|
223
277
|
}
|
|
224
278
|
}
|
|
279
|
+
const variantError = validateVariantHasModel(cliToolId, parsed.model, parsed.variant);
|
|
280
|
+
if (variantError)
|
|
281
|
+
return { cliToolId, error: variantError };
|
|
225
282
|
return parsed;
|
|
226
283
|
}
|
|
227
284
|
/**
|
|
@@ -508,7 +565,8 @@ function parseAndValidateCliToolColumn(raw) {
|
|
|
508
565
|
* {@link TOOLS_WITH_MODEL_SUPPORT} for the model, exactly as that line did, so
|
|
509
566
|
* the two agree about which tools take one; the run options are additionally
|
|
510
567
|
* gated on {@link TOOLS_WITH_RUN_OPTIONS} so a future tool cannot inherit
|
|
511
|
-
* opencode's flags by accident.
|
|
568
|
+
* opencode's flags by accident. For `opencode-v2` (Issue #2982) the variant is
|
|
569
|
+
* passed on as-is; the executor folds it into `-m model#variant`.
|
|
512
570
|
*
|
|
513
571
|
* Living here rather than in `job-executor.ts` is the point: the column's
|
|
514
572
|
* grammar is this module's business, and a scheduler that re-states any part of
|
|
@@ -206,6 +206,12 @@ function parseSchedulesSection(rows) {
|
|
|
206
206
|
logger.warn('parse:invalid-cli-tool', { name: sanitizedName, cliToolId: resolvedCliToolId });
|
|
207
207
|
continue;
|
|
208
208
|
}
|
|
209
|
+
// Issue #2934: registered but not schedulable (SCHEDULE_UNSUPPORTED_CLI_TOOLS,
|
|
210
|
+
// empty since #2974). Skipped like an unknown tool, so no run is built for it.
|
|
211
|
+
if (!(0, schedule_config_1.isScheduleSupportedCliTool)(resolvedCliToolId)) {
|
|
212
|
+
logger.warn('parse:unsupported-cli-tool', { name: sanitizedName, cliToolId: resolvedCliToolId });
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
209
215
|
const defaultPermission = schedule_config_1.DEFAULT_PERMISSIONS[resolvedCliToolId] ?? '';
|
|
210
216
|
let permission = permissionStr?.trim() || defaultPermission;
|
|
211
217
|
// Validate permission against allowed values
|
|
@@ -237,6 +243,12 @@ function parseSchedulesSection(rows) {
|
|
|
237
243
|
case 'command-code':
|
|
238
244
|
allowedValues = schedule_config_1.COMMAND_CODE_SCHEDULE_PERMISSIONS;
|
|
239
245
|
break;
|
|
246
|
+
// Issue #2974: `default` (no flag) / `auto` (`--auto`). An empty cell
|
|
247
|
+
// resolves to `default`, so an `ask` rule fails the run rather than being
|
|
248
|
+
// approved unattended.
|
|
249
|
+
case 'opencode-v2':
|
|
250
|
+
allowedValues = schedule_config_1.OPENCODE_V2_PERMISSIONS;
|
|
251
|
+
break;
|
|
240
252
|
case 'gemini':
|
|
241
253
|
case 'vibe-local':
|
|
242
254
|
case 'opencode':
|
|
@@ -225,6 +225,16 @@ function validateSchedulesSection(rows) {
|
|
|
225
225
|
field: 'cliTool',
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
|
+
// Issue #2934: a registered tool that cannot be scheduled
|
|
229
|
+
// (SCHEDULE_UNSUPPORTED_CLI_TOOLS, empty since #2974). The parser skips the
|
|
230
|
+
// same rows.
|
|
231
|
+
if (parsed && (0, types_1.isCliToolType)(parsed.cliToolId) && !(0, schedule_config_1.isScheduleSupportedCliTool)(parsed.cliToolId)) {
|
|
232
|
+
errors.push({
|
|
233
|
+
row: i,
|
|
234
|
+
message: `Row ${i + 1}: CLI Tool "${parsed.cliToolId}" is not supported in schedules yet`,
|
|
235
|
+
field: 'cliTool',
|
|
236
|
+
});
|
|
237
|
+
}
|
|
228
238
|
// Validate permission (6th column)
|
|
229
239
|
// Empty/missing permission is allowed -- parser applies default per CLI tool
|
|
230
240
|
const permissionStr = row[5];
|
|
@@ -245,7 +255,9 @@ function validateSchedulesSection(rows) {
|
|
|
245
255
|
: cliToolId === 'copilot' ? schedule_config_1.COPILOT_PERMISSIONS
|
|
246
256
|
: cliToolId === 'antigravity' ? schedule_config_1.ANTIGRAVITY_PERMISSIONS
|
|
247
257
|
: cliToolId === 'command-code' ? schedule_config_1.COMMAND_CODE_SCHEDULE_PERMISSIONS
|
|
248
|
-
:
|
|
258
|
+
// Issue #2974: `default` / `auto`, the parser's and the dialog's list.
|
|
259
|
+
: cliToolId === 'opencode-v2' ? schedule_config_1.OPENCODE_V2_PERMISSIONS
|
|
260
|
+
: [];
|
|
249
261
|
if (!allowedValues.includes(trimmedPermission)) {
|
|
250
262
|
errors.push({
|
|
251
263
|
row: i,
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
* Shared between response-poller.ts and API routes
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = void 0;
|
|
7
|
+
exports.findOpencodeV2DialogTitle = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = exports.OPENCODE_V2_THINKING_PATTERN = exports.OPENCODE_V2_FOOTER_PATTERN = exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_TRAILED_STATUS_BAR_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_EFFORT_PICKER_FOOTER_PATTERN = exports.CODEX_PICKER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_TRUST_QUESTION_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
8
|
+
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_V2_SKIP_PATTERNS = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
|
+
exports.resolveClaudeTrustDialogKeys = resolveClaudeTrustDialogKeys;
|
|
12
|
+
exports.isClaudeTrustDialogOpen = isClaudeTrustDialogOpen;
|
|
13
|
+
exports.isShellPaneCommand = isShellPaneCommand;
|
|
11
14
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
12
15
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
13
16
|
exports.getCodexLifecycleDialog = getCodexLifecycleDialog;
|
|
@@ -17,6 +20,7 @@ exports.findOpenCodeChromeStart = findOpenCodeChromeStart;
|
|
|
17
20
|
exports.findOpenCodeUserEchoEnd = findOpenCodeUserEchoEnd;
|
|
18
21
|
exports.findOpenCodeComposerRows = findOpenCodeComposerRows;
|
|
19
22
|
exports.stripOpenCodeGutter = stripOpenCodeGutter;
|
|
23
|
+
exports.isOpencodeV2ComposerVisible = isOpencodeV2ComposerVisible;
|
|
20
24
|
exports.readCopilotStatusBar = readCopilotStatusBar;
|
|
21
25
|
exports.findCopilotChromeStart = findCopilotChromeStart;
|
|
22
26
|
exports.isCopilotSelectionFrame = isCopilotSelectionFrame;
|
|
@@ -228,6 +232,86 @@ function findClaudeChromeStart(lines) {
|
|
|
228
232
|
* tmux padding or other output. (SF-001)
|
|
229
233
|
*/
|
|
230
234
|
exports.CLAUDE_TRUST_DIALOG_PATTERN = /Yes, I trust this folder/m;
|
|
235
|
+
/** The option row of the trust dialog's cursor: `❯` (or legacy `>`) after the dialog's left padding. */
|
|
236
|
+
const CLAUDE_TRUST_CURSOR_ROW_PATTERN = /^\s*[>❯]\s+\S/;
|
|
237
|
+
/** How far the cursor row may sit from the `Yes, I trust this folder` row (the dialog has two options). */
|
|
238
|
+
const CLAUDE_TRUST_MAX_CURSOR_DISTANCE = 3;
|
|
239
|
+
/**
|
|
240
|
+
* Keys that answer Claude Code's folder-trust dialog with "Yes", or null when
|
|
241
|
+
* no answerable dialog is on screen (Issue #3078).
|
|
242
|
+
*
|
|
243
|
+
* The dialog comes in two layouts, and Enter alone is only right for one:
|
|
244
|
+
*
|
|
245
|
+
* - default Yes (Issue #201 era, `tests/unit/lib/claude-session.test.ts`):
|
|
246
|
+
* ` ❯ 1. Yes, I trust this folder` / ` 2. No, exit` — Enter confirms Yes.
|
|
247
|
+
* - default No (2.1.259 `tests/fixtures/chat-dialog-card-2254/claude-trust-2-1-259.txt`,
|
|
248
|
+
* 2.1.287 with a permission allow-list
|
|
249
|
+
* `tests/fixtures/claude-trust-dialog-3078/allowlist-default-no-2-1-287.txt`):
|
|
250
|
+
* ` ❯ No, exit` / ` Yes, I trust this folder` — Enter EXITS Claude Code.
|
|
251
|
+
*
|
|
252
|
+
* So the answer is read off the screen: the distance from the cursor row to the
|
|
253
|
+
* Yes row becomes that many `Up`/`Down` presses, then `Enter`. Only the last
|
|
254
|
+
* dialog in the capture counts, and a dialog followed by Claude's input-box
|
|
255
|
+
* separator is history in the scrollback, not an open dialog.
|
|
256
|
+
*
|
|
257
|
+
* @param output - ANSI-stripped pane output
|
|
258
|
+
* @returns tmux key names ending in `Enter` (just `['Enter']` when the cursor is
|
|
259
|
+
* already on Yes), or null when no open dialog / no readable cursor row
|
|
260
|
+
*/
|
|
261
|
+
function resolveClaudeTrustDialogKeys(output) {
|
|
262
|
+
const lines = output.split('\n');
|
|
263
|
+
const yesIndex = findOpenClaudeTrustYesRow(lines);
|
|
264
|
+
if (yesIndex === -1)
|
|
265
|
+
return null;
|
|
266
|
+
for (let distance = 0; distance <= CLAUDE_TRUST_MAX_CURSOR_DISTANCE; distance++) {
|
|
267
|
+
for (const direction of distance === 0 ? [0] : [-1, 1]) {
|
|
268
|
+
const index = yesIndex + direction * distance;
|
|
269
|
+
if (index < 0 || index >= lines.length)
|
|
270
|
+
continue;
|
|
271
|
+
if (!CLAUDE_TRUST_CURSOR_ROW_PATTERN.test(lines[index]))
|
|
272
|
+
continue;
|
|
273
|
+
// Cursor above Yes → move Down; below → move Up.
|
|
274
|
+
const key = direction < 0 ? 'Down' : 'Up';
|
|
275
|
+
return [...Array(distance).fill(key), 'Enter'];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Whether Claude Code's folder-trust dialog is the open screen (Issue #3078).
|
|
282
|
+
*
|
|
283
|
+
* The dialog's cursor row (` ❯ No, exit`) has the prompt glyph, so the start
|
|
284
|
+
* wait asks this before CLAUDE_PROMPT_PATTERN rather than reading the dialog as
|
|
285
|
+
* a ready prompt.
|
|
286
|
+
*
|
|
287
|
+
* @param output - ANSI-stripped pane output
|
|
288
|
+
*/
|
|
289
|
+
function isClaudeTrustDialogOpen(output) {
|
|
290
|
+
return findOpenClaudeTrustYesRow(output.split('\n')) !== -1;
|
|
291
|
+
}
|
|
292
|
+
/** `#{pane_current_command}` values of an interactive shell, with tmux's `-` login prefix removed. */
|
|
293
|
+
const SHELL_PANE_COMMANDS = new Set(['sh', 'bash', 'zsh', 'fish', 'dash', 'ksh', 'tcsh', 'csh']);
|
|
294
|
+
/**
|
|
295
|
+
* Whether a pane's foreground command is a shell rather than an agent
|
|
296
|
+
* (Issue #3089). Claude Code shows up as `claude`, `node` or its version
|
|
297
|
+
* string (`2.1.287`), never as one of these, so a shell here after the agent
|
|
298
|
+
* was seen running means the agent has exited.
|
|
299
|
+
*
|
|
300
|
+
* @param command - `#{pane_current_command}` of the pane
|
|
301
|
+
*/
|
|
302
|
+
function isShellPaneCommand(command) {
|
|
303
|
+
return SHELL_PANE_COMMANDS.has(command.trim().replace(/^-/, ''));
|
|
304
|
+
}
|
|
305
|
+
/** Row of the last `Yes, I trust this folder`, or -1 when absent or already answered. */
|
|
306
|
+
function findOpenClaudeTrustYesRow(lines) {
|
|
307
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
308
|
+
if (!exports.CLAUDE_TRUST_DIALOG_PATTERN.test(lines[i]))
|
|
309
|
+
continue;
|
|
310
|
+
// Claude's input box (separator rows) drawn below it: the dialog is scrollback.
|
|
311
|
+
return lines.slice(i + 1).some((line) => exports.CLAUDE_SEPARATOR_PATTERN.test(line)) ? -1 : i;
|
|
312
|
+
}
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
231
315
|
/**
|
|
232
316
|
* Codex prompt pattern
|
|
233
317
|
* T1.2: Improved to detect empty prompts as well
|
|
@@ -1469,12 +1553,22 @@ exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = /Enter\s+to\s+set\s+as\s+default\b
|
|
|
1469
1553
|
* "Enter to set as default · s to use this session only · Esc to cancel"
|
|
1470
1554
|
* (/model command footer as of Claude Code v2.1.218 — Issue #1495)
|
|
1471
1555
|
*
|
|
1556
|
+
* "←/→ to adjust · Enter to confirm · s for this session only · Esc to cancel"
|
|
1557
|
+
* (/effort slider footer as of Claude Code v2.1.257 — Issue #3052; before
|
|
1558
|
+
* 2.1.257 it was "Enter to confirm · Esc to cancel")
|
|
1559
|
+
*
|
|
1560
|
+
* The /effort branch keys on "Enter to confirm · s for this session only" rather
|
|
1561
|
+
* than "←/→ to adjust": the `s` hint is unique to the pickers (the trust dialog's
|
|
1562
|
+
* "Enter to confirm · Esc to cancel" and approval dialogs never carry it), and
|
|
1563
|
+
* keeping the match under the `Enter to` prefix leaves the pattern a single
|
|
1564
|
+
* linear alternation. Linear, no nested quantifiers — ReDoS safe.
|
|
1565
|
+
*
|
|
1472
1566
|
* The "set as default" branch lets status-detector classify the `/model` overlay
|
|
1473
1567
|
* as a Claude selection list (NavigationButtons + ESC hatch, hasActivePrompt=false)
|
|
1474
1568
|
* once detectPrompt() no longer reports it as a prompt (see
|
|
1475
1569
|
* CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN).
|
|
1476
1570
|
*/
|
|
1477
|
-
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc|set\s+as\s+default)/;
|
|
1571
|
+
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+(?:Esc|s\s+for\s+this\s+session\s+only)|set\s+as\s+default)/;
|
|
1478
1572
|
/**
|
|
1479
1573
|
* OpenCode TUI separator pattern (Issue #379)
|
|
1480
1574
|
* Matches lines composed entirely of box-drawing / TUI decoration characters.
|
|
@@ -1498,6 +1592,68 @@ exports.OPENCODE_SKIP_PATTERNS = [
|
|
|
1498
1592
|
exports.OPENCODE_FOOTER_STATUS_PATTERN,
|
|
1499
1593
|
exports.PASTED_TEXT_PATTERN,
|
|
1500
1594
|
];
|
|
1595
|
+
// =============================================================================
|
|
1596
|
+
// OpenCode V2 (`opencode2`, Issue #2934)
|
|
1597
|
+
// =============================================================================
|
|
1598
|
+
//
|
|
1599
|
+
// A separate tool id from `opencode` (Epic #2370, decision 1). Its TUI is drawn
|
|
1600
|
+
// by the same toolkit and many rows look alike, but v1's constants are v1's:
|
|
1601
|
+
// they are left exactly as they are, and v2 names its own here so a change on
|
|
1602
|
+
// either side cannot move the other. Phase 1 reads only what the send path and
|
|
1603
|
+
// the fallback status reader need; the approval dialog (`Always allow`, the
|
|
1604
|
+
// reverse of v1's `Allow always`), the completion row and the session tabs are
|
|
1605
|
+
// Phase 3's.
|
|
1606
|
+
/**
|
|
1607
|
+
* OpenCode V2's empty composer: the input box's `┃` gutter with the
|
|
1608
|
+
* `Ask anything…` placeholder on the same row (2.0.18 draws U+2026; the ASCII
|
|
1609
|
+
* `...` is accepted too, as for v1 since #2915).
|
|
1610
|
+
*
|
|
1611
|
+
* Measured on 2.0.18 at 80x200 (2026-09-28):
|
|
1612
|
+
* ` ┃ Ask anything… "Fix broken tests"`. Match against the ANSI-stripped
|
|
1613
|
+
* frame BEFORE `stripBoxDrawing`, which removes the gutter this anchors on.
|
|
1614
|
+
*/
|
|
1615
|
+
exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = /^[^\S\n]*[\u2502\u2503][^\S\n]*Ask anything(?:\.\.\.|\u2026)/m;
|
|
1616
|
+
/**
|
|
1617
|
+
* OpenCode V2's footer, which ends in `ctrl+p commands` on every frame the
|
|
1618
|
+
* TUI draws (before a turn: `<path>:<branch> shift+tab agents ctrl+p commands`;
|
|
1619
|
+
* after one: `<path>:<branch> 8.8K (1%) ctrl+p commands`, 2.0.18).
|
|
1620
|
+
*
|
|
1621
|
+
* Proof that the TUI — and so its composer — is on screen, NOT that it is idle:
|
|
1622
|
+
* a running turn keeps the footer.
|
|
1623
|
+
*/
|
|
1624
|
+
exports.OPENCODE_V2_FOOTER_PATTERN = /ctrl\+p commands/;
|
|
1625
|
+
/**
|
|
1626
|
+
* OpenCode V2 working indicator: the footer's `esc interrupt` hint, drawn only
|
|
1627
|
+
* while a turn is running (2.0.18).
|
|
1628
|
+
*/
|
|
1629
|
+
exports.OPENCODE_V2_THINKING_PATTERN = /esc interrupt/;
|
|
1630
|
+
/**
|
|
1631
|
+
* Whether OpenCode V2's composer is on screen, so a send may type into it
|
|
1632
|
+
* (Issue #2934, D6): the gutter-anchored placeholder, or the footer.
|
|
1633
|
+
*
|
|
1634
|
+
* @param text - ANSI-stripped capture, box drawing intact
|
|
1635
|
+
*/
|
|
1636
|
+
function isOpencodeV2ComposerVisible(text) {
|
|
1637
|
+
return exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test(text) || exports.OPENCODE_V2_FOOTER_PATTERN.test(text);
|
|
1638
|
+
}
|
|
1639
|
+
/**
|
|
1640
|
+
* The OpenCode V2 dialog title row and its reader (Issue #2971) live in a
|
|
1641
|
+
* browser-safe leaf since Issue #2983, because the chat surface's dialog card
|
|
1642
|
+
* reads the same row to decide whether v2's model keys may close the dialog
|
|
1643
|
+
* first. Re-exported here so every server-side caller keeps one import site.
|
|
1644
|
+
*/
|
|
1645
|
+
var dialog_title_1 = require("./tools/opencode-v2/dialog-title");
|
|
1646
|
+
Object.defineProperty(exports, "OPENCODE_V2_DIALOG_TITLE_PATTERN", { enumerable: true, get: function () { return dialog_title_1.OPENCODE_V2_DIALOG_TITLE_PATTERN; } });
|
|
1647
|
+
Object.defineProperty(exports, "findOpencodeV2DialogTitle", { enumerable: true, get: function () { return dialog_title_1.findOpencodeV2DialogTitle; } });
|
|
1648
|
+
/** OpenCode V2 rows that are chrome, never reply content. */
|
|
1649
|
+
exports.OPENCODE_V2_SKIP_PATTERNS = [
|
|
1650
|
+
exports.OPENCODE_SEPARATOR_PATTERN,
|
|
1651
|
+
exports.OPENCODE_V2_FOOTER_PATTERN,
|
|
1652
|
+
exports.OPENCODE_V2_THINKING_PATTERN,
|
|
1653
|
+
/Ask anything(?:\.\.\.|\u2026)/,
|
|
1654
|
+
/^Build\s+·/,
|
|
1655
|
+
exports.PASTED_TEXT_PATTERN,
|
|
1656
|
+
];
|
|
1501
1657
|
/**
|
|
1502
1658
|
* Copilot prompt pattern (Issue #545)
|
|
1503
1659
|
* Copilot CLI shows "❯" followed by cursor/text hint:
|
|
@@ -2669,6 +2825,9 @@ function detectThinking(cliToolId, content) {
|
|
|
2669
2825
|
case 'command-code':
|
|
2670
2826
|
result = exports.COMMAND_CODE_THINKING_PATTERN.test(content);
|
|
2671
2827
|
break;
|
|
2828
|
+
case 'opencode-v2':
|
|
2829
|
+
result = exports.OPENCODE_V2_THINKING_PATTERN.test(content);
|
|
2830
|
+
break;
|
|
2672
2831
|
default:
|
|
2673
2832
|
result = exports.CLAUDE_THINKING_PATTERN.test(content);
|
|
2674
2833
|
}
|
|
@@ -2787,6 +2946,16 @@ function getCliToolPatterns(cliToolId) {
|
|
|
2787
2946
|
thinkingPattern: exports.COMMAND_CODE_THINKING_PATTERN,
|
|
2788
2947
|
skipPatterns: [...exports.COMMAND_CODE_SKIP_PATTERNS],
|
|
2789
2948
|
};
|
|
2949
|
+
// Issue #2934: OpenCode V2's own constants (see OPENCODE_V2_* above). The
|
|
2950
|
+
// separator row is the same half-block rule v1 draws, so v1's pattern is
|
|
2951
|
+
// reused as a value; nothing of v1's is changed.
|
|
2952
|
+
case 'opencode-v2':
|
|
2953
|
+
return {
|
|
2954
|
+
promptPattern: exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN,
|
|
2955
|
+
separatorPattern: exports.OPENCODE_SEPARATOR_PATTERN,
|
|
2956
|
+
thinkingPattern: exports.OPENCODE_V2_THINKING_PATTERN,
|
|
2957
|
+
skipPatterns: [...exports.OPENCODE_V2_SKIP_PATTERNS],
|
|
2958
|
+
};
|
|
2790
2959
|
default:
|
|
2791
2960
|
// Default to Claude patterns
|
|
2792
2961
|
return getCliToolPatterns('claude');
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
* @see Issue #1784, Phase 2 of the model/effort visibility series
|
|
63
63
|
*/
|
|
64
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
65
|
+
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_EFFORT_ROW_PATTERN = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
66
66
|
exports.resolveEffortToken = resolveEffortToken;
|
|
67
67
|
exports.extractModelInfo = extractModelInfo;
|
|
68
68
|
exports.deriveEffortFromModelId = deriveEffortFromModelId;
|
|
@@ -288,14 +288,83 @@ function readCodexFooter(line) {
|
|
|
288
288
|
* literal-anchored parts, and the greedy prefix class is disjoint from `\S`.
|
|
289
289
|
*/
|
|
290
290
|
exports.CLAUDE_STARTUP_BANNER_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+with\s+(minimal|low|medium|high|xhigh)\s+effort\b/i;
|
|
291
|
+
/**
|
|
292
|
+
* The startup banner as claude 2.1.28x draws it: `<model> · <plan>` with no
|
|
293
|
+
* effort clause (Issue #2955).
|
|
294
|
+
*
|
|
295
|
+
* Measured on claude 2.1.284 (`tests/fixtures/claude-session-start-2955/`):
|
|
296
|
+
* `▝▜██████▀ Sonnet 5.5 · Claude Max`
|
|
297
|
+
* The effort moved off this row to a right-aligned one of its own
|
|
298
|
+
* ({@link CLAUDE_EFFORT_ROW_PATTERN}). Issue #3023 measured on 2.1.285 that
|
|
299
|
+
* this is the shape at the model's DEFAULT effort only: a non-default effort
|
|
300
|
+
* brings the clause back (`Opus 5.5 with xhigh effort · Claude Max`), which
|
|
301
|
+
* {@link CLAUDE_STARTUP_BANNER_PATTERN} reads
|
|
302
|
+
* (`tests/fixtures/claude-effort-default-3023/`).
|
|
303
|
+
*
|
|
304
|
+
* Without the `with … effort` anchor, a box-framed table row containing ` · `
|
|
305
|
+
* would read as a banner — the reason #2361 declined to widen
|
|
306
|
+
* {@link CLAUDE_STARTUP_BANNER_PATTERN}. The anchor here is the plan instead:
|
|
307
|
+
* the separator must be followed by `Claude <Plan>`, the spelling measured on
|
|
308
|
+
* 2.1.284. `API Usage Billing` is deliberately NOT accepted yet: the only frames
|
|
309
|
+
* that carry it are #2361's 2.1.263 Haiku banners, and
|
|
310
|
+
* `model-info-claude-switch-2361.test.ts` pins those as an honest unknown
|
|
311
|
+
* (`fullscreen-after-clear`). The hook's `SessionStart` names the model on
|
|
312
|
+
* those sessions. `·` is excluded from the model group so the lazy
|
|
313
|
+
* match stops at the first separator, and a label still carrying `with …
|
|
314
|
+
* effort` (a truncated old-format banner) is refused by the caller.
|
|
315
|
+
*
|
|
316
|
+
* Tried only after the old pattern, so a 2.1.232-shaped line keeps its effort.
|
|
317
|
+
*/
|
|
318
|
+
exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F·]*?)\s+·\s+Claude\s+[A-Za-z]+\b/;
|
|
319
|
+
/**
|
|
320
|
+
* The right-aligned effort row claude 2.1.28x draws under its banner
|
|
321
|
+
* (Issue #2955): `◐ medium · /effort`.
|
|
322
|
+
*
|
|
323
|
+
* Anchored on the trailing `· /effort` hint, which is chrome and nothing a
|
|
324
|
+
* reply would end a line with; the leading glyph is any one non-space
|
|
325
|
+
* character (the dial changes with the level). The word goes through
|
|
326
|
+
* {@link resolveEffortToken}, so anything outside the known levels reads as no
|
|
327
|
+
* effort rather than as a guess.
|
|
328
|
+
*
|
|
329
|
+
* The row is drawn on the first frame only; after the first turn it is gone
|
|
330
|
+
* (Issue #3023), so a later frame reads the model and no effort.
|
|
331
|
+
*/
|
|
332
|
+
exports.CLAUDE_EFFORT_ROW_PATTERN = /^\s*\S\s+([A-Za-z]+)\s+·\s+\/effort\s*$/;
|
|
291
333
|
function readClaudeBanner(line) {
|
|
292
334
|
const match = exports.CLAUDE_STARTUP_BANNER_PATTERN.exec(line);
|
|
293
|
-
if (
|
|
335
|
+
if (match) {
|
|
336
|
+
const model = match[1].trim();
|
|
337
|
+
if (!isPlausibleModelLabel(model))
|
|
338
|
+
return null;
|
|
339
|
+
return { model, effort: resolveEffortToken(match[2]) };
|
|
340
|
+
}
|
|
341
|
+
// Issue #2955: the 2.1.28x shape, no effort on the row.
|
|
342
|
+
const current = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN.exec(line);
|
|
343
|
+
if (!current)
|
|
294
344
|
return null;
|
|
295
|
-
const model =
|
|
296
|
-
if (!isPlausibleModelLabel(model))
|
|
345
|
+
const model = current[1].trim();
|
|
346
|
+
if (/\swith\s/i.test(model) || !isPlausibleModelLabel(model))
|
|
297
347
|
return null;
|
|
298
|
-
return { model, effort:
|
|
348
|
+
return { model, effort: null };
|
|
349
|
+
}
|
|
350
|
+
function readClaudeEffortRow(line) {
|
|
351
|
+
const match = exports.CLAUDE_EFFORT_ROW_PATTERN.exec(line);
|
|
352
|
+
if (!match)
|
|
353
|
+
return null;
|
|
354
|
+
const effort = resolveEffortToken(match[1]);
|
|
355
|
+
return effort === null ? null : { model: null, effort };
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The banner, with the effort filled from the 2.1.28x effort row when the
|
|
359
|
+
* banner itself names none (Issue #2955). The row is consulted only for a
|
|
360
|
+
* banner that was read, so it never supplies an effort on its own.
|
|
361
|
+
*/
|
|
362
|
+
function readClaudeBannerWithEffort(captureText) {
|
|
363
|
+
const banner = scanFromEnd(captureText, readClaudeBanner);
|
|
364
|
+
if (!banner || banner.effort !== null)
|
|
365
|
+
return banner;
|
|
366
|
+
const row = scanFromEnd(captureText, readClaudeEffortRow);
|
|
367
|
+
return row ? { model: banner.model, effort: row.effort } : banner;
|
|
299
368
|
}
|
|
300
369
|
/**
|
|
301
370
|
* Reads `<model>[ with <effort> effort]` off the line Claude prints when the
|
|
@@ -341,7 +410,10 @@ function readClaudeBanner(line) {
|
|
|
341
410
|
* Billing`), so {@link CLAUDE_STARTUP_BANNER_PATTERN} does not read it and
|
|
342
411
|
* the confirmation line is what publishes the model there. The banner
|
|
343
412
|
* pattern is deliberately not widened: without the `with … effort` anchor
|
|
344
|
-
* a box-framed table row containing ` · ` would read as a banner.
|
|
413
|
+
* a box-framed table row containing ` · ` would read as a banner. (#2955
|
|
414
|
+
* added a second, plan-anchored pattern for the 2.1.28x banner —
|
|
415
|
+
* {@link CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN} — which accepts
|
|
416
|
+
* `· Claude <Plan>` only, so this Haiku row is still not read.)
|
|
345
417
|
* - **`/fast` prints `⎿ ↯ Fast mode ON · model set to Opus 5 · $10/$50 per
|
|
346
418
|
* Mtok` and is a model switch** (`PostModelSwitch` reported
|
|
347
419
|
* `claude-fable-5-1` → `claude-opus-5[1m]` on the same keypress). It is NOT
|
|
@@ -747,7 +819,7 @@ function extractModelInfo(cliToolId, captureText) {
|
|
|
747
819
|
// hooks name the model on `SessionStart` alone — `/model` fires none of
|
|
748
820
|
// the events CommandMate registers — so on a switch the pane is the only
|
|
749
821
|
// channel that hears it.
|
|
750
|
-
return (
|
|
822
|
+
return (readClaudeBannerWithEffort(captureText) ??
|
|
751
823
|
scanFromEnd(captureText, readClaudeModelSwitchLine) ??
|
|
752
824
|
unknown());
|
|
753
825
|
case 'antigravity':
|
|
@@ -31,6 +31,7 @@ exports.detectSessionStatus = detectSessionStatus;
|
|
|
31
31
|
const status_reason_1 = require("./status-reason");
|
|
32
32
|
const frame_1 = require("./tools/frame");
|
|
33
33
|
const registry_1 = require("./tools/registry");
|
|
34
|
+
const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
|
|
34
35
|
var status_reason_2 = require("./status-reason");
|
|
35
36
|
Object.defineProperty(exports, "STATUS_REASON", { enumerable: true, get: function () { return status_reason_2.STATUS_REASON; } });
|
|
36
37
|
/**
|
|
@@ -139,7 +140,15 @@ Object.defineProperty(exports, "STATUS_CHECK_LINE_COUNT", { enumerable: true, ge
|
|
|
139
140
|
*/
|
|
140
141
|
function detectSessionStatus(output, cliToolId, lastOutputTimestamp) {
|
|
141
142
|
const frame = (0, frame_1.normalizeFrame)(output);
|
|
142
|
-
const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, {
|
|
143
|
+
const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, {
|
|
144
|
+
lastOutputTimestamp,
|
|
145
|
+
// Issue #2991: the same presence reading Auto-Yes and History use, so an
|
|
146
|
+
// unvouched numbered list is not `waiting` here either (and therefore
|
|
147
|
+
// neither `isPromptWaiting` nor a send refusal). Consulted only by tools
|
|
148
|
+
// that set `requireVouchedPrompt`; `legacy` tools and non-`multiple_choice`
|
|
149
|
+
// prompts come back `present: true` regardless.
|
|
150
|
+
isPromptVouched: (prompt) => (0, auto_yes_dialog_gate_1.evaluateDialogPresence)(cliToolId, prompt.promptData?.type, output).present,
|
|
151
|
+
});
|
|
143
152
|
return {
|
|
144
153
|
status: verdict.status,
|
|
145
154
|
confidence: verdict.confidence,
|
|
@@ -155,10 +155,11 @@ exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
|
|
|
155
155
|
* | `Press space to select or enter to save for next conversation` | `/experimental` | 1st |
|
|
156
156
|
* | `Press space to select or enter to save` | `/experimental` (0.155.1) | 1st |
|
|
157
157
|
* | `left/right group · enter edit shortcut · … · esc close` | `/keymap` | 2nd |
|
|
158
|
+
* | `enter continue · esc skip` | update offer (0.157.1, Issue #3020) | 2nd |
|
|
158
159
|
*
|
|
159
160
|
* No `/g` (keeps `.test()` stateless) and no nested quantifiers (ReDoS-safe).
|
|
160
161
|
*/
|
|
161
|
-
exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back)/i;
|
|
162
|
+
exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back|skip)/i;
|
|
162
163
|
const INITIAL_SGR = { bold: false, dim: false, fg: null };
|
|
163
164
|
/**
|
|
164
165
|
* Apply one SGR parameter list to the running attribute state.
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.codexStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
18
18
|
exports.isCodexStalePrompt = isCodexStalePrompt;
|
|
19
|
+
exports.isCodexModelPickerFrame = isCodexModelPickerFrame;
|
|
19
20
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
20
21
|
const prompt_detector_1 = require("../../prompt-detector");
|
|
21
22
|
const status_reason_1 = require("../../status-reason");
|
|
22
23
|
const cli_patterns_2 = require("./cli-patterns");
|
|
23
24
|
const prompt_1 = require("./prompt");
|
|
24
25
|
const frame_1 = require("../frame");
|
|
26
|
+
const dialog_block_1 = require("../dialog-block");
|
|
25
27
|
const run_detection_1 = require("../run-detection");
|
|
26
28
|
const verified_against_1 = require("../verified-against");
|
|
27
29
|
const thinking_constants_1 = require("../../../../config/thinking-constants");
|
|
@@ -463,3 +465,27 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
463
465
|
return null;
|
|
464
466
|
},
|
|
465
467
|
});
|
|
468
|
+
/**
|
|
469
|
+
* Issue #3062: is this frame codex's `/model` picker (either stage)?
|
|
470
|
+
*
|
|
471
|
+
* Auto-Yes must not answer it: the digit is an immediate decision, so the
|
|
472
|
+
* poller would pick the model and the reasoning effort for the operator. It is
|
|
473
|
+
* judged by the picker's own footer row (`enter select · esc back`, `enter
|
|
474
|
+
* default · s session · esc back`) rather than by `detectDialog`'s `picker`
|
|
475
|
+
* kind, which also covers the hooks list/detail screens whose Auto-Yes
|
|
476
|
+
* behaviour is unchanged. The footer must sit under the option block of a frame
|
|
477
|
+
* `detectDialog` vouches for, so the same words quoted in a reply do not count.
|
|
478
|
+
* `/prompt-response` does not call this and keeps accepting an answer.
|
|
479
|
+
*
|
|
480
|
+
* @param cleanOutput - The capture Auto-Yes judged (ANSI and box drawing stripped)
|
|
481
|
+
*/
|
|
482
|
+
function isCodexModelPickerFrame(cleanOutput) {
|
|
483
|
+
const frame = (0, frame_1.normalizeFrame)(cleanOutput);
|
|
484
|
+
if (!exports.codexStatusDetector.detectDialog(frame))
|
|
485
|
+
return false;
|
|
486
|
+
const contentEnd = findCodexContentEnd(frame.contentLines);
|
|
487
|
+
const block = (0, dialog_block_1.findNumberedOptionBlock)((0, cli_patterns_1.stripBoxDrawing)(frame.clean).split('\n'), contentEnd);
|
|
488
|
+
return (block !== null &&
|
|
489
|
+
(cli_patterns_1.CODEX_PICKER_FOOTER_PATTERN.test(block.footer) ||
|
|
490
|
+
cli_patterns_1.CODEX_EFFORT_PICKER_FOOTER_PATTERN.test(block.footer)));
|
|
491
|
+
}
|