commandmate 0.37.0 → 0.38.1
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 +33 -33
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -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 +1 -1
- 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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/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_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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +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_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_client-reference-manifest.js +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 +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]/env/route_client-reference-manifest.js +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 +4 -3
- 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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_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 +1 -6
- 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 +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 +2 -7
- 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_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.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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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/chat/page_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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -9
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +33 -33
- package/.next/server/chunks/1467.js +1 -1
- package/.next/server/chunks/1707.js +1 -1
- package/.next/server/chunks/1886.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3480.js +1 -18
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/4207.js +5 -0
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6677.js +2 -2
- package/.next/server/chunks/6793.js +13 -0
- package/.next/server/chunks/7075.js +1 -1
- package/.next/server/chunks/8052.js +74 -0
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/9080.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-c4b1d2aae7e3f59b.js → 2407-be448eda70bc19b6.js} +1 -1
- package/.next/static/chunks/4388-a778968d9c4e9327.js +1 -0
- package/.next/static/chunks/4949-fa93029d6e05db0d.js +1 -0
- package/.next/static/chunks/998-292ebcd30f329eb1.js +1 -0
- package/.next/static/chunks/app/sessions/page-fe42c8f6fd59b9e7.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-1eb4297af22afac8.js +1 -0
- package/.next/static/css/ed092b853e52b5eb.css +1 -0
- package/.next/trace +14 -14
- package/dist/cli/commands/ls.d.ts +64 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +238 -30
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +14 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +154 -15
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +37 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/server-url.d.ts +27 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +48 -6
- package/dist/lib/cli-tools/types.d.ts +22 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +8 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +8 -0
- package/dist/server/locales/en/worktree.json +23 -1
- package/dist/server/locales/ja/worktree.json +23 -1
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +327 -0
- package/dist/server/src/lib/cli-tools/base.js +22 -0
- package/dist/server/src/lib/cmate-parser.js +26 -6
- package/dist/server/src/lib/cmate-validator.js +354 -0
- package/dist/server/src/lib/detection/cli-patterns.js +40 -2
- package/dist/server/src/lib/detection/model-info-extractor.js +40 -3
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +44 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +9 -0
- package/dist/server/src/lib/detection/tools/command-code/detect.js +14 -3
- package/dist/server/src/lib/detection/tools/command-code/permission.js +104 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +8 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +20 -2
- package/dist/server/src/lib/prompt-answer-sender.js +339 -16
- package/dist/server/src/lib/session/claude-executor.js +190 -17
- package/dist/server/src/types/cli-tool-contracts.js +75 -1
- package/dist/types/cli-tool-contracts.d.ts +162 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +75 -1
- package/package.json +1 -1
- package/.next/server/chunks/6337.js +0 -1
- package/.next/server/chunks/663.js +0 -79
- package/.next/static/chunks/4388-410b1d8ed0d8d98b.js +0 -1
- package/.next/static/chunks/4949-5b97d1eb769482d2.js +0 -1
- package/.next/static/chunks/998-ac0ded6d5eeb4dc0.js +0 -1
- package/.next/static/chunks/app/sessions/page-b8651c3f17c36800.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f993ca88fe758599.js +0 -1
- package/.next/static/css/c511ecdf1e7f18a0.css +0 -1
- /package/.next/static/{0WNCXbrakAsDUEgDarN8N → DryXJ1-iHfWxfrHkkWVy8}/_buildManifest.js +0 -0
- /package/.next/static/{0WNCXbrakAsDUEgDarN8N → DryXJ1-iHfWxfrHkkWVy8}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CMATE.md Client-Side Validator
|
|
4
|
+
* Issue #294: Schedule execution feature
|
|
5
|
+
*
|
|
6
|
+
* Provides pure-function validation and template generation for CMATE.md files.
|
|
7
|
+
* Unlike cmate-parser.ts, this module has no fs dependency and can be used
|
|
8
|
+
* in client-side (browser) code.
|
|
9
|
+
*
|
|
10
|
+
* Validation rules mirror cmate-parser.ts but return errors instead of
|
|
11
|
+
* silently skipping invalid entries.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.CMATE_TEMPLATE_CONTENT = exports.COMMAND_CODE_DIRECT_WRITE_TOOLS_DENIED = exports.COMMAND_CODE_PRINT_GATED_TOOLS = void 0;
|
|
15
|
+
exports.parseCmateContent = parseCmateContent;
|
|
16
|
+
exports.validateScheduleHeaders = validateScheduleHeaders;
|
|
17
|
+
exports.validateSchedulesSection = validateSchedulesSection;
|
|
18
|
+
exports.isCommandCodeDirectWriteToolsDenied = isCommandCodeDirectWriteToolsDenied;
|
|
19
|
+
exports.collectScheduleWarnings = collectScheduleWarnings;
|
|
20
|
+
exports.isScheduleEnabled = isScheduleEnabled;
|
|
21
|
+
const cmate_constants_1 = require("../config/cmate-constants");
|
|
22
|
+
const schedule_config_1 = require("../config/schedule-config");
|
|
23
|
+
const cmate_cli_tool_parser_1 = require("../lib/cmate-cli-tool-parser");
|
|
24
|
+
const types_1 = require("../lib/cli-tools/types");
|
|
25
|
+
/**
|
|
26
|
+
* The tools `commandcode -p` rejects when the agent calls them directly and
|
|
27
|
+
* `--yolo` was not passed (Issue #2576; measured on the 1.53.1 bundle, where
|
|
28
|
+
* `resolvePrintHarnessMods` injects `print-permission-gate` unless
|
|
29
|
+
* `dangerouslySkipPermissions` is set).
|
|
30
|
+
*/
|
|
31
|
+
exports.COMMAND_CODE_PRINT_GATED_TOOLS = [
|
|
32
|
+
'edit_file',
|
|
33
|
+
'write_file',
|
|
34
|
+
'shell_command',
|
|
35
|
+
'monitor_command',
|
|
36
|
+
'kill_shell',
|
|
37
|
+
];
|
|
38
|
+
/** Reason code of the command-code print-gate warning (Issue #2576) */
|
|
39
|
+
exports.COMMAND_CODE_DIRECT_WRITE_TOOLS_DENIED = 'command-code-direct-write-tools-denied';
|
|
40
|
+
/** Required header columns for the Schedules table */
|
|
41
|
+
const REQUIRED_SCHEDULE_HEADERS = ['Name', 'Cron', 'Message', 'CLI Tool', 'Enabled'];
|
|
42
|
+
/** Optional header columns (validated only when present) */
|
|
43
|
+
const OPTIONAL_SCHEDULE_HEADERS = ['Permission'];
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Template
|
|
46
|
+
// =============================================================================
|
|
47
|
+
/** Default CMATE.md template content */
|
|
48
|
+
exports.CMATE_TEMPLATE_CONTENT = `## Schedules
|
|
49
|
+
|
|
50
|
+
| Name | Cron | Message | CLI Tool | Enabled | Permission |
|
|
51
|
+
|------|------|---------|----------|---------|------------|
|
|
52
|
+
| example-task | 0 * * * * | README.mdを要約してください | claude | true | acceptEdits |
|
|
53
|
+
| copilot-example | 0 9 * * * | コードをレビューしてください | copilot --model gpt-4.1 | true | allow-all-tools |
|
|
54
|
+
`;
|
|
55
|
+
// =============================================================================
|
|
56
|
+
// Parser (client-side, no fs dependency)
|
|
57
|
+
// =============================================================================
|
|
58
|
+
/**
|
|
59
|
+
* Parse CMATE.md content into a generic structure.
|
|
60
|
+
* Client-side equivalent of parseCmateFile() from cmate-parser.ts.
|
|
61
|
+
*
|
|
62
|
+
* @param content - Raw CMATE.md file content
|
|
63
|
+
* @returns Map of section name to table rows
|
|
64
|
+
*/
|
|
65
|
+
function parseCmateContent(content) {
|
|
66
|
+
const result = new Map();
|
|
67
|
+
const lines = content.split('\n');
|
|
68
|
+
let currentSection = null;
|
|
69
|
+
let headerParsed = false;
|
|
70
|
+
let separatorParsed = false;
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
const headerMatch = trimmed.match(/^##\s+(.+)$/);
|
|
74
|
+
if (headerMatch) {
|
|
75
|
+
currentSection = headerMatch[1].trim();
|
|
76
|
+
headerParsed = false;
|
|
77
|
+
separatorParsed = false;
|
|
78
|
+
if (!result.has(currentSection)) {
|
|
79
|
+
result.set(currentSection, []);
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (!trimmed || !trimmed.startsWith('|') || !currentSection) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!headerParsed) {
|
|
87
|
+
headerParsed = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (!separatorParsed) {
|
|
91
|
+
if (trimmed.match(/^\|[\s-:|]+\|$/)) {
|
|
92
|
+
separatorParsed = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
separatorParsed = true;
|
|
96
|
+
}
|
|
97
|
+
const cells = trimmed
|
|
98
|
+
.split('|')
|
|
99
|
+
.slice(1, -1)
|
|
100
|
+
.map((cell) => cell.trim());
|
|
101
|
+
if (cells.length > 0) {
|
|
102
|
+
result.get(currentSection).push(cells);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
// =============================================================================
|
|
108
|
+
// Validation
|
|
109
|
+
// =============================================================================
|
|
110
|
+
/**
|
|
111
|
+
* Validate that the Schedules section header row contains the expected columns.
|
|
112
|
+
*
|
|
113
|
+
* @param content - Raw CMATE.md file content
|
|
114
|
+
* @returns Array of validation errors (empty = headers valid)
|
|
115
|
+
*/
|
|
116
|
+
function validateScheduleHeaders(content) {
|
|
117
|
+
const errors = [];
|
|
118
|
+
const lines = content.split('\n');
|
|
119
|
+
let inSchedules = false;
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
const trimmed = line.trim();
|
|
122
|
+
const sectionMatch = trimmed.match(/^##\s+(.+)$/);
|
|
123
|
+
if (sectionMatch) {
|
|
124
|
+
inSchedules = sectionMatch[1].trim() === 'Schedules';
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!inSchedules || !trimmed.startsWith('|')) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// First table row in Schedules section = header row
|
|
131
|
+
const cells = trimmed
|
|
132
|
+
.split('|')
|
|
133
|
+
.slice(1, -1)
|
|
134
|
+
.map((cell) => cell.trim());
|
|
135
|
+
// Validate required headers
|
|
136
|
+
for (let i = 0; i < REQUIRED_SCHEDULE_HEADERS.length; i++) {
|
|
137
|
+
const expected = REQUIRED_SCHEDULE_HEADERS[i];
|
|
138
|
+
const actual = cells[i];
|
|
139
|
+
if (!actual || actual !== expected) {
|
|
140
|
+
errors.push({
|
|
141
|
+
row: -1,
|
|
142
|
+
message: `Header column ${i + 1}: expected "${expected}", got "${actual || '(missing)'}"`,
|
|
143
|
+
field: 'header',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Validate optional headers (only when present)
|
|
148
|
+
for (let j = 0; j < OPTIONAL_SCHEDULE_HEADERS.length; j++) {
|
|
149
|
+
const colIndex = REQUIRED_SCHEDULE_HEADERS.length + j;
|
|
150
|
+
const expected = OPTIONAL_SCHEDULE_HEADERS[j];
|
|
151
|
+
const actual = cells[colIndex];
|
|
152
|
+
if (actual !== undefined && actual !== expected) {
|
|
153
|
+
errors.push({
|
|
154
|
+
row: -1,
|
|
155
|
+
message: `Header column ${colIndex + 1}: expected "${expected}", got "${actual}"`,
|
|
156
|
+
field: 'header',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
break; // Only check the first table row (header)
|
|
161
|
+
}
|
|
162
|
+
return errors;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Validate rows from the Schedules section.
|
|
166
|
+
* Returns an array of validation errors (empty array = all valid).
|
|
167
|
+
*
|
|
168
|
+
* @param rows - Raw table rows from parseCmateContent() for the Schedules section
|
|
169
|
+
* @returns Array of validation errors
|
|
170
|
+
*/
|
|
171
|
+
function validateSchedulesSection(rows) {
|
|
172
|
+
const errors = [];
|
|
173
|
+
for (let i = 0; i < rows.length; i++) {
|
|
174
|
+
const row = rows[i];
|
|
175
|
+
// Minimum required columns: Name, Cron, Message
|
|
176
|
+
if (row.length < 3) {
|
|
177
|
+
errors.push({
|
|
178
|
+
row: i,
|
|
179
|
+
message: `Row ${i + 1}: insufficient columns (need at least 3, got ${row.length})`,
|
|
180
|
+
field: 'columns',
|
|
181
|
+
});
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const [name, cronExpression, message] = row;
|
|
185
|
+
// Validate name
|
|
186
|
+
const sanitizedName = (0, cmate_constants_1.sanitizeContent)(name);
|
|
187
|
+
if (!cmate_constants_1.NAME_PATTERN.test(sanitizedName)) {
|
|
188
|
+
errors.push({
|
|
189
|
+
row: i,
|
|
190
|
+
message: `Row ${i + 1}: invalid name "${sanitizedName}"`,
|
|
191
|
+
field: 'name',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Validate cron expression
|
|
195
|
+
if (!(0, cmate_constants_1.isValidCronExpression)(cronExpression)) {
|
|
196
|
+
errors.push({
|
|
197
|
+
row: i,
|
|
198
|
+
message: `Row ${i + 1}: invalid cron "${cronExpression}"`,
|
|
199
|
+
field: 'cron',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Validate message
|
|
203
|
+
const sanitizedMessage = (0, cmate_constants_1.sanitizeContent)(message);
|
|
204
|
+
if (!sanitizedMessage.trim()) {
|
|
205
|
+
errors.push({
|
|
206
|
+
row: i,
|
|
207
|
+
message: `Row ${i + 1}: empty message`,
|
|
208
|
+
field: 'message',
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// Validate CLI Tool column via shared pipeline (DR1-007)
|
|
212
|
+
const { result: parsed, errors: cliToolErrors } = (0, cmate_cli_tool_parser_1.parseAndValidateCliToolColumn)(row[3] || '');
|
|
213
|
+
for (const errMsg of cliToolErrors) {
|
|
214
|
+
errors.push({
|
|
215
|
+
row: i,
|
|
216
|
+
message: `Row ${i + 1}: ${errMsg}`,
|
|
217
|
+
field: errMsg.includes('Model') ? 'model' : 'cliTool',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// Validate cliToolId is a known tool (DR2-009)
|
|
221
|
+
if (parsed && !(0, types_1.isCliToolType)(parsed.cliToolId)) {
|
|
222
|
+
errors.push({
|
|
223
|
+
row: i,
|
|
224
|
+
message: `Row ${i + 1}: unknown CLI Tool "${parsed.cliToolId}"`,
|
|
225
|
+
field: 'cliTool',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
// Validate permission (6th column)
|
|
229
|
+
// Empty/missing permission is allowed -- parser applies default per CLI tool
|
|
230
|
+
const permissionStr = row[5];
|
|
231
|
+
if (permissionStr !== undefined && permissionStr.trim() !== '') {
|
|
232
|
+
const trimmedPermission = permissionStr.trim();
|
|
233
|
+
const cliToolId = parsed.cliToolId;
|
|
234
|
+
// DR3-002: copilot separated from gemini/vibe-local to accept COPILOT_PERMISSIONS
|
|
235
|
+
// Issue #1914: the fallback is `[]`, not CLAUDE_PERMISSIONS. Every tool
|
|
236
|
+
// whose CLI has a permission flag is named explicitly; anything else --
|
|
237
|
+
// `opencode`, `gemini`, `vibe-local`, and any tool added to CLI_TOOL_IDS
|
|
238
|
+
// without a branch here -- has no flag, so a non-empty Permission cell is
|
|
239
|
+
// an error rather than something silently checked against Claude's list.
|
|
240
|
+
// Issue #2454: command-code's list is the six-value column vocabulary
|
|
241
|
+
// (`yolo` + the five `--permission-mode` choices), the same set the
|
|
242
|
+
// parser accepts and the dialog offers.
|
|
243
|
+
const allowedValues = cliToolId === 'claude' ? schedule_config_1.CLAUDE_PERMISSIONS
|
|
244
|
+
: cliToolId === 'codex' ? schedule_config_1.CODEX_SANDBOXES
|
|
245
|
+
: cliToolId === 'copilot' ? schedule_config_1.COPILOT_PERMISSIONS
|
|
246
|
+
: cliToolId === 'antigravity' ? schedule_config_1.ANTIGRAVITY_PERMISSIONS
|
|
247
|
+
: cliToolId === 'command-code' ? schedule_config_1.COMMAND_CODE_SCHEDULE_PERMISSIONS
|
|
248
|
+
: [];
|
|
249
|
+
if (!allowedValues.includes(trimmedPermission)) {
|
|
250
|
+
errors.push({
|
|
251
|
+
row: i,
|
|
252
|
+
message: `Row ${i + 1}: invalid permission "${trimmedPermission}" for ${cliToolId}`,
|
|
253
|
+
field: 'permission',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return errors;
|
|
259
|
+
}
|
|
260
|
+
// =============================================================================
|
|
261
|
+
// Warnings (Issue #2576)
|
|
262
|
+
// =============================================================================
|
|
263
|
+
/**
|
|
264
|
+
* Whether a schedule runs `commandcode -p` with its print gate still on.
|
|
265
|
+
*
|
|
266
|
+
* Shared by the parser's log line, {@link collectScheduleWarnings} and the
|
|
267
|
+
* ScheduleEditDialog note, so the three cannot disagree.
|
|
268
|
+
*
|
|
269
|
+
* The test is "one of the five `--permission-mode` values", not "anything but
|
|
270
|
+
* `yolo`", because that is what `buildCliArgs` does: `yolo` gets `--yolo`, the
|
|
271
|
+
* five modes get `--permission-mode <value>` and leave the gate on, and
|
|
272
|
+
* anything else (an empty cell, an out-of-vocabulary value) gets `--yolo` --
|
|
273
|
+
* which is also what the parser resolves those cells to. "Not `yolo`" flagged
|
|
274
|
+
* an empty cell that in fact runs with `--yolo`.
|
|
275
|
+
*
|
|
276
|
+
* What the gate rejects is the write tools the agent calls *directly*
|
|
277
|
+
* ({@link COMMAND_CODE_PRINT_GATED_TOOLS}); a write routed through a sub-agent
|
|
278
|
+
* can still land, so this does not mean the run is read-only.
|
|
279
|
+
*
|
|
280
|
+
* @param cliToolId - CLI tool id of the schedule
|
|
281
|
+
* @param permission - Permission cell or resolved permission
|
|
282
|
+
* @returns true when the directly-called write tools will be rejected
|
|
283
|
+
*/
|
|
284
|
+
function isCommandCodeDirectWriteToolsDenied(cliToolId, permission) {
|
|
285
|
+
return (cliToolId === 'command-code' &&
|
|
286
|
+
schedule_config_1.COMMAND_CODE_PERMISSIONS.includes(permission.trim()));
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Collect non-blocking warnings from the Schedules section rows (Issue #2576).
|
|
290
|
+
*
|
|
291
|
+
* CMATE.md is edited by hand, and that path never shows the dialog note, so the
|
|
292
|
+
* judgment has to run on the file itself. Only rows that will actually run with
|
|
293
|
+
* the gate on are reported, mirroring `parseSchedulesSection`:
|
|
294
|
+
*
|
|
295
|
+
* - rows the parser skips (any validation error other than the permission) are
|
|
296
|
+
* left out and do not count toward the limit;
|
|
297
|
+
* - rows past `MAX_SCHEDULE_ENTRIES` registered rows are left out -- the parser
|
|
298
|
+
* stops there, and a row with an out-of-vocabulary permission *is* registered
|
|
299
|
+
* (as `yolo`), so it counts;
|
|
300
|
+
* - rows with an out-of-vocabulary permission are left out -- they run as `yolo`;
|
|
301
|
+
* - disabled rows are left out -- they are registered but never run, and the
|
|
302
|
+
* warning is about a schedule running unnoticed. Enabling one rewrites
|
|
303
|
+
* CMATE.md, and the next read reports it.
|
|
304
|
+
*
|
|
305
|
+
* This never adds to {@link validateSchedulesSection}'s errors -- a warned row
|
|
306
|
+
* is still registered and still runs.
|
|
307
|
+
*
|
|
308
|
+
* @param rows - Raw table rows from parseCmateContent() for the Schedules section
|
|
309
|
+
* @returns Array of warnings (empty = nothing to flag)
|
|
310
|
+
*/
|
|
311
|
+
function collectScheduleWarnings(rows) {
|
|
312
|
+
const warnings = [];
|
|
313
|
+
let registered = 0;
|
|
314
|
+
for (let i = 0; i < rows.length; i++) {
|
|
315
|
+
const row = rows[i];
|
|
316
|
+
const errors = validateSchedulesSection([row]);
|
|
317
|
+
if (errors.some((error) => error.field !== 'permission'))
|
|
318
|
+
continue;
|
|
319
|
+
if (registered >= cmate_constants_1.MAX_SCHEDULE_ENTRIES)
|
|
320
|
+
break;
|
|
321
|
+
registered++;
|
|
322
|
+
if (errors.length > 0)
|
|
323
|
+
continue;
|
|
324
|
+
const [rawName, , , rawCliTool, enabledStr, permissionStr] = row;
|
|
325
|
+
if (!isScheduleEnabled(enabledStr))
|
|
326
|
+
continue;
|
|
327
|
+
const { result: parsed } = (0, cmate_cli_tool_parser_1.parseAndValidateCliToolColumn)(rawCliTool || '');
|
|
328
|
+
const permission = (permissionStr ?? '').trim();
|
|
329
|
+
if (!isCommandCodeDirectWriteToolsDenied(parsed.cliToolId, permission))
|
|
330
|
+
continue;
|
|
331
|
+
const name = (0, cmate_constants_1.sanitizeContent)(rawName);
|
|
332
|
+
warnings.push({
|
|
333
|
+
row: i,
|
|
334
|
+
name,
|
|
335
|
+
field: 'permission',
|
|
336
|
+
code: exports.COMMAND_CODE_DIRECT_WRITE_TOOLS_DENIED,
|
|
337
|
+
cliToolId: parsed.cliToolId,
|
|
338
|
+
permission,
|
|
339
|
+
message: `Row ${i + 1}: schedule "${name}" runs command-code with the --permission-mode value "${permission}", ` +
|
|
340
|
+
`so commandcode -p rejects the write tools the agent calls directly ` +
|
|
341
|
+
`(${exports.COMMAND_CODE_PRINT_GATED_TOOLS.join(', ')}). ` +
|
|
342
|
+
'This is a warning, not an error: the schedule still runs. Use "yolo" if it needs to write.',
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return warnings;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Read the Enabled cell of a Schedules row: missing, empty or `true` (any case)
|
|
349
|
+
* means enabled. Shared with `parseSchedulesSection` so the parser and
|
|
350
|
+
* {@link collectScheduleWarnings} cannot disagree about which rows run.
|
|
351
|
+
*/
|
|
352
|
+
function isScheduleEnabled(enabledStr) {
|
|
353
|
+
return enabledStr === undefined || enabledStr === '' || enabledStr.toLowerCase() === 'true';
|
|
354
|
+
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
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_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
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.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 = void 0;
|
|
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 = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
11
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
@@ -2020,14 +2020,52 @@ exports.VIBE_LOCAL_PROMPT_PATTERN = /ctx:\d+%\s*[>❯]/m;
|
|
|
2020
2020
|
* Matches braille spinners, "Thinking", and tool execution indicators.
|
|
2021
2021
|
*/
|
|
2022
2022
|
exports.VIBE_LOCAL_THINKING_PATTERN = /[\u2800-\u28FF]|Thinking|⠋|⠙|⠹|⠸|⠼|⠴|⠦|⠧|⠇|⠏|Running|Executing/;
|
|
2023
|
+
/**
|
|
2024
|
+
* The banner agy paints INTO its empty input box while a non-default permission
|
|
2025
|
+
* mode is on (Issue #2592).
|
|
2026
|
+
*
|
|
2027
|
+
* Measured on agy 1.2.4 in the #2592 UAT
|
|
2028
|
+
* (`tests/fixtures/agent-mode-2592/antigravity-{accept-edits,plan}.txt`, row 18,
|
|
2029
|
+
* between the box's two rules):
|
|
2030
|
+
*
|
|
2031
|
+
* `> Accept-edits mode: file edits auto-approved (shift+tab to cycle)`
|
|
2032
|
+
* `> Plan mode: research & plan only (shift+tab to cycle)`
|
|
2033
|
+
*
|
|
2034
|
+
* It takes the place of the bare `>` an empty box shows in default — it is a
|
|
2035
|
+
* placeholder, not typed text — so a reader that only accepts the bare glyph
|
|
2036
|
+
* reads an idle accept-edits / plan pane as "no input box at all". Before this
|
|
2037
|
+
* pattern existed that is exactly what happened: the status detector fell through
|
|
2038
|
+
* to its `default` floor (`running` + `isUnclassifiedActive`), `commandmate ls`
|
|
2039
|
+
* showed a resting agent as running, `wait` never completed, and
|
|
2040
|
+
* `isAntigravityReady` refused every send. #2592 made those two modes one click
|
|
2041
|
+
* away, so the hole had to close with it.
|
|
2042
|
+
*
|
|
2043
|
+
* The structure is matched rather than the two sentences: `<Name> mode: <text>
|
|
2044
|
+
* (shift+tab to cycle)`, anchored on the key hint agy ends every banner with, so
|
|
2045
|
+
* a third mode needs no edit here. What stays out is anything a user could have
|
|
2046
|
+
* typed into the box — the trailing hint is the part nobody types.
|
|
2047
|
+
*
|
|
2048
|
+
* Whole-row, no `/g`, no nested quantifiers (`[^\n]*` is followed by a literal).
|
|
2049
|
+
*/
|
|
2050
|
+
exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = '>[^\\S\\n]+[A-Z][A-Za-z-]*[^\\S\\n]mode:[^\\n]*\\(shift\\+tab to cycle\\)[^\\S\\n]*';
|
|
2051
|
+
/** {@link ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE} as a single-row pattern. */
|
|
2052
|
+
exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = new RegExp(`^${exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE}$`, 'm');
|
|
2023
2053
|
/**
|
|
2024
2054
|
* Antigravity (agy) interactive REPL prompt pattern (Issue #988)
|
|
2025
2055
|
* agy shows a bare ">" input box line when waiting for user input. The input box
|
|
2026
2056
|
* is always rendered (even while generating), so prompt presence alone does not
|
|
2027
2057
|
* mean "ready" — running vs idle is resolved together with the thinking pattern /
|
|
2028
2058
|
* footer status bar in status-detector.ts. (Confirmed on machine: line is "> ".)
|
|
2059
|
+
*
|
|
2060
|
+
* Issue #2592: or the mode banner that replaces the bare glyph in an EMPTY box
|
|
2061
|
+
* while accept-edits / plan is on ({@link ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN}).
|
|
2062
|
+
* Every consumer of this pattern is asking "is agy's input box drawn and empty?"
|
|
2063
|
+
* — the idle rule in `detection/tools/antigravity/detect.ts`, the survey guard
|
|
2064
|
+
* beside it, `isAntigravityReady` (the send gate) and the liveness probe — and
|
|
2065
|
+
* the answer does not depend on the permission mode, so the banner is folded in
|
|
2066
|
+
* here once rather than at each of them.
|
|
2029
2067
|
*/
|
|
2030
|
-
exports.ANTIGRAVITY_PROMPT_PATTERN =
|
|
2068
|
+
exports.ANTIGRAVITY_PROMPT_PATTERN = new RegExp(`^(?:>\\s*|${exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE})$`, 'm');
|
|
2031
2069
|
/**
|
|
2032
2070
|
* Antigravity (agy) thinking/processing pattern (Issue #988)
|
|
2033
2071
|
* While generating, agy shows a braille spinner with "Generating..." in the
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* | tool | line |
|
|
35
35
|
* |-------------|------------------------------------------------------------------|
|
|
36
36
|
* | codex | footer: `gpt-5.6-sol xhigh · ~/share/work/…` |
|
|
37
|
+
* | codex | footer: `gpt-6-astra medium · ~/… · <thread title> Plan mode (…)` (0.154, #2592) |
|
|
37
38
|
* | claude | banner: `▝▜█████▛▘ Opus 5 (1M context) with xhigh effort · Claude Max` |
|
|
38
39
|
* | claude | switch: ` ⎿ Set model to Sonnet 5 for this session only` (#2361) |
|
|
39
40
|
* | antigravity | footer: `? for shortcuts … Gemini 3.7 Flash · hig` |
|
|
@@ -61,7 +62,7 @@
|
|
|
61
62
|
* @see Issue #1784, Phase 2 of the model/effort visibility series
|
|
62
63
|
*/
|
|
63
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
|
-
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
65
|
+
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
65
66
|
exports.resolveEffortToken = resolveEffortToken;
|
|
66
67
|
exports.extractModelInfo = extractModelInfo;
|
|
67
68
|
exports.deriveEffortFromModelId = deriveEffortFromModelId;
|
|
@@ -156,12 +157,48 @@ function resolveEffortToken(token, options = {}) {
|
|
|
156
157
|
* `cli-patterns.ts` documents).
|
|
157
158
|
*/
|
|
158
159
|
exports.CODEX_FOOTER_MODEL_PATTERN = /^\s*([^\s·]+)(?:\s+(minimal|low|medium|high|xhigh)\b)?/i;
|
|
160
|
+
/**
|
|
161
|
+
* A codex status bar with something AFTER the path (Issue #2592).
|
|
162
|
+
*
|
|
163
|
+
* codex 0.154.0 appends two things to the bar the pattern above was written for,
|
|
164
|
+
* measured in the #2592 UAT (`tests/fixtures/agent-mode-2592/codex-*.txt`, row 40):
|
|
165
|
+
*
|
|
166
|
+
* ` gpt-6-astra medium · ~/uat3-…/sandbox-repo · Reply with one word Plan mode (shift+tab to cycle)`
|
|
167
|
+
* ` gpt-6-astra xhigh · ~/uat3-…/sandbox-repo · Reply with one word`
|
|
168
|
+
* ` gpt-6-astra medium · ~/uat3-…/sandbox-repo Plan mode (shift+tab to cycle)`
|
|
169
|
+
*
|
|
170
|
+
* — a `·` segment carrying the thread's title once the first turn has named it,
|
|
171
|
+
* and the right-aligned Plan-mode badge. `CODEX_STATUS_BAR_PATTERN` requires the
|
|
172
|
+
* row to END in the path, so every one of these read as "no status bar", and the
|
|
173
|
+
* model / effort latched from the one bar codex draws before the first turn
|
|
174
|
+
* (`xhigh`) stayed on screen for the rest of the session. That is how #2592's
|
|
175
|
+
* UAT found it: Plan mode moves codex to `medium`, the pane said so, and the UI
|
|
176
|
+
* kept saying `xhigh`.
|
|
177
|
+
*
|
|
178
|
+
* Deliberately a SECOND pattern here rather than a widened
|
|
179
|
+
* `CODEX_STATUS_BAR_PATTERN`. That one is the footer boundary the codex
|
|
180
|
+
* running/idle rules are windowed on (#1150), and the module docblock's rule —
|
|
181
|
+
* this module must never be the reason that boundary moves — stands. Widening a
|
|
182
|
+
* value reader cannot change a status verdict; widening the boundary can.
|
|
183
|
+
*
|
|
184
|
+
* The shape: head segment (`<model>[ <effort>]`), `·`, a path, then EITHER a
|
|
185
|
+
* further `·` segment OR a column gap (two spaces) before right-aligned text.
|
|
186
|
+
* The trailer must start at one of those two places, so a path followed by a
|
|
187
|
+
* single space and prose is still not a bar. {@link readCodexFooter}'s
|
|
188
|
+
* digit-or-effort check applies to rows matched either way.
|
|
189
|
+
*
|
|
190
|
+
* No /g. No nested quantifiers: `[^·]*` stops at the first `·`, and the two
|
|
191
|
+
* trailer alternatives each start with a literal or a fixed-width gap.
|
|
192
|
+
*/
|
|
193
|
+
exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = /^\s*\S[^·]*·\s*~?\/\S*(?:\s*·[^\n]*|[^\S\n]{2,}\S[^\n]*)$/;
|
|
159
194
|
function readCodexFooter(line) {
|
|
160
195
|
// Same "is this the status bar" question the detector asks, answered by the
|
|
161
196
|
// same pattern (#1150). Imported read-only: this module must never be the
|
|
162
|
-
// reason that boundary moves.
|
|
163
|
-
|
|
197
|
+
// reason that boundary moves. Issue #2592 adds the trailer-bearing shape as a
|
|
198
|
+
// second, extractor-local reading — see CODEX_STATUS_BAR_WITH_TRAILER_PATTERN.
|
|
199
|
+
if (!cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line) && !exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN.test(line)) {
|
|
164
200
|
return null;
|
|
201
|
+
}
|
|
165
202
|
const separator = line.indexOf('·');
|
|
166
203
|
if (separator < 0)
|
|
167
204
|
return null;
|
|
@@ -5,6 +5,7 @@ exports.APPROVAL_TARGET_MAX_LOOKBACK = void 0;
|
|
|
5
5
|
exports.findClaudeTaskPanelLines = findClaudeTaskPanelLines;
|
|
6
6
|
exports.findClaudeChrome = findClaudeChrome;
|
|
7
7
|
exports.maskClaudeChrome = maskClaudeChrome;
|
|
8
|
+
exports.isTypedTextFieldOption = isTypedTextFieldOption;
|
|
8
9
|
exports.findApprovalContextStart = findApprovalContextStart;
|
|
9
10
|
exports.joinApprovalTarget = joinApprovalTarget;
|
|
10
11
|
exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
|
|
@@ -410,6 +411,49 @@ const TEXT_INPUT_PATTERNS = [
|
|
|
410
411
|
/custom/i,
|
|
411
412
|
/differently/i,
|
|
412
413
|
];
|
|
414
|
+
/**
|
|
415
|
+
* Labels of the rows measured to BE a text field on screen (Issue #2573).
|
|
416
|
+
*
|
|
417
|
+
* `requiresTextInput` (from {@link TEXT_INPUT_PATTERNS}) reads the WORDS of a
|
|
418
|
+
* label — "tell … what to do differently", "custom", "enter …" — and says the
|
|
419
|
+
* option is about the user's own text. It does not say where typed characters
|
|
420
|
+
* land, and for two rows it flags alike the measured answer is opposite:
|
|
421
|
+
*
|
|
422
|
+
* | row | on screen | free text + Enter |
|
|
423
|
+
* |-----|-----------|-------------------|
|
|
424
|
+
* | Command Code `AskUserQuestion` `Type something...` (#2522) | a `TextInput` | lands in the field — the answer |
|
|
425
|
+
* | Command Code permission `No, tell Command Code what to do differently` | a menu row | ignored; the Enter confirms the highlighted `1. Yes` |
|
|
426
|
+
*
|
|
427
|
+
* The second is how a "No + reason" was delivered as an approval. The same
|
|
428
|
+
* words sit on codex's and copilot's approval rows (codex's also name letter
|
|
429
|
+
* hotkeys, `(y)` / `(p)`), and the generic patterns match inside the command an
|
|
430
|
+
* approval row quotes (`… commands that start with 'npm run custom'`).
|
|
431
|
+
*
|
|
432
|
+
* So this is an allowlist of what was measured, not a denylist of what went
|
|
433
|
+
* wrong: a flagged row is a field only when its label is one of these. Anchored
|
|
434
|
+
* at the start so Command Code's folded description (`Type something... Give me
|
|
435
|
+
* a branch name …`) still matches. Command Code's reader
|
|
436
|
+
* (`tools/command-code/dialog.ts`) marks the same rows with the same expression.
|
|
437
|
+
*/
|
|
438
|
+
const TYPED_TEXT_FIELD_LABEL_PATTERNS = [
|
|
439
|
+
/^[^\S\n]*type\s+something\b/i,
|
|
440
|
+
];
|
|
441
|
+
/**
|
|
442
|
+
* Whether typed text reaches this option as its answer (Issue #2573).
|
|
443
|
+
*
|
|
444
|
+
* `true` only for a `requiresTextInput` row whose label is a measured text field
|
|
445
|
+
* ({@link TYPED_TEXT_FIELD_LABEL_PATTERNS}). Every other flagged row is a menu
|
|
446
|
+
* row: it is answered by its NUMBER, and free text sent at it is swallowed while
|
|
447
|
+
* the Enter after it confirms whatever is highlighted.
|
|
448
|
+
*
|
|
449
|
+
* Pure, and restated in `components/worktree/PromptPanel.tsx` for the answer
|
|
450
|
+
* panels, which cannot import this module (its graph reaches `lib/env`'s `fs`);
|
|
451
|
+
* `tests/unit/components/PromptPanel.test.tsx` asserts the two agree.
|
|
452
|
+
*/
|
|
453
|
+
function isTypedTextFieldOption(option) {
|
|
454
|
+
return option.requiresTextInput === true
|
|
455
|
+
&& TYPED_TEXT_FIELD_LABEL_PATTERNS.some((pattern) => pattern.test(option.label));
|
|
456
|
+
}
|
|
413
457
|
// ============================================================================
|
|
414
458
|
// Helper functions
|
|
415
459
|
// ============================================================================
|
|
@@ -163,6 +163,15 @@ exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector
|
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
165
|
// Idle: bare "> " input prompt visible and the response has completed.
|
|
166
|
+
//
|
|
167
|
+
// Issue #2592: "bare" includes the permission-mode banner agy paints into
|
|
168
|
+
// an EMPTY box while accept-edits / plan is on (`> Plan mode: research &
|
|
169
|
+
// plan only (shift+tab to cycle)`) — `promptPattern` accepts it, see
|
|
170
|
+
// ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN. Without that, a resting pane in
|
|
171
|
+
// either mode reached the `default` floor as `running` + unclassified, and
|
|
172
|
+
// the mode button (which refuses unclassified frames) could switch INTO
|
|
173
|
+
// accept-edits once and never back out. The thinking check above still runs
|
|
174
|
+
// first, so a generating pane in those modes is still `running`.
|
|
166
175
|
const { promptPattern } = (0, cli_patterns_1.getCliToolPatterns)('antigravity');
|
|
167
176
|
if (promptPattern.test(frame.lastLines)) {
|
|
168
177
|
return {
|
|
@@ -51,9 +51,14 @@
|
|
|
51
51
|
* branch below publishes `'positive'` outright rather than through
|
|
52
52
|
* `resolveIdleEvidence`, so a rule added without changing that would never run.
|
|
53
53
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
54
|
+
* Epic #2249 決定 3 keeps Auto-Yes on the legacy numbered-response path,
|
|
55
|
+
* because Command Code fires `PreToolUse` AFTER the dialog is answered, so a
|
|
56
|
+
* hook-driven permission decision cannot dismiss it. That is why this module
|
|
57
|
+
* had no `detectDialog` until Issue #2574 — and why the one it has now does not
|
|
58
|
+
* touch that decision. `./permission.ts` declares how the permission dialog
|
|
59
|
+
* takes an answer (`numbered`, and a digit that commits without an Enter), which
|
|
60
|
+
* is what `sendPromptAnswer` reads; the Auto-Yes gate still does not judge this
|
|
61
|
+
* tool, because its rollout row stays `legacy`.
|
|
57
62
|
*
|
|
58
63
|
* Issue #2369 added a second `afterPrompt` branch for the other screen the
|
|
59
64
|
* shared chain could not read: the `/usage` panel, whose last row is
|
|
@@ -123,6 +128,7 @@ exports.commandCodeStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
|
123
128
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
124
129
|
const selection_shape_1 = require("../../selection-shape");
|
|
125
130
|
const dialog_1 = require("./dialog");
|
|
131
|
+
const permission_1 = require("./permission");
|
|
126
132
|
const status_reason_1 = require("../../status-reason");
|
|
127
133
|
const run_detection_1 = require("../run-detection");
|
|
128
134
|
const verified_against_1 = require("../verified-against");
|
|
@@ -257,6 +263,11 @@ exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector
|
|
|
257
263
|
}
|
|
258
264
|
return null;
|
|
259
265
|
},
|
|
266
|
+
// Issue #2574: the permission dialog's answer mode, for the sender. Not an
|
|
267
|
+
// Auto-Yes gate — see the module docblock and `./permission.ts`.
|
|
268
|
+
detectDialog(frame) {
|
|
269
|
+
return (0, permission_1.detectCommandCodePermissionDialog)(frame);
|
|
270
|
+
},
|
|
260
271
|
afterThinking(frame) {
|
|
261
272
|
// The composer is drawn throughout a turn, so "running" has to be resolved
|
|
262
273
|
// before the generic composer check can say "ready". Widened window; see the
|