commandmate 0.43.0 → 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 +209 -209
- package/.next/app-path-routes-manifest.json +36 -36
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- 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.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.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 +2 -2
- 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.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.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.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.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.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.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.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.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.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.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.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.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.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 -1
- 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.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.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.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 -1
- 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 +2 -2
- 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.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 +3 -3
- 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 +36 -36
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.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 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- package/.next/server/chunks/7506.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 +1 -1
- 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/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +2 -2
- 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/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-340774f1a24f2b45.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- 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-057c850cd0df978e.js → layout-0fc249fb7de75a27.js} +1 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +58 -620
- 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/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/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/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/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/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +28 -6
- package/dist/server/locales/ja/worktree.json +28 -6
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +27 -2
- package/dist/server/src/lib/detection/cli-patterns.js +94 -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/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +131 -15
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- 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 +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- 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/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"systemMessage": "System Message",
|
|
66
66
|
"systemMessageLabel": "System message",
|
|
67
67
|
"openFile": "Open file: {path}",
|
|
68
|
+
"imageLoading": "Loading image…",
|
|
69
|
+
"imageUnavailable": "Image unavailable",
|
|
70
|
+
"openImage": "Open image: {path}",
|
|
71
|
+
"videoLabel": "Video: {path}",
|
|
68
72
|
"conversationLabel": "Conversation: {preview}",
|
|
69
73
|
"filePathMissing": "That path is not in this worktree"
|
|
70
74
|
},
|
|
@@ -491,7 +495,10 @@
|
|
|
491
495
|
"buttonAriaLabel": "Update CommandMate to v{version}",
|
|
492
496
|
"buttonReleaseAriaLabel": "Open the v{version} release page",
|
|
493
497
|
"buttonUpdating": "Updating…",
|
|
494
|
-
"statusDialogTitle": "Update status"
|
|
498
|
+
"statusDialogTitle": "Update status",
|
|
499
|
+
"pendingLabel": "v{version} coming soon",
|
|
500
|
+
"pendingDescription": "v{version} is not on npm yet. You can update once it is published there.",
|
|
501
|
+
"notYetPublished": "The new version is not on npm yet. Please try again in a few minutes."
|
|
495
502
|
},
|
|
496
503
|
"terminal": {
|
|
497
504
|
"historyLabel": "History",
|
|
@@ -1097,11 +1104,26 @@
|
|
|
1097
1104
|
"close": "Close (Esc)",
|
|
1098
1105
|
"closeAria": "Close this screen (Esc)"
|
|
1099
1106
|
},
|
|
1100
|
-
"
|
|
1101
|
-
"
|
|
1102
|
-
"
|
|
1103
|
-
"
|
|
1104
|
-
"
|
|
1107
|
+
"planReview": {
|
|
1108
|
+
"groupLabel": "Plan review",
|
|
1109
|
+
"commentLabel": "Comment on the plan",
|
|
1110
|
+
"commentPlaceholder": "What should change? (Add comment → Submit review)",
|
|
1111
|
+
"comment": "Add comment",
|
|
1112
|
+
"submit": "Submit review (Ctrl+R)",
|
|
1113
|
+
"approve": "Approve (Ctrl+A)",
|
|
1114
|
+
"cancel": "Cancel (Esc)",
|
|
1115
|
+
"approveConfirmLabel": "Confirm plan approval",
|
|
1116
|
+
"approveConfirmText": "Approving runs the plan. Approve it?",
|
|
1117
|
+
"approveConfirmYes": "Approve and run",
|
|
1118
|
+
"approveConfirmNo": "Not now",
|
|
1119
|
+
"refusal": {
|
|
1120
|
+
"ambiguousAnswer": "Nothing was sent: a bare number or yes / no is not an answer here — the plan review has no numbered options. Approve or cancel, or rephrase it as a comment.",
|
|
1121
|
+
"busy": "Nothing was sent: the plan review's focus is not on the plan. Move it back into the plan in the terminal, then retry.",
|
|
1122
|
+
"nothingToSubmit": "There is no comment to submit. Add a comment first.",
|
|
1123
|
+
"invalidRequest": "That action does not fit this screen. Nothing was sent.",
|
|
1124
|
+
"notActive": "Nothing was sent: no plan review is on screen.",
|
|
1125
|
+
"generic": "Could not send."
|
|
1126
|
+
}
|
|
1105
1127
|
},
|
|
1106
1128
|
"selectionKeys": {
|
|
1107
1129
|
"numbersToolbarLabel": "Option number keys",
|
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"systemMessage": "システムメッセージ",
|
|
66
66
|
"systemMessageLabel": "システムメッセージ",
|
|
67
67
|
"openFile": "ファイルを開く: {path}",
|
|
68
|
+
"imageLoading": "画像を読み込み中…",
|
|
69
|
+
"imageUnavailable": "画像を表示できません",
|
|
70
|
+
"openImage": "画像を開く: {path}",
|
|
71
|
+
"videoLabel": "動画: {path}",
|
|
68
72
|
"conversationLabel": "会話: {preview}",
|
|
69
73
|
"filePathMissing": "このパスは worktree にありません"
|
|
70
74
|
},
|
|
@@ -491,7 +495,10 @@
|
|
|
491
495
|
"buttonAriaLabel": "CommandMate を v{version} にアップデート",
|
|
492
496
|
"buttonReleaseAriaLabel": "v{version} のリリースページを開く",
|
|
493
497
|
"buttonUpdating": "更新中…",
|
|
494
|
-
"statusDialogTitle": "アップデートの状態"
|
|
498
|
+
"statusDialogTitle": "アップデートの状態",
|
|
499
|
+
"pendingLabel": "v{version} 公開準備中",
|
|
500
|
+
"pendingDescription": "v{version} は npm への反映待ちです。反映されると更新できるようになります。",
|
|
501
|
+
"notYetPublished": "npm への反映待ちです。しばらくしてから再度お試しください。"
|
|
495
502
|
},
|
|
496
503
|
"terminal": {
|
|
497
504
|
"historyLabel": "履歴",
|
|
@@ -1097,11 +1104,26 @@
|
|
|
1097
1104
|
"close": "閉じる (Esc)",
|
|
1098
1105
|
"closeAria": "この画面を閉じる (Esc)"
|
|
1099
1106
|
},
|
|
1100
|
-
"
|
|
1101
|
-
"
|
|
1102
|
-
"
|
|
1103
|
-
"
|
|
1104
|
-
"
|
|
1107
|
+
"planReview": {
|
|
1108
|
+
"groupLabel": "プランのレビュー",
|
|
1109
|
+
"commentLabel": "プランへのコメント",
|
|
1110
|
+
"commentPlaceholder": "直してほしい点を書く(コメントを追加 → レビューを送信)",
|
|
1111
|
+
"comment": "コメントを追加",
|
|
1112
|
+
"submit": "レビューを送信 (Ctrl+R)",
|
|
1113
|
+
"approve": "承認 (Ctrl+A)",
|
|
1114
|
+
"cancel": "取り消し (Esc)",
|
|
1115
|
+
"approveConfirmLabel": "プランの承認の確認",
|
|
1116
|
+
"approveConfirmText": "承認するとプランが実行されます。承認しますか?",
|
|
1117
|
+
"approveConfirmYes": "承認して実行",
|
|
1118
|
+
"approveConfirmNo": "やめる",
|
|
1119
|
+
"refusal": {
|
|
1120
|
+
"ambiguousAnswer": "番号や yes / no だけの入力は送っていません。計画には番号付きの選択肢がありません。承認か取り消しを使うか、コメントとして書き直してください。",
|
|
1121
|
+
"busy": "レビュー画面のフォーカスが本文以外にあるため、何も送っていません。ターミナルで本文にフォーカスを戻してから、もう一度送ってください。",
|
|
1122
|
+
"nothingToSubmit": "送るコメントがありません。先にコメントを追加してください。",
|
|
1123
|
+
"invalidRequest": "この画面では送れない操作です。何も送っていません。",
|
|
1124
|
+
"notActive": "計画のレビュー画面が表示されていないため、何も送っていません。",
|
|
1125
|
+
"generic": "送信できませんでした。"
|
|
1126
|
+
}
|
|
1105
1127
|
},
|
|
1106
1128
|
"selectionKeys": {
|
|
1107
1129
|
"numbersToolbarLabel": "選択肢の番号キー",
|
|
@@ -228,6 +228,7 @@ function validateImageContent(extension, buffer) {
|
|
|
228
228
|
return {
|
|
229
229
|
valid: false,
|
|
230
230
|
error: `File size exceeds ${exports.IMAGE_MAX_SIZE_BYTES / 1024 / 1024}MB limit`,
|
|
231
|
+
reason: 'too-large',
|
|
231
232
|
};
|
|
232
233
|
}
|
|
233
234
|
const normalizedExt = normalizeExtension(extension);
|
|
@@ -64,6 +64,7 @@ const response_checker_1 = require("./polling/response-checker");
|
|
|
64
64
|
const antigravity_permission_receipts_1 = require("./polling/antigravity-permission-receipts");
|
|
65
65
|
const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
|
|
66
66
|
const auto_yes_policy_1 = require("./polling/auto-yes-policy");
|
|
67
|
+
const detect_1 = require("./detection/tools/codex/detect");
|
|
67
68
|
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
68
69
|
const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
|
|
69
70
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
@@ -490,6 +491,27 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
490
491
|
});
|
|
491
492
|
return 'no_answer';
|
|
492
493
|
}
|
|
494
|
+
// 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
|
|
495
|
+
// answer. A digit there is an immediate decision, so the base rules'
|
|
496
|
+
// default would choose the model and effort for the operator. Judged by the
|
|
497
|
+
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
498
|
+
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
499
|
+
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
500
|
+
// recognised the frame and deliberately declined it.
|
|
501
|
+
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(cleanOutput)) {
|
|
502
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
503
|
+
reason: 'unclassified-frame',
|
|
504
|
+
mode: null,
|
|
505
|
+
promptType: promptDetection.promptData.type,
|
|
506
|
+
});
|
|
507
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
|
|
508
|
+
worktreeId,
|
|
509
|
+
cliToolId,
|
|
510
|
+
instanceId,
|
|
511
|
+
promptType: promptDetection.promptData.type,
|
|
512
|
+
});
|
|
513
|
+
return 'no_answer';
|
|
514
|
+
}
|
|
493
515
|
// 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
|
|
494
516
|
// not enough to send an answer. The detection above judges the ROWS, and the
|
|
495
517
|
// rows of an agent's own reply can be indistinguishable from a dialog's --
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Answering Command Code's plan review overlay from the CLI / API (Issue #3125).
|
|
4
|
+
*
|
|
5
|
+
* The overlay (`REVIEW` — `Approve ctrl+a` / `Cancel esc` / `type + enter to
|
|
6
|
+
* comment`) is not a dialog with options and not the composer, so neither
|
|
7
|
+
* `respond` (options) nor `send` (composer) could reach it. This module is the
|
|
8
|
+
* one place its keys are decided:
|
|
9
|
+
*
|
|
10
|
+
* | action | keys | allowed on phase |
|
|
11
|
+
* |-----------|----------------------------------------|-------------------------------|
|
|
12
|
+
* | `comment` | `Enter`, the text (`-l`), `Enter` | `body` |
|
|
13
|
+
* | `submit` | [the comment keys], `C-r` | `body` (needs ≥1 comment) |
|
|
14
|
+
* | `approve` | `C-a` — or `Enter` on the radio | `body`, `approve-choice` |
|
|
15
|
+
* | `cancel` | `Escape` | `body`, `approve-choice` |
|
|
16
|
+
*
|
|
17
|
+
* Why the comment opens the box with `Enter` first instead of just typing: `?`
|
|
18
|
+
* `x` `!` are one-key quick comments on this screen (measured on 1.58.0), so a
|
|
19
|
+
* comment that begins with one of them would pin a canned sentence instead.
|
|
20
|
+
* An empty `Enter` with the cursor in the plan body only opens the box
|
|
21
|
+
* (measured, #2763 §1 問い 4), and inside the box every key is text.
|
|
22
|
+
*
|
|
23
|
+
* Everything else is refused with nothing sent:
|
|
24
|
+
* - `action-focus`: `Enter` RUNS the focused action there (#2763 approved a
|
|
25
|
+
* plan that way), and what the shortcuts and letters do with the focus on
|
|
26
|
+
* the list was not measured;
|
|
27
|
+
* - `comment-box`: someone is typing a comment in the pane, and `Escape` there
|
|
28
|
+
* discards it rather than cancelling the review;
|
|
29
|
+
* - `unknown`: a hint bar this module has not seen.
|
|
30
|
+
*
|
|
31
|
+
* Approval is only ever the explicit `approve` action. Nothing here is reached
|
|
32
|
+
* by Auto-Yes: the detector publishes this screen with `hasActivePrompt: false`.
|
|
33
|
+
*
|
|
34
|
+
* @module lib/cli-tools/command-code-plan-review
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
|
|
38
|
+
exports.isPlanReviewAction = isPlanReviewAction;
|
|
39
|
+
exports.planCommandCodePlanReviewKeys = planCommandCodePlanReviewKeys;
|
|
40
|
+
exports.sendCommandCodePlanReviewKeys = sendCommandCodePlanReviewKeys;
|
|
41
|
+
const tmux_1 = require("../tmux/tmux");
|
|
42
|
+
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
43
|
+
exports.PLAN_REVIEW_ACTIONS = ['comment', 'submit', 'approve', 'cancel'];
|
|
44
|
+
function isPlanReviewAction(value) {
|
|
45
|
+
return typeof value === 'string' && exports.PLAN_REVIEW_ACTIONS.includes(value);
|
|
46
|
+
}
|
|
47
|
+
/** Refusal reason codes. All of them mean "nothing was sent". */
|
|
48
|
+
exports.PLAN_REVIEW_REFUSAL = {
|
|
49
|
+
/** The overlay is up, but its focus is somewhere these keys are unsafe. */
|
|
50
|
+
BUSY: 'plan_review_busy',
|
|
51
|
+
/** `submit` with no comment given and none pending. */
|
|
52
|
+
NOTHING_TO_SUBMIT: 'plan_review_nothing_to_submit',
|
|
53
|
+
/** A bare number / yes / no, which would otherwise become a comment. */
|
|
54
|
+
AMBIGUOUS_ANSWER: 'plan_review_ambiguous_answer',
|
|
55
|
+
/** The request does not fit this screen (no text for a comment, `--default`). */
|
|
56
|
+
INVALID_REQUEST: 'plan_review_invalid_request',
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* A comment the caller did not label as one, that is really an answer meant
|
|
60
|
+
* for an options dialog. Typed as a comment it would land on the plan.
|
|
61
|
+
*/
|
|
62
|
+
const DIALOG_ANSWER_LIKE = /^(?:\d+(?:\s*,\s*\d+)*|y|yes|n|no)$/i;
|
|
63
|
+
/** One line: a newline inside the box would pin the comment half-typed. */
|
|
64
|
+
function normalizeComment(text) {
|
|
65
|
+
return text.replace(/\s*[\r\n]+\s*/g, ' ').trim();
|
|
66
|
+
}
|
|
67
|
+
const PHASE_REFUSALS = {
|
|
68
|
+
'action-focus': 'The plan review has its focus on the action list (`↑/↓ choose · enter to run`), where Enter runs the ' +
|
|
69
|
+
'focused action, so no key was sent. Move the focus back into the plan (↑) in the terminal, then retry.',
|
|
70
|
+
'comment-box': 'A comment is being typed in the plan review (`enter to pin · esc discard`), so no key was sent. ' +
|
|
71
|
+
'Pin or discard it in the terminal, then retry.',
|
|
72
|
+
unknown: 'The plan review is up, but its hint bar is not one this version knows, so no key was sent. ' +
|
|
73
|
+
'Answer it in the terminal.',
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Decide the keys for a request against the screen as it is now. Pure.
|
|
77
|
+
*
|
|
78
|
+
* @param state - `readCommandCodePlanReviewState` of the frame about to be answered
|
|
79
|
+
* @param request - what the caller asked for
|
|
80
|
+
*/
|
|
81
|
+
function planCommandCodePlanReviewKeys(state, request) {
|
|
82
|
+
const comment = request.text === undefined ? '' : normalizeComment(request.text);
|
|
83
|
+
const action = request.action ?? 'comment';
|
|
84
|
+
if (request.useDefault) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
88
|
+
message: 'The plan review has no default option. Comment with text, or choose ' +
|
|
89
|
+
'--plan-review submit | approve | cancel.',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if ((action === 'approve' || action === 'cancel') && comment) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
96
|
+
message: `--plan-review ${action} takes no text. Comment first, then ${action}.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (action === 'comment' && !comment) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
reason: exports.PLAN_REVIEW_REFUSAL.INVALID_REQUEST,
|
|
103
|
+
message: 'A plan review comment needs text.',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (request.action === undefined && DIALOG_ANSWER_LIKE.test(comment)) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
reason: exports.PLAN_REVIEW_REFUSAL.AMBIGUOUS_ANSWER,
|
|
110
|
+
message: `The plan review has no numbered options, and "${comment}" would be pinned to the plan as a ` +
|
|
111
|
+
'comment, so no key was sent. Approve or cancel with --plan-review approve | cancel; to really ' +
|
|
112
|
+
'comment this text, add --plan-review comment.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (state.phase === 'approve-choice') {
|
|
116
|
+
// The radio `ctrl+a` opens when comments are pending (1.58.0): `enter
|
|
117
|
+
// confirm · esc back`. Enter confirms whichever side is `(•)`.
|
|
118
|
+
if (action === 'approve')
|
|
119
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Enter' }], comment: null };
|
|
120
|
+
if (action === 'cancel')
|
|
121
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Escape' }], comment: null };
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
reason: exports.PLAN_REVIEW_REFUSAL.BUSY,
|
|
125
|
+
message: 'The plan review is asking how to approve (`←/→ choose · enter confirm · esc back`), so no key was ' +
|
|
126
|
+
'sent. Confirm with --plan-review approve, or go back with --plan-review cancel.',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
if (state.phase !== 'body') {
|
|
130
|
+
return { ok: false, reason: exports.PLAN_REVIEW_REFUSAL.BUSY, message: PHASE_REFUSALS[state.phase] };
|
|
131
|
+
}
|
|
132
|
+
const commentSteps = comment
|
|
133
|
+
? [{ kind: 'key', key: 'Enter' }, { kind: 'text', text: comment }, { kind: 'key', key: 'Enter' }]
|
|
134
|
+
: [];
|
|
135
|
+
switch (action) {
|
|
136
|
+
case 'comment':
|
|
137
|
+
return { ok: true, action, steps: commentSteps, comment };
|
|
138
|
+
case 'submit':
|
|
139
|
+
if (!comment && state.pendingComments === 0) {
|
|
140
|
+
return {
|
|
141
|
+
ok: false,
|
|
142
|
+
reason: exports.PLAN_REVIEW_REFUSAL.NOTHING_TO_SUBMIT,
|
|
143
|
+
message: 'The plan review has no pending comment to submit, so no key was sent. Give the comment text ' +
|
|
144
|
+
'with --plan-review submit, or approve / cancel the plan.',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return { ok: true, action, steps: [...commentSteps, { kind: 'key', key: 'C-r' }], comment: comment || null };
|
|
148
|
+
case 'approve':
|
|
149
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'C-a' }], comment: null };
|
|
150
|
+
case 'cancel':
|
|
151
|
+
return { ok: true, action, steps: [{ kind: 'key', key: 'Escape' }], comment: null };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Pause between steps, so the TUI handles each one as its own input event. */
|
|
155
|
+
exports.PLAN_REVIEW_STEP_DELAY_MS = 300;
|
|
156
|
+
/**
|
|
157
|
+
* Send the planned steps, one tmux invocation each.
|
|
158
|
+
*
|
|
159
|
+
* Key steps (including `C-r`) go through `sendSpecialKeys`; the comment text
|
|
160
|
+
* goes through `-l` so it is never resolved as a key name.
|
|
161
|
+
*/
|
|
162
|
+
async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
|
|
163
|
+
for (let i = 0; i < steps.length; i++) {
|
|
164
|
+
const step = steps[i];
|
|
165
|
+
if (step.kind === 'text') {
|
|
166
|
+
await (0, tmux_1.sendKeys)(sessionName, step.text, false, { literal: true });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, [step.key]);
|
|
170
|
+
}
|
|
171
|
+
if (i < steps.length - 1)
|
|
172
|
+
await sleep(exports.PLAN_REVIEW_STEP_DELAY_MS);
|
|
173
|
+
}
|
|
174
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
175
|
+
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* only the correlation.
|
|
37
37
|
*/
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.CommandCodeTool = exports.COMMAND_CODE_STARTING_WINDOW_MS = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
39
|
+
exports.CommandCodeTool = exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = exports.COMMAND_CODE_STARTING_WINDOW_MS = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
40
40
|
exports.buildCommandCodeLaunchCommand = buildCommandCodeLaunchCommand;
|
|
41
41
|
exports.isCommandCodeReady = isCommandCodeReady;
|
|
42
42
|
const base_1 = require("./base");
|
|
@@ -51,6 +51,7 @@ const tool_id_1 = require("../../lib/hooks/sources/command-code/tool-id");
|
|
|
51
51
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
52
52
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
53
53
|
const install_hints_1 = require("./install-hints");
|
|
54
|
+
const plan_review_state_1 = require("../detection/tools/command-code/plan-review-state");
|
|
54
55
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
55
56
|
const logger = (0, logger_1.createLogger)('cli-tools/command-code');
|
|
56
57
|
/** The executable CommandMate launches. See the module docblock for why not `cmd`. */
|
|
@@ -144,6 +145,16 @@ function isCommandCodeReady(rawOutput) {
|
|
|
144
145
|
return false;
|
|
145
146
|
return !cli_patterns_1.COMMAND_CODE_THINKING_PATTERN.test((0, cli_patterns_1.stripAnsi)(rawOutput));
|
|
146
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Why `send` stops at the plan review overlay (Issue #3125).
|
|
150
|
+
*
|
|
151
|
+
* The overlay replaces the composer until a human decides, so waiting for the
|
|
152
|
+
* composer only ran out the clock (`prompt not ready` after the full timeout).
|
|
153
|
+
* Its comments, Submit review, approval and cancel go through `respond`.
|
|
154
|
+
*/
|
|
155
|
+
exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = 'Command Code is showing a plan review (REVIEW), which takes review comments, not messages. ' +
|
|
156
|
+
'Comment with `commandmate respond <worktree-id> "<text>"`, then `--plan-review submit` (ctrl+r), ' +
|
|
157
|
+
'`--plan-review approve` (ctrl+a) or `--plan-review cancel` (esc).';
|
|
147
158
|
/**
|
|
148
159
|
* Command Code CLI tool implementation.
|
|
149
160
|
* Manages `commandcode` sessions using tmux.
|
|
@@ -301,15 +312,21 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
301
312
|
*
|
|
302
313
|
* @throws SessionStartTimeoutError when a just-launched session's composer
|
|
303
314
|
* has still not appeared
|
|
315
|
+
* @throws Error ({@link COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE}) at once when
|
|
316
|
+
* the plan review overlay is on screen (Issue #3125)
|
|
304
317
|
* @throws Error when the composer is not detected within the timeout
|
|
305
318
|
*/
|
|
306
319
|
async waitForPrompt(sessionName) {
|
|
307
320
|
const startTime = Date.now();
|
|
308
321
|
const pollInterval = 500;
|
|
322
|
+
let planReviewPolls = 0;
|
|
309
323
|
while (Date.now() - startTime < COMMAND_CODE_PROMPT_WAIT_TIMEOUT_MS) {
|
|
324
|
+
let planReviewUp = false;
|
|
310
325
|
try {
|
|
311
326
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, COMMAND_CODE_READINESS_CAPTURE_LINES);
|
|
312
|
-
|
|
327
|
+
// Read first: a focused action row (`❯ Approve ctrl+a`) is a `❯` row.
|
|
328
|
+
planReviewUp = (0, plan_review_state_1.readCommandCodePlanReviewState)(rawOutput) !== null;
|
|
329
|
+
if (!planReviewUp && isCommandCodeReady(rawOutput)) {
|
|
313
330
|
this.composerPendingSince.delete(sessionName);
|
|
314
331
|
return;
|
|
315
332
|
}
|
|
@@ -317,6 +334,14 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
317
334
|
catch {
|
|
318
335
|
// Capture may fail - continue polling
|
|
319
336
|
}
|
|
337
|
+
// Issue #3125: no composer comes back until a human answers the review.
|
|
338
|
+
// Two polls in a row, because the frame redrawn just after `Esc` can
|
|
339
|
+
// still carry the footer (`after-cancel-partial-redraw.txt`, #2763).
|
|
340
|
+
planReviewPolls = planReviewUp ? planReviewPolls + 1 : 0;
|
|
341
|
+
if (planReviewPolls >= 2) {
|
|
342
|
+
logger.info('command-code-plan-review-blocks-send', { sessionName });
|
|
343
|
+
throw new Error(exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE);
|
|
344
|
+
}
|
|
320
345
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
321
346
|
}
|
|
322
347
|
const launchedAt = this.composerPendingSince.get(sessionName);
|
|
@@ -8,6 +8,9 @@ exports.findOpencodeV2DialogTitle = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = e
|
|
|
8
8
|
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_V2_SKIP_PATTERNS = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
|
+
exports.resolveClaudeTrustDialogKeys = resolveClaudeTrustDialogKeys;
|
|
12
|
+
exports.isClaudeTrustDialogOpen = isClaudeTrustDialogOpen;
|
|
13
|
+
exports.isShellPaneCommand = isShellPaneCommand;
|
|
11
14
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
12
15
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
13
16
|
exports.getCodexLifecycleDialog = getCodexLifecycleDialog;
|
|
@@ -229,6 +232,86 @@ function findClaudeChromeStart(lines) {
|
|
|
229
232
|
* tmux padding or other output. (SF-001)
|
|
230
233
|
*/
|
|
231
234
|
exports.CLAUDE_TRUST_DIALOG_PATTERN = /Yes, I trust this folder/m;
|
|
235
|
+
/** The option row of the trust dialog's cursor: `❯` (or legacy `>`) after the dialog's left padding. */
|
|
236
|
+
const CLAUDE_TRUST_CURSOR_ROW_PATTERN = /^\s*[>❯]\s+\S/;
|
|
237
|
+
/** How far the cursor row may sit from the `Yes, I trust this folder` row (the dialog has two options). */
|
|
238
|
+
const CLAUDE_TRUST_MAX_CURSOR_DISTANCE = 3;
|
|
239
|
+
/**
|
|
240
|
+
* Keys that answer Claude Code's folder-trust dialog with "Yes", or null when
|
|
241
|
+
* no answerable dialog is on screen (Issue #3078).
|
|
242
|
+
*
|
|
243
|
+
* The dialog comes in two layouts, and Enter alone is only right for one:
|
|
244
|
+
*
|
|
245
|
+
* - default Yes (Issue #201 era, `tests/unit/lib/claude-session.test.ts`):
|
|
246
|
+
* ` ❯ 1. Yes, I trust this folder` / ` 2. No, exit` — Enter confirms Yes.
|
|
247
|
+
* - default No (2.1.259 `tests/fixtures/chat-dialog-card-2254/claude-trust-2-1-259.txt`,
|
|
248
|
+
* 2.1.287 with a permission allow-list
|
|
249
|
+
* `tests/fixtures/claude-trust-dialog-3078/allowlist-default-no-2-1-287.txt`):
|
|
250
|
+
* ` ❯ No, exit` / ` Yes, I trust this folder` — Enter EXITS Claude Code.
|
|
251
|
+
*
|
|
252
|
+
* So the answer is read off the screen: the distance from the cursor row to the
|
|
253
|
+
* Yes row becomes that many `Up`/`Down` presses, then `Enter`. Only the last
|
|
254
|
+
* dialog in the capture counts, and a dialog followed by Claude's input-box
|
|
255
|
+
* separator is history in the scrollback, not an open dialog.
|
|
256
|
+
*
|
|
257
|
+
* @param output - ANSI-stripped pane output
|
|
258
|
+
* @returns tmux key names ending in `Enter` (just `['Enter']` when the cursor is
|
|
259
|
+
* already on Yes), or null when no open dialog / no readable cursor row
|
|
260
|
+
*/
|
|
261
|
+
function resolveClaudeTrustDialogKeys(output) {
|
|
262
|
+
const lines = output.split('\n');
|
|
263
|
+
const yesIndex = findOpenClaudeTrustYesRow(lines);
|
|
264
|
+
if (yesIndex === -1)
|
|
265
|
+
return null;
|
|
266
|
+
for (let distance = 0; distance <= CLAUDE_TRUST_MAX_CURSOR_DISTANCE; distance++) {
|
|
267
|
+
for (const direction of distance === 0 ? [0] : [-1, 1]) {
|
|
268
|
+
const index = yesIndex + direction * distance;
|
|
269
|
+
if (index < 0 || index >= lines.length)
|
|
270
|
+
continue;
|
|
271
|
+
if (!CLAUDE_TRUST_CURSOR_ROW_PATTERN.test(lines[index]))
|
|
272
|
+
continue;
|
|
273
|
+
// Cursor above Yes → move Down; below → move Up.
|
|
274
|
+
const key = direction < 0 ? 'Down' : 'Up';
|
|
275
|
+
return [...Array(distance).fill(key), 'Enter'];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Whether Claude Code's folder-trust dialog is the open screen (Issue #3078).
|
|
282
|
+
*
|
|
283
|
+
* The dialog's cursor row (` ❯ No, exit`) has the prompt glyph, so the start
|
|
284
|
+
* wait asks this before CLAUDE_PROMPT_PATTERN rather than reading the dialog as
|
|
285
|
+
* a ready prompt.
|
|
286
|
+
*
|
|
287
|
+
* @param output - ANSI-stripped pane output
|
|
288
|
+
*/
|
|
289
|
+
function isClaudeTrustDialogOpen(output) {
|
|
290
|
+
return findOpenClaudeTrustYesRow(output.split('\n')) !== -1;
|
|
291
|
+
}
|
|
292
|
+
/** `#{pane_current_command}` values of an interactive shell, with tmux's `-` login prefix removed. */
|
|
293
|
+
const SHELL_PANE_COMMANDS = new Set(['sh', 'bash', 'zsh', 'fish', 'dash', 'ksh', 'tcsh', 'csh']);
|
|
294
|
+
/**
|
|
295
|
+
* Whether a pane's foreground command is a shell rather than an agent
|
|
296
|
+
* (Issue #3089). Claude Code shows up as `claude`, `node` or its version
|
|
297
|
+
* string (`2.1.287`), never as one of these, so a shell here after the agent
|
|
298
|
+
* was seen running means the agent has exited.
|
|
299
|
+
*
|
|
300
|
+
* @param command - `#{pane_current_command}` of the pane
|
|
301
|
+
*/
|
|
302
|
+
function isShellPaneCommand(command) {
|
|
303
|
+
return SHELL_PANE_COMMANDS.has(command.trim().replace(/^-/, ''));
|
|
304
|
+
}
|
|
305
|
+
/** Row of the last `Yes, I trust this folder`, or -1 when absent or already answered. */
|
|
306
|
+
function findOpenClaudeTrustYesRow(lines) {
|
|
307
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
308
|
+
if (!exports.CLAUDE_TRUST_DIALOG_PATTERN.test(lines[i]))
|
|
309
|
+
continue;
|
|
310
|
+
// Claude's input box (separator rows) drawn below it: the dialog is scrollback.
|
|
311
|
+
return lines.slice(i + 1).some((line) => exports.CLAUDE_SEPARATOR_PATTERN.test(line)) ? -1 : i;
|
|
312
|
+
}
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
232
315
|
/**
|
|
233
316
|
* Codex prompt pattern
|
|
234
317
|
* T1.2: Improved to detect empty prompts as well
|
|
@@ -1470,12 +1553,22 @@ exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = /Enter\s+to\s+set\s+as\s+default\b
|
|
|
1470
1553
|
* "Enter to set as default · s to use this session only · Esc to cancel"
|
|
1471
1554
|
* (/model command footer as of Claude Code v2.1.218 — Issue #1495)
|
|
1472
1555
|
*
|
|
1556
|
+
* "←/→ to adjust · Enter to confirm · s for this session only · Esc to cancel"
|
|
1557
|
+
* (/effort slider footer as of Claude Code v2.1.257 — Issue #3052; before
|
|
1558
|
+
* 2.1.257 it was "Enter to confirm · Esc to cancel")
|
|
1559
|
+
*
|
|
1560
|
+
* The /effort branch keys on "Enter to confirm · s for this session only" rather
|
|
1561
|
+
* than "←/→ to adjust": the `s` hint is unique to the pickers (the trust dialog's
|
|
1562
|
+
* "Enter to confirm · Esc to cancel" and approval dialogs never carry it), and
|
|
1563
|
+
* keeping the match under the `Enter to` prefix leaves the pattern a single
|
|
1564
|
+
* linear alternation. Linear, no nested quantifiers — ReDoS safe.
|
|
1565
|
+
*
|
|
1473
1566
|
* The "set as default" branch lets status-detector classify the `/model` overlay
|
|
1474
1567
|
* as a Claude selection list (NavigationButtons + ESC hatch, hasActivePrompt=false)
|
|
1475
1568
|
* once detectPrompt() no longer reports it as a prompt (see
|
|
1476
1569
|
* CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN).
|
|
1477
1570
|
*/
|
|
1478
|
-
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc|set\s+as\s+default)/;
|
|
1571
|
+
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+(?:Esc|s\s+for\s+this\s+session\s+only)|set\s+as\s+default)/;
|
|
1479
1572
|
/**
|
|
1480
1573
|
* OpenCode TUI separator pattern (Issue #379)
|
|
1481
1574
|
* Matches lines composed entirely of box-drawing / TUI decoration characters.
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.codexStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
18
18
|
exports.isCodexStalePrompt = isCodexStalePrompt;
|
|
19
|
+
exports.isCodexModelPickerFrame = isCodexModelPickerFrame;
|
|
19
20
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
20
21
|
const prompt_detector_1 = require("../../prompt-detector");
|
|
21
22
|
const status_reason_1 = require("../../status-reason");
|
|
22
23
|
const cli_patterns_2 = require("./cli-patterns");
|
|
23
24
|
const prompt_1 = require("./prompt");
|
|
24
25
|
const frame_1 = require("../frame");
|
|
26
|
+
const dialog_block_1 = require("../dialog-block");
|
|
25
27
|
const run_detection_1 = require("../run-detection");
|
|
26
28
|
const verified_against_1 = require("../verified-against");
|
|
27
29
|
const thinking_constants_1 = require("../../../../config/thinking-constants");
|
|
@@ -463,3 +465,27 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
463
465
|
return null;
|
|
464
466
|
},
|
|
465
467
|
});
|
|
468
|
+
/**
|
|
469
|
+
* Issue #3062: is this frame codex's `/model` picker (either stage)?
|
|
470
|
+
*
|
|
471
|
+
* Auto-Yes must not answer it: the digit is an immediate decision, so the
|
|
472
|
+
* poller would pick the model and the reasoning effort for the operator. It is
|
|
473
|
+
* judged by the picker's own footer row (`enter select · esc back`, `enter
|
|
474
|
+
* default · s session · esc back`) rather than by `detectDialog`'s `picker`
|
|
475
|
+
* kind, which also covers the hooks list/detail screens whose Auto-Yes
|
|
476
|
+
* behaviour is unchanged. The footer must sit under the option block of a frame
|
|
477
|
+
* `detectDialog` vouches for, so the same words quoted in a reply do not count.
|
|
478
|
+
* `/prompt-response` does not call this and keeps accepting an answer.
|
|
479
|
+
*
|
|
480
|
+
* @param cleanOutput - The capture Auto-Yes judged (ANSI and box drawing stripped)
|
|
481
|
+
*/
|
|
482
|
+
function isCodexModelPickerFrame(cleanOutput) {
|
|
483
|
+
const frame = (0, frame_1.normalizeFrame)(cleanOutput);
|
|
484
|
+
if (!exports.codexStatusDetector.detectDialog(frame))
|
|
485
|
+
return false;
|
|
486
|
+
const contentEnd = findCodexContentEnd(frame.contentLines);
|
|
487
|
+
const block = (0, dialog_block_1.findNumberedOptionBlock)((0, cli_patterns_1.stripBoxDrawing)(frame.clean).split('\n'), contentEnd);
|
|
488
|
+
return (block !== null &&
|
|
489
|
+
(cli_patterns_1.CODEX_PICKER_FOOTER_PATTERN.test(block.footer) ||
|
|
490
|
+
cli_patterns_1.CODEX_EFFORT_PICKER_FOOTER_PATTERN.test(block.footer)));
|
|
491
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which part of Command Code's plan review overlay has the keyboard
|
|
4
|
+
* (Issue #3125).
|
|
5
|
+
*
|
|
6
|
+
* The detector already says THAT the overlay is up
|
|
7
|
+
* (`command_code_plan_review`, see `detect.ts`). Answering it needs one more
|
|
8
|
+
* fact, because the same keys mean different things depending on where the
|
|
9
|
+
* focus is — measured on 1.58.0 (`tests/fixtures/command-code-plan-review-2763/`)
|
|
10
|
+
* and unchanged in the 1.74.0 rows #3059 observed
|
|
11
|
+
* (`tests/fixtures/command-code-plan-review-3125/`):
|
|
12
|
+
*
|
|
13
|
+
* | phase | hint bar (last content row) | `Enter` does |
|
|
14
|
+
* |------------------|----------------------------------------------|-------------------------|
|
|
15
|
+
* | `body` | `type + enter to comment · …` | opens / pins a comment |
|
|
16
|
+
* | `comment-box` | `enter to pin · esc discard` | pins what is typed |
|
|
17
|
+
* | `action-focus` | `↑/↓ choose · enter to run` (a `❯` on a row) | RUNS the focused action |
|
|
18
|
+
* | `approve-choice` | `←/→ choose · enter confirm · esc back` | confirms the approval |
|
|
19
|
+
*
|
|
20
|
+
* The body cursor itself is drawn by background colour alone and cannot be read
|
|
21
|
+
* off a plain capture; the hint bar and the `❯` can, which is all this needs.
|
|
22
|
+
*
|
|
23
|
+
* Browser-safe and pure, like `selection-shape.ts` it builds on.
|
|
24
|
+
*
|
|
25
|
+
* @module lib/detection/tools/command-code/plan-review-state
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.readCommandCodePlanReviewState = readCommandCodePlanReviewState;
|
|
29
|
+
const ansi_1 = require("../../ansi");
|
|
30
|
+
const selection_shape_1 = require("../../selection-shape");
|
|
31
|
+
/** Rows read from the end of the frame — the same 15 the detector reads. */
|
|
32
|
+
const TAIL_CONTENT_ROWS = 15;
|
|
33
|
+
const BODY_HINT = /^\s*type \+ enter to comment\b/i;
|
|
34
|
+
const COMMENT_BOX_HINT = /^\s*enter to pin\s*·\s*esc discard\s*$/i;
|
|
35
|
+
const ACTION_FOCUS_HINT = /^\s*↑\/↓ choose\s*·\s*enter to run\s*$/i;
|
|
36
|
+
const FOCUSED_ACTION_ROW = /^\s*❯ +(?:Submit review\b|Approve\s+ctrl\+a\b|Cancel\s+esc\b)/im;
|
|
37
|
+
const PENDING_BADGE = /^\s*REVIEW\s+(\d+)\s+pending comments?\b/im;
|
|
38
|
+
const APPROVE_WITH_COMMENTS_SELECTED = /\(•\)\s+with\s+\d+\s+comments?\s+as\s+notes/i;
|
|
39
|
+
/**
|
|
40
|
+
* Read the plan review overlay's focus off a capture.
|
|
41
|
+
*
|
|
42
|
+
* @param frame - a raw `capture-pane` frame, ANSI intact or stripped
|
|
43
|
+
* @returns null when the overlay is not at the bottom of this frame
|
|
44
|
+
*/
|
|
45
|
+
function readCommandCodePlanReviewState(frame) {
|
|
46
|
+
if (!frame)
|
|
47
|
+
return null;
|
|
48
|
+
const rows = (0, ansi_1.stripAnsi)(frame.replace(/\r\n/g, '\n'))
|
|
49
|
+
.split('\n')
|
|
50
|
+
.filter((row) => row.trim() !== '')
|
|
51
|
+
.slice(-TAIL_CONTENT_ROWS);
|
|
52
|
+
if (rows.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
const tail = rows.join('\n');
|
|
55
|
+
const pendingMatch = PENDING_BADGE.exec(tail);
|
|
56
|
+
const pendingComments = pendingMatch ? Number(pendingMatch[1]) : 0;
|
|
57
|
+
if ((0, selection_shape_1.isCommandCodePlanApproveChoice)(tail)) {
|
|
58
|
+
return {
|
|
59
|
+
phase: 'approve-choice',
|
|
60
|
+
pendingComments,
|
|
61
|
+
approveChoice: APPROVE_WITH_COMMENTS_SELECTED.test(tail) ? 'with-comments' : 'discard-comments',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (!(0, selection_shape_1.hasCommandCodePlanReviewFooterAtBottom)(tail))
|
|
65
|
+
return null;
|
|
66
|
+
const hint = rows[rows.length - 1];
|
|
67
|
+
let phase = 'unknown';
|
|
68
|
+
if (FOCUSED_ACTION_ROW.test(tail) || ACTION_FOCUS_HINT.test(hint))
|
|
69
|
+
phase = 'action-focus';
|
|
70
|
+
else if (COMMENT_BOX_HINT.test(hint))
|
|
71
|
+
phase = 'comment-box';
|
|
72
|
+
else if (BODY_HINT.test(hint))
|
|
73
|
+
phase = 'body';
|
|
74
|
+
return { phase, pendingComments, approveChoice: null };
|
|
75
|
+
}
|