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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which part of Command Code's plan review overlay has the keyboard
|
|
4
|
+
* (Issue #3125).
|
|
5
|
+
*
|
|
6
|
+
* The detector already says THAT the overlay is up
|
|
7
|
+
* (`command_code_plan_review`, see `detect.ts`). Answering it needs one more
|
|
8
|
+
* fact, because the same keys mean different things depending on where the
|
|
9
|
+
* focus is — measured on 1.58.0 (`tests/fixtures/command-code-plan-review-2763/`)
|
|
10
|
+
* and unchanged in the 1.74.0 rows #3059 observed
|
|
11
|
+
* (`tests/fixtures/command-code-plan-review-3125/`):
|
|
12
|
+
*
|
|
13
|
+
* | phase | hint bar (last content row) | `Enter` does |
|
|
14
|
+
* |------------------|----------------------------------------------|-------------------------|
|
|
15
|
+
* | `body` | `type + enter to comment · …` | opens / pins a comment |
|
|
16
|
+
* | `comment-box` | `enter to pin · esc discard` | pins what is typed |
|
|
17
|
+
* | `action-focus` | `↑/↓ choose · enter to run` (a `❯` on a row) | RUNS the focused action |
|
|
18
|
+
* | `approve-choice` | `←/→ choose · enter confirm · esc back` | confirms the approval |
|
|
19
|
+
*
|
|
20
|
+
* The body cursor itself is drawn by background colour alone and cannot be read
|
|
21
|
+
* off a plain capture; the hint bar and the `❯` can, which is all this needs.
|
|
22
|
+
*
|
|
23
|
+
* Browser-safe and pure, like `selection-shape.ts` it builds on.
|
|
24
|
+
*
|
|
25
|
+
* @module lib/detection/tools/command-code/plan-review-state
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.readCommandCodePlanReviewState = readCommandCodePlanReviewState;
|
|
29
|
+
const ansi_1 = require("../../ansi");
|
|
30
|
+
const selection_shape_1 = require("../../selection-shape");
|
|
31
|
+
/** Rows read from the end of the frame — the same 15 the detector reads. */
|
|
32
|
+
const TAIL_CONTENT_ROWS = 15;
|
|
33
|
+
const BODY_HINT = /^\s*type \+ enter to comment\b/i;
|
|
34
|
+
const COMMENT_BOX_HINT = /^\s*enter to pin\s*·\s*esc discard\s*$/i;
|
|
35
|
+
const ACTION_FOCUS_HINT = /^\s*↑\/↓ choose\s*·\s*enter to run\s*$/i;
|
|
36
|
+
const FOCUSED_ACTION_ROW = /^\s*❯ +(?:Submit review\b|Approve\s+ctrl\+a\b|Cancel\s+esc\b)/im;
|
|
37
|
+
const PENDING_BADGE = /^\s*REVIEW\s+(\d+)\s+pending comments?\b/im;
|
|
38
|
+
const APPROVE_WITH_COMMENTS_SELECTED = /\(•\)\s+with\s+\d+\s+comments?\s+as\s+notes/i;
|
|
39
|
+
/**
|
|
40
|
+
* Read the plan review overlay's focus off a capture.
|
|
41
|
+
*
|
|
42
|
+
* @param frame - a raw `capture-pane` frame, ANSI intact or stripped
|
|
43
|
+
* @returns null when the overlay is not at the bottom of this frame
|
|
44
|
+
*/
|
|
45
|
+
function readCommandCodePlanReviewState(frame) {
|
|
46
|
+
if (!frame)
|
|
47
|
+
return null;
|
|
48
|
+
const rows = (0, ansi_1.stripAnsi)(frame.replace(/\r\n/g, '\n'))
|
|
49
|
+
.split('\n')
|
|
50
|
+
.filter((row) => row.trim() !== '')
|
|
51
|
+
.slice(-TAIL_CONTENT_ROWS);
|
|
52
|
+
if (rows.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
const tail = rows.join('\n');
|
|
55
|
+
const pendingMatch = PENDING_BADGE.exec(tail);
|
|
56
|
+
const pendingComments = pendingMatch ? Number(pendingMatch[1]) : 0;
|
|
57
|
+
if ((0, selection_shape_1.isCommandCodePlanApproveChoice)(tail)) {
|
|
58
|
+
return {
|
|
59
|
+
phase: 'approve-choice',
|
|
60
|
+
pendingComments,
|
|
61
|
+
approveChoice: APPROVE_WITH_COMMENTS_SELECTED.test(tail) ? 'with-comments' : 'discard-comments',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (!(0, selection_shape_1.hasCommandCodePlanReviewFooterAtBottom)(tail))
|
|
65
|
+
return null;
|
|
66
|
+
const hint = rows[rows.length - 1];
|
|
67
|
+
let phase = 'unknown';
|
|
68
|
+
if (FOCUSED_ACTION_ROW.test(tail) || ACTION_FOCUS_HINT.test(hint))
|
|
69
|
+
phase = 'action-focus';
|
|
70
|
+
else if (COMMENT_BOX_HINT.test(hint))
|
|
71
|
+
phase = 'comment-box';
|
|
72
|
+
else if (BODY_HINT.test(hint))
|
|
73
|
+
phase = 'body';
|
|
74
|
+
return { phase, pendingComments, approveChoice: null };
|
|
75
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2 screen detector — the fallback reader (Issue #2934, Phase 1).
|
|
4
|
+
*
|
|
5
|
+
* OpenCode V2's state comes from its server's SSE stream
|
|
6
|
+
* (`@/lib/hooks/sources/opencode-v2`); this module is what decides when that
|
|
7
|
+
* stream is not there (a pane launched `--standalone`, a subscription that has
|
|
8
|
+
* not reattached yet). It reads, in this order:
|
|
9
|
+
*
|
|
10
|
+
* - the approval dialog's button strip (`Allow once Always allow Reject`)
|
|
11
|
+
* → `waiting` (Issue #2965);
|
|
12
|
+
* - the question form's key hints (`↑↓ select enter submit esc dismiss`)
|
|
13
|
+
* → `waiting` (Issue #2965);
|
|
14
|
+
* - a dialog's title row (`Select variant … esc`, the model / variant
|
|
15
|
+
* pickers, Commands, Sessions, Select agent) anywhere on the pane
|
|
16
|
+
* → `waiting` (Issue #2971);
|
|
17
|
+
* - the footer's `esc interrupt` hint → `running`;
|
|
18
|
+
* - the completion row (`Build · <model> · 3.5s · 11.2 tok/s`) as the last
|
|
19
|
+
* transcript row → `ready` (Issue #2965);
|
|
20
|
+
* - the gutter-anchored empty composer (`┃ Ask anything…`) → `ready`;
|
|
21
|
+
* - otherwise the footer without that hint (`… 8.6K (1%) ctrl+p commands`,
|
|
22
|
+
* the frame after a turn, whose composer is a bare gutter) → `ready`.
|
|
23
|
+
*
|
|
24
|
+
* Both dialogs are drawn INSIDE the composer's `┃` gutter and replace the
|
|
25
|
+
* footer altogether (measured on 2.0.18, 80x200, 2026-09-29:
|
|
26
|
+
* `tests/fixtures/opencode-v2-live-2945/permission-required.txt` /
|
|
27
|
+
* `question.txt`), so before #2965 they reached the floor as `running` /
|
|
28
|
+
* `default` — an unclassified frame, which is what wrote the "could not parse
|
|
29
|
+
* it" row into the chat while the structured layer held the very approval.
|
|
30
|
+
*
|
|
31
|
+
* v1's opencode detector is deliberately not reused: its dialog rule keys on
|
|
32
|
+
* v1's wording (`Allow always`, the reverse word order) and would misread v2.
|
|
33
|
+
*
|
|
34
|
+
* `detectDialog` (Issue #2984) reads the same three surfaces for the Auto-Yes
|
|
35
|
+
* gate (`polling/auto-yes-dialog-gate`), measured on 2.0.18 at 80x200
|
|
36
|
+
* (2026-09-29, `tests/fixtures/opencode-v2-dialogs-2984/`): the approval strip
|
|
37
|
+
* (`keys` — a typed digit leaves it open), the question form (`numbered`,
|
|
38
|
+
* `answer_only` — a typed `2` alone submitted `Blue`) and a dialog title
|
|
39
|
+
* (`keys` — a digit goes into the filter). v2's approvals and questions are
|
|
40
|
+
* still answered through the agent's own API (#2945); what the gate needs from
|
|
41
|
+
* this module is the NO — an agent's reply that quotes a `❯ 1. Yes` dialog is
|
|
42
|
+
* none of the three, so Auto-Yes does not type into the composer for it.
|
|
43
|
+
*
|
|
44
|
+
* @module lib/detection/tools/opencode-v2/detect
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.opencodeV2StatusDetector = exports.OPENCODE_V2_PERMISSION_OPTIONS = exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = exports.OPENCODE_V2_QUESTION_PATTERN = exports.OPENCODE_V2_PERMISSION_PATTERN = exports.VERIFIED_AGAINST = void 0;
|
|
48
|
+
exports.endsWithTurnComplete = endsWithTurnComplete;
|
|
49
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
50
|
+
const status_reason_1 = require("../../status-reason");
|
|
51
|
+
const run_detection_1 = require("../run-detection");
|
|
52
|
+
const verified_against_1 = require("../verified-against");
|
|
53
|
+
exports.VERIFIED_AGAINST = verified_against_1.OPENCODE_V2_VERIFIED_AGAINST;
|
|
54
|
+
/**
|
|
55
|
+
* The approval dialog's button strip, on the composer's own `┃` gutter:
|
|
56
|
+
* `┃ Allow once Always allow Reject ctrl+f fullscreen ⇆ select enter con…`
|
|
57
|
+
* (2.0.18). The gutter anchor keeps the same words reaching the pane inside a
|
|
58
|
+
* reply from being read as a dialog, as v1's `OPENCODE_PERMISSION_PATTERN`
|
|
59
|
+
* does; the word order is v2's own (`Always allow`, not v1's `Allow always`).
|
|
60
|
+
*/
|
|
61
|
+
exports.OPENCODE_V2_PERMISSION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*Allow once[^\S\n]{2,}Always allow[^\S\n]{2,}Reject\b/m;
|
|
62
|
+
/**
|
|
63
|
+
* The question form's key hints, on the composer's gutter:
|
|
64
|
+
* `┃ ↑↓ select enter submit esc dismiss` (2.0.18, below the numbered
|
|
65
|
+
* choices and `Type your own answer`).
|
|
66
|
+
*/
|
|
67
|
+
exports.OPENCODE_V2_QUESTION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*↑↓ select[^\S\n]+enter submit[^\S\n]+esc dismiss\b/m;
|
|
68
|
+
/**
|
|
69
|
+
* The row that closes a finished turn: `Build · <model> · 3.5s · 11.2 tok/s`
|
|
70
|
+
* (2.0.18). Transcript rows carry no gutter; the composer's model bar
|
|
71
|
+
* (`┃ Build · <model> OpenCode Zen`) does and has no duration, so neither it
|
|
72
|
+
* nor v1's `▣` row matches. A duration is required — the row without one is not
|
|
73
|
+
* a completion (the lesson v1's #1893 learned).
|
|
74
|
+
*/
|
|
75
|
+
exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = /^[^\S\n│┃]*[A-Za-z][\w-]*(?: [\w-]+)* · [^\n]+? · \d+(?:\.\d+)?(?:ms|s|m(?: \d+s)?)(?: · [\d.]+ tok\/s)?[^\S\n]*$/;
|
|
76
|
+
/** The approval strip's buttons, in the order it draws them (2.0.18). */
|
|
77
|
+
exports.OPENCODE_V2_PERMISSION_OPTIONS = ['Allow once', 'Always allow', 'Reject'];
|
|
78
|
+
/** A row of the composer's gutter (`┃ …`). The question form is drawn entirely on it. */
|
|
79
|
+
const GUTTER_ROW_PATTERN = /^[^\S\n]*[│┃]/;
|
|
80
|
+
/** One choice of the question form: `┃ 1. Red` (2.0.18). */
|
|
81
|
+
const QUESTION_OPTION_ROW_PATTERN = /^[^\S\n]*[│┃][^\S\n]*(\d+)\.[^\S\n]+(\S.*?)[^\S\n]*$/;
|
|
82
|
+
/**
|
|
83
|
+
* The question form as a dialog (Issue #2984): the choices on the gutter rows
|
|
84
|
+
* above its key hints, numbered 1..n without a gap. `null` when the hints row
|
|
85
|
+
* is not in the status window or fewer than two choices can be read.
|
|
86
|
+
*
|
|
87
|
+
* `numbered` / `answer_only` because that is what the form does with a digit:
|
|
88
|
+
* measured on 2.0.18, typing `2` with no Enter submitted `Blue`
|
|
89
|
+
* (`tests/fixtures/opencode-v2-dialogs-2984/question-answered-by-digit.txt`).
|
|
90
|
+
*/
|
|
91
|
+
function readQuestionDialog(frame) {
|
|
92
|
+
if (!exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines))
|
|
93
|
+
return null;
|
|
94
|
+
const lines = frame.contentLines;
|
|
95
|
+
let hints = -1;
|
|
96
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
97
|
+
if (exports.OPENCODE_V2_QUESTION_PATTERN.test(lines[i])) {
|
|
98
|
+
hints = i;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (hints < 0)
|
|
103
|
+
return null;
|
|
104
|
+
const options = [];
|
|
105
|
+
for (let i = hints - 1; i >= 0 && GUTTER_ROW_PATTERN.test(lines[i]); i--) {
|
|
106
|
+
const match = QUESTION_OPTION_ROW_PATTERN.exec(lines[i]);
|
|
107
|
+
if (match)
|
|
108
|
+
options.unshift(`${match[1]}. ${match[2]}`);
|
|
109
|
+
}
|
|
110
|
+
if (options.length < 2)
|
|
111
|
+
return null;
|
|
112
|
+
if (!options.every((option, index) => option.startsWith(`${index + 1}. `)))
|
|
113
|
+
return null;
|
|
114
|
+
return { kind: 'question', options, answerMode: 'numbered', submitMode: 'answer_only' };
|
|
115
|
+
}
|
|
116
|
+
/** Rows below the transcript that are chrome: gutter padding, the model bar, the rule, the footer, the version. */
|
|
117
|
+
function isChromeRow(line) {
|
|
118
|
+
if (/^[\s│┃╹▀]*$/.test(line))
|
|
119
|
+
return true;
|
|
120
|
+
// The composer's model bar: gutter, then `<Agent> · <model> <provider>` with no second `·`.
|
|
121
|
+
if (/^[^\S\n]*[│┃][^\S\n]*[A-Za-z][\w-]* · [^·\n]+$/.test(line))
|
|
122
|
+
return true;
|
|
123
|
+
if (cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(line))
|
|
124
|
+
return true;
|
|
125
|
+
return /^\s*\d+\.\d+\.\d+\s*$/.test(line);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Whether the last transcript row — the first row above the composer's chrome —
|
|
129
|
+
* is the completion row. Only the LAST row counts: the completion row of an
|
|
130
|
+
* earlier turn stays on the pane behind the next turn and behind a dialog.
|
|
131
|
+
*/
|
|
132
|
+
function endsWithTurnComplete(frame) {
|
|
133
|
+
const lines = frame.contentLines;
|
|
134
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
135
|
+
if (isChromeRow(lines[i]))
|
|
136
|
+
continue;
|
|
137
|
+
return exports.OPENCODE_V2_TURN_COMPLETE_PATTERN.test(lines[i]);
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
exports.opencodeV2StatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
142
|
+
tool: 'opencode-v2',
|
|
143
|
+
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
144
|
+
// Issue #2991: every v2 dialog is recognised by `beforePrompt` below, so a
|
|
145
|
+
// numbered list that reaches the generic parser is text in a reply (the UAT
|
|
146
|
+
// frame: `❯ 1. Yes / 2. No` quoted in the answer). Unvouched by
|
|
147
|
+
// `detectDialog`, it is not published as `waiting` — which had left the
|
|
148
|
+
// session refusing every send with nothing on screen to answer.
|
|
149
|
+
requireVouchedPrompt: true,
|
|
150
|
+
// Issue #2965: the two dialogs, ahead of everything. Each is the agent
|
|
151
|
+
// blocked on a human whatever else is on the pane — the question frame keeps
|
|
152
|
+
// the previous turn's completion row above it — and ahead of the generic
|
|
153
|
+
// numbered-list parser too, because the question's `1. Red / 2. Blue` is
|
|
154
|
+
// driven by ↑↓ + Enter (hence `hasActivePrompt: false` and a reason from
|
|
155
|
+
// `SELECTION_LIST_REASONS`, which draws the arrow keys instead of offering to
|
|
156
|
+
// type a number). Issue #2984 measured that a typed digit also commits it,
|
|
157
|
+
// with no Enter — see `detectDialog` below.
|
|
158
|
+
beforePrompt(frame) {
|
|
159
|
+
if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
|
|
160
|
+
return {
|
|
161
|
+
status: 'waiting',
|
|
162
|
+
confidence: 'high',
|
|
163
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
|
|
164
|
+
hasActivePrompt: false,
|
|
165
|
+
evidence: 'positive',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines)) {
|
|
169
|
+
return {
|
|
170
|
+
status: 'waiting',
|
|
171
|
+
confidence: 'high',
|
|
172
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
|
|
173
|
+
hasActivePrompt: false,
|
|
174
|
+
evidence: 'positive',
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// Issue #2971: a dialog opened over the composer keeps the footer (and
|
|
178
|
+
// often the placeholder) on screen, so every rule below read it as `ready`
|
|
179
|
+
// and `wait` completed a turn that never started. Its title row sits ~150
|
|
180
|
+
// rows above the bottom of an 80x200 pane, outside `lastLines`, so the
|
|
181
|
+
// whole frame is read. The reason is v1's (#2112): the same kind of
|
|
182
|
+
// overlay, driven by ↑↓ + Enter and closed with `esc` — no number answers
|
|
183
|
+
// it, hence `hasActivePrompt: false`.
|
|
184
|
+
if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
|
|
185
|
+
return {
|
|
186
|
+
status: 'waiting',
|
|
187
|
+
confidence: 'high',
|
|
188
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
|
|
189
|
+
hasActivePrompt: false,
|
|
190
|
+
evidence: 'positive',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
},
|
|
195
|
+
afterThinking(frame) {
|
|
196
|
+
if ((0, cli_patterns_1.detectThinking)('opencode-v2', frame.lastLines)) {
|
|
197
|
+
return {
|
|
198
|
+
status: 'running',
|
|
199
|
+
confidence: 'high',
|
|
200
|
+
reason: status_reason_1.STATUS_REASON.THINKING_INDICATOR,
|
|
201
|
+
hasActivePrompt: false,
|
|
202
|
+
evidence: 'positive',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Issue #2965: the completion row as the last transcript row, with no
|
|
206
|
+
// `esc interrupt` (ruled out just above) — a finished turn, whether or not
|
|
207
|
+
// the footer made it into the capture.
|
|
208
|
+
if (endsWithTurnComplete(frame)) {
|
|
209
|
+
return {
|
|
210
|
+
status: 'ready',
|
|
211
|
+
confidence: 'high',
|
|
212
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
|
|
213
|
+
hasActivePrompt: false,
|
|
214
|
+
evidence: 'positive',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// The placeholder against the ANSI-stripped frame with its box drawing
|
|
218
|
+
// intact (the pattern anchors on the `┃` gutter). The footer is on every
|
|
219
|
+
// frame, and the running hint was ruled out just above.
|
|
220
|
+
if (cli_patterns_1.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test((0, cli_patterns_1.stripAnsi)(frame.raw)) ||
|
|
221
|
+
cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(frame.lastLines)) {
|
|
222
|
+
return {
|
|
223
|
+
status: 'ready',
|
|
224
|
+
confidence: 'high',
|
|
225
|
+
reason: status_reason_1.STATUS_REASON.INPUT_PROMPT,
|
|
226
|
+
hasActivePrompt: false,
|
|
227
|
+
evidence: 'positive',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
},
|
|
232
|
+
// Issue #2984: the seam the Auto-Yes gate and `respond` read. The same three
|
|
233
|
+
// rules `beforePrompt` reports `waiting` on, in the same order, so the gate
|
|
234
|
+
// and the status API agree about which frames carry a dialog.
|
|
235
|
+
//
|
|
236
|
+
// The strip and the question form are anchored on the composer's `┃` gutter,
|
|
237
|
+
// which `stripBoxDrawing` removes: on the spelling the Auto-Yes poller judges
|
|
238
|
+
// they answer `null` (v1's #1893 precedent). For Auto-Yes `null` and `keys`
|
|
239
|
+
// both send nothing, and the question form never reaches the gate anyway —
|
|
240
|
+
// it draws no `❯` for the generic parser to key on.
|
|
241
|
+
detectDialog(frame) {
|
|
242
|
+
if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
|
|
243
|
+
return { kind: 'permission', options: exports.OPENCODE_V2_PERMISSION_OPTIONS, answerMode: 'keys' };
|
|
244
|
+
}
|
|
245
|
+
const question = readQuestionDialog(frame);
|
|
246
|
+
if (question !== null)
|
|
247
|
+
return question;
|
|
248
|
+
if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
|
|
249
|
+
return { kind: 'picker', options: [], answerMode: 'keys' };
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
},
|
|
253
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2's dialog title row — a pure, dependency-free leaf (Issue #2983).
|
|
4
|
+
*
|
|
5
|
+
* Moved out of `cli-patterns.ts` (which re-exports both names) so a client
|
|
6
|
+
* component can read the same row the detector reads without pulling the
|
|
7
|
+
* logger and the tool registry into the browser bundle: the chat surface's
|
|
8
|
+
* dialog card draws v2's model keys only while one of these dialogs is open,
|
|
9
|
+
* because each of those keys closes the dialog with `Escape` before it is sent.
|
|
10
|
+
*
|
|
11
|
+
* @module lib/detection/tools/opencode-v2/dialog-title
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = void 0;
|
|
15
|
+
exports.findOpencodeV2DialogTitle = findOpencodeV2DialogTitle;
|
|
16
|
+
/**
|
|
17
|
+
* The title row of an OpenCode V2 dialog opened over the composer: the model
|
|
18
|
+
* picker (`ctrl+x m`), the variant picker it opens next, the Commands palette
|
|
19
|
+
* (`ctrl+p`), Sessions (`ctrl+x l`) and Select agent (`ctrl+x a`) — Issue #2971.
|
|
20
|
+
*
|
|
21
|
+
* Measured on 2.0.18 at 80x200 (2026-09-29,
|
|
22
|
+
* `tests/fixtures/opencode-v2-live-2971/`): every one of them opens with a row
|
|
23
|
+
* ` <Title> esc`, the dismiss hint
|
|
24
|
+
* right-aligned after a wide gap, with no `┃` gutter in front. The row BELOW it
|
|
25
|
+
* is the filter (`Search`, or whatever was typed into it) and changes; the
|
|
26
|
+
* title row does not. The footer (`… ctrl+p commands`) stays drawn under every
|
|
27
|
+
* one of them, which is why the footer alone cannot say the composer is free.
|
|
28
|
+
*
|
|
29
|
+
* Not matched: the running footer (`esc interrupt ctrl+p commands`, `esc` not
|
|
30
|
+
* last) and the question form's `┃ ↑↓ select enter submit esc dismiss`
|
|
31
|
+
* (gutter, `esc` not last). Match against the ANSI-stripped frame; the title
|
|
32
|
+
* sits far above the 15-line status window (row 52 of 200), so pass the whole
|
|
33
|
+
* capture.
|
|
34
|
+
*/
|
|
35
|
+
exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = /^[^\S\n]*[^\s\u2502\u2503\u2579\u2580][^\n]*?[^\S\n]{8,}esc[^\S\n]*$/m;
|
|
36
|
+
/**
|
|
37
|
+
* The title of the OpenCode V2 dialog open on the pane (`Select variant`), or
|
|
38
|
+
* `null` when none is (Issue #2971). A send must not type while one is open:
|
|
39
|
+
* the text lands in the dialog's filter, not in the composer.
|
|
40
|
+
*
|
|
41
|
+
* @param text - ANSI-stripped capture of the whole pane
|
|
42
|
+
*/
|
|
43
|
+
function findOpencodeV2DialogTitle(text) {
|
|
44
|
+
const match = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN.exec(text);
|
|
45
|
+
if (match === null)
|
|
46
|
+
return null;
|
|
47
|
+
return match[0].trim().replace(/\s+esc$/, '');
|
|
48
|
+
}
|
|
@@ -18,6 +18,7 @@ const detect_3 = require("./codex/detect");
|
|
|
18
18
|
const detect_4 = require("./command-code/detect");
|
|
19
19
|
const detect_5 = require("./copilot/detect");
|
|
20
20
|
const detect_6 = require("./opencode/detect");
|
|
21
|
+
const detect_7 = require("./opencode-v2/detect");
|
|
21
22
|
const run_detection_1 = require("./run-detection");
|
|
22
23
|
const verified_against_1 = require("./verified-against");
|
|
23
24
|
/**
|
|
@@ -43,6 +44,7 @@ const DETECTORS = {
|
|
|
43
44
|
opencode: detect_6.opencodeStatusDetector,
|
|
44
45
|
antigravity: detect_1.antigravityStatusDetector,
|
|
45
46
|
'command-code': detect_4.commandCodeStatusDetector,
|
|
47
|
+
'opencode-v2': detect_7.opencodeV2StatusDetector,
|
|
46
48
|
gemini: geminiStatusDetector,
|
|
47
49
|
'vibe-local': vibeLocalStatusDetector,
|
|
48
50
|
};
|
|
@@ -99,6 +99,15 @@ function runToolDetection(spec, frame, context = {}) {
|
|
|
99
99
|
// and let the chain continue to the tool's running/idle branches.
|
|
100
100
|
promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
|
|
101
101
|
}
|
|
102
|
+
else if (spec.requireVouchedPrompt && context.isPromptVouched?.(promptDetection) === false) {
|
|
103
|
+
// Issue #2991: a numbered list the tool's own dialog rules do not vouch
|
|
104
|
+
// for — the agent's reply quoting `❯ 1. Yes / 2. No`. Auto-Yes (#2984)
|
|
105
|
+
// and History (#2457) already refuse it; publishing `waiting` for it
|
|
106
|
+
// left the session unanswerable (no dialog to answer) and unwritable (the
|
|
107
|
+
// send guard refused every message). Neutralised the same way as the
|
|
108
|
+
// stale block above, so the tool's own branches decide the status.
|
|
109
|
+
promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
|
|
110
|
+
}
|
|
102
111
|
else {
|
|
103
112
|
return {
|
|
104
113
|
status: 'waiting',
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* instead of importing it.
|
|
27
27
|
*/
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
|
|
29
|
+
exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.OPENCODE_V2_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
|
|
30
30
|
/** claude these rules were read off (#1708 / #1927 fixtures). */
|
|
31
31
|
exports.CLAUDE_VERIFIED_AGAINST = {
|
|
32
32
|
version: '2.1.240',
|
|
@@ -224,6 +224,21 @@ exports.COMMAND_CODE_VERIFIED_AGAINST = {
|
|
|
224
224
|
capturedAt: '2026-09-20',
|
|
225
225
|
paneGeometry: '200x1000',
|
|
226
226
|
};
|
|
227
|
+
/**
|
|
228
|
+
* OpenCode V2 (`opencode2`, npm `@opencode/cli`) — Issue #2934, Epic #2370
|
|
229
|
+
* Phase 1.
|
|
230
|
+
*
|
|
231
|
+
* 2.0.18 is the build Phase 0 and Phase 1 were measured on (2026-09-28, pane
|
|
232
|
+
* 80x200): the SSE vocabulary the state is read from, and the composer / footer
|
|
233
|
+
* rows the send path and the fallback reader match. OpenCode V2 shipped 18
|
|
234
|
+
* releases in its first two weeks, so this stamp is expected to go `stale`
|
|
235
|
+
* quickly — which is the freshness probe doing its job, not a defect.
|
|
236
|
+
*/
|
|
237
|
+
exports.OPENCODE_V2_VERIFIED_AGAINST = {
|
|
238
|
+
version: '2.0.18',
|
|
239
|
+
capturedAt: '2026-09-28',
|
|
240
|
+
paneGeometry: '80x200',
|
|
241
|
+
};
|
|
227
242
|
/**
|
|
228
243
|
* The stamp for a tool whose frames nobody has captured yet.
|
|
229
244
|
*
|
|
@@ -251,6 +266,7 @@ exports.DETECTOR_VERIFIED_AGAINST = {
|
|
|
251
266
|
opencode: exports.OPENCODE_VERIFIED_AGAINST,
|
|
252
267
|
antigravity: exports.ANTIGRAVITY_VERIFIED_AGAINST,
|
|
253
268
|
'command-code': exports.COMMAND_CODE_VERIFIED_AGAINST,
|
|
269
|
+
'opencode-v2': exports.OPENCODE_V2_VERIFIED_AGAINST,
|
|
254
270
|
gemini: exports.UNMEASURED_VERIFIED_AGAINST,
|
|
255
271
|
'vibe-local': exports.UNMEASURED_VERIFIED_AGAINST,
|
|
256
272
|
};
|
|
@@ -46,6 +46,14 @@ const excerpt_1 = require("./excerpt");
|
|
|
46
46
|
exports.UPSTREAM_FAULTS = [
|
|
47
47
|
{ id: 'overloaded', pattern: /\b5\d{2}\s+Overloaded\b/i, selfRetrying: true },
|
|
48
48
|
{ id: 'retrying', pattern: /Retrying in \d+s\s*[·•]\s*attempt \d+\/\d+/i, selfRetrying: true },
|
|
49
|
+
{
|
|
50
|
+
// The conversation outgrew the model's window (Issue #3011). Command Code
|
|
51
|
+
// prints `400 This model's maximum context length is N tokens. However, you
|
|
52
|
+
// requested M tokens`; retrying the same session cannot succeed.
|
|
53
|
+
id: 'context-limit',
|
|
54
|
+
pattern: /\bmaximum context length is \d+ tokens\b/i,
|
|
55
|
+
selfRetrying: false,
|
|
56
|
+
},
|
|
49
57
|
{ id: 'limit-reached', pattern: /\blimit reached\b/i, selfRetrying: false },
|
|
50
58
|
{ id: 'api-error', pattern: /\bAPI Error(?::|\s+\d{3})/i, selfRetrying: false },
|
|
51
59
|
];
|
|
@@ -104,6 +104,7 @@ exports.getDetectorStalenessSnapshot = getDetectorStalenessSnapshot;
|
|
|
104
104
|
exports.clearDetectorVersionProbeCache = clearDetectorVersionProbeCache;
|
|
105
105
|
const child_process_1 = require("child_process");
|
|
106
106
|
const copilot_executable_1 = require("../cli-tools/copilot-executable");
|
|
107
|
+
const opencode_executable_1 = require("../cli-tools/opencode-executable");
|
|
107
108
|
const env_sanitizer_1 = require("../security/env-sanitizer");
|
|
108
109
|
const verified_against_1 = require("./tools/verified-against");
|
|
109
110
|
/** Budget for one `<cli> --version`. Matches the catalog probe and copilot-executable. */
|
|
@@ -202,7 +203,19 @@ exports.DETECTOR_VERSION_PROBES = {
|
|
|
202
203
|
codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
|
|
203
204
|
antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
|
|
204
205
|
'command-code': { kind: 'execFile', command: 'commandcode', args: ['--version'] },
|
|
205
|
-
|
|
206
|
+
// Issue #2939: both OpenCodes are delegated, like copilot. `opencode` may be
|
|
207
|
+
// OpenCode V2 (npm `@opencode/cli` registers it next to `opencode2`), so the
|
|
208
|
+
// row reads the version of the binary each tool would launch — the same
|
|
209
|
+
// resolution `isInstalled()` and the launch line use, never `opencode v2.x`
|
|
210
|
+
// filed as OpenCode 1.x's version.
|
|
211
|
+
opencode: {
|
|
212
|
+
kind: 'delegated',
|
|
213
|
+
probe: async () => (await (0, opencode_executable_1.resolveOpencodeV1Executable)()).executable?.version ?? null,
|
|
214
|
+
},
|
|
215
|
+
'opencode-v2': {
|
|
216
|
+
kind: 'delegated',
|
|
217
|
+
probe: async () => (await (0, opencode_executable_1.resolveOpencodeV2Executable)()).executable?.version ?? null,
|
|
218
|
+
},
|
|
206
219
|
gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
|
|
207
220
|
copilot: {
|
|
208
221
|
kind: 'delegated',
|
|
@@ -61,6 +61,17 @@
|
|
|
61
61
|
* its own — see {@link AgentSessionContextUsage} and
|
|
62
62
|
* `docs/design/opencode-server-live-verification.md` §14.
|
|
63
63
|
*
|
|
64
|
+
* ## OpenCode V2 (Issue #2981)
|
|
65
|
+
*
|
|
66
|
+
* `opencode-v2` fills both records too, with the same meanings — measured on
|
|
67
|
+
* 2.0.18 (`tests/fixtures/opencode-v2-usage-2981`): `GET /api/session/{id}`
|
|
68
|
+
* carries the session's cumulative `cost` / `tokens` (the running total
|
|
69
|
+
* `session.usage.updated` announces), while the TUI's `6.3K (1%)` is the last
|
|
70
|
+
* assistant message's footprint. The writer is
|
|
71
|
+
* `./sources/opencode-v2/usage`, which asks its own server with its own port
|
|
72
|
+
* and password; {@link ensureAgentSessionContextUsage} leaves those instances
|
|
73
|
+
* alone.
|
|
74
|
+
*
|
|
64
75
|
* @module lib/hooks/agent-session-telemetry
|
|
65
76
|
*/
|
|
66
77
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -70,6 +81,7 @@ exports.getAgentSessionTelemetry = getAgentSessionTelemetry;
|
|
|
70
81
|
exports.forgetAgentSessionTelemetry = forgetAgentSessionTelemetry;
|
|
71
82
|
exports.resetAgentSessionTelemetry = resetAgentSessionTelemetry;
|
|
72
83
|
exports.readOpencodeSessionFrame = readOpencodeSessionFrame;
|
|
84
|
+
exports.readOpencodeSessionInfo = readOpencodeSessionInfo;
|
|
73
85
|
exports.agentSessionContextPercent = agentSessionContextPercent;
|
|
74
86
|
exports.getAgentSessionContextUsage = getAgentSessionContextUsage;
|
|
75
87
|
exports.recordAgentSessionContextUsage = recordAgentSessionContextUsage;
|
|
@@ -190,7 +202,25 @@ function readOpencodeSessionFrame(frame, at) {
|
|
|
190
202
|
const properties = isPlainObject(frame.properties) ? frame.properties : null;
|
|
191
203
|
if (!properties)
|
|
192
204
|
return null;
|
|
193
|
-
|
|
205
|
+
return readOpencodeSessionInfo(properties.info, at);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Read one `Session` object, or answer null (Issue #2981).
|
|
209
|
+
*
|
|
210
|
+
* Split out of {@link readOpencodeSessionFrame} because OpenCode V2 serves the
|
|
211
|
+
* same fields — `Session.Info` in 2.0.18's `GET /openapi.json` declares `id`,
|
|
212
|
+
* `parentID`, `title`, `agent`, `model: { id, providerID, variant? }`, `cost`
|
|
213
|
+
* and `tokens: { input, output, reasoning, cache: { read, write } }` — from
|
|
214
|
+
* `GET /api/session/{id}` instead of on a frame. One reader keeps the two
|
|
215
|
+
* versions from disagreeing about what "verbatim" means, and the sub-agent
|
|
216
|
+
* refusal above applies to both.
|
|
217
|
+
*
|
|
218
|
+
* @param value - The `Session` object, unvalidated
|
|
219
|
+
* @param at - Epoch ms it was received
|
|
220
|
+
* @returns The record to store, or null when this is not one to store
|
|
221
|
+
*/
|
|
222
|
+
function readOpencodeSessionInfo(value, at) {
|
|
223
|
+
const info = isPlainObject(value) ? value : null;
|
|
194
224
|
if (!info)
|
|
195
225
|
return null;
|
|
196
226
|
if (typeof info.parentID === 'string' && info.parentID.length > 0)
|
|
@@ -276,6 +306,11 @@ function ensureAgentSessionContextUsage(target, record) {
|
|
|
276
306
|
// close is what retires it, the same lifetime the record itself has.
|
|
277
307
|
if (!record || !record.id)
|
|
278
308
|
return cached;
|
|
309
|
+
// Issue #2981: OpenCode V2 measures its own context in the same refresh that
|
|
310
|
+
// writes the record (`./sources/opencode-v2/usage`), with its own port and
|
|
311
|
+
// password. The v1 fetch below would dial v1's port map for a v2 instance.
|
|
312
|
+
if (target.cliToolId === 'opencode-v2')
|
|
313
|
+
return cached;
|
|
279
314
|
if (cached && cached.sessionAt === record.at)
|
|
280
315
|
return cached;
|
|
281
316
|
if (contextRefreshes.has(key))
|
|
@@ -59,6 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
59
59
|
exports.CLAUDE_END_TURN_STOP_REASON = exports.CLAUDE_HUMAN_PROMPT_SOURCES = exports.CLAUDE_HUMAN_ORIGIN_KIND = exports.CLAUDE_SLASH_COMMAND_PREFIX = exports.CLAUDE_THINKING_LABEL = exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH = exports.MAX_CLAUDE_TURN_BLOCKS = exports.CLAUDE_TURN_TRUNCATION_MARKER = exports.MAX_CLAUDE_TURN_BODY_LENGTH = exports.CLAUDE_PROJECTS_DIR_SEGMENTS = void 0;
|
|
60
60
|
exports.claudeProjectSlug = claudeProjectSlug;
|
|
61
61
|
exports.claudeSlashCommandPrompt = claudeSlashCommandPrompt;
|
|
62
|
+
exports.claudePastedContentPrompt = claudePastedContentPrompt;
|
|
62
63
|
exports.readClaudeContentBlock = readClaudeContentBlock;
|
|
63
64
|
exports.readClaudeTranscriptRecord = readClaudeTranscriptRecord;
|
|
64
65
|
exports.parseClaudeTranscript = parseClaudeTranscript;
|
|
@@ -210,6 +211,37 @@ function claudeSlashCommandPrompt(text) {
|
|
|
210
211
|
const args = CLAUDE_COMMAND_ARGS_PATTERN.exec(trimmed)?.[1].trim() ?? '';
|
|
211
212
|
return args.length === 0 ? name : `${name} ${args}`;
|
|
212
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* A paste's wrapper: `<pasted_content id="X">` … `</pasted_content id="X">`.
|
|
216
|
+
*
|
|
217
|
+
* The closing tag repeats the opening tag's id (`\1`), so a pair whose ids
|
|
218
|
+
* differ — or a tag only mentioned in prose — is not a wrapper and is left alone.
|
|
219
|
+
* One newline just inside each tag is the wrapper's own framing, not the body's.
|
|
220
|
+
*/
|
|
221
|
+
const CLAUDE_PASTED_CONTENT_PATTERN = /<pasted_content id="([^"<>\s]+)">\n?([\s\S]*?)\n?<\/pasted_content id="\1">/g;
|
|
222
|
+
/**
|
|
223
|
+
* The text a person sent, with Claude Code's paste wrapper taken off (Issue #3102).
|
|
224
|
+
*
|
|
225
|
+
* Claude Code records a multi-line message that arrived as a paste — which is
|
|
226
|
+
* what CommandMate's tmux send looks like to it — with the body wrapped in
|
|
227
|
+
* `<pasted_content id="X">…</pasted_content id="X">`. `recordUserTurn` compares
|
|
228
|
+
* the transcript's text with the `/send` row (and a relay row) byte for byte, so
|
|
229
|
+
* the wrapper made every such prompt look like a different message and a second
|
|
230
|
+
* `user` row was written. Unwrapping here lets the existing adoption rules match.
|
|
231
|
+
*
|
|
232
|
+
* Every wrapper in the text is replaced by its body, including one inside a
|
|
233
|
+
* sentence the person typed around a paste. When the result is empty the original
|
|
234
|
+
* is returned, so this never turns a record into a blank prompt.
|
|
235
|
+
*
|
|
236
|
+
* @param text - The record's text, as {@link ClaudeTranscriptRecord.text} holds it
|
|
237
|
+
* @returns The text without wrappers, or `text` itself when there is none to remove
|
|
238
|
+
*/
|
|
239
|
+
function claudePastedContentPrompt(text) {
|
|
240
|
+
if (!text.includes('<pasted_content id='))
|
|
241
|
+
return text;
|
|
242
|
+
const unwrapped = text.replace(CLAUDE_PASTED_CONTENT_PATTERN, (_match, _id, body) => body);
|
|
243
|
+
return unwrapped.trim().length === 0 ? text : unwrapped;
|
|
244
|
+
}
|
|
213
245
|
/**
|
|
214
246
|
* Read one `message.content` element.
|
|
215
247
|
*
|
|
@@ -517,7 +549,7 @@ function createClaudeTurn(record, sessionId) {
|
|
|
517
549
|
// A slash command's record is XML and the operator typed a line; #2265 puts
|
|
518
550
|
// the line on the turn so that the `user` row reads `/release v0.30.1` and
|
|
519
551
|
// the `/send` row holding those same bytes is adopted rather than doubled.
|
|
520
|
-
promptText: claudeSlashCommandPrompt(record.text) ?? record.text,
|
|
552
|
+
promptText: claudeSlashCommandPrompt(record.text) ?? claudePastedContentPrompt(record.text),
|
|
521
553
|
promptIsOperatorInput: isClaudeOperatorPromptRecord(record),
|
|
522
554
|
blocks: [],
|
|
523
555
|
assistantRecords: 0,
|