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,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading an agent's reply out of the chat ledger (Issue #2376 / #2386 / #3039)
|
|
4
|
+
*
|
|
5
|
+
* `ask` reads the reply after its own turn; `reply` (Issue #3039) reads the
|
|
6
|
+
* latest reply of a turn somebody else sent — a worker told to "stop and
|
|
7
|
+
* report" by a supervisor nudge. Both mean the same thing by "the reply", so
|
|
8
|
+
* the rules live here once rather than in two commands that can drift:
|
|
9
|
+
*
|
|
10
|
+
* - only assistant rows in `GET /api/worktrees/:id/messages` are candidates,
|
|
11
|
+
* prompt rows excluded;
|
|
12
|
+
* - CommandMate's own furniture (`relay-sys:` / `model-changed:`) is never an
|
|
13
|
+
* answer;
|
|
14
|
+
* - a row a transcript reader wrote (`<tool>-turn:<id>`) wins over a scrape;
|
|
15
|
+
* - ANSI escapes and control bytes are dropped before the text is returned.
|
|
16
|
+
*
|
|
17
|
+
* What differs between the two callers — how long to hold out for a turn row,
|
|
18
|
+
* and whether an unmarked row may stand in for one — stays with the caller.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.TRANSCRIPT_READER_TOOLS = exports.REPLY_LOOKBACK_MESSAGES = void 0;
|
|
22
|
+
exports.sanitizeReply = sanitizeReply;
|
|
23
|
+
exports.replyCandidates = replyCandidates;
|
|
24
|
+
exports.pickLatestReply = pickLatestReply;
|
|
25
|
+
exports.requestRecentMessages = requestRecentMessages;
|
|
26
|
+
exports.fetchRecentMessages = fetchRecentMessages;
|
|
27
|
+
/**
|
|
28
|
+
* Chat rows read back per request.
|
|
29
|
+
*
|
|
30
|
+
* Bounded because only the tail matters and an unbounded read of a long-running
|
|
31
|
+
* worktree's history is a large response for one line of answer. Generous
|
|
32
|
+
* enough that a turn which wrote several assistant rows (a tool-use narration
|
|
33
|
+
* followed by the summary) still has its last one inside the window.
|
|
34
|
+
*/
|
|
35
|
+
exports.REPLY_LOOKBACK_MESSAGES = 30;
|
|
36
|
+
/**
|
|
37
|
+
* The `request_id` namespace every transcript reader mints for a turn.
|
|
38
|
+
*
|
|
39
|
+
* `codex-turn:<turn_id>`, `claude-turn:<uuid>`, `antigravity-turn:<id>`,
|
|
40
|
+
* `command-code-turn:<id>` and opencode's `oc-turn:<msg id>` — mirrored here as
|
|
41
|
+
* a shape rather than imported: the CLI bundle keeps its own copies of API
|
|
42
|
+
* strings instead of pulling `src/types/agent-transcript.ts` and its dependents
|
|
43
|
+
* into `build:cli`. Matching the shape rather than a list of five literals is
|
|
44
|
+
* also what stops the sixth reader from silently landing outside the filter.
|
|
45
|
+
*
|
|
46
|
+
* A `:` cannot appear in any of the ids themselves, so this cannot match a row
|
|
47
|
+
* that merely CONTAINS the text.
|
|
48
|
+
*/
|
|
49
|
+
const TURN_REQUEST_ID_PATTERN = /-turn:/;
|
|
50
|
+
/**
|
|
51
|
+
* Request-id namespaces CommandMate writes about a session, not for it.
|
|
52
|
+
*
|
|
53
|
+
* `chat_messages` has no `system` role, so "the model changed" (Issue #2357)
|
|
54
|
+
* and "reply from X" (Issue #2377) are both stored as ASSISTANT rows and told
|
|
55
|
+
* apart by their request id. Neither is anything the other session said, and
|
|
56
|
+
* delivering the relay notice back as an answer is the smallest possible loop —
|
|
57
|
+
* `findWorkerReply` steps over the same rows for the same reason.
|
|
58
|
+
*/
|
|
59
|
+
const SYSTEM_ROW_REQUEST_ID_PREFIXES = ['relay-sys:', 'model-changed:'];
|
|
60
|
+
/**
|
|
61
|
+
* Tools whose reply CommandMate reads out of a transcript rather than a screen.
|
|
62
|
+
*
|
|
63
|
+
* For these five the ledger is authoritative and a row with no turn marker is
|
|
64
|
+
* by definition not the answer. For every other tool (copilot / gemini /
|
|
65
|
+
* vibe-local) the scraper's row is the only record there will ever be.
|
|
66
|
+
*
|
|
67
|
+
* Mirrors the five readers that live under `src/lib/hooks/sources/`.
|
|
68
|
+
*/
|
|
69
|
+
exports.TRANSCRIPT_READER_TOOLS = new Set([
|
|
70
|
+
'claude',
|
|
71
|
+
'codex',
|
|
72
|
+
'antigravity',
|
|
73
|
+
'command-code',
|
|
74
|
+
'opencode',
|
|
75
|
+
]);
|
|
76
|
+
/**
|
|
77
|
+
* ANSI escape sequences, as a pattern built from escapes rather than literals.
|
|
78
|
+
*
|
|
79
|
+
* `scripts/check-control-chars.mjs` fails the build on a raw C0 byte in `src/`
|
|
80
|
+
* (Issue #1432), and a raw ESC here would be one.
|
|
81
|
+
*/
|
|
82
|
+
const ANSI_ESCAPE_PATTERN = /[\u001B\u009B][[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PR-TZcf-nqry=><]/g;
|
|
83
|
+
/** Remaining C0/C1 control bytes, once the sequences above are gone. */
|
|
84
|
+
const CONTROL_CHAR_PATTERN = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g;
|
|
85
|
+
/**
|
|
86
|
+
* A reply body fit to print, or `''` if nothing survived.
|
|
87
|
+
*
|
|
88
|
+
* Issue #2386 asked for this as a belt to the braces: the row the junk came
|
|
89
|
+
* from held RAW ANSI, and a caller that pipes a reply into a report or a commit
|
|
90
|
+
* message should never have to strip escape codes out of an agent's sentence.
|
|
91
|
+
*
|
|
92
|
+
* @param raw - Reply text as it arrived
|
|
93
|
+
*/
|
|
94
|
+
function sanitizeReply(raw) {
|
|
95
|
+
return raw.replace(ANSI_ESCAPE_PATTERN, '').replace(CONTROL_CHAR_PATTERN, '').trim();
|
|
96
|
+
}
|
|
97
|
+
/** Whether a row's `request_id` says a transcript reader wrote it. */
|
|
98
|
+
function isTurnRow(requestId) {
|
|
99
|
+
return typeof requestId === 'string' && TURN_REQUEST_ID_PATTERN.test(requestId);
|
|
100
|
+
}
|
|
101
|
+
/** Whether a row is CommandMate's own furniture rather than the agent's words. */
|
|
102
|
+
function isSystemRow(requestId) {
|
|
103
|
+
return typeof requestId === 'string'
|
|
104
|
+
&& SYSTEM_ROW_REQUEST_ID_PREFIXES.some((prefix) => requestId.startsWith(prefix));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The rows that could be a reply written at or after `since`, oldest first.
|
|
108
|
+
*
|
|
109
|
+
* @param messages - Rows as the messages route serialized them
|
|
110
|
+
* @param since - Epoch ms; rows stamped earlier are not candidates
|
|
111
|
+
*/
|
|
112
|
+
function replyCandidates(messages, since) {
|
|
113
|
+
const candidates = [];
|
|
114
|
+
for (const m of messages) {
|
|
115
|
+
if (m.role !== 'assistant')
|
|
116
|
+
continue;
|
|
117
|
+
if (m.messageType === 'prompt')
|
|
118
|
+
continue;
|
|
119
|
+
if (typeof m.content !== 'string')
|
|
120
|
+
continue;
|
|
121
|
+
if (!(Date.parse(m.timestamp) >= since))
|
|
122
|
+
continue;
|
|
123
|
+
if (isSystemRow(m.requestId))
|
|
124
|
+
continue;
|
|
125
|
+
const content = sanitizeReply(m.content);
|
|
126
|
+
if (content === '')
|
|
127
|
+
continue;
|
|
128
|
+
candidates.push({
|
|
129
|
+
content,
|
|
130
|
+
fromTranscript: isTurnRow(m.requestId),
|
|
131
|
+
requestId: typeof m.requestId === 'string' ? m.requestId : null,
|
|
132
|
+
at: m.timestamp,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return candidates;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The newest reply among `candidates`, or null.
|
|
139
|
+
*
|
|
140
|
+
* Newest first among the rows a reader wrote: a turn that emitted several
|
|
141
|
+
* assistant rows (a narration then the summary) still ends on its summary.
|
|
142
|
+
* When `turnRowsOnly` is false and no reader wrote anything, the newest row of
|
|
143
|
+
* any kind is taken — the only record a tool without a transcript has.
|
|
144
|
+
*
|
|
145
|
+
* @param candidates - Output of {@link replyCandidates}
|
|
146
|
+
* @param turnRowsOnly - Whether an unmarked (scraped) row may stand in
|
|
147
|
+
*/
|
|
148
|
+
function pickLatestReply(candidates, turnRowsOnly) {
|
|
149
|
+
for (let i = candidates.length - 1; i >= 0; i -= 1) {
|
|
150
|
+
if (candidates[i].fromTranscript)
|
|
151
|
+
return candidates[i];
|
|
152
|
+
}
|
|
153
|
+
if (turnRowsOnly)
|
|
154
|
+
return null;
|
|
155
|
+
return candidates[candidates.length - 1] ?? null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The recent chat rows for this instance. Throws what the API client throws.
|
|
159
|
+
*
|
|
160
|
+
* @param client - API client
|
|
161
|
+
* @param worktreeId - Worktree ID
|
|
162
|
+
* @param instanceId - Resolved instance ID, or undefined for every instance
|
|
163
|
+
*/
|
|
164
|
+
async function requestRecentMessages(client, worktreeId, instanceId) {
|
|
165
|
+
const query = new URLSearchParams({ limit: String(exports.REPLY_LOOKBACK_MESSAGES) });
|
|
166
|
+
if (instanceId)
|
|
167
|
+
query.set('instance', instanceId);
|
|
168
|
+
// PromptMessageResponse is the CLI's mirror of a serialized chat row; the
|
|
169
|
+
// `messageType: 'prompt'` filter is the caller's, not the type's, so it is
|
|
170
|
+
// the right shape for reading normal rows too.
|
|
171
|
+
const messages = await client.get(`/api/worktrees/${worktreeId}/messages?${query.toString()}`);
|
|
172
|
+
return Array.isArray(messages) ? messages : [];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* {@link requestRecentMessages}, or null if the rows cannot be read.
|
|
176
|
+
*
|
|
177
|
+
* For a caller whose turn already completed: a daemon that cannot serve the
|
|
178
|
+
* ledger is a reason to fall back, not a reason to lose the turn.
|
|
179
|
+
*/
|
|
180
|
+
async function fetchRecentMessages(client, worktreeId, instanceId) {
|
|
181
|
+
try {
|
|
182
|
+
return await requestRecentMessages(client, worktreeId, instanceId);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Launched-server identity check
|
|
3
|
+
* Issue #3087: `remote` published whatever answered on the port
|
|
4
|
+
*
|
|
5
|
+
* A TCP connect only proves that SOMETHING listens. In #3087 an orphaned server from an
|
|
6
|
+
* earlier `start --daemon` (no authentication) kept the port, the server `remote` launched
|
|
7
|
+
* died on EADDRINUSE, and `remote` put the orphan behind a public tunnel.
|
|
8
|
+
*
|
|
9
|
+
* Before anything is published, this asks the endpoint two questions over plain HTTP(S):
|
|
10
|
+
*
|
|
11
|
+
* 1. A request carrying a token nobody holds must be refused with 401. Anything else means
|
|
12
|
+
* authentication is off (or the answer is not CommandMate's middleware), so the server
|
|
13
|
+
* would be reachable without pairing.
|
|
14
|
+
* 2. A request carrying the session token `remote` minted moments ago must succeed. Only
|
|
15
|
+
* the server launched with that token's hash can accept it, so this proves the listener
|
|
16
|
+
* is the one this invocation started — no new API route or nonce is needed.
|
|
17
|
+
*
|
|
18
|
+
* Question 1 is asked first so the session token is never sent to a server already shown to
|
|
19
|
+
* be the wrong one. Every outcome that is not a clear "yes" to both is a refusal (fail-closed);
|
|
20
|
+
* only connection errors and 5xx (a server still warming up) are retried until the deadline.
|
|
21
|
+
*
|
|
22
|
+
* @module server-identity
|
|
23
|
+
*/
|
|
24
|
+
/** Path probed: authenticated like every API route, and it reads nothing (Issue #1925). */
|
|
25
|
+
export declare const IDENTITY_PROBE_PATH = "/api/capabilities";
|
|
26
|
+
export declare const DEFAULT_IDENTITY_TIMEOUT_MS = 30000;
|
|
27
|
+
export declare const DEFAULT_IDENTITY_INTERVAL_MS = 300;
|
|
28
|
+
export interface VerifyLaunchedServerOptions {
|
|
29
|
+
protocol: 'http' | 'https';
|
|
30
|
+
host: string;
|
|
31
|
+
port: number;
|
|
32
|
+
/** Plaintext session token whose hash the launched server was given */
|
|
33
|
+
sessionToken: string;
|
|
34
|
+
timeoutMs?: number;
|
|
35
|
+
intervalMs?: number;
|
|
36
|
+
}
|
|
37
|
+
export type LaunchedServerVerdict = {
|
|
38
|
+
ok: true;
|
|
39
|
+
} | {
|
|
40
|
+
ok: false;
|
|
41
|
+
reason: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Verify that the endpoint is the authenticated server this invocation launched.
|
|
45
|
+
*
|
|
46
|
+
* @returns `{ ok: true }` only when an unknown token is refused with 401 AND the session
|
|
47
|
+
* token is accepted; otherwise `{ ok: false, reason }`. Never throws.
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyLaunchedServer(options: VerifyLaunchedServerOptions): Promise<LaunchedServerVerdict>;
|
|
50
|
+
//# sourceMappingURL=server-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-identity.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AACjD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAGhD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAqDjF;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CA0ChC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Launched-server identity check
|
|
4
|
+
* Issue #3087: `remote` published whatever answered on the port
|
|
5
|
+
*
|
|
6
|
+
* A TCP connect only proves that SOMETHING listens. In #3087 an orphaned server from an
|
|
7
|
+
* earlier `start --daemon` (no authentication) kept the port, the server `remote` launched
|
|
8
|
+
* died on EADDRINUSE, and `remote` put the orphan behind a public tunnel.
|
|
9
|
+
*
|
|
10
|
+
* Before anything is published, this asks the endpoint two questions over plain HTTP(S):
|
|
11
|
+
*
|
|
12
|
+
* 1. A request carrying a token nobody holds must be refused with 401. Anything else means
|
|
13
|
+
* authentication is off (or the answer is not CommandMate's middleware), so the server
|
|
14
|
+
* would be reachable without pairing.
|
|
15
|
+
* 2. A request carrying the session token `remote` minted moments ago must succeed. Only
|
|
16
|
+
* the server launched with that token's hash can accept it, so this proves the listener
|
|
17
|
+
* is the one this invocation started — no new API route or nonce is needed.
|
|
18
|
+
*
|
|
19
|
+
* Question 1 is asked first so the session token is never sent to a server already shown to
|
|
20
|
+
* be the wrong one. Every outcome that is not a clear "yes" to both is a refusal (fail-closed);
|
|
21
|
+
* only connection errors and 5xx (a server still warming up) are retried until the deadline.
|
|
22
|
+
*
|
|
23
|
+
* @module server-identity
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DEFAULT_IDENTITY_INTERVAL_MS = exports.DEFAULT_IDENTITY_TIMEOUT_MS = exports.IDENTITY_PROBE_PATH = void 0;
|
|
27
|
+
exports.verifyLaunchedServer = verifyLaunchedServer;
|
|
28
|
+
const http_1 = require("http");
|
|
29
|
+
const https_1 = require("https");
|
|
30
|
+
const crypto_1 = require("crypto");
|
|
31
|
+
/** Path probed: authenticated like every API route, and it reads nothing (Issue #1925). */
|
|
32
|
+
exports.IDENTITY_PROBE_PATH = '/api/capabilities';
|
|
33
|
+
exports.DEFAULT_IDENTITY_TIMEOUT_MS = 30000;
|
|
34
|
+
exports.DEFAULT_IDENTITY_INTERVAL_MS = 300;
|
|
35
|
+
const REQUEST_TIMEOUT_MS = 10000;
|
|
36
|
+
function probe(options, bearer, timeoutMs) {
|
|
37
|
+
return new Promise((resolve) => {
|
|
38
|
+
const send = options.protocol === 'https' ? https_1.request : http_1.request;
|
|
39
|
+
let settled = false;
|
|
40
|
+
const finish = (status) => {
|
|
41
|
+
if (settled)
|
|
42
|
+
return;
|
|
43
|
+
settled = true;
|
|
44
|
+
resolve(status);
|
|
45
|
+
};
|
|
46
|
+
try {
|
|
47
|
+
const req = send({
|
|
48
|
+
host: options.host,
|
|
49
|
+
port: options.port,
|
|
50
|
+
path: exports.IDENTITY_PROBE_PATH,
|
|
51
|
+
method: 'GET',
|
|
52
|
+
headers: { Authorization: `Bearer ${bearer}` },
|
|
53
|
+
timeout: timeoutMs,
|
|
54
|
+
// Loopback only, and identity is proven by the token, not the certificate: a
|
|
55
|
+
// self-signed CM_HTTPS_CERT must not make the check impossible.
|
|
56
|
+
rejectUnauthorized: false,
|
|
57
|
+
}, (res) => {
|
|
58
|
+
res.resume();
|
|
59
|
+
finish(res.statusCode ?? null);
|
|
60
|
+
});
|
|
61
|
+
req.on('timeout', () => {
|
|
62
|
+
req.destroy();
|
|
63
|
+
finish(null);
|
|
64
|
+
});
|
|
65
|
+
req.on('error', () => finish(null));
|
|
66
|
+
req.end();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
finish(null);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function isTransient(status) {
|
|
74
|
+
return status === null || status >= 500;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Verify that the endpoint is the authenticated server this invocation launched.
|
|
78
|
+
*
|
|
79
|
+
* @returns `{ ok: true }` only when an unknown token is refused with 401 AND the session
|
|
80
|
+
* token is accepted; otherwise `{ ok: false, reason }`. Never throws.
|
|
81
|
+
*/
|
|
82
|
+
async function verifyLaunchedServer(options) {
|
|
83
|
+
const timeoutMs = options.timeoutMs ?? exports.DEFAULT_IDENTITY_TIMEOUT_MS;
|
|
84
|
+
const intervalMs = options.intervalMs ?? exports.DEFAULT_IDENTITY_INTERVAL_MS;
|
|
85
|
+
const deadline = Date.now() + timeoutMs;
|
|
86
|
+
// A token that cannot be anyone's: fresh random bytes, never hashed or stored anywhere.
|
|
87
|
+
const decoy = (0, crypto_1.randomBytes)(32).toString('hex');
|
|
88
|
+
const where = `${options.host}:${options.port}`;
|
|
89
|
+
const ask = async (bearer) => {
|
|
90
|
+
for (;;) {
|
|
91
|
+
const remaining = deadline - Date.now();
|
|
92
|
+
const status = await probe(options, bearer, Math.max(Math.min(REQUEST_TIMEOUT_MS, remaining), 1));
|
|
93
|
+
if (!isTransient(status) || deadline - Date.now() <= 0) {
|
|
94
|
+
return status;
|
|
95
|
+
}
|
|
96
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(intervalMs, Math.max(deadline - Date.now(), 1))));
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const unauthenticated = await ask(decoy);
|
|
100
|
+
if (unauthenticated !== 401) {
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
reason: unauthenticated === null
|
|
104
|
+
? `nothing answered on ${where}`
|
|
105
|
+
: `the server on ${where} did not require authentication (HTTP ${unauthenticated} for an unknown token, expected 401)`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const authenticated = await ask(options.sessionToken);
|
|
109
|
+
if (authenticated === null || authenticated < 200 || authenticated >= 300) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
reason: authenticated === null
|
|
113
|
+
? `nothing answered on ${where}`
|
|
114
|
+
: `the server on ${where} is not the one this command started (HTTP ${authenticated} for this session's token)`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return { ok: true };
|
|
118
|
+
}
|
|
@@ -25,4 +25,17 @@ export declare const DEFAULT_INTERVAL_MS = 300;
|
|
|
25
25
|
* @returns true if the server accepted a connection, false on timeout
|
|
26
26
|
*/
|
|
27
27
|
export declare function waitForServer(host: string, port: number, options?: WaitForServerOptions): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Whether something is accepting TCP connections on host:port right now.
|
|
30
|
+
*
|
|
31
|
+
* Issue #3087: a single attempt, used where "the port is free" has to be proven
|
|
32
|
+
* (before `start` spawns a server, after `stop` claims to have stopped one)
|
|
33
|
+
* rather than waited for.
|
|
34
|
+
*
|
|
35
|
+
* @param host - Host to connect to
|
|
36
|
+
* @param port - Port to connect to
|
|
37
|
+
* @param timeoutMs - How long one connection attempt may take
|
|
38
|
+
* @returns true if a connection was accepted
|
|
39
|
+
*/
|
|
40
|
+
export declare function isPortInUse(host: string, port: number, timeoutMs?: number): Promise<boolean>;
|
|
28
41
|
//# sourceMappingURL=server-ready.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-ready.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-ready.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
|
1
|
+
{"version":3,"file":"server-ready.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-ready.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAElG"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.DEFAULT_INTERVAL_MS = exports.DEFAULT_TIMEOUT_MS = void 0;
|
|
14
14
|
exports.waitForServer = waitForServer;
|
|
15
|
+
exports.isPortInUse = isPortInUse;
|
|
15
16
|
const net_1 = require("net");
|
|
16
17
|
exports.DEFAULT_TIMEOUT_MS = 30000;
|
|
17
18
|
exports.DEFAULT_INTERVAL_MS = 300;
|
|
@@ -39,6 +40,21 @@ async function waitForServer(host, port, options = {}) {
|
|
|
39
40
|
await delay(Math.min(intervalMs, remaining));
|
|
40
41
|
}
|
|
41
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Whether something is accepting TCP connections on host:port right now.
|
|
45
|
+
*
|
|
46
|
+
* Issue #3087: a single attempt, used where "the port is free" has to be proven
|
|
47
|
+
* (before `start` spawns a server, after `stop` claims to have stopped one)
|
|
48
|
+
* rather than waited for.
|
|
49
|
+
*
|
|
50
|
+
* @param host - Host to connect to
|
|
51
|
+
* @param port - Port to connect to
|
|
52
|
+
* @param timeoutMs - How long one connection attempt may take
|
|
53
|
+
* @returns true if a connection was accepted
|
|
54
|
+
*/
|
|
55
|
+
function isPortInUse(host, port, timeoutMs = 1000) {
|
|
56
|
+
return tryConnect(host, port, timeoutMs);
|
|
57
|
+
}
|
|
42
58
|
/**
|
|
43
59
|
* Attempt a single TCP connection.
|
|
44
60
|
*
|
|
@@ -67,6 +67,15 @@ export declare const COPILOT_VERSION_PROBE_TIMEOUT_MS = 5000;
|
|
|
67
67
|
* is; what is copilot-specific is the caller below.
|
|
68
68
|
*/
|
|
69
69
|
export declare function findExecutableOnPath(name: string): string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Every executable named `name` on `PATH`, in `PATH` order, up to `limit`.
|
|
72
|
+
*
|
|
73
|
+
* Issue #2939: `opencode` can name two different programs on one machine
|
|
74
|
+
* (OpenCode 1.x's installer and `@opencode/cli`, which registers `opencode`
|
|
75
|
+
* next to `opencode2`), so "the first one" is not always the one a tool wants.
|
|
76
|
+
* The same walk as {@link findExecutableOnPath}, not a second copy of it.
|
|
77
|
+
*/
|
|
78
|
+
export declare function findExecutablesOnPath(name: string, limit?: number): string[];
|
|
70
79
|
/**
|
|
71
80
|
* The copilot this machine would actually run, or null when there is none.
|
|
72
81
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/copilot-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAQH;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5D,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;CAC1C;AAQD,4FAA4F;AAC5F,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAyBrD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"copilot-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/copilot-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAQH;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5D,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;CAC1C;AAQD,4FAA4F;AAC5F,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAyBrD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiB,GAAG,MAAM,EAAE,CAYtF;AAuCD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiBlF"}
|
|
@@ -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.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which `opencode` is OpenCode 1.x and which is OpenCode V2 (Issue #2939).
|
|
3
|
+
*
|
|
4
|
+
* ## Why the name is not enough
|
|
5
|
+
*
|
|
6
|
+
* OpenCode V2's npm package `@opencode/cli` (2.0.18) registers **both**
|
|
7
|
+
* `opencode` and `opencode2` in its `bin`. So on a machine that has it,
|
|
8
|
+
* `opencode` may be OpenCode 1.x (its own installer, `~/.opencode/bin`) or
|
|
9
|
+
* OpenCode V2 (`/opt/homebrew/bin/opencode`), decided by nothing but the order
|
|
10
|
+
* of `PATH`. Asking `which opencode` then answers "OpenCode is installed" for a
|
|
11
|
+
* V2 binary, and the v1 launch line (`opencode --port N --hostname …`) reaches
|
|
12
|
+
* a program that has neither flag.
|
|
13
|
+
*
|
|
14
|
+
* The answer here is the version each candidate prints about itself:
|
|
15
|
+
*
|
|
16
|
+
* - OpenCode 1.x prints a bare `1.18.33`;
|
|
17
|
+
* - OpenCode V2 prints `opencode v2.0.18`.
|
|
18
|
+
*
|
|
19
|
+
* Every `opencode` / `opencode2` on `PATH` is a candidate, not just the first,
|
|
20
|
+
* so a V2 `opencode` earlier on `PATH` no longer hides a 1.x one behind it.
|
|
21
|
+
*
|
|
22
|
+
* ## Probe and launch are one measurement
|
|
23
|
+
*
|
|
24
|
+
* The path that answered is the path the launch line runs — the rule
|
|
25
|
+
* `./copilot-executable` set for copilot (#1907). The server resolves names on
|
|
26
|
+
* its own `PATH`, the pane on its login shell's; typing a bare `opencode` would
|
|
27
|
+
* let the two disagree.
|
|
28
|
+
*
|
|
29
|
+
* ## Cost
|
|
30
|
+
*
|
|
31
|
+
* `opencode --version` takes ~0.4 s and both tools probe `opencode`, so one
|
|
32
|
+
* probe per path is shared for {@link OPENCODE_EXECUTABLE_CACHE_TTL_MS}, and a
|
|
33
|
+
* concurrent caller gets the probe already in flight.
|
|
34
|
+
*
|
|
35
|
+
* @module lib/cli-tools/opencode-executable
|
|
36
|
+
*/
|
|
37
|
+
/** OpenCode 1.x's executable name (tool id `opencode`). */
|
|
38
|
+
export declare const OPENCODE_V1_BINARY_NAME = "opencode";
|
|
39
|
+
/** OpenCode V2's own executable name (tool id `opencode-v2`). */
|
|
40
|
+
export declare const OPENCODE_V2_BINARY_NAME = "opencode2";
|
|
41
|
+
/** Budget for one `--version`. */
|
|
42
|
+
export declare const OPENCODE_VERSION_PROBE_TIMEOUT_MS = 5000;
|
|
43
|
+
/** How long one probe result is reused (same TTL as the installed-agents cache). */
|
|
44
|
+
export declare const OPENCODE_EXECUTABLE_CACHE_TTL_MS = 30000;
|
|
45
|
+
/** Which OpenCode a binary is. */
|
|
46
|
+
export type OpencodeGeneration = 'v1' | 'v2';
|
|
47
|
+
/** What `--version` said, when it said something recognisable. */
|
|
48
|
+
export interface OpencodeVersionInfo {
|
|
49
|
+
readonly generation: OpencodeGeneration;
|
|
50
|
+
/** `major.minor.patch` (plus any pre-release suffix). */
|
|
51
|
+
readonly version: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Classify `opencode --version` / `opencode2 --version` output.
|
|
55
|
+
*
|
|
56
|
+
* A line has to be a version in one of the two forms and nothing else, so a
|
|
57
|
+
* different program that happens to print a number is not taken for either.
|
|
58
|
+
* The major version decides: 1 is OpenCode 1.x, 2 or later is OpenCode V2.
|
|
59
|
+
* `0.x` (the pre-1.0 `opencode`) and anything unreadable are null.
|
|
60
|
+
*
|
|
61
|
+
* @returns The generation and version, or null when the output is not OpenCode's
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseOpencodeVersionOutput(output: string): OpencodeVersionInfo | null;
|
|
64
|
+
/** One candidate and what it answered (null: no recognisable answer). */
|
|
65
|
+
export interface OpencodeProbe {
|
|
66
|
+
readonly path: string;
|
|
67
|
+
readonly info: OpencodeVersionInfo | null;
|
|
68
|
+
}
|
|
69
|
+
/** The binary a tool will run. */
|
|
70
|
+
export interface OpencodeExecutable {
|
|
71
|
+
/** Absolute path, as found on `PATH` — the launch line runs exactly this. */
|
|
72
|
+
readonly path: string;
|
|
73
|
+
readonly version: string;
|
|
74
|
+
readonly generation: OpencodeGeneration;
|
|
75
|
+
}
|
|
76
|
+
/** A resolution: what was chosen, and every candidate asked on the way. */
|
|
77
|
+
export interface OpencodeResolution {
|
|
78
|
+
readonly executable: OpencodeExecutable | null;
|
|
79
|
+
readonly probed: readonly OpencodeProbe[];
|
|
80
|
+
}
|
|
81
|
+
/** Forget every cached probe (tests, and a caller that knows the install changed). */
|
|
82
|
+
export declare function clearOpencodeExecutableCache(): void;
|
|
83
|
+
/** `<path> --version`, classified; cached per path. Never rejects. */
|
|
84
|
+
export declare function probeOpencodeExecutable(path: string): Promise<OpencodeVersionInfo | null>;
|
|
85
|
+
/**
|
|
86
|
+
* OpenCode 1.x: the first `opencode` on `PATH` that prints a 1.x version.
|
|
87
|
+
* An `opencode` that answers `opencode v2.x` is skipped, never launched.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveOpencodeV1Executable(): Promise<OpencodeResolution>;
|
|
90
|
+
/**
|
|
91
|
+
* OpenCode V2: `opencode2` first, then an `opencode` that prints
|
|
92
|
+
* `opencode v2.x` — for an operator who has V2 only under the `opencode` name.
|
|
93
|
+
*/
|
|
94
|
+
export declare function resolveOpencodeV2Executable(): Promise<OpencodeResolution>;
|
|
95
|
+
/**
|
|
96
|
+
* Why OpenCode 1.x counts as not installed, when there is more to say than
|
|
97
|
+
* "no `opencode` on PATH".
|
|
98
|
+
*
|
|
99
|
+
* @returns A sentence naming the `opencode` that is there and what it is, or
|
|
100
|
+
* null when nothing called `opencode` was found at all
|
|
101
|
+
*/
|
|
102
|
+
export declare function describeOpencodeV1Unavailable(resolution: OpencodeResolution): string | null;
|
|
103
|
+
//# sourceMappingURL=opencode-executable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/opencode-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD,kCAAkC;AAClC,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAKtD,oFAAoF;AACpF,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAKvD,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAQD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAarF;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC3C;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AASD,sFAAsF;AACtF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AA2BD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAOzF;AAqBD;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAEzE;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAe3F"}
|