commandmate 0.44.0 → 0.44.2
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 +331 -335
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +3 -3
- 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/release-notes/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_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_client-reference-manifest.js +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 +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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- 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/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 +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/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 +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_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_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_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 +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_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.js +1 -2
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -2
- 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_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_client-reference-manifest.js +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_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 +3 -3
- 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.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 +2 -2
- 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.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_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_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/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 +7 -7
- 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 +35 -35
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -0
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- package/.next/server/chunks/4372.js +5 -0
- package/.next/server/chunks/5595.js +1 -0
- package/.next/server/chunks/5845.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +3 -3
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -0
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/9130.js +1 -5
- package/.next/server/chunks/9390.js +1 -2
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9798.js +2 -0
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/static/chunks/{2407-340774f1a24f2b45.js → 2407-051f6f84226a9f2c.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/591-539fec878c9dec5e.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{9619-84aced0846cbe3ac.js → 9619-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-9da1ab602bcb3051.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +1 -0
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +72 -25
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +7 -8
- package/dist/cli/commands/remote.d.ts +10 -0
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +17 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +47 -2
- package/dist/cli/docs/setup-guide.d.ts +1 -1
- package/dist/cli/docs/setup-guide.d.ts.map +1 -1
- package/dist/cli/docs/setup-guide.js +2 -0
- package/dist/cli/types/api-responses.d.ts +25 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/lib/session/prompt-view.d.ts +205 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +267 -0
- package/dist/server/locales/en/worktree.json +13 -1
- package/dist/server/locales/ja/worktree.json +13 -1
- package/dist/server/server.js +5 -3
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/auto-yes-lifecycle.js +133 -0
- package/dist/server/src/lib/auto-yes-poller.js +19 -4
- package/dist/server/src/lib/cli-tools/antigravity.js +3 -2
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/command-code.js +3 -2
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/cli-patterns.js +38 -20
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +7 -31
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +8 -3
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -46
- package/dist/server/src/lib/detection/tools/codex/live-region.js +73 -0
- package/dist/server/src/lib/detection/tools/command-code/detect.js +11 -0
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- package/dist/server/src/lib/detection/tools/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
- package/dist/server/src/lib/detection/tools/live-region.js +204 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +25 -3
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
- package/dist/server/src/lib/polling/response-checker.js +25 -20
- package/dist/server/src/lib/prompt-answer-sender.js +1 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +8 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -0
- package/dist/server/src/lib/relay/relay-triggers.js +9 -0
- package/dist/server/src/lib/resource-cleanup.js +6 -4
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-session.js +7 -1
- package/dist/server/src/lib/session/current-output-builder.js +53 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/prompt-view.js +267 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +34 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/dist/server/src/lib/session/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +5 -3
- package/package.json +1 -1
- package/release-notes/0.44.1.json +54 -0
- package/release-notes/0.44.2.json +33 -0
- package/.next/server/chunks/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/650.js +0 -1
- package/.next/server/chunks/6661.js +0 -1
- package/.next/server/chunks/8583.js +0 -1
- package/.next/server/chunks/964.js +0 -1
- package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/591-0a45801e83f26f24.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/app/layout-0fc249fb7de75a27.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +0 -1
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_buildManifest.js +0 -0
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* How a waiting prompt is shown and answered, decided once (Issue #3184).
|
|
4
|
+
*
|
|
5
|
+
* Before this module every reader of a prompt payload re-derived the same three
|
|
6
|
+
* facts for itself — "can it be answered?", "where are the choices?", "is the
|
|
7
|
+
* answer a keystroke or an API call?" — from `type`, `options`,
|
|
8
|
+
* `decisionOptions`, `decisionId` and `askUserQuestion`. The panel, the phone
|
|
9
|
+
* sheet, the chat surface, Auto-Yes and `wait` each combined them a little
|
|
10
|
+
* differently, and a fix to one surface kept missing the others (#2775 →
|
|
11
|
+
* #2810 → #2822, #3181). {@link derivePromptView} is the one combination; a
|
|
12
|
+
* reader takes its {@link PromptView} and does not look at the raw fields to
|
|
13
|
+
* decide what to show.
|
|
14
|
+
*
|
|
15
|
+
* ## No imports, on purpose
|
|
16
|
+
*
|
|
17
|
+
* The CLI (`tsconfig.cli.json`) compiles with `"paths": {}`, so it can reach a
|
|
18
|
+
* module under `src/lib` by a relative path only when nothing in that module's
|
|
19
|
+
* graph uses the `@/` alias. `types/models` and `session/structured-prompt` both
|
|
20
|
+
* do. The input is therefore a structural type ({@link PromptViewSource}) that
|
|
21
|
+
* every existing prompt shape — `LivePromptData`, `StoredPromptData`, the CLI's
|
|
22
|
+
* own `PromptData` mirror — satisfies without a cast, and this file stays
|
|
23
|
+
* importable from a client component, the server and the CLI alike.
|
|
24
|
+
*
|
|
25
|
+
* ## What it does not replace
|
|
26
|
+
*
|
|
27
|
+
* `isAnswerablePromptData()` (`types/models`) stays: it narrows to the closed
|
|
28
|
+
* `PromptData` union (#1725) for the code that builds an answer body. The two
|
|
29
|
+
* agree by construction — `derivePromptView(x)?.kind === 'screen-choices'`
|
|
30
|
+
* exactly when `isAnswerablePromptData(x)` — and
|
|
31
|
+
* `tests/unit/session/prompt-view-3184.test.ts` holds that over every fixture.
|
|
32
|
+
*
|
|
33
|
+
* @module lib/session/prompt-view
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TYPED_TEXT_FIELD_LABEL_PATTERNS = exports.UNCLASSIFIED_PROMPT_VIEW_TYPE = void 0;
|
|
37
|
+
exports.promptHeadingMessage = promptHeadingMessage;
|
|
38
|
+
exports.optionTakesTypedText = optionTakesTypedText;
|
|
39
|
+
exports.readDecisionId = readDecisionId;
|
|
40
|
+
exports.readQuestionChoices = readQuestionChoices;
|
|
41
|
+
exports.readDecisionHeading = readDecisionHeading;
|
|
42
|
+
exports.derivePromptView = derivePromptView;
|
|
43
|
+
exports.readPromptView = readPromptView;
|
|
44
|
+
/**
|
|
45
|
+
* `promptData.type` for a frame nothing could classify. Same value as
|
|
46
|
+
* `UNCLASSIFIED_PROMPT_TYPE` in `types/models`, restated because this module may
|
|
47
|
+
* not import it (see the module note); the test asserts the two are equal.
|
|
48
|
+
*/
|
|
49
|
+
exports.UNCLASSIFIED_PROMPT_VIEW_TYPE = 'unclassified';
|
|
50
|
+
function promptHeadingMessage(heading) {
|
|
51
|
+
switch (heading.kind) {
|
|
52
|
+
case 'question':
|
|
53
|
+
return { text: heading.text };
|
|
54
|
+
case 'approval':
|
|
55
|
+
return heading.toolName
|
|
56
|
+
? { key: 'structuredApprovalTitle', values: { toolName: heading.toolName } }
|
|
57
|
+
: { key: 'structuredApprovalTitleNoTool' };
|
|
58
|
+
case 'agent-question':
|
|
59
|
+
return { key: 'structuredQuestionTitle' };
|
|
60
|
+
case 'unreadable':
|
|
61
|
+
return { key: 'unclassifiedTitle' };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// =============================================================================
|
|
65
|
+
// Field readers (moved from components/worktree/prompt-decision-id, #1932/#2039/#3181)
|
|
66
|
+
// =============================================================================
|
|
67
|
+
/**
|
|
68
|
+
* The option labels measured to be a text field on screen (Issue #2573).
|
|
69
|
+
* Restated from `TYPED_TEXT_FIELD_LABEL_PATTERNS` in
|
|
70
|
+
* `lib/detection/prompt-detect-multiple-choice`, whose graph reaches `fs`.
|
|
71
|
+
*/
|
|
72
|
+
exports.TYPED_TEXT_FIELD_LABEL_PATTERNS = [
|
|
73
|
+
/^[^\S\n]*type\s+something\b/i,
|
|
74
|
+
];
|
|
75
|
+
/**
|
|
76
|
+
* Whether an option is a text field on screen, so its answer is the typed TEXT
|
|
77
|
+
* rather than its number (Issue #2573). `requiresTextInput` alone is also true
|
|
78
|
+
* for a menu row such as `No, tell Command Code what to do differently`.
|
|
79
|
+
*/
|
|
80
|
+
function optionTakesTypedText(option) {
|
|
81
|
+
return option.requiresTextInput === true
|
|
82
|
+
&& exports.TYPED_TEXT_FIELD_LABEL_PATTERNS.some((pattern) => pattern.test(option.label));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The decision id a payload names, or null (Issue #1932). A validating read:
|
|
86
|
+
* absent, empty or not a string is "no addressable decision".
|
|
87
|
+
*/
|
|
88
|
+
function readDecisionId(source) {
|
|
89
|
+
if (!source)
|
|
90
|
+
return null;
|
|
91
|
+
const candidate = source.decisionId;
|
|
92
|
+
return typeof candidate === 'string' && candidate !== '' ? candidate : null;
|
|
93
|
+
}
|
|
94
|
+
function hasDecisionOptions(source) {
|
|
95
|
+
return Array.isArray(source.decisionOptions) && source.decisionOptions.length > 0;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The choices a question offers when it may be answered over the API, or null
|
|
99
|
+
* (Issue #2039). All three must hold: a decision id, exactly one question with
|
|
100
|
+
* a complete label list, and NO approval verdicts on the same payload.
|
|
101
|
+
*/
|
|
102
|
+
function readQuestionChoices(source) {
|
|
103
|
+
if (!source || readDecisionId(source) === null)
|
|
104
|
+
return null;
|
|
105
|
+
if (hasDecisionOptions(source))
|
|
106
|
+
return null;
|
|
107
|
+
const asked = source.askUserQuestion;
|
|
108
|
+
if (!asked || typeof asked.question !== 'string' || asked.question === '')
|
|
109
|
+
return null;
|
|
110
|
+
if (!Array.isArray(asked.labels) || asked.labels.length === 0)
|
|
111
|
+
return null;
|
|
112
|
+
const labels = asked.labels.filter((label) => typeof label === 'string' && label !== '');
|
|
113
|
+
// Partial is worse than none: the numbers are positions in this list.
|
|
114
|
+
if (labels.length !== asked.labels.length)
|
|
115
|
+
return null;
|
|
116
|
+
const questionCount = typeof asked.questionCount === 'number' ? asked.questionCount : 1;
|
|
117
|
+
if (questionCount !== 1)
|
|
118
|
+
return null;
|
|
119
|
+
return {
|
|
120
|
+
question: asked.question,
|
|
121
|
+
labels,
|
|
122
|
+
questionCount,
|
|
123
|
+
...(asked.custom === true ? { custom: true } : {}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** The heading for addressable choices, or null when there is nothing to click (#3181). */
|
|
127
|
+
function readDecisionHeading(source) {
|
|
128
|
+
if (!source || readDecisionId(source) === null)
|
|
129
|
+
return null;
|
|
130
|
+
if (hasDecisionOptions(source)) {
|
|
131
|
+
return {
|
|
132
|
+
kind: 'approval',
|
|
133
|
+
toolName: typeof source.toolName === 'string' && source.toolName ? source.toolName : null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return readQuestionChoices(source) ? { kind: 'question' } : null;
|
|
137
|
+
}
|
|
138
|
+
// =============================================================================
|
|
139
|
+
// The view
|
|
140
|
+
// =============================================================================
|
|
141
|
+
function screenChoices(source) {
|
|
142
|
+
const options = Array.isArray(source.options) ? source.options : [];
|
|
143
|
+
const choices = [];
|
|
144
|
+
for (const option of options) {
|
|
145
|
+
if (typeof option === 'string') {
|
|
146
|
+
// yes_no: `['yes', 'no']`, answered by the word itself.
|
|
147
|
+
choices.push({
|
|
148
|
+
answer: option,
|
|
149
|
+
label: option,
|
|
150
|
+
isDefault: source.defaultOption === option,
|
|
151
|
+
takesText: false,
|
|
152
|
+
});
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (!option || typeof option !== 'object')
|
|
156
|
+
continue;
|
|
157
|
+
const o = option;
|
|
158
|
+
if (typeof o.number !== 'number' || typeof o.label !== 'string')
|
|
159
|
+
continue;
|
|
160
|
+
choices.push({
|
|
161
|
+
answer: String(o.number),
|
|
162
|
+
label: o.label,
|
|
163
|
+
isDefault: o.isDefault === true,
|
|
164
|
+
takesText: optionTakesTypedText({ label: o.label, requiresTextInput: o.requiresTextInput === true }),
|
|
165
|
+
...(typeof o.description === 'string' ? { description: o.description } : {}),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return choices;
|
|
169
|
+
}
|
|
170
|
+
function decisionChoices(decisionOptions) {
|
|
171
|
+
if (!Array.isArray(decisionOptions))
|
|
172
|
+
return [];
|
|
173
|
+
const choices = [];
|
|
174
|
+
for (const option of decisionOptions) {
|
|
175
|
+
const o = option;
|
|
176
|
+
if (!o || typeof o.number !== 'number' || typeof o.label !== 'string')
|
|
177
|
+
continue;
|
|
178
|
+
choices.push({ answer: String(o.number), label: o.label, isDefault: false, takesText: false });
|
|
179
|
+
}
|
|
180
|
+
return choices;
|
|
181
|
+
}
|
|
182
|
+
const UNREADABLE_VIEW = {
|
|
183
|
+
kind: 'unreadable',
|
|
184
|
+
heading: { kind: 'unreadable' },
|
|
185
|
+
choices: [],
|
|
186
|
+
multiSelect: false,
|
|
187
|
+
freeText: null,
|
|
188
|
+
decisionId: null,
|
|
189
|
+
apiTarget: null,
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Decide how a prompt payload is shown and answered (Issue #3184).
|
|
193
|
+
*
|
|
194
|
+
* Evaluated in this order (design §2.3):
|
|
195
|
+
* 1. any `type` but the unclassified sentinel → `screen-choices`;
|
|
196
|
+
* 2. unclassified + decision id + approval verdicts → `api-choices` (approval);
|
|
197
|
+
* 3. unclassified + decision id + one complete question → `api-choices` (question);
|
|
198
|
+
* 4. every other unclassified payload — no id, #1932's options-without-id half
|
|
199
|
+
* state, and both stored history records — → `unreadable`.
|
|
200
|
+
*
|
|
201
|
+
* @param source - A live or stored prompt payload, or null
|
|
202
|
+
* @returns The view, or null when there is no prompt
|
|
203
|
+
*/
|
|
204
|
+
function derivePromptView(source) {
|
|
205
|
+
if (source == null)
|
|
206
|
+
return null;
|
|
207
|
+
if (source.type !== exports.UNCLASSIFIED_PROMPT_VIEW_TYPE) {
|
|
208
|
+
const choices = screenChoices(source);
|
|
209
|
+
return {
|
|
210
|
+
kind: 'screen-choices',
|
|
211
|
+
heading: { kind: 'question', text: typeof source.question === 'string' ? source.question : '' },
|
|
212
|
+
choices,
|
|
213
|
+
multiSelect: source.multiSelect === true,
|
|
214
|
+
freeText: choices.some((choice) => choice.takesText) ? { via: 'screen' } : null,
|
|
215
|
+
decisionId: null,
|
|
216
|
+
apiTarget: null,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const decisionId = readDecisionId(source);
|
|
220
|
+
if (decisionId !== null && hasDecisionOptions(source)) {
|
|
221
|
+
const choices = decisionChoices(source.decisionOptions);
|
|
222
|
+
if (choices.length > 0) {
|
|
223
|
+
return {
|
|
224
|
+
kind: 'api-choices',
|
|
225
|
+
heading: {
|
|
226
|
+
kind: 'approval',
|
|
227
|
+
toolName: typeof source.toolName === 'string' && source.toolName ? source.toolName : null,
|
|
228
|
+
},
|
|
229
|
+
choices,
|
|
230
|
+
multiSelect: false,
|
|
231
|
+
freeText: null,
|
|
232
|
+
decisionId,
|
|
233
|
+
apiTarget: 'approval',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const question = readQuestionChoices(source);
|
|
238
|
+
if (decisionId !== null && question !== null) {
|
|
239
|
+
return {
|
|
240
|
+
kind: 'api-choices',
|
|
241
|
+
heading: { kind: 'agent-question', text: question.question },
|
|
242
|
+
choices: question.labels.map((label, index) => ({
|
|
243
|
+
answer: String(index + 1),
|
|
244
|
+
label,
|
|
245
|
+
isDefault: false,
|
|
246
|
+
takesText: false,
|
|
247
|
+
})),
|
|
248
|
+
multiSelect: false,
|
|
249
|
+
freeText: question.custom === true ? { via: 'api' } : null,
|
|
250
|
+
decisionId,
|
|
251
|
+
apiTarget: 'question',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return UNREADABLE_VIEW;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The view a `current-output` payload carries, falling back to deriving it.
|
|
258
|
+
*
|
|
259
|
+
* `??`, not `||`: a server from before #3184 sends no `promptView`, and its
|
|
260
|
+
* absence means "this daemon does not publish the field" — the same function
|
|
261
|
+
* then decides from `promptData`, so old and new servers reach the same answer.
|
|
262
|
+
*/
|
|
263
|
+
function readPromptView(payload) {
|
|
264
|
+
if (!payload)
|
|
265
|
+
return null;
|
|
266
|
+
return payload.promptView ?? derivePromptView(payload.promptData);
|
|
267
|
+
}
|
|
@@ -410,7 +410,12 @@
|
|
|
410
410
|
"stats": "Show usage statistics",
|
|
411
411
|
"thinking": "Switch the model variant",
|
|
412
412
|
"web": "Pair another device with this OpenCode",
|
|
413
|
-
"worktrees": "Manage workspaces"
|
|
413
|
+
"worktrees": "Manage workspaces",
|
|
414
|
+
"artifact-capabilities": "Load the reference for what a published artifact can use, such as connectors and file downloads",
|
|
415
|
+
"artifact-diagramming": "Load guidance for drawing diagrams in artifacts that stay legible in light and dark themes",
|
|
416
|
+
"claude-in-chrome": "Have Claude carry out a task in your browser through Claude in Chrome",
|
|
417
|
+
"plugin-authoring": "Load the reference Claude uses to write a mod",
|
|
418
|
+
"slides": "Make a new Claude Slides presentation from your brief"
|
|
414
419
|
}
|
|
415
420
|
},
|
|
416
421
|
"session": {
|
|
@@ -556,6 +561,13 @@
|
|
|
556
561
|
"dialogCardLabel": "Terminal screen",
|
|
557
562
|
"unreadableHint": "Answer with the number shown on screen (1-9) or y/n. Enter confirms whatever the CLI has highlighted."
|
|
558
563
|
},
|
|
564
|
+
"sessionStarting": {
|
|
565
|
+
"title": "Starting {agent}…",
|
|
566
|
+
"titleWithElapsed": "Starting {agent}… {elapsed}",
|
|
567
|
+
"hint": "The terminal will appear once the agent is ready.",
|
|
568
|
+
"showTerminal": "Show terminal",
|
|
569
|
+
"label": "Agent starting"
|
|
570
|
+
},
|
|
559
571
|
"chatTranscript": {
|
|
560
572
|
"regionLabel": "Chat transcript",
|
|
561
573
|
"loading": "Loading messages",
|
|
@@ -410,7 +410,12 @@
|
|
|
410
410
|
"stats": "使用量の統計を表示",
|
|
411
411
|
"thinking": "モデルのバリアントを切り替え",
|
|
412
412
|
"web": "この OpenCode に別のデバイスをペアリング",
|
|
413
|
-
"worktrees": "ワークスペースを管理"
|
|
413
|
+
"worktrees": "ワークスペースを管理",
|
|
414
|
+
"artifact-capabilities": "公開アーティファクトで使える機能(コネクタ・ファイルのダウンロードなど)のリファレンスを読み込み",
|
|
415
|
+
"artifact-diagramming": "アーティファクトにライト・ダーク両方で読める図を描くためのガイダンスを読み込み",
|
|
416
|
+
"claude-in-chrome": "Claude in Chrome 経由でブラウザ上の作業を Claude に依頼",
|
|
417
|
+
"plugin-authoring": "mod を書くときに Claude が使うリファレンスを読み込み",
|
|
418
|
+
"slides": "指示から Claude Slides のプレゼンテーションを作成"
|
|
414
419
|
}
|
|
415
420
|
},
|
|
416
421
|
"session": {
|
|
@@ -556,6 +561,13 @@
|
|
|
556
561
|
"dialogCardLabel": "ターミナルの画面",
|
|
557
562
|
"unreadableHint": "画面に出ている番号(1〜9)か y/n で答えてください。Enter は選択中の項目をそのまま確定します。"
|
|
558
563
|
},
|
|
564
|
+
"sessionStarting": {
|
|
565
|
+
"title": "{agent} を起動中…",
|
|
566
|
+
"titleWithElapsed": "{agent} を起動中… {elapsed}",
|
|
567
|
+
"hint": "起動が終わるとターミナルを表示します。",
|
|
568
|
+
"showTerminal": "ターミナルを見る",
|
|
569
|
+
"label": "エージェントの起動中"
|
|
570
|
+
},
|
|
559
571
|
"chatTranscript": {
|
|
560
572
|
"regionLabel": "チャット履歴",
|
|
561
573
|
"loading": "メッセージを読み込み中",
|
package/dist/server/server.js
CHANGED
|
@@ -71,7 +71,7 @@ const ws_server_1 = require("./src/lib/ws-server");
|
|
|
71
71
|
const worktrees_1 = require("./src/lib/git/worktrees");
|
|
72
72
|
const db_instance_1 = require("./src/lib/db/db-instance");
|
|
73
73
|
const response_poller_1 = require("./src/lib/polling/response-poller");
|
|
74
|
-
const
|
|
74
|
+
const auto_yes_lifecycle_1 = require("./src/lib/auto-yes-lifecycle");
|
|
75
75
|
const schedule_manager_1 = require("./src/lib/schedule-manager");
|
|
76
76
|
const timer_manager_1 = require("./src/lib/timer-manager");
|
|
77
77
|
const resource_cleanup_1 = require("./src/lib/resource-cleanup");
|
|
@@ -825,8 +825,10 @@ app.prepare().then(() => {
|
|
|
825
825
|
}
|
|
826
826
|
// Stop polling first
|
|
827
827
|
(0, response_poller_1.stopAllPolling)();
|
|
828
|
-
// Issue #138: Stop all auto-yes pollers
|
|
829
|
-
|
|
828
|
+
// Issue #138: Stop all auto-yes pollers. Issue #3184: the `server-shutdown`
|
|
829
|
+
// row of the Auto-Yes lifecycle table — the state itself is in memory and
|
|
830
|
+
// goes with the process; nothing is persisted for the next start.
|
|
831
|
+
(0, auto_yes_lifecycle_1.releaseAutoYes)('server-shutdown', { scope: 'all' });
|
|
830
832
|
// Issue #294: Stop all scheduled executions (SIGKILL fire-and-forget)
|
|
831
833
|
(0, schedule_manager_1.stopAllSchedules)();
|
|
832
834
|
// Issue #534: Stop all timer-based delayed messages
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* How long a session may be shown as "starting" (Issue #3179).
|
|
4
|
+
*
|
|
5
|
+
* `lib/session/session-starting-state` records when an agent's launch began and
|
|
6
|
+
* clears the record when `BaseCLITool.startSession` returns or throws. These
|
|
7
|
+
* bounds are the escape hatches for the launches that do neither in time:
|
|
8
|
+
* several tools (antigravity, codex, gemini, copilot, Command Code) only LOG
|
|
9
|
+
* when their readiness wait runs out and carry on, so a launch that never
|
|
10
|
+
* became ready would otherwise be shown as starting for as long as the request
|
|
11
|
+
* lingered. Past the bound the screen falls back to what it showed before
|
|
12
|
+
* #3179 — the raw pane — so a human notices the stuck start.
|
|
13
|
+
*
|
|
14
|
+
* @module config/session-starting-config
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SESSION_STARTING_ELAPSED_THRESHOLD_MS = exports.SESSION_STARTING_PROMPT_GRACE_MS = exports.SESSION_STARTING_DEFAULT_WAIT_MS = exports.SESSION_STARTING_GRACE_MS = void 0;
|
|
18
|
+
exports.getSessionStartingMaxMs = getSessionStartingMaxMs;
|
|
19
|
+
exports.getSessionStartingMaxMsAcrossTools = getSessionStartingMaxMsAcrossTools;
|
|
20
|
+
const types_1 = require("../lib/cli-tools/types");
|
|
21
|
+
/**
|
|
22
|
+
* Slack added on top of a tool's own readiness wait, so the starting display
|
|
23
|
+
* outlives the wait it describes by a little rather than ending a beat before
|
|
24
|
+
* the launch reports.
|
|
25
|
+
*/
|
|
26
|
+
exports.SESSION_STARTING_GRACE_MS = 5_000;
|
|
27
|
+
/**
|
|
28
|
+
* The default readiness wait a launch performs (antigravity / codex / gemini /
|
|
29
|
+
* copilot / opencode / Command Code are all measured at about 30 s, counting
|
|
30
|
+
* their initial settle delay and their prompt wait).
|
|
31
|
+
*/
|
|
32
|
+
exports.SESSION_STARTING_DEFAULT_WAIT_MS = 30_000;
|
|
33
|
+
/**
|
|
34
|
+
* Per-tool readiness waits that differ from the default. Claude waits for its
|
|
35
|
+
* composer for up to `CLAUDE_INIT_TIMEOUT` (60 s); the literal is restated here
|
|
36
|
+
* rather than imported so this config module stays free of the session graph.
|
|
37
|
+
*/
|
|
38
|
+
const SESSION_STARTING_WAIT_MS = {
|
|
39
|
+
claude: 60_000,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The longest a launch of `cliToolId` is shown as starting, in ms.
|
|
43
|
+
*
|
|
44
|
+
* @param cliToolId - The tool being launched
|
|
45
|
+
* @returns Its readiness wait plus {@link SESSION_STARTING_GRACE_MS}
|
|
46
|
+
*/
|
|
47
|
+
function getSessionStartingMaxMs(cliToolId) {
|
|
48
|
+
return (SESSION_STARTING_WAIT_MS[cliToolId] ?? exports.SESSION_STARTING_DEFAULT_WAIT_MS)
|
|
49
|
+
+ exports.SESSION_STARTING_GRACE_MS;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The longest {@link getSessionStartingMaxMs} over every tool, in ms.
|
|
53
|
+
*
|
|
54
|
+
* A send to a worktree with no session launches the agent inside the request,
|
|
55
|
+
* so the client must wait at least this long (Issue #3194).
|
|
56
|
+
*/
|
|
57
|
+
function getSessionStartingMaxMsAcrossTools() {
|
|
58
|
+
return Math.max(...types_1.CLI_TOOL_IDS.map(getSessionStartingMaxMs));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* How long a dialog may stay on screen during a launch before it is treated as
|
|
62
|
+
* one the server will NOT answer (a login, an unknown dialog) and the starting
|
|
63
|
+
* display gives way to the raw pane.
|
|
64
|
+
*
|
|
65
|
+
* The dialogs the launch answers itself — the folder-trust screens of
|
|
66
|
+
* antigravity / codex / copilot / claude — are answered within one poll of the
|
|
67
|
+
* launch's readiness loop (≤ 1 s) plus the settle wait after the key, so they
|
|
68
|
+
* never reach this bound.
|
|
69
|
+
*/
|
|
70
|
+
exports.SESSION_STARTING_PROMPT_GRACE_MS = 5_000;
|
|
71
|
+
/**
|
|
72
|
+
* After how long the client starts printing the elapsed time next to
|
|
73
|
+
* "<agent> を起動中…".
|
|
74
|
+
*/
|
|
75
|
+
exports.SESSION_STARTING_ELAPSED_THRESHOLD_MS = 5_000;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* When Auto-Yes state is released, decided in one table (Issue #3184).
|
|
4
|
+
*
|
|
5
|
+
* Auto-Yes lives per worktree x instance with its own expiry, independent of
|
|
6
|
+
* the session it answers for. Every path that ends that relationship — a killed
|
|
7
|
+
* session (#3182), a removed instance, a deleted worktree, the orphan sweep,
|
|
8
|
+
* a poller giving up on errors, server shutdown — used to decide for itself
|
|
9
|
+
* what to do with the state, and one of them (instance removal) decided
|
|
10
|
+
* nothing at all, leaving a grant that silently approved the next session to
|
|
11
|
+
* claim the id. {@link AUTO_YES_LIFECYCLE} is the decision; each path calls
|
|
12
|
+
* {@link releaseAutoYes} (or its two halves) with the event it is.
|
|
13
|
+
*
|
|
14
|
+
* ## disable vs delete
|
|
15
|
+
*
|
|
16
|
+
* - `disable` keeps the entry with `enabled: false` (and the `stopReason`), for
|
|
17
|
+
* an instance that still exists — the UI can say why Auto-Yes went off.
|
|
18
|
+
* - `delete` drops the entry, for an instance or worktree that no longer
|
|
19
|
+
* exists. Kept, it would never be swept: the orphan sweep works per worktree.
|
|
20
|
+
*
|
|
21
|
+
* ## Not in the table
|
|
22
|
+
*
|
|
23
|
+
* Manual disable, expiry and the stop pattern are Auto-Yes's own conditions,
|
|
24
|
+
* not lifecycle events, and stay in `auto-yes-state` / the auto-yes route. A
|
|
25
|
+
* worktree ID rename MOVES the state (`worktree-session-reconcile`) rather than
|
|
26
|
+
* releasing it. The "starting" record (#3179) is cleared by kill-session beside
|
|
27
|
+
* this call, not by it: it has its own token rules (#3195).
|
|
28
|
+
*
|
|
29
|
+
* ## Imports go through the auto-yes-manager barrel
|
|
30
|
+
*
|
|
31
|
+
* The cleanup modules' tests mock `@/lib/polling/auto-yes-manager`, and so must
|
|
32
|
+
* this module's imports resolve to it. That barrel re-exports the poller, so
|
|
33
|
+
* `auto-yes-poller` must NOT import this module (it would be a cycle); its
|
|
34
|
+
* consecutive-errors path applies the same row directly, and
|
|
35
|
+
* `tests/unit/lib/auto-yes-lifecycle-3184.test.ts` holds the two equal.
|
|
36
|
+
*
|
|
37
|
+
* @module lib/auto-yes-lifecycle
|
|
38
|
+
*/
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.AUTO_YES_LIFECYCLE = void 0;
|
|
41
|
+
exports.stopAutoYesPollersFor = stopAutoYesPollersFor;
|
|
42
|
+
exports.applyAutoYesStateRule = applyAutoYesStateRule;
|
|
43
|
+
exports.releaseAutoYes = releaseAutoYes;
|
|
44
|
+
const auto_yes_manager_1 = require("./polling/auto-yes-manager");
|
|
45
|
+
/**
|
|
46
|
+
* The table (design §8.2).
|
|
47
|
+
*
|
|
48
|
+
* `session-killed` is #3182's decision as #3188 shipped it: disable with no
|
|
49
|
+
* reason (no new reason was added), for the instance only. `server-shutdown`
|
|
50
|
+
* deliberately does not persist anything: the state lives in memory, and a
|
|
51
|
+
* restarted server starting with every grant off is the safe side.
|
|
52
|
+
*/
|
|
53
|
+
exports.AUTO_YES_LIFECYCLE = {
|
|
54
|
+
'session-killed': { state: 'disable', poller: 'stop' },
|
|
55
|
+
'instance-removed': { state: 'delete', poller: 'stop' },
|
|
56
|
+
'worktree-deleted': { state: 'delete', poller: 'stop' },
|
|
57
|
+
'orphan-swept': { state: 'delete', poller: 'stop' },
|
|
58
|
+
'consecutive-errors': { state: 'disable', stopReason: 'consecutive_errors', poller: 'stop' },
|
|
59
|
+
'server-shutdown': { state: 'none', poller: 'stop' },
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Stop the pollers the event's target names (the poller half of the table).
|
|
63
|
+
* Separate from {@link applyAutoYesStateRule} so a caller that reports the two
|
|
64
|
+
* failures apart (`session-cleanup`) can keep doing so.
|
|
65
|
+
*/
|
|
66
|
+
function stopAutoYesPollersFor(event, target) {
|
|
67
|
+
if (exports.AUTO_YES_LIFECYCLE[event].poller !== 'stop')
|
|
68
|
+
return;
|
|
69
|
+
switch (target.scope) {
|
|
70
|
+
case 'instance':
|
|
71
|
+
(0, auto_yes_manager_1.stopAutoYesPolling)((0, auto_yes_manager_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
72
|
+
return;
|
|
73
|
+
case 'worktree':
|
|
74
|
+
(0, auto_yes_manager_1.stopAutoYesPollingByWorktree)(target.worktreeId);
|
|
75
|
+
return;
|
|
76
|
+
case 'key':
|
|
77
|
+
(0, auto_yes_manager_1.stopAutoYesPolling)(target.compositeKey);
|
|
78
|
+
return;
|
|
79
|
+
case 'all':
|
|
80
|
+
(0, auto_yes_manager_1.stopAllAutoYesPolling)();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function disableKey(compositeKey, stopReason) {
|
|
85
|
+
const cliToolId = (0, auto_yes_manager_1.extractCliToolId)(compositeKey);
|
|
86
|
+
if (!cliToolId)
|
|
87
|
+
return;
|
|
88
|
+
(0, auto_yes_manager_1.disableAutoYes)((0, auto_yes_manager_1.extractWorktreeId)(compositeKey), cliToolId, stopReason, (0, auto_yes_manager_1.extractInstanceId)(compositeKey) ?? undefined);
|
|
89
|
+
}
|
|
90
|
+
/** Apply the event's state rule to its target (the state half of the table). */
|
|
91
|
+
function applyAutoYesStateRule(event, target) {
|
|
92
|
+
const rule = exports.AUTO_YES_LIFECYCLE[event];
|
|
93
|
+
if (rule.state === 'none')
|
|
94
|
+
return;
|
|
95
|
+
switch (target.scope) {
|
|
96
|
+
case 'instance':
|
|
97
|
+
if (rule.state === 'disable') {
|
|
98
|
+
(0, auto_yes_manager_1.disableAutoYes)(target.worktreeId, target.cliToolId, rule.stopReason, target.instanceId);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
(0, auto_yes_manager_1.deleteAutoYesState)((0, auto_yes_manager_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
case 'worktree':
|
|
105
|
+
if (rule.state === 'disable') {
|
|
106
|
+
(0, auto_yes_manager_1.getCompositeKeysByWorktree)(target.worktreeId).forEach((key) => disableKey(key, rule.stopReason));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
(0, auto_yes_manager_1.deleteAutoYesStateByWorktree)(target.worktreeId);
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
case 'key':
|
|
113
|
+
if (rule.state === 'disable') {
|
|
114
|
+
disableKey(target.compositeKey, rule.stopReason);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
(0, auto_yes_manager_1.deleteAutoYesState)(target.compositeKey);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
case 'all':
|
|
121
|
+
(0, auto_yes_manager_1.getAutoYesStateCompositeKeys)().forEach((key) => rule.state === 'disable' ? disableKey(key, rule.stopReason) : (0, auto_yes_manager_1.deleteAutoYesState)(key));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Release Auto-Yes for an event: stop the pollers first, then apply the state
|
|
127
|
+
* rule — the order `session-cleanup` has kept since #404. Both halves are
|
|
128
|
+
* synchronous, so no poll can run between them.
|
|
129
|
+
*/
|
|
130
|
+
function releaseAutoYes(event, target) {
|
|
131
|
+
stopAutoYesPollersFor(event, target);
|
|
132
|
+
applyAutoYesStateRule(event, target);
|
|
133
|
+
}
|
|
@@ -65,6 +65,7 @@ const antigravity_permission_receipts_1 = require("./polling/antigravity-permiss
|
|
|
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
67
|
const detect_1 = require("./detection/tools/codex/detect");
|
|
68
|
+
const frame_1 = require("./detection/tools/frame");
|
|
68
69
|
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
69
70
|
const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
|
|
70
71
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
@@ -182,6 +183,13 @@ function incrementErrorCount(compositeKey) {
|
|
|
182
183
|
pollerState.consecutiveErrors++;
|
|
183
184
|
pollerState.currentInterval = (0, auto_yes_state_1.calculateBackoffInterval)(pollerState.consecutiveErrors);
|
|
184
185
|
// Issue #499 Item 5: Auto-stop after consecutive error threshold.
|
|
186
|
+
//
|
|
187
|
+
// Issue #3184: this is the `consecutive-errors` row of AUTO_YES_LIFECYCLE
|
|
188
|
+
// (`lib/auto-yes-lifecycle`) — disable with `consecutive_errors`, stop the
|
|
189
|
+
// poller — applied here directly rather than through `releaseAutoYes`:
|
|
190
|
+
// that module reaches this one through the auto-yes-manager barrel, so
|
|
191
|
+
// importing it back would be a cycle. `auto-yes-lifecycle-3184.test.ts`
|
|
192
|
+
// holds this call and the table row equal.
|
|
185
193
|
if (pollerState.consecutiveErrors >= auto_yes_config_1.AUTO_STOP_ERROR_THRESHOLD) {
|
|
186
194
|
const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
|
|
187
195
|
const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
|
|
@@ -439,7 +447,14 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
439
447
|
// such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
|
|
440
448
|
// says so.
|
|
441
449
|
const receiptScope = { worktreeId, instanceId };
|
|
442
|
-
|
|
450
|
+
// Issue #3183: the ONE frame every judgement below reads — normalised once,
|
|
451
|
+
// from the capture as captured (the input-box markers are rule rows the
|
|
452
|
+
// cleaned spelling has blanked), and handed as the same object to the
|
|
453
|
+
// prompt reading, the codex launch guards and the dialog gate. That is what
|
|
454
|
+
// makes "the status chain and Auto-Yes read the same live region" a fact
|
|
455
|
+
// rather than a hope: there is no second normalisation to disagree with.
|
|
456
|
+
const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
|
|
457
|
+
const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
|
|
443
458
|
if (!promptDetection.isPrompt || !promptDetection.promptData) {
|
|
444
459
|
pollerState.lastAnsweredPromptKey = null;
|
|
445
460
|
pollerState.lastAnsweredAt = null;
|
|
@@ -473,7 +488,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
473
488
|
// to the tool. Auto-answer layer only: the detection above still reports the
|
|
474
489
|
// prompt, so the human keeps seeing the screen and the response poller
|
|
475
490
|
// still notifies them about it.
|
|
476
|
-
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(
|
|
491
|
+
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
|
|
477
492
|
if (launchDialog) {
|
|
478
493
|
// Recorded through the #1684 channel so `capture --json` and `cmate wait`
|
|
479
494
|
// can name the reason instead of showing a worker that went quiet.
|
|
@@ -498,7 +513,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
498
513
|
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
499
514
|
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
500
515
|
// recognised the frame and deliberately declined it.
|
|
501
|
-
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(
|
|
516
|
+
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
|
|
502
517
|
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
503
518
|
reason: 'unclassified-frame',
|
|
504
519
|
mode: null,
|
|
@@ -529,7 +544,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
529
544
|
// Recorded through the #1684 channel with the reason code #1924 landed for
|
|
530
545
|
// exactly this position, so `capture --json` and `cmate wait` can name the
|
|
531
546
|
// gap instead of showing a worker that silently went quiet.
|
|
532
|
-
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type,
|
|
547
|
+
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type, frame);
|
|
533
548
|
if (!dialogGate.allowed) {
|
|
534
549
|
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
535
550
|
reason: 'unclassified-frame',
|
|
@@ -26,6 +26,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
|
|
|
26
26
|
const logger_1 = require("../../lib/logger");
|
|
27
27
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
28
28
|
const install_hints_1 = require("./install-hints");
|
|
29
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
29
30
|
const logger = (0, logger_1.createLogger)('cli-tools/antigravity');
|
|
30
31
|
/**
|
|
31
32
|
* Extract error message from unknown error type (DRY).
|
|
@@ -149,7 +150,7 @@ function readInputBoxStatusRow(contentLines) {
|
|
|
149
150
|
* @returns True when the input box is live and agy is idle
|
|
150
151
|
*/
|
|
151
152
|
function isAntigravityReady(output) {
|
|
152
|
-
const frame = (0, frame_1.normalizeFrame)(output);
|
|
153
|
+
const frame = (0, frame_1.normalizeFrame)(output, 'antigravity');
|
|
153
154
|
if (cli_patterns_1.ANTIGRAVITY_SELECTION_LIST_PATTERN.test(frame.lastLines))
|
|
154
155
|
return false;
|
|
155
156
|
if (ANTIGRAVITY_TRUST_DIALOG_PATTERN.test(frame.lastLines))
|
|
@@ -254,7 +255,7 @@ class AntigravityTool extends base_1.BaseCLITool {
|
|
|
254
255
|
worktreePath,
|
|
255
256
|
});
|
|
256
257
|
const launchCommand = model ? `${base} --model ${shellSingleQuote(model)}` : base;
|
|
257
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
258
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
258
259
|
// Wait for agy to initialize
|
|
259
260
|
await new Promise((resolve) => setTimeout(resolve, ANTIGRAVITY_INIT_WAIT_MS));
|
|
260
261
|
// Poll until the interactive prompt is ready (handles the trust dialog)
|