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,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Answering Command Code's plan review overlay from the CLI / API (Issue #3125).
|
|
4
|
+
*
|
|
5
|
+
* The overlay (`REVIEW` — `Approve ctrl+a` / `Cancel esc` / `type + enter to
|
|
6
|
+
* comment`) is not a dialog with options and not the composer, so neither
|
|
7
|
+
* `respond` (options) nor `send` (composer) could reach it. This module is the
|
|
8
|
+
* one place its keys are decided:
|
|
9
|
+
*
|
|
10
|
+
* | action | keys | allowed on phase |
|
|
11
|
+
* |-----------|----------------------------------------|-------------------------------|
|
|
12
|
+
* | `comment` | `Enter`, the text (`-l`), `Enter` | `body` |
|
|
13
|
+
* | `submit` | [the comment keys], `C-r` | `body` (needs ≥1 comment) |
|
|
14
|
+
* | `approve` | `C-a` — or `Enter` on the radio | `body`, `approve-choice` |
|
|
15
|
+
* | `cancel` | `Escape` | `body`, `approve-choice` |
|
|
16
|
+
*
|
|
17
|
+
* Why the comment opens the box with `Enter` first instead of just typing: `?`
|
|
18
|
+
* `x` `!` are one-key quick comments on this screen (measured on 1.58.0), so a
|
|
19
|
+
* comment that begins with one of them would pin a canned sentence instead.
|
|
20
|
+
* An empty `Enter` with the cursor in the plan body only opens the box
|
|
21
|
+
* (measured, #2763 §1 問い 4), and inside the box every key is text.
|
|
22
|
+
*
|
|
23
|
+
* Everything else is refused with nothing sent:
|
|
24
|
+
* - `action-focus`: `Enter` RUNS the focused action there (#2763 approved a
|
|
25
|
+
* plan that way), and what the shortcuts and letters do with the focus on
|
|
26
|
+
* the list was not measured;
|
|
27
|
+
* - `comment-box`: someone is typing a comment in the pane, and `Escape` there
|
|
28
|
+
* discards it rather than cancelling the review;
|
|
29
|
+
* - `unknown`: a hint bar this module has not seen.
|
|
30
|
+
*
|
|
31
|
+
* Approval is only ever the explicit `approve` action. Nothing here is reached
|
|
32
|
+
* by Auto-Yes: the detector publishes this screen with `hasActivePrompt: false`.
|
|
33
|
+
*
|
|
34
|
+
* @module lib/cli-tools/command-code-plan-review
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
|
|
38
|
+
exports.isPlanReviewAction = isPlanReviewAction;
|
|
39
|
+
exports.planCommandCodePlanReviewKeys = planCommandCodePlanReviewKeys;
|
|
40
|
+
exports.sendCommandCodePlanReviewKeys = sendCommandCodePlanReviewKeys;
|
|
41
|
+
const tmux_1 = require("../tmux/tmux");
|
|
42
|
+
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
43
|
+
exports.PLAN_REVIEW_ACTIONS = ['comment', 'submit', 'approve', 'cancel'];
|
|
44
|
+
function isPlanReviewAction(value) {
|
|
45
|
+
return typeof value === 'string' && exports.PLAN_REVIEW_ACTIONS.includes(value);
|
|
46
|
+
}
|
|
47
|
+
/** Refusal reason codes. All of them mean "nothing was sent". */
|
|
48
|
+
exports.PLAN_REVIEW_REFUSAL = {
|
|
49
|
+
/** The overlay is up, but its focus is somewhere these keys are unsafe. */
|
|
50
|
+
BUSY: 'plan_review_busy',
|
|
51
|
+
/** `submit` with no comment given and none pending. */
|
|
52
|
+
NOTHING_TO_SUBMIT: 'plan_review_nothing_to_submit',
|
|
53
|
+
/** A bare number / yes / no, which would otherwise become a comment. */
|
|
54
|
+
AMBIGUOUS_ANSWER: 'plan_review_ambiguous_answer',
|
|
55
|
+
/** The request does not fit this screen (no text for a comment, `--default`). */
|
|
56
|
+
INVALID_REQUEST: 'plan_review_invalid_request',
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* A comment the caller did not label as one, that is really an answer meant
|
|
60
|
+
* for an options dialog. Typed as a comment it would land on the plan.
|
|
61
|
+
*/
|
|
62
|
+
const DIALOG_ANSWER_LIKE = /^(?:\d+(?:\s*,\s*\d+)*|y|yes|n|no)$/i;
|
|
63
|
+
/** One line: a newline inside the box would pin the comment half-typed. */
|
|
64
|
+
function normalizeComment(text) {
|
|
65
|
+
return text.replace(/\s*[\r\n]+\s*/g, ' ').trim();
|
|
66
|
+
}
|
|
67
|
+
const PHASE_REFUSALS = {
|
|
68
|
+
'action-focus': 'The plan review has its focus on the action list (`↑/↓ choose · enter to run`), where Enter runs the ' +
|
|
69
|
+
'focused action, so no key was sent. Move the focus back into the plan (↑) in the terminal, then retry.',
|
|
70
|
+
'comment-box': 'A comment is being typed in the plan review (`enter to pin · esc discard`), so no key was sent. ' +
|
|
71
|
+
'Pin or discard it in the terminal, then retry.',
|
|
72
|
+
unknown: 'The plan review is up, but its hint bar is not one this version knows, so no key was sent. ' +
|
|
73
|
+
'Answer it in the terminal.',
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Decide the keys for a request against the screen as it is now. Pure.
|
|
77
|
+
*
|
|
78
|
+
* @param state - `readCommandCodePlanReviewState` of the frame about to be answered
|
|
79
|
+
* @param request - what the caller asked for
|
|
80
|
+
*/
|
|
81
|
+
function planCommandCodePlanReviewKeys(state, request) {
|
|
82
|
+
const comment = request.text === undefined ? '' : normalizeComment(request.text);
|
|
83
|
+
const action = request.action ?? 'comment';
|
|
84
|
+
if (request.useDefault) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
88
|
+
message: 'The plan review has no default option. Comment with text, or choose ' +
|
|
89
|
+
'--plan-review submit | approve | cancel.',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if ((action === 'approve' || action === 'cancel') && comment) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
96
|
+
message: `--plan-review ${action} takes no text. Comment first, then ${action}.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (action === 'comment' && !comment) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
103
|
+
message: 'A plan review comment needs text.',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (request.action === undefined && DIALOG_ANSWER_LIKE.test(comment)) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
reason: exports.PLAN_REVIEW_REFUSAL.AMBIGUOUS_ANSWER,
|
|
110
|
+
message: `The plan review has no numbered options, and "${comment}" would be pinned to the plan as a ` +
|
|
111
|
+
'comment, so no key was sent. Approve or cancel with --plan-review approve | cancel; to really ' +
|
|
112
|
+
'comment this text, add --plan-review comment.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (state.phase === 'approve-choice') {
|
|
116
|
+
// The radio `ctrl+a` opens when comments are pending (1.58.0): `enter
|
|
117
|
+
// confirm · esc back`. Enter confirms whichever side is `(•)`.
|
|
118
|
+
if (action === 'approve')
|
|
119
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Enter' }], comment: null };
|
|
120
|
+
if (action === 'cancel')
|
|
121
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Escape' }], comment: null };
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
reason: exports.PLAN_REVIEW_REFUSAL.BUSY,
|
|
125
|
+
message: 'The plan review is asking how to approve (`←/→ choose · enter confirm · esc back`), so no key was ' +
|
|
126
|
+
'sent. Confirm with --plan-review approve, or go back with --plan-review cancel.',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (state.phase !== 'body') {
|
|
130
|
+
return { ok: false, reason: exports.PLAN_REVIEW_REFUSAL.BUSY, message: PHASE_REFUSALS[state.phase] };
|
|
131
|
+
}
|
|
132
|
+
const commentSteps = comment
|
|
133
|
+
? [{ kind: 'key', key: 'Enter' }, { kind: 'text', text: comment }, { kind: 'key', key: 'Enter' }]
|
|
134
|
+
: [];
|
|
135
|
+
switch (action) {
|
|
136
|
+
case 'comment':
|
|
137
|
+
return { ok: true, action, steps: commentSteps, comment };
|
|
138
|
+
case 'submit':
|
|
139
|
+
if (!comment && state.pendingComments === 0) {
|
|
140
|
+
return {
|
|
141
|
+
ok: false,
|
|
142
|
+
reason: exports.PLAN_REVIEW_REFUSAL.NOTHING_TO_SUBMIT,
|
|
143
|
+
message: 'The plan review has no pending comment to submit, so no key was sent. Give the comment text ' +
|
|
144
|
+
'with --plan-review submit, or approve / cancel the plan.',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return { ok: true, action, steps: [...commentSteps, { kind: 'key', key: 'C-r' }], comment: comment || null };
|
|
148
|
+
case 'approve':
|
|
149
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'C-a' }], comment: null };
|
|
150
|
+
case 'cancel':
|
|
151
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Escape' }], comment: null };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Pause between steps, so the TUI handles each one as its own input event. */
|
|
155
|
+
exports.PLAN_REVIEW_STEP_DELAY_MS = 300;
|
|
156
|
+
/**
|
|
157
|
+
* Send the planned steps, one tmux invocation each.
|
|
158
|
+
*
|
|
159
|
+
* Key steps (including `C-r`) go through `sendSpecialKeys`; the comment text
|
|
160
|
+
* goes through `-l` so it is never resolved as a key name.
|
|
161
|
+
*/
|
|
162
|
+
async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
|
|
163
|
+
for (let i = 0; i < steps.length; i++) {
|
|
164
|
+
const step = steps[i];
|
|
165
|
+
if (step.kind === 'text') {
|
|
166
|
+
await (0, tmux_1.sendKeys)(sessionName, step.text, false, { literal: true });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, [step.key]);
|
|
170
|
+
}
|
|
171
|
+
if (i < steps.length - 1)
|
|
172
|
+
await sleep(exports.PLAN_REVIEW_STEP_DELAY_MS);
|
|
173
|
+
}
|
|
174
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
175
|
+
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* only the correlation.
|
|
37
37
|
*/
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.CommandCodeTool = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
39
|
+
exports.CommandCodeTool = exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = exports.COMMAND_CODE_STARTING_WINDOW_MS = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
40
40
|
exports.buildCommandCodeLaunchCommand = buildCommandCodeLaunchCommand;
|
|
41
41
|
exports.isCommandCodeReady = isCommandCodeReady;
|
|
42
42
|
const base_1 = require("./base");
|
|
@@ -51,6 +51,8 @@ const tool_id_1 = require("../../lib/hooks/sources/command-code/tool-id");
|
|
|
51
51
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
52
52
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
53
53
|
const install_hints_1 = require("./install-hints");
|
|
54
|
+
const plan_review_state_1 = require("../detection/tools/command-code/plan-review-state");
|
|
55
|
+
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
54
56
|
const logger = (0, logger_1.createLogger)('cli-tools/command-code');
|
|
55
57
|
/** The executable CommandMate launches. See the module docblock for why not `cmd`. */
|
|
56
58
|
exports.COMMAND_CODE_COMMAND = 'commandcode';
|
|
@@ -106,6 +108,16 @@ const COMMAND_CODE_POLL_INTERVAL_MS = 1000;
|
|
|
106
108
|
const COMMAND_CODE_INIT_MAX_ATTEMPTS = 30;
|
|
107
109
|
/** Timeout for waiting for the composer before sending a message. */
|
|
108
110
|
const COMMAND_CODE_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
111
|
+
/**
|
|
112
|
+
* How long after a launch a composer that has never been seen still counts as
|
|
113
|
+
* "starting" (Issue #3006).
|
|
114
|
+
*
|
|
115
|
+
* Past this, a pane that has shown no composer since it was launched is not
|
|
116
|
+
* slow, it is stuck on something (an unmeasured dialog, a crash screen), and
|
|
117
|
+
* `prompt not ready` — which #3007 answers by reading the screen — is the
|
|
118
|
+
* truer report than "retry in a few seconds".
|
|
119
|
+
*/
|
|
120
|
+
exports.COMMAND_CODE_STARTING_WINDOW_MS = 120_000;
|
|
109
121
|
/** Rows of pane tail the readiness probe reads. */
|
|
110
122
|
const COMMAND_CODE_READINESS_CAPTURE_LINES = 50;
|
|
111
123
|
/**
|
|
@@ -133,6 +145,16 @@ function isCommandCodeReady(rawOutput) {
|
|
|
133
145
|
return false;
|
|
134
146
|
return !cli_patterns_1.COMMAND_CODE_THINKING_PATTERN.test((0, cli_patterns_1.stripAnsi)(rawOutput));
|
|
135
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Why `send` stops at the plan review overlay (Issue #3125).
|
|
150
|
+
*
|
|
151
|
+
* The overlay replaces the composer until a human decides, so waiting for the
|
|
152
|
+
* composer only ran out the clock (`prompt not ready` after the full timeout).
|
|
153
|
+
* Its comments, Submit review, approval and cancel go through `respond`.
|
|
154
|
+
*/
|
|
155
|
+
exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = 'Command Code is showing a plan review (REVIEW), which takes review comments, not messages. ' +
|
|
156
|
+
'Comment with `commandmate respond <worktree-id> "<text>"`, then `--plan-review submit` (ctrl+r), ' +
|
|
157
|
+
'`--plan-review approve` (ctrl+a) or `--plan-review cancel` (esc).';
|
|
136
158
|
/**
|
|
137
159
|
* Command Code CLI tool implementation.
|
|
138
160
|
* Manages `commandcode` sessions using tmux.
|
|
@@ -141,6 +163,20 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
141
163
|
id = 'command-code';
|
|
142
164
|
name = 'Command Code CLI';
|
|
143
165
|
command = exports.COMMAND_CODE_COMMAND;
|
|
166
|
+
/**
|
|
167
|
+
* Sessions this instance launched whose composer has not been seen since,
|
|
168
|
+
* keyed by tmux session name, valued by launch time (Issue #3006).
|
|
169
|
+
*
|
|
170
|
+
* This is what tells a slow cold start apart from a live session that is
|
|
171
|
+
* showing something other than the composer. Only the launch path adds an
|
|
172
|
+
* entry, and any readiness probe that sees the composer removes it, so a
|
|
173
|
+
* session that has ever reached its composer keeps the old
|
|
174
|
+
* `prompt not ready` refusal. Held per instance rather than per module
|
|
175
|
+
* because `CLIToolManager` holds one instance for the process, and a restart
|
|
176
|
+
* forgets it — which errs towards `prompt not ready`, the answer this
|
|
177
|
+
* repository gave before.
|
|
178
|
+
*/
|
|
179
|
+
composerPendingSince = new Map();
|
|
144
180
|
/**
|
|
145
181
|
* Declare the claude-family pad (Issue #2297).
|
|
146
182
|
*
|
|
@@ -209,6 +245,9 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
209
245
|
// launch below then fails: falling back to the screen scraper is always safe
|
|
210
246
|
// and trusting a dead session's events is not.
|
|
211
247
|
(0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: tool_id_1.COMMAND_CODE_CLI_TOOL_ID, instanceId });
|
|
248
|
+
// Issue #3006: from here until a readiness probe sees the composer, a send
|
|
249
|
+
// that cannot find it is reporting a slow start, not a wedged session.
|
|
250
|
+
this.composerPendingSince.set(sessionName, Date.now());
|
|
212
251
|
try {
|
|
213
252
|
if (!exists) {
|
|
214
253
|
// Inline-rendered, so the pane keeps scrollback; depth comes from the
|
|
@@ -229,6 +268,7 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
229
268
|
logger.info('started-command-code-session');
|
|
230
269
|
}
|
|
231
270
|
catch (error) {
|
|
271
|
+
this.composerPendingSince.delete(sessionName);
|
|
232
272
|
throw new Error(`Failed to start Command Code session: ${(0, errors_1.getErrorMessage)(error)}`);
|
|
233
273
|
}
|
|
234
274
|
}
|
|
@@ -246,6 +286,7 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
246
286
|
try {
|
|
247
287
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, COMMAND_CODE_READINESS_CAPTURE_LINES);
|
|
248
288
|
if (isCommandCodeReady(rawOutput)) {
|
|
289
|
+
this.composerPendingSince.delete(sessionName);
|
|
249
290
|
logger.info('command-code-prompt-detected');
|
|
250
291
|
return;
|
|
251
292
|
}
|
|
@@ -262,23 +303,57 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
262
303
|
* Mirrors CodexTool.waitForPrompt: throws on timeout so a failed readiness
|
|
263
304
|
* check STOPS the send rather than typing into a non-ready TUI.
|
|
264
305
|
*
|
|
306
|
+
* Issue #3006: when the session was launched by this server and its composer
|
|
307
|
+
* has not been seen once since — the cold start of a dispatch — the timeout
|
|
308
|
+
* is a {@link SessionStartTimeoutError} (`SESSION_STARTING`, 503 at the send
|
|
309
|
+
* route), the same answer claude gives for a start that is merely slow. A
|
|
310
|
+
* session that HAS shown its composer keeps the plain `prompt not ready`
|
|
311
|
+
* error: it is up, and something on screen is in the way.
|
|
312
|
+
*
|
|
313
|
+
* @throws SessionStartTimeoutError when a just-launched session's composer
|
|
314
|
+
* has still not appeared
|
|
315
|
+
* @throws Error ({@link COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE}) at once when
|
|
316
|
+
* the plan review overlay is on screen (Issue #3125)
|
|
265
317
|
* @throws Error when the composer is not detected within the timeout
|
|
266
318
|
*/
|
|
267
319
|
async waitForPrompt(sessionName) {
|
|
268
320
|
const startTime = Date.now();
|
|
269
321
|
const pollInterval = 500;
|
|
322
|
+
let planReviewPolls = 0;
|
|
270
323
|
while (Date.now() - startTime < COMMAND_CODE_PROMPT_WAIT_TIMEOUT_MS) {
|
|
324
|
+
let planReviewUp = false;
|
|
271
325
|
try {
|
|
272
326
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, COMMAND_CODE_READINESS_CAPTURE_LINES);
|
|
273
|
-
|
|
327
|
+
// Read first: a focused action row (`❯ Approve ctrl+a`) is a `❯` row.
|
|
328
|
+
planReviewUp = (0, plan_review_state_1.readCommandCodePlanReviewState)(rawOutput) !== null;
|
|
329
|
+
if (!planReviewUp && isCommandCodeReady(rawOutput)) {
|
|
330
|
+
this.composerPendingSince.delete(sessionName);
|
|
274
331
|
return;
|
|
275
332
|
}
|
|
276
333
|
}
|
|
277
334
|
catch {
|
|
278
335
|
// Capture may fail - continue polling
|
|
279
336
|
}
|
|
337
|
+
// Issue #3125: no composer comes back until a human answers the review.
|
|
338
|
+
// Two polls in a row, because the frame redrawn just after `Esc` can
|
|
339
|
+
// still carry the footer (`after-cancel-partial-redraw.txt`, #2763).
|
|
340
|
+
planReviewPolls = planReviewUp ? planReviewPolls + 1 : 0;
|
|
341
|
+
if (planReviewPolls >= 2) {
|
|
342
|
+
logger.info('command-code-plan-review-blocks-send', { sessionName });
|
|
343
|
+
throw new Error(exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE);
|
|
344
|
+
}
|
|
280
345
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
281
346
|
}
|
|
347
|
+
const launchedAt = this.composerPendingSince.get(sessionName);
|
|
348
|
+
if (launchedAt !== undefined) {
|
|
349
|
+
const sinceLaunchMs = Date.now() - launchedAt;
|
|
350
|
+
if (sinceLaunchMs <= exports.COMMAND_CODE_STARTING_WINDOW_MS) {
|
|
351
|
+
logger.info('command-code-session-still-starting', { sessionName, sinceLaunchMs });
|
|
352
|
+
throw new session_start_error_1.SessionStartTimeoutError(this.name, sessionName, sinceLaunchMs);
|
|
353
|
+
}
|
|
354
|
+
// Too long since the launch to call it slow; report it as not ready.
|
|
355
|
+
this.composerPendingSince.delete(sessionName);
|
|
356
|
+
}
|
|
282
357
|
logger.info('command-code-prompt-not-ready');
|
|
283
358
|
throw new Error('Command Code prompt not ready: timed out waiting for the composer before sending');
|
|
284
359
|
}
|
|
@@ -312,6 +387,9 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
312
387
|
logger.info('sent-message-to-command-code-session');
|
|
313
388
|
}
|
|
314
389
|
catch (error) {
|
|
390
|
+
// Issue #3006: passed through unwrapped so its `code` reaches the route.
|
|
391
|
+
if ((0, session_start_error_1.isSessionStartTimeoutError)(error))
|
|
392
|
+
throw error;
|
|
315
393
|
throw new Error(`Failed to send message to Command Code: ${(0, errors_1.getErrorMessage)(error)}`);
|
|
316
394
|
}
|
|
317
395
|
}
|
|
@@ -338,6 +416,7 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
338
416
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_EXIT_WAIT_MS));
|
|
339
417
|
}
|
|
340
418
|
const killed = await (0, tmux_1.killSession)(sessionName);
|
|
419
|
+
this.composerPendingSince.delete(sessionName);
|
|
341
420
|
// So a later session reusing the name starts clean.
|
|
342
421
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
343
422
|
if (killed) {
|
|
@@ -87,6 +87,16 @@ const COMPOSER_SPECS = {
|
|
|
87
87
|
clearBeforeSend: false,
|
|
88
88
|
submitEnterCount: 1,
|
|
89
89
|
},
|
|
90
|
+
// Issue #2934: OpenCode V2 draws the same gutter-and-no-marker input box as
|
|
91
|
+
// v1 (`┃ Ask anything… "…"` on 2.0.18, 80x200), so the box reader is the
|
|
92
|
+
// right one — the marker reader would find nothing and classify every send
|
|
93
|
+
// `submitted` without evidence. Same pane height as v1's.
|
|
94
|
+
'opencode-v2': {
|
|
95
|
+
reader: 'opencode-box',
|
|
96
|
+
verifyCaptureLines: tmux_pane_config_1.OPENCODE_PANE_HEIGHT,
|
|
97
|
+
clearBeforeSend: false,
|
|
98
|
+
submitEnterCount: 1,
|
|
99
|
+
},
|
|
90
100
|
};
|
|
91
101
|
/**
|
|
92
102
|
* The composer description for a CLI tool.
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
exports.COPILOT_VERSION_PROBE_TIMEOUT_MS = void 0;
|
|
41
41
|
exports.findExecutableOnPath = findExecutableOnPath;
|
|
42
|
+
exports.findExecutablesOnPath = findExecutablesOnPath;
|
|
42
43
|
exports.resolveCopilotExecutable = resolveCopilotExecutable;
|
|
43
44
|
const child_process_1 = require("child_process");
|
|
44
45
|
const fs_1 = require("fs");
|
|
@@ -83,17 +84,32 @@ function isExecutableFile(candidate) {
|
|
|
83
84
|
* is; what is copilot-specific is the caller below.
|
|
84
85
|
*/
|
|
85
86
|
function findExecutableOnPath(name) {
|
|
87
|
+
return findExecutablesOnPath(name, 1)[0] ?? null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Every executable named `name` on `PATH`, in `PATH` order, up to `limit`.
|
|
91
|
+
*
|
|
92
|
+
* Issue #2939: `opencode` can name two different programs on one machine
|
|
93
|
+
* (OpenCode 1.x's installer and `@opencode/cli`, which registers `opencode`
|
|
94
|
+
* next to `opencode2`), so "the first one" is not always the one a tool wants.
|
|
95
|
+
* The same walk as {@link findExecutableOnPath}, not a second copy of it.
|
|
96
|
+
*/
|
|
97
|
+
function findExecutablesOnPath(name, limit = Infinity) {
|
|
86
98
|
const rawPath = process.env.PATH;
|
|
87
|
-
if (!rawPath)
|
|
88
|
-
return
|
|
99
|
+
if (!rawPath || limit <= 0)
|
|
100
|
+
return [];
|
|
101
|
+
const found = [];
|
|
89
102
|
for (const directory of rawPath.split(path_1.delimiter)) {
|
|
90
103
|
if (!directory)
|
|
91
104
|
continue;
|
|
92
105
|
const candidate = (0, path_1.join)(directory, name);
|
|
93
|
-
if (isExecutableFile(candidate))
|
|
94
|
-
|
|
106
|
+
if (found.includes(candidate) || !isExecutableFile(candidate))
|
|
107
|
+
continue;
|
|
108
|
+
found.push(candidate);
|
|
109
|
+
if (found.length >= limit)
|
|
110
|
+
break;
|
|
95
111
|
}
|
|
96
|
-
return
|
|
112
|
+
return found;
|
|
97
113
|
}
|
|
98
114
|
/**
|
|
99
115
|
* Where `gh copilot` puts the copy it downloads.
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
* @module lib/cli-tools/graceful-exit
|
|
43
43
|
*/
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.DEFAULT_GRACEFUL_EXIT_SPEC = exports.GEMINI_EXIT_COMMAND_TEXT = exports.COMMAND_CODE_EXIT_COMMAND_TEXT = exports.OPENCODE_EXIT_COMMAND_TEXT = exports.COPILOT_EXIT_COMMAND_TEXT = void 0;
|
|
45
|
+
exports.DEFAULT_GRACEFUL_EXIT_SPEC = exports.GEMINI_EXIT_COMMAND_TEXT = exports.COMMAND_CODE_EXIT_COMMAND_TEXT = exports.OPENCODE_V2_EXIT_COMMAND_TEXT = exports.OPENCODE_EXIT_COMMAND_TEXT = exports.COPILOT_EXIT_COMMAND_TEXT = void 0;
|
|
46
46
|
exports.resolveGracefulExitSpec = resolveGracefulExitSpec;
|
|
47
47
|
exports.verifyGracefulExit = verifyGracefulExit;
|
|
48
48
|
const copilot_constants_1 = require("../../config/copilot-constants");
|
|
@@ -52,6 +52,8 @@ const cli_tool_contracts_1 = require("../../types/cli-tool-contracts");
|
|
|
52
52
|
exports.COPILOT_EXIT_COMMAND_TEXT = '/exit';
|
|
53
53
|
/** The graceful exit command opencode's TUI accepts. */
|
|
54
54
|
exports.OPENCODE_EXIT_COMMAND_TEXT = '/exit';
|
|
55
|
+
/** OpenCode V2's quit command (Issue #2934) — the TUI's own `/exit`. */
|
|
56
|
+
exports.OPENCODE_V2_EXIT_COMMAND_TEXT = '/exit';
|
|
55
57
|
/** Command Code's own quit command (Issue #2250). */
|
|
56
58
|
exports.COMMAND_CODE_EXIT_COMMAND_TEXT = '/exit';
|
|
57
59
|
/** The graceful exit command gemini's TUI accepts. */
|
|
@@ -141,6 +143,18 @@ const GRACEFUL_EXIT_SPECS = {
|
|
|
141
143
|
exitWaitMs: cli_tool_timing_config_1.OPENCODE_EXIT_WAIT_MS,
|
|
142
144
|
ownsLoopbackServer: true,
|
|
143
145
|
},
|
|
146
|
+
// Issue #2934: `/exit` and a separate Enter, as for v1. The server is not the
|
|
147
|
+
// TUI here but `opencode2 serve` in the same pane, stopped by
|
|
148
|
+
// `scripts/opencode-v2/launch.sh`'s trap when the TUI goes — so the pane still
|
|
149
|
+
// owns a loopback port, and the postcondition checks it stopped answering.
|
|
150
|
+
'opencode-v2': {
|
|
151
|
+
keys: [
|
|
152
|
+
(0, cli_tool_contracts_1.literalStep)(exports.OPENCODE_V2_EXIT_COMMAND_TEXT, cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS),
|
|
153
|
+
(0, cli_tool_contracts_1.keyStep)('Enter'),
|
|
154
|
+
],
|
|
155
|
+
exitWaitMs: cli_tool_timing_config_1.OPENCODE_V2_EXIT_WAIT_MS,
|
|
156
|
+
ownsLoopbackServer: true,
|
|
157
|
+
},
|
|
144
158
|
};
|
|
145
159
|
/**
|
|
146
160
|
* The graceful-exit description for a CLI tool.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module cli-tools
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.CLIToolManager = exports.buildCommandCodeLaunchCommand = exports.CommandCodeTool = exports.AntigravityTool = exports.GeminiTool = exports.CodexTool = exports.ClaudeTool = exports.BaseCLITool = exports.DEFAULT_GRACEFUL_EXIT_SPEC = exports.verifyGracefulExit = exports.resolveGracefulExitSpec = exports.GEMINI_PANE_HEIGHT = exports.resolveCaptureSpec = exports.DEFAULT_COMPOSER_SPEC = exports.resolveComposerSpec = exports.isImageCapableCLITool = void 0;
|
|
9
|
+
exports.CLIToolManager = exports.OpenCodeV2Tool = exports.buildCommandCodeLaunchCommand = exports.CommandCodeTool = exports.AntigravityTool = exports.GeminiTool = exports.CodexTool = exports.ClaudeTool = exports.BaseCLITool = exports.DEFAULT_GRACEFUL_EXIT_SPEC = exports.verifyGracefulExit = exports.resolveGracefulExitSpec = exports.GEMINI_PANE_HEIGHT = exports.resolveCaptureSpec = exports.DEFAULT_COMPOSER_SPEC = exports.resolveComposerSpec = exports.isImageCapableCLITool = void 0;
|
|
10
10
|
var types_1 = require("./types");
|
|
11
11
|
Object.defineProperty(exports, "isImageCapableCLITool", { enumerable: true, get: function () { return types_1.isImageCapableCLITool; } });
|
|
12
12
|
var composer_spec_1 = require("./composer-spec");
|
|
@@ -34,6 +34,8 @@ Object.defineProperty(exports, "AntigravityTool", { enumerable: true, get: funct
|
|
|
34
34
|
var command_code_1 = require("./command-code");
|
|
35
35
|
Object.defineProperty(exports, "CommandCodeTool", { enumerable: true, get: function () { return command_code_1.CommandCodeTool; } });
|
|
36
36
|
Object.defineProperty(exports, "buildCommandCodeLaunchCommand", { enumerable: true, get: function () { return command_code_1.buildCommandCodeLaunchCommand; } });
|
|
37
|
+
var opencode_v2_1 = require("./opencode-v2");
|
|
38
|
+
Object.defineProperty(exports, "OpenCodeV2Tool", { enumerable: true, get: function () { return opencode_v2_1.OpenCodeV2Tool; } });
|
|
37
39
|
// Export CLI tool manager
|
|
38
40
|
var manager_1 = require("./manager");
|
|
39
41
|
Object.defineProperty(exports, "CLIToolManager", { enumerable: true, get: function () { return manager_1.CLIToolManager; } });
|
|
@@ -83,6 +83,8 @@ exports.CLI_TOOL_INSTALL_HINTS = {
|
|
|
83
83
|
opencode: 'Install with: npm install -g opencode-ai',
|
|
84
84
|
copilot: copilot_constants_1.COPILOT_INSTALL_HINT,
|
|
85
85
|
'command-code': 'Install with: npm install -g command-code',
|
|
86
|
+
// Issue #2934: the package installs the `opencode2` executable.
|
|
87
|
+
'opencode-v2': 'Install with: npm install -g @opencode/cli',
|
|
86
88
|
// No package to name: `agy` ships with Antigravity and updates itself. The
|
|
87
89
|
// URL is lifted from the binary on PATH rather than from a search result.
|
|
88
90
|
antigravity: 'Install the Antigravity CLI: https://antigravity.google/docs/cli/reference',
|
|
@@ -114,18 +116,22 @@ function getCliToolInstallHint(id) {
|
|
|
114
116
|
* and #2009's contract is that the phrase survives.
|
|
115
117
|
*
|
|
116
118
|
* @param tool - The tool that could not be started
|
|
119
|
+
* @param detail - Why, when there is more to say than "not on PATH" — e.g.
|
|
120
|
+
* `opencode` is there but is OpenCode V2 (Issue #2939)
|
|
117
121
|
* @returns A sentence safe to hand back to an HTTP caller
|
|
118
122
|
*/
|
|
119
|
-
function buildMissingToolMessage(tool) {
|
|
123
|
+
function buildMissingToolMessage(tool, detail) {
|
|
120
124
|
return (`${tool.name} (${tool.command}) is not installed or not in PATH. ` +
|
|
125
|
+
(detail ? `${detail} ` : '') +
|
|
121
126
|
`${getCliToolInstallHint(tool.id)}`);
|
|
122
127
|
}
|
|
123
128
|
/**
|
|
124
129
|
* The typed refusal, carrying {@link buildMissingToolMessage}.
|
|
125
130
|
*
|
|
126
131
|
* @param tool - The tool that could not be started
|
|
132
|
+
* @param detail - See {@link buildMissingToolMessage}
|
|
127
133
|
* @returns The error every launch path throws for a missing binary
|
|
128
134
|
*/
|
|
129
|
-
function missingToolError(tool) {
|
|
130
|
-
return new session_start_error_1.SessionStartUnavailableError(tool.name, buildMissingToolMessage(tool));
|
|
135
|
+
function missingToolError(tool, detail) {
|
|
136
|
+
return new session_start_error_1.SessionStartUnavailableError(tool.name, buildMissingToolMessage(tool, detail));
|
|
131
137
|
}
|
|
@@ -211,6 +211,25 @@ const LIVENESS_SPECS = {
|
|
|
211
211
|
cli_patterns_1.COMMAND_CODE_THINKING_PATTERN,
|
|
212
212
|
],
|
|
213
213
|
},
|
|
214
|
+
/**
|
|
215
|
+
* OpenCode V2 2.0.18 — measured at 80x200 (Issue #2934).
|
|
216
|
+
*
|
|
217
|
+
* The footer (`… ctrl+p commands`) is drawn on every frame the TUI paints,
|
|
218
|
+
* before and after a turn and while one runs, so it alone carries liveness;
|
|
219
|
+
* the placeholder and the running hint are listed as well so a frame with
|
|
220
|
+
* either is not taken for a shell. None of the three can be matched by a
|
|
221
|
+
* shell prompt. After the TUI exits the alternate screen is gone and only the
|
|
222
|
+
* shell's rows remain, which is what makes the verdict flip.
|
|
223
|
+
*/
|
|
224
|
+
'opencode-v2': {
|
|
225
|
+
...SHARED,
|
|
226
|
+
...ADDED_TOOL_DEFAULTS,
|
|
227
|
+
alivePatterns: [
|
|
228
|
+
cli_patterns_1.OPENCODE_V2_IDLE_COMPOSER_PATTERN,
|
|
229
|
+
cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN,
|
|
230
|
+
cli_patterns_1.OPENCODE_V2_THINKING_PATTERN,
|
|
231
|
+
],
|
|
232
|
+
},
|
|
214
233
|
/** vibe-local — patterns from `cli-patterns`; no live frames (needs Ollama). */
|
|
215
234
|
'vibe-local': {
|
|
216
235
|
...SHARED,
|
|
@@ -46,6 +46,7 @@ const opencode_1 = require("./opencode");
|
|
|
46
46
|
const copilot_1 = require("./copilot");
|
|
47
47
|
const antigravity_1 = require("./antigravity");
|
|
48
48
|
const command_code_1 = require("./command-code");
|
|
49
|
+
const opencode_v2_1 = require("./opencode-v2");
|
|
49
50
|
/**
|
|
50
51
|
* CLI Tool Manager (Singleton)
|
|
51
52
|
* Provides centralized access to all CLI tools (Issue #368: includes Vibe Local, Issue #379: includes OpenCode)
|
|
@@ -67,6 +68,7 @@ class CLIToolManager {
|
|
|
67
68
|
this.tools.set('copilot', new copilot_1.CopilotTool());
|
|
68
69
|
this.tools.set('antigravity', new antigravity_1.AntigravityTool());
|
|
69
70
|
this.tools.set('command-code', new command_code_1.CommandCodeTool());
|
|
71
|
+
this.tools.set('opencode-v2', new opencode_v2_1.OpenCodeV2Tool());
|
|
70
72
|
}
|
|
71
73
|
/**
|
|
72
74
|
* Get singleton instance
|