commandmate 0.48.0 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +164 -164
- package/.next/app-path-routes-manifest.json +30 -30
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-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_client-reference-manifest.js +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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.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_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.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +3 -3
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +30 -30
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1945.js +3 -3
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/4243.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/4280.js +1 -1
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/720.js +2 -2
- package/.next/server/chunks/7604.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +3 -3
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9627.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
- package/.next/static/chunks/{2407-26139a8a2f1adbe8.js → 2407-ab92ae9837c39dce.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/{2863-f0121af1cbbedb3b.js → 2863-7173dc305dffc4f6.js} +1 -1
- package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
- package/.next/static/chunks/{8165-c68b3dc844210e6a.js → 8165-263172c17ae8e8c3.js} +1 -1
- package/.next/static/chunks/9079-987939d231704218.js +1 -0
- package/.next/static/chunks/app/{layout-46b4cbf07520d9b6.js → layout-aa8e66164a4367af.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-fb241bed579c67aa.js → page-cfd645305e25fd33.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/{page-cbc7749a33450cc5.js → page-a8d7886703ffc7b4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +3 -5
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +5 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +4 -6
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +8 -1
- package/dist/cli/config/duration-constants.d.ts +16 -13
- package/dist/cli/config/duration-constants.d.ts.map +1 -1
- package/dist/cli/config/duration-constants.js +21 -21
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +2 -1
- package/dist/cli/types/api-responses.d.ts +29 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts +24 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +54 -1
- package/dist/config/auto-yes-duration.d.ts +56 -0
- package/dist/config/auto-yes-duration.d.ts.map +1 -0
- package/dist/config/auto-yes-duration.js +76 -0
- package/dist/server/src/config/auto-yes-config.js +14 -19
- package/dist/server/src/config/auto-yes-duration.js +76 -0
- package/dist/server/src/lib/auto-yes-state.js +9 -2
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +137 -14
- package/dist/server/src/lib/detection/composer-text.js +215 -11
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +8 -191
- package/dist/server/src/lib/detection/upstream-faults.js +19 -2
- package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +4 -2
- package/dist/server/src/lib/polling/response-checker.js +12 -15
- package/dist/server/src/lib/session/composer-clear.js +56 -4
- package/dist/server/src/lib/session/current-output-builder.js +2 -1
- package/dist/server/src/lib/session/send-attempt-state.js +2 -1
- package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
- package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
- package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +26 -339
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/gate-runner.js +11 -4
- package/docs/en/user-guide/webapp-guide.md +15 -10
- package/package.json +1 -1
- package/release-notes/0.49.0.json +45 -0
- package/.next/server/chunks/6722.js +0 -1
- package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +0 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
- package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
- package/.next/static/chunks/9079-406b84d3cc891a87.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
- /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The low-level episode writes: open / close / replace / rebind / updateKind
|
|
4
|
+
* (Issue #3798). Each one emits through the store's listeners.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.openEpisode = openEpisode;
|
|
8
|
+
exports.closeEpisode = closeEpisode;
|
|
9
|
+
exports.replaceEpisode = replaceEpisode;
|
|
10
|
+
exports.rebindEpisode = rebindEpisode;
|
|
11
|
+
exports.updateEpisodeKind = updateEpisodeKind;
|
|
12
|
+
const waiting_episode_state_store_1 = require("../../lib/session/waiting-episode-state-store");
|
|
13
|
+
/**
|
|
14
|
+
* Open an episode (Issue #3798). Low-level: the caller has decided there is
|
|
15
|
+
* none open and what it is bound to. Emits the opening edge.
|
|
16
|
+
*/
|
|
17
|
+
function openEpisode(parts, next, at) {
|
|
18
|
+
const key = (0, waiting_episode_state_store_1.keyOf)(parts);
|
|
19
|
+
const view = { since: next.since, kind: next.kind };
|
|
20
|
+
const meta = {
|
|
21
|
+
episodeId: (0, waiting_episode_state_store_1.nextEpisodeId)(),
|
|
22
|
+
openedAt: at,
|
|
23
|
+
boundAt: at,
|
|
24
|
+
binding: next.binding,
|
|
25
|
+
openedBy: next.openedBy,
|
|
26
|
+
promptScreenKey: next.promptScreenKey ?? null,
|
|
27
|
+
};
|
|
28
|
+
waiting_episode_state_store_1.episodes.set(key, view);
|
|
29
|
+
waiting_episode_state_store_1.metas.set(view, meta);
|
|
30
|
+
(0, waiting_episode_state_store_1.bumpVersion)(key);
|
|
31
|
+
(0, waiting_episode_state_store_1.emit)({
|
|
32
|
+
worktreeId: parts.worktreeId,
|
|
33
|
+
cliToolId: parts.cliToolId,
|
|
34
|
+
instanceId: parts.instanceId,
|
|
35
|
+
waiting: true,
|
|
36
|
+
since: view.since,
|
|
37
|
+
kind: view.kind,
|
|
38
|
+
at,
|
|
39
|
+
cause: 'opened',
|
|
40
|
+
episodeId: meta.episodeId,
|
|
41
|
+
previousEpisodeId: null,
|
|
42
|
+
closeReason: null,
|
|
43
|
+
});
|
|
44
|
+
return { ...view, ...meta };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Close the open episode when it is still `expectedId` (Issue #3798). A closer
|
|
48
|
+
* that names the episode it decided about cannot close a later one.
|
|
49
|
+
*
|
|
50
|
+
* @returns Whether an episode was closed
|
|
51
|
+
*/
|
|
52
|
+
function closeEpisode(parts, expectedId, reason, at) {
|
|
53
|
+
const key = (0, waiting_episode_state_store_1.keyOf)(parts);
|
|
54
|
+
const view = waiting_episode_state_store_1.episodes.get(key);
|
|
55
|
+
if (view === undefined)
|
|
56
|
+
return false;
|
|
57
|
+
const meta = (0, waiting_episode_state_store_1.metaOf)(view);
|
|
58
|
+
if (meta.episodeId !== expectedId)
|
|
59
|
+
return false;
|
|
60
|
+
waiting_episode_state_store_1.episodes.delete(key);
|
|
61
|
+
waiting_episode_state_store_1.lastClosed.set(key, { at, promptScreenKey: meta.promptScreenKey });
|
|
62
|
+
(0, waiting_episode_state_store_1.bumpVersion)(key);
|
|
63
|
+
(0, waiting_episode_state_store_1.emit)({
|
|
64
|
+
worktreeId: parts.worktreeId,
|
|
65
|
+
cliToolId: parts.cliToolId,
|
|
66
|
+
instanceId: parts.instanceId,
|
|
67
|
+
waiting: false,
|
|
68
|
+
since: null,
|
|
69
|
+
kind: null,
|
|
70
|
+
at,
|
|
71
|
+
cause: 'closed',
|
|
72
|
+
episodeId: null,
|
|
73
|
+
previousEpisodeId: meta.episodeId,
|
|
74
|
+
closeReason: reason,
|
|
75
|
+
});
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Put a new episode in place of `expectedId` as one operation (Issue #3798):
|
|
80
|
+
* listeners hear a single opening edge for the new wait and no closing one
|
|
81
|
+
* in between, so nothing reports "nobody is waiting" mid-swap.
|
|
82
|
+
*
|
|
83
|
+
* @returns The new episode, or null when `expectedId` is no longer open
|
|
84
|
+
*/
|
|
85
|
+
function replaceEpisode(parts, expectedId, next, reason, at) {
|
|
86
|
+
const key = (0, waiting_episode_state_store_1.keyOf)(parts);
|
|
87
|
+
const old = waiting_episode_state_store_1.episodes.get(key);
|
|
88
|
+
if (old === undefined)
|
|
89
|
+
return null;
|
|
90
|
+
const oldMeta = (0, waiting_episode_state_store_1.metaOf)(old);
|
|
91
|
+
if (oldMeta.episodeId !== expectedId)
|
|
92
|
+
return null;
|
|
93
|
+
waiting_episode_state_store_1.lastClosed.set(key, { at, promptScreenKey: oldMeta.promptScreenKey });
|
|
94
|
+
const view = { since: next.since, kind: next.kind };
|
|
95
|
+
const meta = {
|
|
96
|
+
episodeId: (0, waiting_episode_state_store_1.nextEpisodeId)(),
|
|
97
|
+
openedAt: at,
|
|
98
|
+
boundAt: at,
|
|
99
|
+
binding: next.binding,
|
|
100
|
+
openedBy: next.openedBy,
|
|
101
|
+
promptScreenKey: next.promptScreenKey ?? null,
|
|
102
|
+
};
|
|
103
|
+
waiting_episode_state_store_1.episodes.set(key, view);
|
|
104
|
+
waiting_episode_state_store_1.metas.set(view, meta);
|
|
105
|
+
(0, waiting_episode_state_store_1.bumpVersion)(key);
|
|
106
|
+
(0, waiting_episode_state_store_1.emit)({
|
|
107
|
+
worktreeId: parts.worktreeId,
|
|
108
|
+
cliToolId: parts.cliToolId,
|
|
109
|
+
instanceId: parts.instanceId,
|
|
110
|
+
waiting: true,
|
|
111
|
+
since: view.since,
|
|
112
|
+
kind: view.kind,
|
|
113
|
+
at,
|
|
114
|
+
cause: 'replaced',
|
|
115
|
+
episodeId: meta.episodeId,
|
|
116
|
+
previousEpisodeId: oldMeta.episodeId,
|
|
117
|
+
closeReason: reason,
|
|
118
|
+
});
|
|
119
|
+
return { ...view, ...meta };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Change what the open episode `expectedId` is bound to (Issue #3798). Not an
|
|
123
|
+
* edge: the wait goes on, so nothing is emitted and `since` stays.
|
|
124
|
+
*
|
|
125
|
+
* @returns Whether the episode was rebound
|
|
126
|
+
*/
|
|
127
|
+
function rebindEpisode(parts, expectedId, binding, at) {
|
|
128
|
+
const key = (0, waiting_episode_state_store_1.keyOf)(parts);
|
|
129
|
+
const view = waiting_episode_state_store_1.episodes.get(key);
|
|
130
|
+
if (view === undefined)
|
|
131
|
+
return false;
|
|
132
|
+
const meta = (0, waiting_episode_state_store_1.metaOf)(view);
|
|
133
|
+
if (meta.episodeId !== expectedId)
|
|
134
|
+
return false;
|
|
135
|
+
meta.binding = binding;
|
|
136
|
+
meta.boundAt = at;
|
|
137
|
+
(0, waiting_episode_state_store_1.bumpVersion)(key);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Refresh the kind of the open episode `expectedId` (Issue #3798, I10). The
|
|
142
|
+
* wait goes on: no edge, and the version does not move.
|
|
143
|
+
*
|
|
144
|
+
* @returns Whether the episode was still open
|
|
145
|
+
*/
|
|
146
|
+
function updateEpisodeKind(parts, expectedId, kind) {
|
|
147
|
+
const view = waiting_episode_state_store_1.episodes.get((0, waiting_episode_state_store_1.keyOf)(parts));
|
|
148
|
+
if (view === undefined || (0, waiting_episode_state_store_1.metaOf)(view).episodeId !== expectedId)
|
|
149
|
+
return false;
|
|
150
|
+
view.kind = kind;
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The waiting-episode store's state tables, its listeners and the reads
|
|
4
|
+
* (Issue #1786 / #3798). The single place that initialises each `globalThis` slot.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.UNKNOWN_BINDING = exports.lastClosed = exports.metas = exports.episodes = void 0;
|
|
8
|
+
exports.nextEpisodeId = nextEpisodeId;
|
|
9
|
+
exports.keyOf = keyOf;
|
|
10
|
+
exports.bumpVersion = bumpVersion;
|
|
11
|
+
exports.onWaitingTransition = onWaitingTransition;
|
|
12
|
+
exports.onWaitingEpisodeTransition = onWaitingEpisodeTransition;
|
|
13
|
+
exports.emit = emit;
|
|
14
|
+
exports.metaOf = metaOf;
|
|
15
|
+
exports.getWaitingEpisodeRecord = getWaitingEpisodeRecord;
|
|
16
|
+
exports.getEpisodeVersion = getEpisodeVersion;
|
|
17
|
+
exports.snapshotEpisodeVersions = snapshotEpisodeVersions;
|
|
18
|
+
exports.getLastClosedEpisode = getLastClosedEpisode;
|
|
19
|
+
exports.getWaitingEpisode = getWaitingEpisode;
|
|
20
|
+
exports.hasOpenWaitingEpisode = hasOpenWaitingEpisode;
|
|
21
|
+
exports.clearWaitingEpisodes = clearWaitingEpisodes;
|
|
22
|
+
exports.clearWaitingTransitionListeners = clearWaitingTransitionListeners;
|
|
23
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
24
|
+
const logger_1 = require("../../lib/logger");
|
|
25
|
+
const global_state_1 = require("../global-state");
|
|
26
|
+
const logger = (0, logger_1.createLogger)('waiting-episode-state');
|
|
27
|
+
/** compositeKey -> the wait currently in progress for that instance. */
|
|
28
|
+
exports.episodes = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodes', () => new Map());
|
|
29
|
+
/** Subscribers to the edge. See the module docblock. */
|
|
30
|
+
const listeners = (0, global_state_1.getOrInitGlobal)('__sessionWaitingTransitionListeners', () => new Set());
|
|
31
|
+
exports.metas = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodeMeta', () => new WeakMap());
|
|
32
|
+
const versions = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodeVersions', () => new Map());
|
|
33
|
+
exports.lastClosed = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodeLastClosed', () => new Map());
|
|
34
|
+
const episodeSeq = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodeSeq', () => ({
|
|
35
|
+
value: 0,
|
|
36
|
+
nonce: Math.random().toString(36).slice(2, 10),
|
|
37
|
+
}));
|
|
38
|
+
const episodeListeners = (0, global_state_1.getOrInitGlobal)('__sessionWaitingEpisodeListeners', () => new Set());
|
|
39
|
+
/** The binding used when no resolver is registered: nothing is known. */
|
|
40
|
+
exports.UNKNOWN_BINDING = {
|
|
41
|
+
kind: 'unattributed',
|
|
42
|
+
generation: { kind: 'none' },
|
|
43
|
+
lastClosedTurnId: null,
|
|
44
|
+
};
|
|
45
|
+
function nextEpisodeId() {
|
|
46
|
+
episodeSeq.value += 1;
|
|
47
|
+
return `wep-${episodeSeq.nonce}-${episodeSeq.value}`;
|
|
48
|
+
}
|
|
49
|
+
function keyOf(parts) {
|
|
50
|
+
return (0, auto_yes_state_1.buildCompositeKey)(parts.worktreeId, parts.cliToolId, parts.instanceId);
|
|
51
|
+
}
|
|
52
|
+
function bumpVersion(key) {
|
|
53
|
+
versions.set(key, (versions.get(key) ?? 0) + 1);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Subscribe to waiting edges.
|
|
57
|
+
*
|
|
58
|
+
* @returns An unsubscribe function. Idempotent — calling it twice is harmless.
|
|
59
|
+
*/
|
|
60
|
+
function onWaitingTransition(listener) {
|
|
61
|
+
listeners.add(listener);
|
|
62
|
+
return () => {
|
|
63
|
+
listeners.delete(listener);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Subscribe to waiting edges with the episode's identity (Issue #3798).
|
|
68
|
+
*
|
|
69
|
+
* The same crossings `onWaitingTransition` delivers, in the same order, with
|
|
70
|
+
* the cause, the episode ids and the close reason added.
|
|
71
|
+
*/
|
|
72
|
+
function onWaitingEpisodeTransition(listener) {
|
|
73
|
+
episodeListeners.add(listener);
|
|
74
|
+
return () => {
|
|
75
|
+
episodeListeners.delete(listener);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Notify subscribers, containing anything they throw. */
|
|
79
|
+
function emit(transition) {
|
|
80
|
+
const { cause: _cause, episodeId: _id, previousEpisodeId: _prev, closeReason: _reason, ...plain } = transition;
|
|
81
|
+
for (const listener of listeners) {
|
|
82
|
+
try {
|
|
83
|
+
listener(plain);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
logListenerFailure(transition, error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const listener of episodeListeners) {
|
|
90
|
+
try {
|
|
91
|
+
listener(transition);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logListenerFailure(transition, error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function logListenerFailure(transition, error) {
|
|
99
|
+
logger.error('waiting-transition-listener-failed', {
|
|
100
|
+
worktreeId: transition.worktreeId,
|
|
101
|
+
cliToolId: transition.cliToolId,
|
|
102
|
+
instanceId: transition.instanceId ?? transition.cliToolId,
|
|
103
|
+
waiting: transition.waiting,
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The meta of an episode in the map. An episode put there without one (a test
|
|
109
|
+
* that wrote the map directly) is given an unattributed identity on first read.
|
|
110
|
+
*/
|
|
111
|
+
function metaOf(view) {
|
|
112
|
+
let meta = exports.metas.get(view);
|
|
113
|
+
if (meta === undefined) {
|
|
114
|
+
meta = {
|
|
115
|
+
episodeId: nextEpisodeId(),
|
|
116
|
+
openedAt: view.since,
|
|
117
|
+
boundAt: view.since,
|
|
118
|
+
binding: exports.UNKNOWN_BINDING,
|
|
119
|
+
openedBy: 'legacy-edge',
|
|
120
|
+
promptScreenKey: null,
|
|
121
|
+
};
|
|
122
|
+
exports.metas.set(view, meta);
|
|
123
|
+
}
|
|
124
|
+
return meta;
|
|
125
|
+
}
|
|
126
|
+
/** The open episode with its identity and binding, or null (Issue #3798). */
|
|
127
|
+
function getWaitingEpisodeRecord(worktreeId, cliToolId, instanceId) {
|
|
128
|
+
const view = exports.episodes.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
|
|
129
|
+
if (view === undefined)
|
|
130
|
+
return null;
|
|
131
|
+
const meta = metaOf(view);
|
|
132
|
+
return { since: view.since, kind: view.kind, ...meta, binding: meta.binding };
|
|
133
|
+
}
|
|
134
|
+
/** The instance's episode version: it moves on every open, close, replacement and rebind. */
|
|
135
|
+
function getEpisodeVersion(worktreeId, cliToolId, instanceId) {
|
|
136
|
+
return versions.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? 0;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Every instance version of one worktree, as of now (Issue #3798): the status
|
|
140
|
+
* probe fixes them before it lists the tmux sessions. An instance missing from
|
|
141
|
+
* the map is at version 0.
|
|
142
|
+
*/
|
|
143
|
+
function snapshotEpisodeVersions(worktreeId) {
|
|
144
|
+
const prefix = `${worktreeId}${auto_yes_state_1.COMPOSITE_KEY_SEPARATOR}`;
|
|
145
|
+
const snapshot = new Map();
|
|
146
|
+
for (const [key, version] of versions) {
|
|
147
|
+
if (key.startsWith(prefix))
|
|
148
|
+
snapshot.set(key, version);
|
|
149
|
+
}
|
|
150
|
+
return snapshot;
|
|
151
|
+
}
|
|
152
|
+
/** The last episode that ended for this instance, or null. */
|
|
153
|
+
function getLastClosedEpisode(worktreeId, cliToolId, instanceId) {
|
|
154
|
+
return exports.lastClosed.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* @returns The wait in progress for this instance, or null when it is not
|
|
158
|
+
* waiting. Read-only: observing the edge is {@link observeWaitingEdge}'s job.
|
|
159
|
+
*/
|
|
160
|
+
function getWaitingEpisode(worktreeId, cliToolId, instanceId) {
|
|
161
|
+
return exports.episodes.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Whether **any** instance in this worktree is still waiting (Issue #2001).
|
|
165
|
+
*
|
|
166
|
+
* The cross-device dismissal is keyed on the worktree, because that is what the
|
|
167
|
+
* Service Worker `tag` names (`<worktreeId>:prompt`, `push-sender`): two agent
|
|
168
|
+
* instances waiting in one worktree share a single notification card on the
|
|
169
|
+
* phone. So one instance crossing the closing edge is not on its own a reason
|
|
170
|
+
* to clear that card — the card is still telling the truth until the last of
|
|
171
|
+
* them has been answered.
|
|
172
|
+
*
|
|
173
|
+
* The prefix test is exact rather than heuristic: `buildCompositeKey` puts the
|
|
174
|
+
* worktree id first and rejects a worktree id containing
|
|
175
|
+
* {@link COMPOSITE_KEY_SEPARATOR}, so no other worktree's key can start with
|
|
176
|
+
* `<worktreeId>:`.
|
|
177
|
+
*/
|
|
178
|
+
function hasOpenWaitingEpisode(worktreeId) {
|
|
179
|
+
const prefix = `${worktreeId}${auto_yes_state_1.COMPOSITE_KEY_SEPARATOR}`;
|
|
180
|
+
for (const key of exports.episodes.keys()) {
|
|
181
|
+
if (key.startsWith(prefix))
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Drop every episode. Test seam.
|
|
188
|
+
*
|
|
189
|
+
* CI runs with `fileParallelism: false`, so one process holds this map for the
|
|
190
|
+
* whole suite: a test that opens an episode and does not clear it hands the next
|
|
191
|
+
* file a session that is already waiting.
|
|
192
|
+
*/
|
|
193
|
+
function clearWaitingEpisodes() {
|
|
194
|
+
exports.episodes.clear();
|
|
195
|
+
versions.clear();
|
|
196
|
+
exports.lastClosed.clear();
|
|
197
|
+
}
|
|
198
|
+
/** Drop every subscriber. Test seam, paired with {@link clearWaitingEpisodes}. */
|
|
199
|
+
function clearWaitingTransitionListeners() {
|
|
200
|
+
listeners.clear();
|
|
201
|
+
episodeListeners.clear();
|
|
202
|
+
}
|