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
|
@@ -22,6 +22,7 @@ exports.stopResourceCleanup = stopResourceCleanup;
|
|
|
22
22
|
const child_process_1 = require("child_process");
|
|
23
23
|
const fs_1 = require("fs");
|
|
24
24
|
const auto_yes_manager_1 = require("./polling/auto-yes-manager");
|
|
25
|
+
const auto_yes_lifecycle_1 = require("./auto-yes-lifecycle");
|
|
25
26
|
const path_validator_1 = require("./security/path-validator");
|
|
26
27
|
const schedule_manager_1 = require("./schedule-manager");
|
|
27
28
|
const timer_manager_1 = require("./timer-manager");
|
|
@@ -174,18 +175,19 @@ function cleanupOrphanedMapEntries() {
|
|
|
174
175
|
// If DB query returned nothing, skip cleanup to avoid false positives
|
|
175
176
|
return result;
|
|
176
177
|
}
|
|
177
|
-
// Cleanup autoYesStates (Issue #525: composite keys)
|
|
178
|
+
// Cleanup autoYesStates (Issue #525: composite keys). Issue #3184: through the
|
|
179
|
+
// `orphan-swept` row of the Auto-Yes lifecycle table.
|
|
178
180
|
const autoYesStateKeys = (0, auto_yes_manager_1.getAutoYesStateCompositeKeys)();
|
|
179
181
|
for (const compositeKey of autoYesStateKeys) {
|
|
180
182
|
const worktreeId = (0, auto_yes_manager_1.extractWorktreeId)(compositeKey);
|
|
181
183
|
// [SEC4-MF-001] Validate extracted worktreeId
|
|
182
184
|
if (!(0, path_validator_1.isValidWorktreeId)(worktreeId)) {
|
|
183
|
-
(0,
|
|
185
|
+
(0, auto_yes_lifecycle_1.applyAutoYesStateRule)('orphan-swept', { scope: 'key', compositeKey });
|
|
184
186
|
result.deletedAutoYesStateIds.push(compositeKey);
|
|
185
187
|
continue;
|
|
186
188
|
}
|
|
187
189
|
if (!validWorktreeIds.has(worktreeId)) {
|
|
188
|
-
(0,
|
|
190
|
+
(0, auto_yes_lifecycle_1.applyAutoYesStateRule)('orphan-swept', { scope: 'key', compositeKey });
|
|
189
191
|
result.deletedAutoYesStateIds.push(compositeKey);
|
|
190
192
|
}
|
|
191
193
|
}
|
|
@@ -194,7 +196,7 @@ function cleanupOrphanedMapEntries() {
|
|
|
194
196
|
for (const compositeKey of autoYesPollerKeys) {
|
|
195
197
|
const worktreeId = (0, auto_yes_manager_1.extractWorktreeId)(compositeKey);
|
|
196
198
|
if (!(0, path_validator_1.isValidWorktreeId)(worktreeId) || !validWorktreeIds.has(worktreeId)) {
|
|
197
|
-
(0,
|
|
199
|
+
(0, auto_yes_lifecycle_1.stopAutoYesPollersFor)('orphan-swept', { scope: 'key', compositeKey });
|
|
198
200
|
result.deletedAutoYesPollerIds.push(compositeKey);
|
|
199
201
|
}
|
|
200
202
|
}
|
|
@@ -43,6 +43,7 @@ exports.buildAgentLaunchCommandLine = buildAgentLaunchCommandLine;
|
|
|
43
43
|
const sources_1 = require("../../lib/hooks/sources");
|
|
44
44
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
45
45
|
const session_generation_archive_1 = require("../../lib/session/session-generation-archive");
|
|
46
|
+
const session_starting_state_1 = require("../../lib/session/session-starting-state");
|
|
46
47
|
const logger_1 = require("../../lib/logger");
|
|
47
48
|
const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle');
|
|
48
49
|
/**
|
|
@@ -66,6 +67,16 @@ const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle')
|
|
|
66
67
|
* @param at - Epoch ms; defaults to now
|
|
67
68
|
*/
|
|
68
69
|
function beginAgentSession(target, at = Date.now()) {
|
|
70
|
+
// Issue #3179: the launch is in progress from here until
|
|
71
|
+
// `BaseCLITool.startSession` returns or throws (it clears the record in a
|
|
72
|
+
// `finally`). First, so the screen stops reading the about-to-be-created pane
|
|
73
|
+
// as a running agent before anything else here can fail.
|
|
74
|
+
// Issue #3195: the record is written under the token `startSession` is
|
|
75
|
+
// running the launch with (an `AsyncLocalStorage`, read inside
|
|
76
|
+
// `markSessionStarting`), which is how that `finally` knows the record is
|
|
77
|
+
// its own. A second call from the same launch (codex's
|
|
78
|
+
// `relaunchIntoSamePane`) rewrites the same launch's record.
|
|
79
|
+
(0, session_starting_state_1.markSessionStarting)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
69
80
|
const before = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
70
81
|
(0, agent_event_state_1.beginAgentEventGeneration)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
71
82
|
const after = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
@@ -36,6 +36,7 @@ const cmate_cli_tool_parser_1 = require("../../lib/cmate-cli-tool-parser");
|
|
|
36
36
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
37
37
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
38
38
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
39
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
39
40
|
const logger = (0, logger_1.createLogger)('claude-session');
|
|
40
41
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
41
42
|
// ----- Helper Functions -----
|
|
@@ -429,6 +430,11 @@ function findSessionErrorPattern(cleanOutput) {
|
|
|
429
430
|
* reading as a zsh prompt. What changed is that six other tools can now be
|
|
430
431
|
* asked the same question; see `lib/cli-tools/liveness-spec`.
|
|
431
432
|
*
|
|
433
|
+
* Issue #3191: a `user@host …` prompt of 40 characters or more is now read as
|
|
434
|
+
* the shell too (claude's spec takes `SHELL_PROMPT_LINE_PATTERNS`), so a claude
|
|
435
|
+
* that was `/exit`ed into a long zsh / bash prompt is reported unhealthy and
|
|
436
|
+
* relaunched instead of timing out the next send.
|
|
437
|
+
*
|
|
432
438
|
* @param sessionName - tmux session name
|
|
433
439
|
* @returns HealthCheckResult with healthy status and optional reason
|
|
434
440
|
*/
|
|
@@ -674,7 +680,7 @@ async function startClaudeSession(options) {
|
|
|
674
680
|
// and the operator's `~/.claude/settings.json` (measured on 2.1.278).
|
|
675
681
|
const launchCommand = model === undefined ? baseLaunchCommand : `${baseLaunchCommand} --model ${(0, hook_settings_generator_1.shellQuote)(model)}`;
|
|
676
682
|
// Start Claude CLI in interactive mode using dynamically resolved path
|
|
677
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
683
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
678
684
|
// Wait for Claude to initialize with dynamic detection (OCP-001)
|
|
679
685
|
// Use constants instead of hardcoded values
|
|
680
686
|
const maxWaitTime = exports.CLAUDE_INIT_TIMEOUT;
|
|
@@ -55,6 +55,7 @@ const db_1 = require("../../lib/db");
|
|
|
55
55
|
// when this instance was last handed a prompt.
|
|
56
56
|
const chat_db_1 = require("../../lib/db/chat-db");
|
|
57
57
|
const unclassified_frame_tracker_1 = require("../../lib/detection/unclassified-frame-tracker");
|
|
58
|
+
const session_starting_state_1 = require("../../lib/session/session-starting-state");
|
|
58
59
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
59
60
|
const upstream_faults_1 = require("../../lib/detection/upstream-faults");
|
|
60
61
|
const opencode_pane_obstruction_1 = require("../../lib/detection/opencode-pane-obstruction");
|
|
@@ -85,6 +86,7 @@ const prompt_waiting_composition_1 = require("../../lib/session/prompt-waiting-c
|
|
|
85
86
|
const provisional_turn_1 = require("../../lib/session/provisional-turn");
|
|
86
87
|
const status_evidence_1 = require("../../lib/session/status-evidence");
|
|
87
88
|
const ask_user_question_prompt_1 = require("../../lib/session/ask-user-question-prompt");
|
|
89
|
+
const prompt_view_1 = require("../../lib/session/prompt-view");
|
|
88
90
|
const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
|
|
89
91
|
const layer_disagreement_1 = require("../../lib/session/layer-disagreement");
|
|
90
92
|
const structured_prompt_1 = require("../../lib/session/structured-prompt");
|
|
@@ -608,7 +610,8 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId, resolut
|
|
|
608
610
|
// surface is actually being watched at, which is exactly the property the
|
|
609
611
|
// terminal snapshot already has. Gated on the merged verdict (`'running'`, not
|
|
610
612
|
// the tmux-session-exists `isRunning`) so an idle pane reads no transcript.
|
|
611
|
-
|
|
613
|
+
// Issue #3179: not during a launch — there is no turn to publish yet.
|
|
614
|
+
if (payload.isRunning && payload.sessionStatus === 'running' && payload.startingSince == null) {
|
|
612
615
|
// Issue #2248 made this an `await`, and it buys less than it looks like: the
|
|
613
616
|
// expensive half — the transcript read and the broadcast — is detached
|
|
614
617
|
// inside, so what is waited for is a worktree row and a Map lookup. What it
|
|
@@ -750,6 +753,10 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
750
753
|
(0, status_evidence_1.forgetLastKnownStatus)((0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
|
|
751
754
|
return {
|
|
752
755
|
isRunning: false,
|
|
756
|
+
// Issue #3179: `beginAgentSession` runs before the pane is created, so a
|
|
757
|
+
// launch can be in progress with no tmux session yet. Read-only here —
|
|
758
|
+
// there is no frame to judge a dialog on.
|
|
759
|
+
startingSince: (0, session_starting_state_1.getSessionStartingSince)(worktreeId, cliToolId, instanceId),
|
|
753
760
|
sessionName,
|
|
754
761
|
content: '',
|
|
755
762
|
lineCount: 0,
|
|
@@ -828,7 +835,17 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
828
835
|
const compositeKey = (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
829
836
|
const lastServerResponseTimestamp = (0, auto_yes_manager_1.getLastServerResponseTimestamp)(compositeKey);
|
|
830
837
|
const lastOutputTimestamp = lastServerResponseTimestamp ? new Date(lastServerResponseTimestamp) : undefined;
|
|
831
|
-
const
|
|
838
|
+
const rawStatusResult = (0, status_detector_1.detectSessionStatus)(output, cliToolId, lastOutputTimestamp);
|
|
839
|
+
// Issue #3179: a launch in progress. The frame is a shell prompt and the
|
|
840
|
+
// launch line, or a dialog the launch is about to answer, and none of the
|
|
841
|
+
// flags below may be read off it: the floor verdict raised the Navigate pad,
|
|
842
|
+
// the trust dialog raised the selection list / prompt sheet. A dialog that
|
|
843
|
+
// outstays the launch's own answer releases the record (a login, an unknown
|
|
844
|
+
// dialog), and from then on this is the ordinary verdict again.
|
|
845
|
+
const startingSince = (0, session_starting_state_1.observeSessionStartingFrame)(worktreeId, cliToolId, instanceId, rawStatusResult.status === 'waiting' || rawStatusResult.hasActivePrompt);
|
|
846
|
+
const statusResult = startingSince === null
|
|
847
|
+
? rawStatusResult
|
|
848
|
+
: (0, session_starting_state_1.startingStatusResult)(rawStatusResult);
|
|
832
849
|
// Issue #1912: every `running` reason that means "the agent is producing
|
|
833
850
|
// output", not just `thinking_indicator`. opencode answers
|
|
834
851
|
// `opencode_processing_indicator` for its `esc interrupt` footer, which is
|
|
@@ -946,7 +963,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
946
963
|
// the guard cannot disagree about whether a prompt is open. What they are
|
|
947
964
|
// still allowed to differ on is what to DO about it — see `blocksSend`, which
|
|
948
965
|
// bounds the structured layer's veto over sends and leaves this flag alone.
|
|
949
|
-
|
|
966
|
+
// Issue #3179: not while a launch is in progress. The scraper half is already
|
|
967
|
+
// neutralised above; this also drops a structured wait the launch inherited.
|
|
968
|
+
const isPromptWaiting = startingSince === null && promptResolution.waiting;
|
|
950
969
|
// Issue #1726: the agent's own account of what it asked. It contributes only
|
|
951
970
|
// where some other layer has already established that a dialog is on screen —
|
|
952
971
|
// this record decides no status of its own, because Claude emits nothing at
|
|
@@ -1033,13 +1052,15 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1033
1052
|
// instead of by coincidence.)
|
|
1034
1053
|
patterns: decisionOptions !== null ? promptWaiting.patterns : null,
|
|
1035
1054
|
};
|
|
1036
|
-
const promptData =
|
|
1037
|
-
?
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
:
|
|
1055
|
+
const promptData = startingSince !== null
|
|
1056
|
+
? null
|
|
1057
|
+
: scraperPromptWaiting
|
|
1058
|
+
? correctedPromptData ??
|
|
1059
|
+
scraperPromptData ??
|
|
1060
|
+
(structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts) : null)
|
|
1061
|
+
: structuredFacts
|
|
1062
|
+
? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts)
|
|
1063
|
+
: null;
|
|
1043
1064
|
// Issue #2870: whether `/prompt-response` would answer the prompt published
|
|
1044
1065
|
// above, read by the SAME function it re-verifies with. In #2868 `promptData`
|
|
1045
1066
|
// came off the generic parser alone, the route refused it, and the UI's Send
|
|
@@ -1111,7 +1132,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1111
1132
|
// and the 60 seconds — start afresh if the frame is still unreadable once the
|
|
1112
1133
|
// decision is gone (answered, expired, or the source dropped).
|
|
1113
1134
|
const answerableOverAgentApi = (0, structured_prompt_1.hasApiAnswerableDecision)(eventSource.capabilities.eventIdentity, structuredEvents.pendingDecisions ?? []);
|
|
1114
|
-
|
|
1135
|
+
// Issue #3179: a launch in progress is not a detection failure — its frame is
|
|
1136
|
+
// the shell and the launch line — so no row, and the run starts afresh after.
|
|
1137
|
+
const unclassifiedVerdict = (0, unclassified_frame_tracker_1.observeUnclassifiedFrame)(compositeKey, merged.isUnclassifiedActive && !answerableOverAgentApi && startingSince === null);
|
|
1115
1138
|
if (unclassifiedVerdict.shouldRecord) {
|
|
1116
1139
|
recordUnclassifiedFrame(db, {
|
|
1117
1140
|
worktreeId,
|
|
@@ -1197,32 +1220,40 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1197
1220
|
// `sessionStatus` it sat next to one poll earlier. Observed before it is read
|
|
1198
1221
|
// so a positive poll reports itself, which is what keeps the field from
|
|
1199
1222
|
// looking stale on a healthy session.
|
|
1223
|
+
// Issue #3179: the structured layer cannot override a launch in progress
|
|
1224
|
+
// either — a `waiting` it inherited would put the answer sheet back.
|
|
1225
|
+
const published = startingSince === null
|
|
1226
|
+
? merged
|
|
1227
|
+
: { ...merged, status: 'running', reason: status_detector_1.STATUS_REASON.STARTING, thinking: false };
|
|
1200
1228
|
(0, status_evidence_1.observeStatusEvidence)(compositeKey, {
|
|
1201
|
-
status:
|
|
1202
|
-
reason:
|
|
1203
|
-
evidence:
|
|
1229
|
+
status: published.status,
|
|
1230
|
+
reason: published.reason,
|
|
1231
|
+
evidence: published.evidence,
|
|
1204
1232
|
});
|
|
1205
1233
|
const lastKnown = (0, status_evidence_1.getLastKnownStatus)(compositeKey);
|
|
1206
1234
|
return {
|
|
1207
1235
|
isRunning: true,
|
|
1208
1236
|
sessionName,
|
|
1209
1237
|
cliToolId,
|
|
1210
|
-
sessionStatus:
|
|
1211
|
-
sessionStatusReason:
|
|
1238
|
+
sessionStatus: published.status,
|
|
1239
|
+
sessionStatusReason: published.reason,
|
|
1212
1240
|
content: newContent,
|
|
1213
1241
|
fullOutput: output,
|
|
1214
1242
|
realtimeSnippet,
|
|
1215
1243
|
lineCount: totalLines,
|
|
1216
1244
|
lastCapturedLine,
|
|
1217
1245
|
isComplete: isPromptWaiting,
|
|
1218
|
-
isGenerating:
|
|
1219
|
-
thinking:
|
|
1246
|
+
isGenerating: published.thinking,
|
|
1247
|
+
thinking: published.thinking,
|
|
1220
1248
|
// Issue #2607: named after the tool actually running. A fixed "Claude" was
|
|
1221
1249
|
// published for every agent, and `capture --json` readers took it at its word.
|
|
1222
|
-
thinkingMessage:
|
|
1250
|
+
thinkingMessage: published.thinking ? `${(0, types_2.getCliToolDisplayName)(cliToolId)} is thinking...` : null,
|
|
1223
1251
|
isPromptWaiting,
|
|
1224
1252
|
promptData,
|
|
1225
1253
|
...(promptAnswerable !== undefined ? { promptAnswerable } : {}),
|
|
1254
|
+
// Issue #3184: appended next to the value it is derived from, not at the end
|
|
1255
|
+
// — it is a reading of `promptData`, and only of it.
|
|
1256
|
+
promptView: (0, prompt_view_1.derivePromptView)(promptData),
|
|
1226
1257
|
autoYes: {
|
|
1227
1258
|
enabled: autoYesState?.enabled ?? false,
|
|
1228
1259
|
expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
|
|
@@ -1235,11 +1266,12 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1235
1266
|
isSelectionListActive,
|
|
1236
1267
|
isPagerActive,
|
|
1237
1268
|
isDismissablePanelActive,
|
|
1238
|
-
isUnclassifiedActive: merged.isUnclassifiedActive,
|
|
1269
|
+
isUnclassifiedActive: startingSince === null && merged.isUnclassifiedActive,
|
|
1270
|
+
startingSince,
|
|
1239
1271
|
// Issue #1926: the same fact `isUnclassifiedActive` carries, named the way
|
|
1240
1272
|
// §4 D1 names it. Published from the merged verdict so the two cannot
|
|
1241
1273
|
// disagree on the wire.
|
|
1242
|
-
statusEvidence:
|
|
1274
|
+
statusEvidence: published.evidence,
|
|
1243
1275
|
lastKnownStatus: lastKnown?.status ?? null,
|
|
1244
1276
|
lastKnownStatusAt: lastKnown?.at ?? null,
|
|
1245
1277
|
lastServerResponseTimestamp,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Keep the launch line off the pane (Issue #3180).
|
|
4
|
+
*
|
|
5
|
+
* Every `startSession` types its launch line into the pane's login shell —
|
|
6
|
+
* `CM_HOOK_URL='…' CM_PERMISSION_HOOK_URL='…' CM_PORT='3000' 'agy'` — and the
|
|
7
|
+
* shell echoes it. A tool that repaints the whole screen hides the echo once it
|
|
8
|
+
* draws; agy and codex draw inline, so the line, with its internal URL, port
|
|
9
|
+
* and worktree ID, stayed in the scrollback for the life of the session.
|
|
10
|
+
*
|
|
11
|
+
* `clear` runs in the same shell, before the agent, so the echo is wiped before
|
|
12
|
+
* the agent paints. The shell stays the agent's parent exactly as before, which
|
|
13
|
+
* is what keeps exit detection (`judgeToolLiveness`, `relaunchIfToolExited`)
|
|
14
|
+
* unchanged: when the agent quits, the pane falls back to the same shell prompt.
|
|
15
|
+
*
|
|
16
|
+
* `clear` alone only empties the visible screen. tmux 3.4+ defaults to
|
|
17
|
+
* `scroll-on-clear on`, which moves what `clear` wiped INTO the scrollback, and
|
|
18
|
+
* CommandMate's capture reads the scrollback: in the 2026-10-04 UAT (tmux 3.5a)
|
|
19
|
+
* codex, antigravity, Command Code and gemini still had the launch line twice in
|
|
20
|
+
* `tmux capture-pane -p -J -S -` (two `CM_HOOK_URL` hits), and it surfaced in the
|
|
21
|
+
* UI terminal and in codex's trust-dialog sheet. So `printf '\033[3J'` follows
|
|
22
|
+
* `clear`: ESC [3J (Erase Saved Lines) drops the scrollback, the echo included.
|
|
23
|
+
* `tmux clear-history` would also work but depends on the pane having a tmux
|
|
24
|
+
* binary and `TMUX` set, so it is not used. `printf` is a builtin in zsh, bash,
|
|
25
|
+
* dash and fish, and each reads `\033` in the format as octal ESC; the single
|
|
26
|
+
* quotes keep the backslash for printf in all of them.
|
|
27
|
+
*
|
|
28
|
+
* Joined with `;`, not `&&`, and with `clear`'s stderr dropped: a pane whose
|
|
29
|
+
* `clear` is missing or fails (unknown `TERM`, no ncurses), or whose `printf`
|
|
30
|
+
* fails, must still start the agent — a launch line left on screen is a
|
|
31
|
+
* cosmetic leak, a session that never starts is not — and must not print the
|
|
32
|
+
* failure in the line's place.
|
|
33
|
+
*
|
|
34
|
+
* Applied at the `sendKeys` call site, AFTER any flags a tool appends
|
|
35
|
+
* (`--model`, `-s <id>`, Command Code's launch flags): `buildAgentLaunchCommandLine`
|
|
36
|
+
* stays `NAME='value' … command`, and an appended flag lands on the agent, not
|
|
37
|
+
* on `clear`.
|
|
38
|
+
*
|
|
39
|
+
* Deliberately not in a module the session suites mock wholesale
|
|
40
|
+
* (`agent-session-lifecycle`, `tmux`), so those suites see the real prefix.
|
|
41
|
+
*
|
|
42
|
+
* @module lib/session/launch-screen
|
|
43
|
+
*/
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.LAUNCH_SCREEN_CLEAR_PREFIX = void 0;
|
|
46
|
+
exports.withLaunchScreenCleared = withLaunchScreenCleared;
|
|
47
|
+
/** The prefix every launch line is typed with. */
|
|
48
|
+
exports.LAUNCH_SCREEN_CLEAR_PREFIX = "clear 2>/dev/null; printf '\\033[3J'; ";
|
|
49
|
+
/**
|
|
50
|
+
* The line to type into the pane: clear the screen and the scrollback, then launch.
|
|
51
|
+
*
|
|
52
|
+
* @param launchCommand - The rendered launch line, flags included
|
|
53
|
+
* @returns `clear 2>/dev/null; printf '\033[3J'; <launchCommand>`
|
|
54
|
+
*/
|
|
55
|
+
function withLaunchScreenCleared(launchCommand) {
|
|
56
|
+
return `${exports.LAUNCH_SCREEN_CLEAR_PREFIX}${launchCommand}`;
|
|
57
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -33,11 +33,45 @@
|
|
|
33
33
|
*/
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
35
|
exports.STRUCTURED_SEND_GUARD_ENV = exports.STRUCTURED_SEND_BLOCK_MAX_AGE_MS = void 0;
|
|
36
|
+
exports.isApiAnswerableStructuredWait = isApiAnswerableStructuredWait;
|
|
37
|
+
exports.isApiAnswerableWaitNow = isApiAnswerableWaitNow;
|
|
36
38
|
exports.structuredWaitingReason = structuredWaitingReason;
|
|
37
39
|
exports.resolvePromptWaiting = resolvePromptWaiting;
|
|
38
40
|
exports.peekPromptWaiting = peekPromptWaiting;
|
|
39
41
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
40
42
|
const status_mapping_1 = require("../../lib/session/status-mapping");
|
|
43
|
+
const structured_prompt_1 = require("../../lib/session/structured-prompt");
|
|
44
|
+
/**
|
|
45
|
+
* Whether a structured wait is one the app answers over the agent's own API
|
|
46
|
+
* (Issue #3184, design §6-2).
|
|
47
|
+
*
|
|
48
|
+
* The same three conjuncts `current-output-builder` requires before it
|
|
49
|
+
* publishes a `decisionId` on the live payload (its `addressableDecisionId`):
|
|
50
|
+
* the record came from `Notification(permission_prompt)` rather than being a
|
|
51
|
+
* `permission-request` forecast, the tool's event source names each decision
|
|
52
|
+
* by id (`eventIdentity: 'permission-id'`), and the record carries such an id.
|
|
53
|
+
* That is exactly when `derivePromptView` reads the payload as `api-choices` —
|
|
54
|
+
* an approval or a question the panel draws buttons for — so the waiting kind
|
|
55
|
+
* published beside it says `prompt` too, instead of the scraper's `menu` /
|
|
56
|
+
* `unclassified` and the push body's "check the terminal".
|
|
57
|
+
*
|
|
58
|
+
* @param structured - The structured record, or null
|
|
59
|
+
* @param eventIdentity - `capabilities.eventIdentity` of the tool's event source
|
|
60
|
+
*/
|
|
61
|
+
function isApiAnswerableStructuredWait(structured, eventIdentity) {
|
|
62
|
+
return (structured !== null &&
|
|
63
|
+
structured.source === 'notification' &&
|
|
64
|
+
eventIdentity === 'permission-id' &&
|
|
65
|
+
(0, structured_prompt_1.isAddressableDecision)(structured.decisionId));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* {@link isApiAnswerableStructuredWait} for the record as it stands now — a
|
|
69
|
+
* read, like {@link peekPromptWaiting}: nothing is released or corroborated.
|
|
70
|
+
* Kept here so the structured record is still read in this one module (#1737).
|
|
71
|
+
*/
|
|
72
|
+
function isApiAnswerableWaitNow(worktreeId, cliToolId, instanceId, eventIdentity) {
|
|
73
|
+
return isApiAnswerableStructuredWait((0, agent_event_state_1.getStructuredPromptWaiting)(worktreeId, cliToolId, instanceId), eventIdentity);
|
|
74
|
+
}
|
|
41
75
|
/**
|
|
42
76
|
* How long a structured-only dialog may keep refusing sends (Issue #1737).
|
|
43
77
|
*
|