commandmate 0.44.1 → 0.44.3
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 +169 -169
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +0 -6
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route_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.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.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.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.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.js +2 -2
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +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.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.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.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.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +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.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.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.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.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.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.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +35 -35
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- 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/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -0
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/5845.js +1 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- 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/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -5
- package/.next/server/chunks/9390.js +2 -3
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- 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/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +10 -13
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +608 -416
- package/dist/cli/types/api-responses.d.ts +174 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +228 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +290 -0
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/server.js +5 -3
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
- package/dist/server/src/lib/auto-yes-poller.js +465 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
- package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- 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 +11 -49
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -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 +10 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +666 -1162
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +6 -5
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +6 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- 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/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +454 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +290 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +6 -8
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.2.json +33 -0
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6474.js +0 -14
- 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/server/chunks/967.js +0 -1
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-308072f285c34787.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -22,9 +22,10 @@ const current_output_builder_1 = require("../../lib/session/current-output-build
|
|
|
22
22
|
const logger_1 = require("../../lib/logger");
|
|
23
23
|
const manager_1 = require("../../lib/cli-tools/manager");
|
|
24
24
|
const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
|
|
25
|
+
const global_state_1 = require("../global-state");
|
|
26
|
+
const terminal_session_ownership_1 = require("./terminal-session-ownership");
|
|
25
27
|
const logger = (0, logger_1.createLogger)('terminal-broadcast');
|
|
26
|
-
const versionCounters =
|
|
27
|
-
(globalThis.__terminalSnapshotVersions = new Map());
|
|
28
|
+
const versionCounters = (0, global_state_1.getOrInitGlobal)('__terminalSnapshotVersions', () => new Map());
|
|
28
29
|
exports.INTERACTION_SNAPSHOT_RETRY_DELAYS_MS = [100, 250, 500, 750];
|
|
29
30
|
function nextVersion(key) {
|
|
30
31
|
const version = (versionCounters.get(key) ?? 0) + 1;
|
|
@@ -40,6 +41,8 @@ async function broadcastTerminalSnapshot(worktreeId, cliToolId, instanceId) {
|
|
|
40
41
|
if (!(0, ws_server_1.hasRoomSubscribers)(worktreeId))
|
|
41
42
|
return;
|
|
42
43
|
try {
|
|
44
|
+
if (!(await isPushableSession(worktreeId, cliToolId, instanceId)))
|
|
45
|
+
return;
|
|
43
46
|
const db = (0, db_instance_1.getDbInstance)();
|
|
44
47
|
const payload = await (0, current_output_builder_1.buildCurrentOutput)(db, worktreeId, cliToolId, instanceId);
|
|
45
48
|
emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId);
|
|
@@ -68,6 +71,9 @@ function snapshotFingerprint(payload) {
|
|
|
68
71
|
// the push, the same reason `sessionStatus` and the two dismiss-panel
|
|
69
72
|
// fields above are here.
|
|
70
73
|
payload.promptAnswerable ?? null,
|
|
74
|
+
// Issue #3397: so "Auto-Yes sent Enter" (and its `no-effect` follow-up)
|
|
75
|
+
// reaches the push even when the frame did not change.
|
|
76
|
+
payload.autoYes?.lastEnterFallback ?? null,
|
|
71
77
|
payload.isSelectionListActive ?? false,
|
|
72
78
|
payload.isPagerActive ?? false,
|
|
73
79
|
// Issue #2369: in the fingerprint for the same reason `sessionStatus` is —
|
|
@@ -80,7 +86,30 @@ function snapshotFingerprint(payload) {
|
|
|
80
86
|
payload.startingSince ?? null,
|
|
81
87
|
]);
|
|
82
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether the session under this (worktree, tool, instance)'s name may be read
|
|
91
|
+
* and pushed now (Issue #3334).
|
|
92
|
+
*
|
|
93
|
+
* `buildCurrentOutput` finds the session by name. The poller that drives this
|
|
94
|
+
* push was started by a send the route had checked, but it keeps ticking by
|
|
95
|
+
* name: if the session ends mid-poll and another CommandMate server starts one
|
|
96
|
+
* under the same name (#2865), the next tick would capture that server's pane
|
|
97
|
+
* and push it to this server's tabs. Asked before every capture, with the same
|
|
98
|
+
* check the WebSocket terminal uses; a refused session is not read and nothing
|
|
99
|
+
* is pushed — the HTTP poll (which answers 409) says what happened.
|
|
100
|
+
*/
|
|
101
|
+
async function isPushableSession(worktreeId, cliToolId, instanceId) {
|
|
102
|
+
const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
|
|
103
|
+
const refusal = await (0, terminal_session_ownership_1.findTerminalSessionRefusal)(worktreeId, sessionName);
|
|
104
|
+
if (refusal === null)
|
|
105
|
+
return true;
|
|
106
|
+
logger.info('terminal-snapshot:refused', { worktreeId, cliToolId, instanceId, refusal });
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
/** `null` when the session may not be read now ({@link isPushableSession}). */
|
|
83
110
|
async function captureFreshPayload(worktreeId, cliToolId, instanceId) {
|
|
111
|
+
if (!(await isPushableSession(worktreeId, cliToolId, instanceId)))
|
|
112
|
+
return null;
|
|
84
113
|
const tool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
|
|
85
114
|
(0, tmux_capture_cache_1.invalidateCache)(tool.getSessionName(worktreeId, instanceId));
|
|
86
115
|
return (0, current_output_builder_1.buildCurrentOutput)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId, instanceId);
|
|
@@ -110,6 +139,9 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
|
|
|
110
139
|
// `JSON.stringify` (in `broadcast`) already drops from the wire on its own.
|
|
111
140
|
// Defaulting it would turn "not judged" into a judgement.
|
|
112
141
|
promptAnswerable: payload.promptAnswerable,
|
|
142
|
+
// Issue #3397: straight through, like `promptAnswerable` — undefined (and so
|
|
143
|
+
// off the wire) when the payload carries no `autoYes`.
|
|
144
|
+
autoYesEnterFallback: payload.autoYes?.lastEnterFallback,
|
|
113
145
|
isSelectionListActive: payload.isSelectionListActive ?? false,
|
|
114
146
|
isPagerActive: payload.isPagerActive ?? false,
|
|
115
147
|
isDismissablePanelActive: payload.isDismissablePanelActive ?? false,
|
|
@@ -129,11 +161,15 @@ async function broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId,
|
|
|
129
161
|
return;
|
|
130
162
|
try {
|
|
131
163
|
const initialPayload = await captureFreshPayload(worktreeId, cliToolId, instanceId);
|
|
164
|
+
if (initialPayload === null)
|
|
165
|
+
return;
|
|
132
166
|
const initialFingerprint = snapshotFingerprint(initialPayload);
|
|
133
167
|
emitTerminalSnapshot(worktreeId, cliToolId, initialPayload, instanceId);
|
|
134
168
|
for (const delayMs of retryDelaysMs) {
|
|
135
169
|
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
136
170
|
const payload = await captureFreshPayload(worktreeId, cliToolId, instanceId);
|
|
171
|
+
if (payload === null)
|
|
172
|
+
return;
|
|
137
173
|
if (snapshotFingerprint(payload) !== initialFingerprint) {
|
|
138
174
|
emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId);
|
|
139
175
|
return;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "May this server write to, or show, the session under this name right now?"
|
|
4
|
+
* (Issue #3334).
|
|
5
|
+
*
|
|
6
|
+
* Shared by the two realtime paths that address a session by a name they
|
|
7
|
+
* resolved earlier: the WebSocket terminal (`ws-server.ts` — every
|
|
8
|
+
* `terminal_input` / `terminal_resize` and the control-mode fallback capture)
|
|
9
|
+
* and the terminal snapshot push (`terminal-broadcast.ts`). Both outlive the
|
|
10
|
+
* moment they were set up — a socket, a poller chain — and a session that
|
|
11
|
+
* ended and was started again by another CommandMate server under the same
|
|
12
|
+
* name (#2865) would otherwise receive this server's keys, or have its screen
|
|
13
|
+
* pushed to this server's tabs. So both ask again before every write or read,
|
|
14
|
+
* the way the routes ask per request.
|
|
15
|
+
*
|
|
16
|
+
* Kept out of `ws-server.ts` so the push can import it without loading the
|
|
17
|
+
* socket server (and so the many suites that stub `@/lib/ws-server` keep
|
|
18
|
+
* stubbing only what they meant to).
|
|
19
|
+
*
|
|
20
|
+
* @module lib/realtime/terminal-session-ownership
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.FOREIGN_TERMINAL_SESSION_ERROR = void 0;
|
|
24
|
+
exports.findTerminalSessionRefusal = findTerminalSessionRefusal;
|
|
25
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
26
|
+
const db_1 = require("../../lib/db");
|
|
27
|
+
const session_ownership_1 = require("../../lib/cli-tools/session-ownership");
|
|
28
|
+
/** The `terminal_error` text for a session another CommandMate server owns. */
|
|
29
|
+
exports.FOREIGN_TERMINAL_SESSION_ERROR = 'Session belongs to another CommandMate server';
|
|
30
|
+
/**
|
|
31
|
+
* Why the session may not be touched now, or null.
|
|
32
|
+
*
|
|
33
|
+
* The worktree row is re-read by id because a rename re-points a terminal
|
|
34
|
+
* subscription (`migrateWorktreeRooms`); a row that is gone cannot vouch for
|
|
35
|
+
* the session, which is refused for the same reason `sendUserMessage` refuses
|
|
36
|
+
* it. An absent session is not refused here — there is nothing of anyone's to
|
|
37
|
+
* show or type into, and each caller already handles a missing session.
|
|
38
|
+
*/
|
|
39
|
+
async function findTerminalSessionRefusal(worktreeId, sessionName) {
|
|
40
|
+
const worktree = (0, db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId);
|
|
41
|
+
if (!worktree)
|
|
42
|
+
return 'Worktree not found';
|
|
43
|
+
const ownership = await (0, session_ownership_1.checkSessionOwnership)(sessionName, worktree.path);
|
|
44
|
+
return ownership.verdict === 'foreign' ? exports.FOREIGN_TERMINAL_SESSION_ERROR : null;
|
|
45
|
+
}
|
|
@@ -58,6 +58,7 @@ const relay_readiness_1 = require("../../lib/relay/relay-readiness");
|
|
|
58
58
|
const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
|
|
59
59
|
const relay_system_line_1 = require("../../lib/relay/relay-system-line");
|
|
60
60
|
const logger_1 = require("../../lib/logger");
|
|
61
|
+
const global_state_1 = require("../global-state");
|
|
61
62
|
const logger = (0, logger_1.createLogger)('relay-delivery');
|
|
62
63
|
/**
|
|
63
64
|
* How many assistant rows back the reply is looked for.
|
|
@@ -153,7 +154,7 @@ const TRANSCRIPT_READER_TOOLS = {
|
|
|
153
154
|
const RELAY_TURN_ROW_GRACE_MS = 15_000;
|
|
154
155
|
/** How often the grace above re-reads the ledger. */
|
|
155
156
|
const RELAY_TURN_ROW_POLL_MS = 1_000;
|
|
156
|
-
const inFlight = (
|
|
157
|
+
const inFlight = (0, global_state_1.getOrInitGlobal)('__relayDeliveryInFlight', () => new Set());
|
|
157
158
|
/** Forget every in-flight delivery. Test seam. */
|
|
158
159
|
function resetRelayDeliveryState() {
|
|
159
160
|
inFlight.clear();
|
|
@@ -222,6 +223,8 @@ function findWorkerReply(db, worker, since) {
|
|
|
222
223
|
/** The options of B's open dialog, in the shape the notice lists them. */
|
|
223
224
|
function promptOptionsOf(message) {
|
|
224
225
|
const data = message.promptData;
|
|
226
|
+
// #3184: type narrowing only — the stored row's screen `options` are listed;
|
|
227
|
+
// a stored degraded record never carries a decision id, so it has none.
|
|
225
228
|
if (!(0, models_1.isAnswerablePromptData)(data))
|
|
226
229
|
return [];
|
|
227
230
|
if (data.type === 'yes_no') {
|
|
@@ -383,6 +386,7 @@ function notifyRelayPromptWaiting(worker) {
|
|
|
383
386
|
return;
|
|
384
387
|
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
385
388
|
const options = promptOptionsOf(prompt);
|
|
389
|
+
// #3184: type narrowing only, to read `question` off the closed union.
|
|
386
390
|
const question = (0, models_1.isAnswerablePromptData)(prompt.promptData)
|
|
387
391
|
? prompt.promptData.question
|
|
388
392
|
: (prompt.promptData?.question ?? prompt.content);
|
|
@@ -467,7 +471,7 @@ async function deliverOne(db, relayId, kind, body) {
|
|
|
467
471
|
if (!relay)
|
|
468
472
|
return 'skipped';
|
|
469
473
|
const requester = (0, relay_session_ref_1.resolveRelaySession)(db, relay.from);
|
|
470
|
-
const hold = await (0, relay_readiness_1.findRelayHoldReason)(requester.worktreeId, requester.cliToolId, requester.instanceId);
|
|
474
|
+
const hold = await (0, relay_readiness_1.findRelayHoldReason)(requester.worktreeId, requester.cliToolId, requester.instanceId, db);
|
|
471
475
|
if (hold) {
|
|
472
476
|
logger.debug('relay-delivery-held', { relayId, kind, reason: hold });
|
|
473
477
|
return 'held';
|
|
@@ -13,12 +13,25 @@
|
|
|
13
13
|
* is running. The relay waits for `ready` instead — the ledger is durable, so
|
|
14
14
|
* waiting costs nothing but time.
|
|
15
15
|
*
|
|
16
|
+
* Since Issue #3337 "mid-turn" is also the hooks' answer when they speak for
|
|
17
|
+
* a codex pane (`lib/session/hook-turn-hold`, the rule `capture --json`
|
|
18
|
+
* reads): the frame alone read a live codex turn as `ready`.
|
|
19
|
+
*
|
|
16
20
|
* The prompt-dialog question is deliberately NOT asked here: `sendUserMessage`
|
|
17
21
|
* already refuses a send that would land in an open dialog (#1708/#1737), and
|
|
18
22
|
* duplicating that judgement would give the relay path its own second opinion
|
|
19
23
|
* about a state the send path is the authority on. A refusal there is a retry
|
|
20
24
|
* here.
|
|
21
25
|
*
|
|
26
|
+
* **Is it this server's session?** (Issue #3334) Asked first — before the
|
|
27
|
+
* pane is read, and before `isRunning()`, which reads the pane (claude) or
|
|
28
|
+
* resumes an event stream (opencode-v2) on its own.
|
|
29
|
+
* `sendUserMessage` refuses a session another CommandMate server created under
|
|
30
|
+
* the same name (#2865), but this check came first and read that pane to judge
|
|
31
|
+
* it — the same order `sendUserMessage` itself was fixed out of. Such a session
|
|
32
|
+
* holds the delivery (`foreign_session`): the ledger keeps the payload, and it
|
|
33
|
+
* goes out if this server's own session comes back before the deadline.
|
|
34
|
+
*
|
|
22
35
|
* Fail-open on an unreadable pane, for the same reason `prompt-waiting-guard`
|
|
23
36
|
* fails open: the cost of a wrong "ready" is a message the send path refuses
|
|
24
37
|
* and the pump retries, while the cost of a wrong "not ready" is a relay that
|
|
@@ -29,22 +42,46 @@
|
|
|
29
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
43
|
exports.findRelayHoldReason = findRelayHoldReason;
|
|
31
44
|
const manager_1 = require("../../lib/cli-tools/manager");
|
|
45
|
+
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
46
|
+
const worktree_session_ownership_1 = require("../../lib/cli-tools/worktree-session-ownership");
|
|
32
47
|
const cli_session_1 = require("../../lib/session/cli-session");
|
|
33
48
|
const status_detector_1 = require("../../lib/detection/status-detector");
|
|
49
|
+
const hook_turn_hold_1 = require("../../lib/session/hook-turn-hold");
|
|
34
50
|
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
35
51
|
const logger_1 = require("../../lib/logger");
|
|
36
52
|
const logger = (0, logger_1.createLogger)('relay-readiness');
|
|
37
53
|
/**
|
|
38
54
|
* Whether a relay may be delivered into this session now.
|
|
39
55
|
*
|
|
56
|
+
* @param db - The handle the worktree row is read from (Issue #3334); defaults
|
|
57
|
+
* to the server's
|
|
40
58
|
* @returns `null` when the session can take the message, else why it cannot
|
|
41
59
|
*/
|
|
42
|
-
async function findRelayHoldReason(worktreeId, cliToolId, instanceId) {
|
|
60
|
+
async function findRelayHoldReason(worktreeId, cliToolId, instanceId, db) {
|
|
43
61
|
try {
|
|
62
|
+
// Issue #3334: the session name `sendUserMessage` will address, checked
|
|
63
|
+
// the way it checks it — before anything touches the session. That
|
|
64
|
+
// includes `isRunning()`: it is not a bare existence test for every tool.
|
|
65
|
+
// claude's reads the pane to judge its health, and opencode-v2's starts
|
|
66
|
+
// re-subscribing to the event stream of whatever server sits in the
|
|
67
|
+
// session's directory.
|
|
68
|
+
const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId);
|
|
69
|
+
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName, db);
|
|
70
|
+
if (ownership === null || ownership.verdict === 'foreign')
|
|
71
|
+
return 'foreign_session';
|
|
72
|
+
if (ownership.verdict === 'absent')
|
|
73
|
+
return 'session_stopped';
|
|
44
74
|
const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
|
|
45
75
|
if (!(await cliTool.isRunning(worktreeId, instanceId)))
|
|
46
76
|
return 'session_stopped';
|
|
47
77
|
const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
|
|
78
|
+
// Issue #3337: for a tool whose hook turns the screen may not end (codex),
|
|
79
|
+
// an open hook turn holds the pane at `running` whatever the frame reads —
|
|
80
|
+
// the rule `capture --json` publishes, read from the one place it is
|
|
81
|
+
// written. A frame of a live codex turn read `ready`, and a reply typed into
|
|
82
|
+
// it interrupted the turn.
|
|
83
|
+
if ((0, hook_turn_hold_1.hookTurnHoldsPane)(worktreeId, cliToolId, instanceId, output))
|
|
84
|
+
return 'generating';
|
|
48
85
|
const status = (0, status_detector_1.detectSessionStatus)(output, cliToolId);
|
|
49
86
|
// Only `running` holds. `waiting` is a dialog, which is the send path's
|
|
50
87
|
// judgement to make (and its refusal is a retry); `idle` and `ready` both
|
|
@@ -75,6 +75,8 @@ exports.areRelayTriggersActive = areRelayTriggersActive;
|
|
|
75
75
|
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
76
76
|
const relay_policy_1 = require("../../lib/relay/relay-policy");
|
|
77
77
|
const logger_1 = require("../../lib/logger");
|
|
78
|
+
const prompt_waiting_composition_1 = require("../../lib/session/prompt-waiting-composition");
|
|
79
|
+
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
78
80
|
const logger = (0, logger_1.createLogger)('relay-triggers');
|
|
79
81
|
/**
|
|
80
82
|
* Tell the relays that this instance finished a turn.
|
|
@@ -151,6 +153,13 @@ function startRelayTriggers() {
|
|
|
151
153
|
// another session as a question it might report to a human.
|
|
152
154
|
if (!transition.waiting || transition.kind !== 'prompt')
|
|
153
155
|
return;
|
|
156
|
+
// Issue #3184 (design §6-2): a wait answered over the agent's API is
|
|
157
|
+
// published as `prompt` for the dots and the push body, but the relay is
|
|
158
|
+
// not raised for it — its notice lists the stored row's screen options,
|
|
159
|
+
// and such a wait has none to list. Relaying it is a separate Issue.
|
|
160
|
+
if ((0, prompt_waiting_composition_1.isApiAnswerableWaitNow)(transition.worktreeId, transition.cliToolId, transition.instanceId, (0, registry_1.getAgentEventSource)(transition.cliToolId).capabilities.eventIdentity)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
154
163
|
onRelayPromptWaiting(transition.worktreeId, transition.cliToolId, transition.instanceId);
|
|
155
164
|
});
|
|
156
165
|
const timer = setInterval(() => void runRelayMaintenance(), relay_policy_1.RELAY_PUMP_INTERVAL_MS);
|
|
@@ -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
|
}
|
|
@@ -15,6 +15,7 @@ exports.cleanScrollbackResponse = cleanScrollbackResponse;
|
|
|
15
15
|
exports.truncateMessage = truncateMessage;
|
|
16
16
|
const cli_patterns_1 = require("./detection/cli-patterns");
|
|
17
17
|
const tui_accumulator_1 = require("./tui-accumulator");
|
|
18
|
+
const startup_screen_1 = require("./polling/startup-screen");
|
|
18
19
|
const copilot_constants_1 = require("../config/copilot-constants");
|
|
19
20
|
/**
|
|
20
21
|
* Clean up Claude response by removing shell setup commands, environment exports, ANSI codes, and banner
|
|
@@ -473,11 +474,33 @@ function findScrollbackChromeStart(lines, cliToolId) {
|
|
|
473
474
|
* classify rows by their SGR attributes, and stripping first would destroy the
|
|
474
475
|
* evidence they read.
|
|
475
476
|
*
|
|
477
|
+
* ## The startup screen (Issue #3293)
|
|
478
|
+
*
|
|
479
|
+
* Neither step removes a banner. codex's and vibe-local's startup screens are
|
|
480
|
+
* mostly rows no pattern names — the version, the cwd, a tagline, a logo — so
|
|
481
|
+
* the first flush of a session, whose cursor is 0, saved the screen as a reply.
|
|
482
|
+
* What says "this is not a reply" is the pane, not the rows: no message has
|
|
483
|
+
* been echoed on it yet ({@link isStartupScreenWithoutUserEcho}, the same
|
|
484
|
+
* reading the poller makes). So the flush hands the pane over with the rows.
|
|
485
|
+
*
|
|
486
|
+
* It is a separate argument because `response` cannot answer for it. The rows
|
|
487
|
+
* past the cursor ordinarily hold a reply and no echo — the echo of the turn
|
|
488
|
+
* they belong to sits above the cursor — so asking the question of `response`
|
|
489
|
+
* would empty real replies. A caller that has only a slice omits `paneLines`
|
|
490
|
+
* and gets the two steps above and nothing else.
|
|
491
|
+
*
|
|
476
492
|
* @param response - Raw capture, ANSI intact
|
|
477
493
|
* @param cliToolId - The tool the capture came from
|
|
494
|
+
* @param paneLines - The whole capture `response` was sliced from, ANSI intact.
|
|
495
|
+
* Omitted when the caller does not hold it, or when the capture came back
|
|
496
|
+
* clipped by its window (#1670 — the echo may have scrolled out of it)
|
|
478
497
|
* @returns Cleaned response, or an empty string when the capture was all chrome
|
|
498
|
+
* or the pane has not had a turn yet
|
|
479
499
|
*/
|
|
480
|
-
function cleanScrollbackResponse(response, cliToolId) {
|
|
500
|
+
function cleanScrollbackResponse(response, cliToolId, paneLines) {
|
|
501
|
+
if (paneLines && (0, startup_screen_1.isStartupScreenWithoutUserEcho)(cliToolId, paneLines)) {
|
|
502
|
+
return '';
|
|
503
|
+
}
|
|
481
504
|
const allLines = response.split('\n');
|
|
482
505
|
const chromeStart = findScrollbackChromeStart(allLines, cliToolId);
|
|
483
506
|
const bodyLines = chromeStart >= 0 ? allLines.slice(0, chromeStart) : allLines;
|
|
@@ -222,6 +222,22 @@ function resolveExtractionStartIndex(lastCapturedLine, totalLines, bufferReset,
|
|
|
222
222
|
return foundUserPrompt >= 0 ? foundUserPrompt + 1 : 0;
|
|
223
223
|
}
|
|
224
224
|
// Branch 2b: Codex uses lastCapturedLine directly (Codex-specific TUI behavior)
|
|
225
|
+
//
|
|
226
|
+
// Issue #3335: on codex 0.160.0 this is NOT a read cursor, and it is left
|
|
227
|
+
// that way on purpose. 0.160.0 draws in the alternate screen — the capture is
|
|
228
|
+
// the 1000-row pane, the composer pinned to row 996, the transcript growing
|
|
229
|
+
// from the top — so after the startup screen the cursor is the composer row
|
|
230
|
+
// (996, the poller) or the row count (999/1000, the pre-send flush and the
|
|
231
|
+
// advance after a transcript turn), and every reply is drawn above it.
|
|
232
|
+
// Extraction from it is empty, and the reply reaches History from codex's own
|
|
233
|
+
// transcript, read on the Stop hook (`hooks/stop-history-capture.ts` →
|
|
234
|
+
// `hooks/sources/codex/history.ts`), not from the pane. The cost is stated:
|
|
235
|
+
// a 0.160.0 session whose codex hooks are not installed or not trusted gets
|
|
236
|
+
// no reply row from the pane either. What the screen read must not do is
|
|
237
|
+
// save a wrong row from the parked cursor: the poller stops at the composer
|
|
238
|
+
// (`collectCompletedResponse`), a re-read from the top (cursor >= totalLines,
|
|
239
|
+
// branch 1 above) is dropped by `lineCount <= lastCapturedLine`, and the flush
|
|
240
|
+
// reads nothing at or below the composer (`isCodexCursorAtOrBelowComposer`).
|
|
225
241
|
if (cliToolId === 'codex') {
|
|
226
242
|
return Math.max(0, lastCapturedLine);
|
|
227
243
|
}
|
|
@@ -33,6 +33,7 @@ const claude_executor_1 = require("./session/claude-executor");
|
|
|
33
33
|
const cron_parser_1 = require("./cron-parser");
|
|
34
34
|
const job_executor_1 = require("./job-executor");
|
|
35
35
|
const logger_1 = require("../lib/logger");
|
|
36
|
+
const global_state_1 = require("./global-state");
|
|
36
37
|
const logger = (0, logger_1.createLogger)('schedule-manager');
|
|
37
38
|
// Re-export for backward compatibility (public API preservation)
|
|
38
39
|
var cron_parser_2 = require("./cron-parser");
|
|
@@ -202,16 +203,13 @@ function replaceCronExpression(state, entry) {
|
|
|
202
203
|
* Get or initialize the global manager state.
|
|
203
204
|
*/
|
|
204
205
|
function getManagerState() {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
return globalThis.__scheduleManagerStates;
|
|
206
|
+
return (0, global_state_1.getOrInitGlobal)('__scheduleManagerStates', () => ({
|
|
207
|
+
timerId: null,
|
|
208
|
+
schedules: new Map(),
|
|
209
|
+
initialized: false,
|
|
210
|
+
isSyncing: false,
|
|
211
|
+
cmateFileCache: new Map(),
|
|
212
|
+
}));
|
|
215
213
|
}
|
|
216
214
|
// =============================================================================
|
|
217
215
|
// Lazy DB Accessor
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The `AskUserQuestion` call an agent instance has in flight (Issue #1726).
|
|
4
|
+
*
|
|
5
|
+
* Split out of `agent-event-state` (Issue #3375), which re-exports the public
|
|
6
|
+
* names and applies the transition from `recordAgentEvent`.
|
|
7
|
+
*
|
|
8
|
+
* @module lib/session/agent-event-ask-user-question
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.askUserQuestion = void 0;
|
|
12
|
+
exports.applyAskUserQuestionTransition = applyAskUserQuestionTransition;
|
|
13
|
+
exports.recordAskUserQuestion = recordAskUserQuestion;
|
|
14
|
+
exports.getAskUserQuestion = getAskUserQuestion;
|
|
15
|
+
exports.clearAskUserQuestion = clearAskUserQuestion;
|
|
16
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
17
|
+
// Issue #2100: the shared list of tool names that mean "a human is being asked
|
|
18
|
+
// to CHOOSE". Pure — its own only import is `permission-request-payload`, which
|
|
19
|
+
// this module already reached for `ASK_USER_QUESTION_TOOL` — and importing it
|
|
20
|
+
// here rather than repeating `'question'` is what keeps the release rule below
|
|
21
|
+
// and `pendingDecisionKind`'s reader from drifting apart.
|
|
22
|
+
const pending_decision_kind_1 = require("../../lib/hooks/pending-decision-kind");
|
|
23
|
+
const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
|
|
24
|
+
const agent_event_structured_state_1 = require("../../lib/session/agent-event-structured-state");
|
|
25
|
+
const global_state_1 = require("../global-state");
|
|
26
|
+
/** compositeKey -> the `AskUserQuestion` call currently in flight (#1726). */
|
|
27
|
+
exports.askUserQuestion = (0, global_state_1.getOrInitGlobal)('__agentEventAskUserQuestion', () => new Map());
|
|
28
|
+
/**
|
|
29
|
+
* When the in-flight question is released (Issue #1726).
|
|
30
|
+
*
|
|
31
|
+
* | event | effect on the question |
|
|
32
|
+
* |-----------------------------------|------------------------|
|
|
33
|
+
* | `pre_tool_use(AskUserQuestion)` | unchanged (this IS it) |
|
|
34
|
+
* | `pre_tool_use(any other tool)` | release |
|
|
35
|
+
* | `post_tool_use` | release |
|
|
36
|
+
* | `notification(permission_prompt)` | **unchanged** |
|
|
37
|
+
* | `notification(idle_prompt)` | release |
|
|
38
|
+
* | `notification(other)` | unchanged |
|
|
39
|
+
* | `stop` | release |
|
|
40
|
+
* | `user_prompt_submit` | release |
|
|
41
|
+
* | `session_start` / `session_end` | release |
|
|
42
|
+
*
|
|
43
|
+
* `PostToolUse` is the precise release — "this tool call is over" — and `Stop`
|
|
44
|
+
* is the backstop for a delivery that never arrives. Issue #1726's text proposed
|
|
45
|
+
* `PostToolUse` and the #1721 spike recorded it as never observed, so this Issue
|
|
46
|
+
* measured it directly on a live v2.1.223 session (2026-08-06):
|
|
47
|
+
*
|
|
48
|
+
* ```
|
|
49
|
+
* 15:36:04.112 PreToolUse AskUserQuestion
|
|
50
|
+
* 15:36:28.643 PostToolUse AskUserQuestion <- the human answered
|
|
51
|
+
* 15:36:29.992 Stop
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* It fires, 1.3 s ahead of `Stop` here — and much further ahead whenever the
|
|
55
|
+
* agent keeps working after the answer, which is the case that matters: `Stop`
|
|
56
|
+
* alone would leave a finished question in place for the whole rest of the turn.
|
|
57
|
+
*
|
|
58
|
+
* A `PostToolUse` for any other tool releases as well: the agent could not have
|
|
59
|
+
* finished another tool call while this question was still on screen.
|
|
60
|
+
*
|
|
61
|
+
* **`Notification(permission_prompt)` keeping the question is a live
|
|
62
|
+
* measurement, not a guess.** The #1721 report says the picker emits no events
|
|
63
|
+
* while it is displayed (§5.6), and a first cut of this module read that as "any
|
|
64
|
+
* event means the picker is gone". Driving a real v2.1.223 session through the
|
|
65
|
+
* server on 2026-08-06 disproved it:
|
|
66
|
+
*
|
|
67
|
+
* ```
|
|
68
|
+
* 15:29:18.099 PreToolUse(AskUserQuestion)
|
|
69
|
+
* 15:29:18.109 PermissionRequest(AskUserQuestion) -> no decision
|
|
70
|
+
* 15:29:24.128 Notification(permission_prompt) <- picker still on screen
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* The notification lands ~6 s after the dialog is drawn (§5.5's timing exactly),
|
|
74
|
+
* which is *inside* the window §5.6 was counting rather than outside it. Under
|
|
75
|
+
* the first rule it deleted the question six seconds after it arrived, and the
|
|
76
|
+
* options went back to being the screen's — which is the whole feature, silently
|
|
77
|
+
* off, on every real session.
|
|
78
|
+
*
|
|
79
|
+
* `idle_prompt` still releases: the agent reporting it is sitting at the
|
|
80
|
+
* composer is the agent saying no picker is in front of it. An unrecognised
|
|
81
|
+
* notification type changes nothing, because nothing is known about it.
|
|
82
|
+
*/
|
|
83
|
+
function applyAskUserQuestionTransition(key, record) {
|
|
84
|
+
switch (record.event) {
|
|
85
|
+
case 'pre_tool_use':
|
|
86
|
+
// A `PreToolUse` for anything else means the agent has moved on to another
|
|
87
|
+
// tool, so whatever question was in flight has been answered. Only
|
|
88
|
+
// reachable when the operator's own settings.json registers a wider
|
|
89
|
+
// matcher than the injected `AskUserQuestion` one — the two files are
|
|
90
|
+
// concatenated, not substituted (#1722).
|
|
91
|
+
//
|
|
92
|
+
// Issue #2100: the exemption is the whole QUESTION vocabulary, not
|
|
93
|
+
// Claude's one spelling. opencode names its question tool `question`, and
|
|
94
|
+
// it publishes a tool part for the same call: measured on 1.18.23 in an
|
|
95
|
+
// isolated HOME, `question.asked` and
|
|
96
|
+
// `message.part.updated(tool=question, status=running)` arrive **in the
|
|
97
|
+
// same millisecond**, in that order (§27.3). Under the old test the
|
|
98
|
+
// second frame read as "the agent moved on to another tool" and deleted
|
|
99
|
+
// the episode 1 ms after the ingest recorded it, which is why
|
|
100
|
+
// `pendingDecisions[].questionOptions` and `promptData.askUserQuestion`
|
|
101
|
+
// were null for every opencode question. Claude is unaffected —
|
|
102
|
+
// `AskUserQuestion` is the first member of the same list — and the cost
|
|
103
|
+
// is that a hook tool literally named `question` no longer releases the
|
|
104
|
+
// episode, which is the same name `pendingDecisionKind` already reads as
|
|
105
|
+
// "this record is a question" for every tool.
|
|
106
|
+
if (!pending_decision_kind_1.QUESTION_DECISION_TOOL_NAMES.includes(record.detail ?? '')) {
|
|
107
|
+
exports.askUserQuestion.delete(key);
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
case 'notification':
|
|
111
|
+
if (record.detail === 'idle_prompt')
|
|
112
|
+
exports.askUserQuestion.delete(key);
|
|
113
|
+
return;
|
|
114
|
+
case 'post_tool_use':
|
|
115
|
+
case 'stop':
|
|
116
|
+
case 'user_prompt_submit':
|
|
117
|
+
case 'session_start':
|
|
118
|
+
case 'session_end':
|
|
119
|
+
exports.askUserQuestion.delete(key);
|
|
120
|
+
return;
|
|
121
|
+
default:
|
|
122
|
+
// exhaustive check: a new AgentEventType must decide its transition here
|
|
123
|
+
record.event;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Record the `AskUserQuestion` invocation reported for one instance.
|
|
129
|
+
*
|
|
130
|
+
* Idempotent by construction: the same call is reported twice on every session
|
|
131
|
+
* — once by `PreToolUse` and once by the `PermissionRequest` that
|
|
132
|
+
* `AskUserQuestion` also raises with a byte-identical `tool_input` — and the
|
|
133
|
+
* second delivery simply overwrites the first with the same content.
|
|
134
|
+
*
|
|
135
|
+
* @param at - Epoch ms; defaults to now
|
|
136
|
+
*/
|
|
137
|
+
function recordAskUserQuestion(worktreeId, cliToolId, instanceId, spec, at = Date.now()) {
|
|
138
|
+
exports.askUserQuestion.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), { at, spec });
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The `AskUserQuestion` call in flight for this instance, or null.
|
|
142
|
+
*
|
|
143
|
+
* Bounded exactly like {@link getStructuredSessionState}: a record from a
|
|
144
|
+
* previous generation belongs to a Claude process that no longer exists, and one
|
|
145
|
+
* older than {@link STRUCTURED_STATE_MAX_AGE_MS} has outlived the screen it
|
|
146
|
+
* describes. There is no provisional bound — unlike a `PermissionRequest`, a
|
|
147
|
+
* `PreToolUse(AskUserQuestion)` is not a prediction that a dialog *might*
|
|
148
|
+
* appear: allowing the permission request does not dismiss the picker (§5.6), so
|
|
149
|
+
* the picker is drawn unconditionally.
|
|
150
|
+
*
|
|
151
|
+
* @param now - Epoch ms; defaults to now
|
|
152
|
+
*/
|
|
153
|
+
function getAskUserQuestion(worktreeId, cliToolId, instanceId, now = Date.now()) {
|
|
154
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
155
|
+
const episode = exports.askUserQuestion.get(key);
|
|
156
|
+
if (!episode)
|
|
157
|
+
return null;
|
|
158
|
+
const generation = agent_event_turn_1.generationStartedAt.get(key);
|
|
159
|
+
if (generation !== undefined && episode.at < generation)
|
|
160
|
+
return null;
|
|
161
|
+
if (now - episode.at >= agent_event_structured_state_1.STRUCTURED_STATE_MAX_AGE_MS)
|
|
162
|
+
return null;
|
|
163
|
+
return episode;
|
|
164
|
+
}
|
|
165
|
+
/** Drop the in-flight question for one instance. */
|
|
166
|
+
function clearAskUserQuestion(worktreeId, cliToolId, instanceId) {
|
|
167
|
+
exports.askUserQuestion.delete((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
|
|
168
|
+
}
|