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,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* reply Command - read an agent session's latest reply (Issue #3039)
|
|
4
|
+
*
|
|
5
|
+
* commandmate reply <worktree-id> [--instance <id|alias>] [--agent <tool>]
|
|
6
|
+
* [--since <iso8601>] [--json]
|
|
7
|
+
*
|
|
8
|
+
* ## Why this exists next to ask / capture
|
|
9
|
+
*
|
|
10
|
+
* `ask` reads the reply to the turn IT sent. A supervisor that nudged a worker
|
|
11
|
+
* with a plain `send` ("stop and report") had no way to read the answer short
|
|
12
|
+
* of opening the tool's transcript file itself — which works for Claude, whose
|
|
13
|
+
* path is computable from the cwd, and not for Command Code, whose project slug
|
|
14
|
+
* is not. `capture` is no substitute: the pane also holds the nudge's own echo,
|
|
15
|
+
* and a pane line cannot be attributed to a turn.
|
|
16
|
+
*
|
|
17
|
+
* The server already has the reply: the transcript readers write each turn into
|
|
18
|
+
* the chat ledger keyed `<tool>-turn:<id>`, and `ask` reads it from there. This
|
|
19
|
+
* command is that read on its own, through the same shared rules
|
|
20
|
+
* (`utils/reply-ledger`), so the two can never disagree about what a reply is.
|
|
21
|
+
*
|
|
22
|
+
* ## What it deliberately does not do
|
|
23
|
+
*
|
|
24
|
+
* - No pane fallback. A row off the screen is exactly what cannot be attributed
|
|
25
|
+
* to a turn; returning it would re-introduce the problem this command solves.
|
|
26
|
+
* Only transcript-reader rows count, for every tool.
|
|
27
|
+
* - No wait. It is one read; "no reply yet" is an answer (exit 0, empty stdout,
|
|
28
|
+
* `reply: null`), not an error, so a caller can poll or give up on its terms.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.createReplyCommand = createReplyCommand;
|
|
32
|
+
const commander_1 = require("commander");
|
|
33
|
+
const types_1 = require("../types");
|
|
34
|
+
const api_client_1 = require("../utils/api-client");
|
|
35
|
+
const command_helpers_1 = require("../utils/command-helpers");
|
|
36
|
+
const cli_tool_ids_1 = require("../config/cli-tool-ids");
|
|
37
|
+
const agent_target_options_1 = require("../config/agent-target-options");
|
|
38
|
+
const instances_1 = require("./instances");
|
|
39
|
+
const reply_ledger_1 = require("../utils/reply-ledger");
|
|
40
|
+
/**
|
|
41
|
+
* A date-time that starts with a calendar date. Date.parse alone would also
|
|
42
|
+
* take "1" or "Sep 30", which is a typo more often than an intent.
|
|
43
|
+
*/
|
|
44
|
+
const ISO_DATE_PREFIX = /^\d{4}-\d{2}-\d{2}/;
|
|
45
|
+
/**
|
|
46
|
+
* Parse `--since <iso8601>` into epoch ms. No value means "any time".
|
|
47
|
+
*
|
|
48
|
+
* @param raw - Raw option value, if the user passed one
|
|
49
|
+
*/
|
|
50
|
+
function parseSince(raw) {
|
|
51
|
+
if (raw === undefined)
|
|
52
|
+
return Number.NEGATIVE_INFINITY;
|
|
53
|
+
const value = Date.parse(raw);
|
|
54
|
+
if (!ISO_DATE_PREFIX.test(raw) || !Number.isFinite(value)) {
|
|
55
|
+
console.error('Error: --since must be an ISO 8601 date-time (e.g. 2026-09-30T12:00:00Z).');
|
|
56
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
function createReplyCommand() {
|
|
61
|
+
const cmd = new commander_1.Command('reply');
|
|
62
|
+
cmd
|
|
63
|
+
.description('Print the latest reply an agent session wrote (from its transcript; '
|
|
64
|
+
+ 'exit 0 with empty stdout when there is none yet)')
|
|
65
|
+
.argument('<worktree-id>', 'Worktree ID')
|
|
66
|
+
.option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
|
|
67
|
+
.option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
|
|
68
|
+
.option('--since <iso8601>', 'Only a reply written at or after this time')
|
|
69
|
+
.option('--json', 'Print { worktreeId, instanceId, cliToolId, reply, requestId, at }')
|
|
70
|
+
.option('--token <token>', command_helpers_1.TOKEN_WARNING)
|
|
71
|
+
.addHelpText('after', `
|
|
72
|
+
Only rows a transcript reader wrote (<tool>-turn:<id>) count as a reply, the
|
|
73
|
+
same rule \`ask\` uses; the pane is never read. Tools with a transcript reader:
|
|
74
|
+
claude, codex, antigravity, command-code, opencode.
|
|
75
|
+
|
|
76
|
+
No reply yet (or none after --since) is not an error: stdout is empty, stderr
|
|
77
|
+
says so in one line, and the exit code is 0. --json prints "reply": null.
|
|
78
|
+
`)
|
|
79
|
+
.action(async (worktreeId, options) => {
|
|
80
|
+
try {
|
|
81
|
+
if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
|
|
82
|
+
console.error('Error: Invalid worktree ID format.');
|
|
83
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
84
|
+
}
|
|
85
|
+
if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
|
|
86
|
+
console.error(`Error: Invalid agent. Must be one of: ${cli_tool_ids_1.CLI_TOOL_IDS.join(', ')}`);
|
|
87
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
88
|
+
}
|
|
89
|
+
if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
|
|
90
|
+
console.error(instances_1.INSTANCE_SELECTOR_ERROR);
|
|
91
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
92
|
+
}
|
|
93
|
+
const since = parseSince(options.since);
|
|
94
|
+
const client = new api_client_1.ApiClient({ token: options.token });
|
|
95
|
+
// Resolved exactly as `ask` resolves it: `--agent` alone names that
|
|
96
|
+
// tool's primary instance (Issue #2479).
|
|
97
|
+
const selector = options.instance ?? options.agent;
|
|
98
|
+
const target = selector
|
|
99
|
+
? await (0, instances_1.resolveInstanceTarget)(client, worktreeId, selector, options.agent)
|
|
100
|
+
: null;
|
|
101
|
+
const cliToolId = target ? target.cliToolId : options.agent;
|
|
102
|
+
const instanceId = target?.instanceId;
|
|
103
|
+
// Unlike `ask`, a failed read is not swallowed: there is no turn this
|
|
104
|
+
// command completed that a fallback would be protecting.
|
|
105
|
+
const messages = await (0, reply_ledger_1.requestRecentMessages)(client, worktreeId, instanceId);
|
|
106
|
+
const latest = (0, reply_ledger_1.pickLatestReply)((0, reply_ledger_1.replyCandidates)(messages, since), true);
|
|
107
|
+
if (options.json) {
|
|
108
|
+
const payload = {
|
|
109
|
+
worktreeId,
|
|
110
|
+
instanceId: instanceId ?? null,
|
|
111
|
+
cliToolId: cliToolId ?? null,
|
|
112
|
+
reply: latest?.content ?? null,
|
|
113
|
+
requestId: latest?.requestId ?? null,
|
|
114
|
+
at: latest?.at ?? null,
|
|
115
|
+
};
|
|
116
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
117
|
+
}
|
|
118
|
+
else if (latest) {
|
|
119
|
+
console.log(latest.content);
|
|
120
|
+
}
|
|
121
|
+
if (!latest) {
|
|
122
|
+
console.error(options.since
|
|
123
|
+
? `No reply since ${options.since} (no transcript row yet).`
|
|
124
|
+
: 'No reply yet (no transcript row yet).');
|
|
125
|
+
}
|
|
126
|
+
process.exit(types_1.ExitCode.SUCCESS);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
(0, command_helpers_1.handleCommandError)(error);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return cmd;
|
|
133
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8apC,wBAAgB,oBAAoB,IAAI,OAAO,CA6F9C"}
|
|
@@ -120,6 +120,240 @@ async function answerSolePendingDecision(client, worktreeId, body) {
|
|
|
120
120
|
throw error;
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
+
/** Reason `/prompt-response` gives when no dialog is on screen any more. */
|
|
124
|
+
const PROMPT_NO_LONGER_ACTIVE = 'prompt_no_longer_active';
|
|
125
|
+
/**
|
|
126
|
+
* Issue #3125: what `--plan-review` takes. Restated rather than imported from
|
|
127
|
+
* `src/lib` (the CLI build does not reach it); the server validates the same set.
|
|
128
|
+
*/
|
|
129
|
+
const PLAN_REVIEW_ACTIONS = ['comment', 'submit', 'approve', 'cancel'];
|
|
130
|
+
/** Reasons the server gives for a plan review answer it refused before any key. */
|
|
131
|
+
function isPlanReviewRefusal(reason) {
|
|
132
|
+
return reason.startsWith('plan_review_');
|
|
133
|
+
}
|
|
134
|
+
/** ` --instance <id>` as the caller spelled it, or nothing. */
|
|
135
|
+
function instanceFlag(instance) {
|
|
136
|
+
return instance ? ` --instance ${instance}` : '';
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* `textFollowUp` from a `/prompt-response` success (Issue #3093), read
|
|
140
|
+
* defensively: an older server omits it, and the route's mirror type is not
|
|
141
|
+
* this command's to widen.
|
|
142
|
+
*/
|
|
143
|
+
function readTextFollowUp(result) {
|
|
144
|
+
const value = result?.textFollowUp;
|
|
145
|
+
if (typeof value !== 'object' || value === null)
|
|
146
|
+
return null;
|
|
147
|
+
const { optionNumber, optionLabel } = value;
|
|
148
|
+
if (typeof optionNumber !== 'number' || typeof optionLabel !== 'string')
|
|
149
|
+
return null;
|
|
150
|
+
return { optionNumber, optionLabel };
|
|
151
|
+
}
|
|
152
|
+
/** Argument checks; returns whether --default was chosen. A mocked `process.exit` returns, so nothing here stops early. */
|
|
153
|
+
function validateRespondArgs(worktreeId, answer, options) {
|
|
154
|
+
// [SEC4-04] Validate worktree ID
|
|
155
|
+
if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
|
|
156
|
+
console.error('Error: Invalid worktree ID format.');
|
|
157
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
158
|
+
}
|
|
159
|
+
// Validate agent if provided
|
|
160
|
+
if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
|
|
161
|
+
console.error('Error: Invalid agent.');
|
|
162
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
163
|
+
}
|
|
164
|
+
// Issue #868 / #2376: an instance id or a roster alias.
|
|
165
|
+
if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
|
|
166
|
+
console.error(instances_1.INSTANCE_SELECTOR_ERROR);
|
|
167
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
168
|
+
}
|
|
169
|
+
// Issue #1681: exactly one of <answer> / --default
|
|
170
|
+
const useDefault = options.default === true;
|
|
171
|
+
// Issue #3125: Command Code's plan review. `approve` / `cancel` take no text,
|
|
172
|
+
// `comment` needs it, and `submit` takes an optional comment to send first.
|
|
173
|
+
const planReview = options.planReview;
|
|
174
|
+
if (planReview !== undefined) {
|
|
175
|
+
if (!PLAN_REVIEW_ACTIONS.includes(planReview)) {
|
|
176
|
+
console.error(`Error: --plan-review must be one of: ${PLAN_REVIEW_ACTIONS.join(', ')}.`);
|
|
177
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
178
|
+
}
|
|
179
|
+
if (useDefault) {
|
|
180
|
+
console.error('Error: --plan-review and --default are mutually exclusive.');
|
|
181
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
182
|
+
}
|
|
183
|
+
if ((planReview === 'approve' || planReview === 'cancel') && answer !== undefined) {
|
|
184
|
+
console.error(`Error: --plan-review ${planReview} takes no <answer>.`);
|
|
185
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
186
|
+
}
|
|
187
|
+
if (planReview === 'comment' && (answer === undefined || !answer.trim())) {
|
|
188
|
+
console.error('Error: --plan-review comment needs the comment text as <answer>.');
|
|
189
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
if (useDefault && answer !== undefined) {
|
|
194
|
+
console.error('Error: <answer> and --default are mutually exclusive.');
|
|
195
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
196
|
+
}
|
|
197
|
+
if (!useDefault && (answer === undefined || !answer.trim())) {
|
|
198
|
+
console.error('Error: Answer cannot be empty. Provide an answer or --default.');
|
|
199
|
+
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
200
|
+
}
|
|
201
|
+
return useDefault;
|
|
202
|
+
}
|
|
203
|
+
/** The `/prompt-response` request body. */
|
|
204
|
+
function buildPromptResponseBody(useDefault, answer, agent, instanceId, planReview) {
|
|
205
|
+
// [DR2-06] Use prompt-response API with cliTool (not cliToolId)
|
|
206
|
+
const body = useDefault ? { useDefault: true } : { answer };
|
|
207
|
+
// Issue #3125: Command Code's plan review action.
|
|
208
|
+
if (planReview !== undefined) {
|
|
209
|
+
body.planReviewAction = planReview;
|
|
210
|
+
}
|
|
211
|
+
if (agent) {
|
|
212
|
+
body.cliTool = agent;
|
|
213
|
+
}
|
|
214
|
+
// Issue #868: target a specific agent instance
|
|
215
|
+
if (instanceId) {
|
|
216
|
+
body.instanceId = instanceId;
|
|
217
|
+
}
|
|
218
|
+
return body;
|
|
219
|
+
}
|
|
220
|
+
/** Reports a `success: false` result and sets the exit code. */
|
|
221
|
+
function reportFailedResponse(result, worktreeId, answer, useDefault, options) {
|
|
222
|
+
// [DR2-06] Check reason for failure
|
|
223
|
+
const reason = result.reason || 'unknown';
|
|
224
|
+
// Issue #1681 / #1726: these mean the server refused BEFORE sending,
|
|
225
|
+
// so the terminal is untouched — worth saying plainly, because the
|
|
226
|
+
// other reasons leave the answer's fate unknown. Issue #2486 adds
|
|
227
|
+
// `unsupported_dialog_layout`: a picker IS on screen but its layout
|
|
228
|
+
// could not be verified, and the server's message says what to do.
|
|
229
|
+
// Issue #3125 adds the `plan_review_*` refusals: the plan review overlay was
|
|
230
|
+
// read and the request did not fit its current focus, so nothing was typed.
|
|
231
|
+
const refusedBeforeSending = reason === 'unresolvable_answer' ||
|
|
232
|
+
reason === 'answer_out_of_range' ||
|
|
233
|
+
reason === 'unsupported_dialog_layout' ||
|
|
234
|
+
isPlanReviewRefusal(reason);
|
|
235
|
+
// Issue #1898: the verdict was addressed to the agent's own API and
|
|
236
|
+
// the POST did not land. Distinct from the two above — the answer was
|
|
237
|
+
// resolved and an attempt was made — and distinct from a keystroke,
|
|
238
|
+
// whose fate is never knowable.
|
|
239
|
+
if (reason === 'decision_not_delivered') {
|
|
240
|
+
console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
|
|
241
|
+
'The dialog is still open; answer it in the terminal.');
|
|
242
|
+
process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
|
|
243
|
+
}
|
|
244
|
+
if (refusedBeforeSending) {
|
|
245
|
+
console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
|
|
246
|
+
// Issue #2583: the operator who lands here typed WORDS at a dialog
|
|
247
|
+
// that only takes a choice — a claude / agy Bash approval refused as
|
|
248
|
+
// free text, or #2573's "No, tell … what to do differently" row. The
|
|
249
|
+
// server's sentence ends with "answer with the option number", and
|
|
250
|
+
// this is that command with the ids already filled in, so the next
|
|
251
|
+
// step is a paste rather than a trip to the docs while a dialog sits
|
|
252
|
+
// open. Printed only for the reason that means "this answer could not
|
|
253
|
+
// be mapped onto a choice", and only when the answer was not already
|
|
254
|
+
// a number (where the number itself is what was wrong).
|
|
255
|
+
if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
|
|
256
|
+
const target = options.instance ? ` --instance ${options.instance}` : '';
|
|
257
|
+
console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
|
|
258
|
+
`(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
|
|
263
|
+
// Issue #3093: the usual way here is the second half of a "No, tell
|
|
264
|
+
// … what to do differently" answer — the row closed the dialog and
|
|
265
|
+
// the agent is waiting for the reason in its input box, which
|
|
266
|
+
// `respond` (dialogs only) cannot reach and `send` can.
|
|
267
|
+
if (reason === PROMPT_NO_LONGER_ACTIVE && !useDefault && answer !== undefined && !/^\d+$/.test(answer.trim())) {
|
|
268
|
+
console.error('Hint: no dialog is open, so this text was not delivered. If you just chose an option that asks ' +
|
|
269
|
+
'for text (e.g. "No, tell … what to do differently"), the agent is waiting for it in its input box — ' +
|
|
270
|
+
`send it with \`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Issue #1726: an option number the agent's own payload does not offer
|
|
274
|
+
// is a bad argument, so it exits with the input-error code the rest of
|
|
275
|
+
// this command already uses for a malformed worktree id or agent.
|
|
276
|
+
process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* What was done on Command Code's plan review (Issue #3125), and the next step:
|
|
280
|
+
* a pinned comment is not delivered to the agent until the review is submitted.
|
|
281
|
+
*/
|
|
282
|
+
function printPlanReviewOutcome(result, worktreeId, options) {
|
|
283
|
+
const planReview = result.planReview;
|
|
284
|
+
if (!planReview)
|
|
285
|
+
return;
|
|
286
|
+
const target = instanceFlag(options.instance);
|
|
287
|
+
switch (planReview.action) {
|
|
288
|
+
case 'comment':
|
|
289
|
+
console.log(`Plan review: pinned comment "${planReview.comment ?? ''}".`);
|
|
290
|
+
console.error(`Next: send the review with \`commandmate respond ${worktreeId} --plan-review submit${target}\` ` +
|
|
291
|
+
`(ctrl+r), or approve with \`--plan-review approve\` (comments go along as notes).`);
|
|
292
|
+
break;
|
|
293
|
+
case 'submit':
|
|
294
|
+
console.log(planReview.comment
|
|
295
|
+
? `Plan review: pinned comment "${planReview.comment}" and submitted the review (ctrl+r).`
|
|
296
|
+
: 'Plan review: submitted the review (ctrl+r).');
|
|
297
|
+
break;
|
|
298
|
+
case 'approve':
|
|
299
|
+
if (planReview.phase === 'approve-choice') {
|
|
300
|
+
console.log(`Plan review: confirmed the approval (${planReview.approveChoice === 'discard-comments' ? 'discarding' : 'with'} the pending comments).`);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log('Plan review: approved the plan (ctrl+a).');
|
|
304
|
+
if (planReview.pendingCommentsBefore > 0) {
|
|
305
|
+
console.error('Note: with pending comments Command Code may ask how to approve — confirm with ' +
|
|
306
|
+
`\`commandmate respond ${worktreeId} --plan-review approve${target}\` again, or go back with \`--plan-review cancel\`.`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
break;
|
|
310
|
+
case 'cancel':
|
|
311
|
+
console.log(planReview.phase === 'approve-choice'
|
|
312
|
+
? 'Plan review: went back from the approval choice (esc).'
|
|
313
|
+
: 'Plan review: cancelled the plan (esc).');
|
|
314
|
+
if (planReview.phase !== 'approve-choice' && planReview.pendingCommentsBefore > 0) {
|
|
315
|
+
console.error(`Note: ${planReview.pendingCommentsBefore} pending comment(s) were discarded with it.`);
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/** Audit trail of which option was actually selected. */
|
|
321
|
+
function printResolvedAudit(result, answer) {
|
|
322
|
+
// Issue #1681: audit trail — print which option was actually selected.
|
|
323
|
+
const resolved = result?.resolved;
|
|
324
|
+
if (resolved) {
|
|
325
|
+
if (resolved.via === 'structured-decision') {
|
|
326
|
+
// Issue #1898: no key was sent. The verdict went to the agent's own
|
|
327
|
+
// API by decision id, which is the only way an opencode approval can
|
|
328
|
+
// be answered at all — worth saying, because "Response sent." on
|
|
329
|
+
// this path would read as "a 1 was typed into the pane".
|
|
330
|
+
console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
|
|
331
|
+
`option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
332
|
+
}
|
|
333
|
+
else if (resolved.via === 'structured-question') {
|
|
334
|
+
// Issue #2040: a question, answered over `POST /question/:id/reply`.
|
|
335
|
+
// What is printed is what reached the AGENT — the labels — rather
|
|
336
|
+
// than the number that was typed: `respond <id> 2` at a question is
|
|
337
|
+
// a position in the agent's own list, and an operator reconciling
|
|
338
|
+
// what they meant against what was sent needs the other end of that
|
|
339
|
+
// mapping. `freeText` prints the text for the same reason.
|
|
340
|
+
const chosen = resolved.optionLabels ?? [];
|
|
341
|
+
console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
|
|
342
|
+
(chosen.length > 0
|
|
343
|
+
? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
|
|
344
|
+
: `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
|
|
345
|
+
}
|
|
346
|
+
else if (resolved.via === 'semantic') {
|
|
347
|
+
console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
348
|
+
}
|
|
349
|
+
else if (resolved.optionNumber !== undefined) {
|
|
350
|
+
console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
console.log(`Selected default answer: ${resolved.optionLabel}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
123
357
|
function createRespondCommand() {
|
|
124
358
|
const cmd = new commander_1.Command('respond');
|
|
125
359
|
cmd
|
|
@@ -127,36 +361,14 @@ function createRespondCommand() {
|
|
|
127
361
|
.argument('<worktree-id>', 'Worktree ID')
|
|
128
362
|
.argument('[answer]', 'Response answer (yes, no, number, or free text)')
|
|
129
363
|
.option('--default', "Select the prompt's default option (mutually exclusive with <answer>)")
|
|
364
|
+
.option('--plan-review <action>', 'Command Code plan review: comment | submit | approve | cancel ' +
|
|
365
|
+
'(text alone is a comment; submit takes an optional comment; approve/cancel take no <answer>)')
|
|
130
366
|
.option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
|
|
131
367
|
.option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
|
|
132
368
|
.option('--token <token>', command_helpers_1.TOKEN_WARNING)
|
|
133
369
|
.action(async (worktreeId, answer, options) => {
|
|
134
370
|
try {
|
|
135
|
-
|
|
136
|
-
if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
|
|
137
|
-
console.error('Error: Invalid worktree ID format.');
|
|
138
|
-
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
139
|
-
}
|
|
140
|
-
// Validate agent if provided
|
|
141
|
-
if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
|
|
142
|
-
console.error('Error: Invalid agent.');
|
|
143
|
-
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
144
|
-
}
|
|
145
|
-
// Issue #868 / #2376: an instance id or a roster alias.
|
|
146
|
-
if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
|
|
147
|
-
console.error(instances_1.INSTANCE_SELECTOR_ERROR);
|
|
148
|
-
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
149
|
-
}
|
|
150
|
-
// Issue #1681: exactly one of <answer> / --default
|
|
151
|
-
const useDefault = options.default === true;
|
|
152
|
-
if (useDefault && answer !== undefined) {
|
|
153
|
-
console.error('Error: <answer> and --default are mutually exclusive.');
|
|
154
|
-
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
155
|
-
}
|
|
156
|
-
if (!useDefault && (answer === undefined || !answer.trim())) {
|
|
157
|
-
console.error('Error: Answer cannot be empty. Provide an answer or --default.');
|
|
158
|
-
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
159
|
-
}
|
|
371
|
+
const useDefault = validateRespondArgs(worktreeId, answer, options);
|
|
160
372
|
const client = new api_client_1.ApiClient({ token: options.token });
|
|
161
373
|
// Issue #1629: /prompt-response derives the session name from cliTool
|
|
162
374
|
// and falls back to the worktree default, so `--instance codex` alone
|
|
@@ -168,15 +380,7 @@ function createRespondCommand() {
|
|
|
168
380
|
const agent = target ? target.cliToolId : options.agent;
|
|
169
381
|
// Issue #2376: the resolved id. /prompt-response reads instance ids.
|
|
170
382
|
const instanceId = target?.instanceId;
|
|
171
|
-
|
|
172
|
-
const body = useDefault ? { useDefault: true } : { answer };
|
|
173
|
-
if (agent) {
|
|
174
|
-
body.cliTool = agent;
|
|
175
|
-
}
|
|
176
|
-
// Issue #868: target a specific agent instance
|
|
177
|
-
if (instanceId) {
|
|
178
|
-
body.instanceId = instanceId;
|
|
179
|
-
}
|
|
383
|
+
const body = buildPromptResponseBody(useDefault, answer, agent, instanceId, options.planReview);
|
|
180
384
|
// Issue #2040: for an agent that publishes per-decision ids (opencode
|
|
181
385
|
// today, and only opencode), a bare `respond <worktree> 3` names the ONE
|
|
182
386
|
// decision that agent is holding, and the number is resolved against
|
|
@@ -189,7 +393,11 @@ function createRespondCommand() {
|
|
|
189
393
|
// the structured path refuses it (`answerStructuredDecision` says so in
|
|
190
394
|
// as many words) — while Enter at a `keys` dialog is a real answer that
|
|
191
395
|
// this command has always been able to give.
|
|
192
|
-
|
|
396
|
+
//
|
|
397
|
+
// Issue #3125: a plan review action names no decision, so it skips this.
|
|
398
|
+
const structured = !useDefault &&
|
|
399
|
+
options.planReview === undefined &&
|
|
400
|
+
(await addressesDecisionsById(client, worktreeId, agent, instanceId));
|
|
193
401
|
let result = null;
|
|
194
402
|
if (structured) {
|
|
195
403
|
const outcome = await answerSolePendingDecision(client, worktreeId, body);
|
|
@@ -205,85 +413,20 @@ function createRespondCommand() {
|
|
|
205
413
|
result = await client.post(`/api/worktrees/${worktreeId}/prompt-response`, body);
|
|
206
414
|
}
|
|
207
415
|
if (result && !result.success) {
|
|
208
|
-
|
|
209
|
-
const reason = result.reason || 'unknown';
|
|
210
|
-
// Issue #1681 / #1726: these mean the server refused BEFORE sending,
|
|
211
|
-
// so the terminal is untouched — worth saying plainly, because the
|
|
212
|
-
// other reasons leave the answer's fate unknown. Issue #2486 adds
|
|
213
|
-
// `unsupported_dialog_layout`: a picker IS on screen but its layout
|
|
214
|
-
// could not be verified, and the server's message says what to do.
|
|
215
|
-
const refusedBeforeSending = reason === 'unresolvable_answer' ||
|
|
216
|
-
reason === 'answer_out_of_range' ||
|
|
217
|
-
reason === 'unsupported_dialog_layout';
|
|
218
|
-
// Issue #1898: the verdict was addressed to the agent's own API and
|
|
219
|
-
// the POST did not land. Distinct from the two above — the answer was
|
|
220
|
-
// resolved and an attempt was made — and distinct from a keystroke,
|
|
221
|
-
// whose fate is never knowable.
|
|
222
|
-
if (reason === 'decision_not_delivered') {
|
|
223
|
-
console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
|
|
224
|
-
'The dialog is still open; answer it in the terminal.');
|
|
225
|
-
process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
|
|
226
|
-
}
|
|
227
|
-
if (refusedBeforeSending) {
|
|
228
|
-
console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
|
|
229
|
-
// Issue #2583: the operator who lands here typed WORDS at a dialog
|
|
230
|
-
// that only takes a choice — a claude / agy Bash approval refused as
|
|
231
|
-
// free text, or #2573's "No, tell … what to do differently" row. The
|
|
232
|
-
// server's sentence ends with "answer with the option number", and
|
|
233
|
-
// this is that command with the ids already filled in, so the next
|
|
234
|
-
// step is a paste rather than a trip to the docs while a dialog sits
|
|
235
|
-
// open. Printed only for the reason that means "this answer could not
|
|
236
|
-
// be mapped onto a choice", and only when the answer was not already
|
|
237
|
-
// a number (where the number itself is what was wrong).
|
|
238
|
-
if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
|
|
239
|
-
const target = options.instance ? ` --instance ${options.instance}` : '';
|
|
240
|
-
console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
|
|
241
|
-
`(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
|
|
246
|
-
}
|
|
247
|
-
// Issue #1726: an option number the agent's own payload does not offer
|
|
248
|
-
// is a bad argument, so it exits with the input-error code the rest of
|
|
249
|
-
// this command already uses for a malformed worktree id or agent.
|
|
250
|
-
process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
|
|
251
|
-
}
|
|
252
|
-
// Issue #1681: audit trail — print which option was actually selected.
|
|
253
|
-
const resolved = result?.resolved;
|
|
254
|
-
if (resolved) {
|
|
255
|
-
if (resolved.via === 'structured-decision') {
|
|
256
|
-
// Issue #1898: no key was sent. The verdict went to the agent's own
|
|
257
|
-
// API by decision id, which is the only way an opencode approval can
|
|
258
|
-
// be answered at all — worth saying, because "Response sent." on
|
|
259
|
-
// this path would read as "a 1 was typed into the pane".
|
|
260
|
-
console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
|
|
261
|
-
`option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
262
|
-
}
|
|
263
|
-
else if (resolved.via === 'structured-question') {
|
|
264
|
-
// Issue #2040: a question, answered over `POST /question/:id/reply`.
|
|
265
|
-
// What is printed is what reached the AGENT — the labels — rather
|
|
266
|
-
// than the number that was typed: `respond <id> 2` at a question is
|
|
267
|
-
// a position in the agent's own list, and an operator reconciling
|
|
268
|
-
// what they meant against what was sent needs the other end of that
|
|
269
|
-
// mapping. `freeText` prints the text for the same reason.
|
|
270
|
-
const chosen = resolved.optionLabels ?? [];
|
|
271
|
-
console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
|
|
272
|
-
(chosen.length > 0
|
|
273
|
-
? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
|
|
274
|
-
: `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
|
|
275
|
-
}
|
|
276
|
-
else if (resolved.via === 'semantic') {
|
|
277
|
-
console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
278
|
-
}
|
|
279
|
-
else if (resolved.optionNumber !== undefined) {
|
|
280
|
-
console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
console.log(`Selected default answer: ${resolved.optionLabel}`);
|
|
284
|
-
}
|
|
416
|
+
reportFailedResponse(result, worktreeId, answer, useDefault, options);
|
|
285
417
|
}
|
|
418
|
+
printResolvedAudit(result, answer);
|
|
419
|
+
if (result && 'planReview' in result)
|
|
420
|
+
printPlanReviewOutcome(result, worktreeId, options);
|
|
286
421
|
console.error('Response sent.');
|
|
422
|
+
// Issue #3093: the option just chosen continues as typed text, which the
|
|
423
|
+
// dialog no longer takes — name the command that does deliver it.
|
|
424
|
+
const followUp = readTextFollowUp(result);
|
|
425
|
+
if (followUp) {
|
|
426
|
+
console.error(`Next: option ${followUp.optionNumber} ("${followUp.optionLabel}") asks for your text, and the dialog ` +
|
|
427
|
+
'is closed now, so `respond` cannot deliver it — send it with ' +
|
|
428
|
+
`\`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
|
|
429
|
+
}
|
|
287
430
|
}
|
|
288
431
|
catch (error) {
|
|
289
432
|
(0, command_helpers_1.handleCommandError)(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AA8ClE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GrE"}
|
|
@@ -14,7 +14,39 @@ const daemon_1 = require("../utils/daemon");
|
|
|
14
14
|
const security_logger_1 = require("../utils/security-logger");
|
|
15
15
|
const env_setup_1 = require("../utils/env-setup");
|
|
16
16
|
const input_validators_1 = require("../utils/input-validators");
|
|
17
|
+
const server_ready_1 = require("../utils/server-ready");
|
|
18
|
+
const server_url_1 = require("../utils/server-url");
|
|
19
|
+
const process_inspect_1 = require("../utils/process-inspect");
|
|
17
20
|
const logger = new logger_1.CLILogger();
|
|
21
|
+
/**
|
|
22
|
+
* Issue #3087: with nothing recorded to stop, make sure nothing answers on the configured port
|
|
23
|
+
* either. A server whose PID file is gone (an orphan from an earlier start, or a file removed by
|
|
24
|
+
* a failed run) still serves there, and "Status: Stopped" would be false. Such a process cannot
|
|
25
|
+
* be proven to be ours, so it is reported, never killed.
|
|
26
|
+
*
|
|
27
|
+
* Only the main server's .env port is known here; a worktree server's port is not re-derived.
|
|
28
|
+
*
|
|
29
|
+
* @returns true when the configured port is free
|
|
30
|
+
*/
|
|
31
|
+
async function ensureConfiguredPortFree(daemonManager, serverLabel) {
|
|
32
|
+
const endpoint = (0, server_url_1.resolveServerEndpoint)(daemonManager.getEffectiveEnv());
|
|
33
|
+
const host = endpoint.bind === '0.0.0.0' ? '127.0.0.1' : endpoint.bind;
|
|
34
|
+
if (!(await (0, server_ready_1.isPortInUse)(host, endpoint.port))) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
const listeners = (0, process_inspect_1.describeListeners)(endpoint.port);
|
|
38
|
+
logger.error(`${serverLabel} has no running process on record, but something is answering on ${host}:${endpoint.port}` +
|
|
39
|
+
`${listeners ? `: ${listeners}` : ''}.`);
|
|
40
|
+
logger.info('It was not started through this PID file, so it was not stopped. ' +
|
|
41
|
+
'If it is an earlier CommandMate server, stop it yourself (e.g. kill <PID>).');
|
|
42
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
command: 'stop',
|
|
45
|
+
action: 'failure',
|
|
46
|
+
details: `Unrecorded listener on port ${endpoint.port}${listeners ? ` (${listeners})` : ''}`,
|
|
47
|
+
});
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
18
50
|
/**
|
|
19
51
|
* Execute stop command
|
|
20
52
|
* Issue #125: Use getPidFilePath for correct path resolution
|
|
@@ -44,10 +76,30 @@ async function stopCommand(options) {
|
|
|
44
76
|
const status = await daemonManager.getStatus();
|
|
45
77
|
if (status === null) {
|
|
46
78
|
logger.info(`${serverLabel} is not running (no PID file found)`);
|
|
47
|
-
logger.info('Status: Stopped');
|
|
48
79
|
}
|
|
49
80
|
else {
|
|
50
81
|
logger.info(`${serverLabel} is not running (stale PID file)`);
|
|
82
|
+
// Issue #3087: the recorded npm process can be gone while the server it launched still
|
|
83
|
+
// listens as an orphan. stop() finds that process group and stops it, and only reports
|
|
84
|
+
// failure when something is left behind.
|
|
85
|
+
if (!(await daemonManager.stop(options.force))) {
|
|
86
|
+
logger.error(`Failed to stop ${serverLabel}: its processes or port are still in use`);
|
|
87
|
+
(0, security_logger_1.logSecurityEvent)({
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
command: 'stop',
|
|
90
|
+
action: 'failure',
|
|
91
|
+
details: `Failed to stop orphaned server of PID ${status.pid ?? 'unknown'}${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
|
|
92
|
+
});
|
|
93
|
+
process.exit(types_1.ExitCode.STOP_FAILED);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (options.issue === undefined && !(await ensureConfiguredPortFree(daemonManager, serverLabel))) {
|
|
98
|
+
process.exit(types_1.ExitCode.STOP_FAILED);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (status === null) {
|
|
102
|
+
logger.info('Status: Stopped');
|
|
51
103
|
}
|
|
52
104
|
process.exit(types_1.ExitCode.SUCCESS);
|
|
53
105
|
return;
|
|
@@ -39,9 +39,9 @@ function createSyncCommand() {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
catch (error) {
|
|
42
|
-
// The route's only 400 is "No repositories
|
|
43
|
-
// wording names the fix (
|
|
44
|
-
// through instead of the generic "Bad request" mapping.
|
|
42
|
+
// The route's only 400 is "No repositories are registered yet..." — the
|
|
43
|
+
// server's wording names the fix (Web UI Add Repository / WORKTREE_REPOS),
|
|
44
|
+
// so pass it through instead of the generic "Bad request" mapping.
|
|
45
45
|
if (error instanceof api_client_1.ApiError && error.statusCode === 400 && error.payload?.error) {
|
|
46
46
|
console.error(`Error: ${error.payload.error}`);
|
|
47
47
|
process.exit(types_1.ExitCode.CONFIG_ERROR);
|
|
@@ -124,6 +124,11 @@ export interface PollWorktreeOptions extends WaitOptions {
|
|
|
124
124
|
export declare function pollWorktree(client: ApiClient, worktreeId: string, options: PollWorktreeOptions): Promise<{
|
|
125
125
|
exitCode: number;
|
|
126
126
|
output?: WaitPromptOutput;
|
|
127
|
+
/** Set with exit 11: which upstream fault was on the frame (Issue #3011). */
|
|
128
|
+
upstreamFault?: {
|
|
129
|
+
id: string;
|
|
130
|
+
matchedText: string;
|
|
131
|
+
};
|
|
127
132
|
}>;
|
|
128
133
|
export declare function createWaitCommand(): Command;
|
|
129
134
|
//# sourceMappingURL=wait.d.ts.map
|