botmux 3.10.0 → 3.11.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/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts +4 -3
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +11 -8
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/pty-backend.d.ts +1 -1
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +4 -1
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +29 -5
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +302 -31
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +6 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +7 -0
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +4 -1
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +37 -3
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts +3 -3
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +9 -3
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts +3 -3
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +12 -7
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +11 -2
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +35 -2
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +88 -7
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/runner-input.d.ts +15 -14
- package/dist/adapters/cli/runner-input.d.ts.map +1 -1
- package/dist/adapters/cli/runner-input.js +64 -26
- package/dist/adapters/cli/runner-input.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +20 -5
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +24 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +110 -5
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/fleet-shutdown.d.ts +47 -0
- package/dist/cli/fleet-shutdown.d.ts.map +1 -0
- package/dist/cli/fleet-shutdown.js +387 -0
- package/dist/cli/fleet-shutdown.js.map +1 -0
- package/dist/cli/pm2-descriptor-guard.d.ts +19 -0
- package/dist/cli/pm2-descriptor-guard.d.ts.map +1 -0
- package/dist/cli/pm2-descriptor-guard.js +122 -0
- package/dist/cli/pm2-descriptor-guard.js.map +1 -0
- package/dist/cli/pm2-exact-start.d.ts +16 -0
- package/dist/cli/pm2-exact-start.d.ts.map +1 -0
- package/dist/cli/pm2-exact-start.js +63 -0
- package/dist/cli/pm2-exact-start.js.map +1 -0
- package/dist/cli/pm2-god-admission.d.ts +8 -0
- package/dist/cli/pm2-god-admission.d.ts.map +1 -0
- package/dist/cli/pm2-god-admission.js +25 -0
- package/dist/cli/pm2-god-admission.js.map +1 -0
- package/dist/cli/pm2-jlist.d.ts +13 -0
- package/dist/cli/pm2-jlist.d.ts.map +1 -0
- package/dist/cli/pm2-jlist.js +108 -0
- package/dist/cli/pm2-jlist.js.map +1 -0
- package/dist/cli/pm2-preflight.d.ts +10 -0
- package/dist/cli/pm2-preflight.d.ts.map +1 -0
- package/dist/cli/pm2-preflight.js +23 -0
- package/dist/cli/pm2-preflight.js.map +1 -0
- package/dist/cli/pm2-shutdown-capability.d.ts +27 -0
- package/dist/cli/pm2-shutdown-capability.d.ts.map +1 -0
- package/dist/cli/pm2-shutdown-capability.js +161 -0
- package/dist/cli/pm2-shutdown-capability.js.map +1 -0
- package/dist/cli/pm2-start-transaction.d.ts +55 -0
- package/dist/cli/pm2-start-transaction.d.ts.map +1 -0
- package/dist/cli/pm2-start-transaction.js +220 -0
- package/dist/cli/pm2-start-transaction.js.map +1 -0
- package/dist/cli/send-dispatch.d.ts +12 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +31 -4
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/session-list-liveness.d.ts +1 -0
- package/dist/cli/session-list-liveness.d.ts.map +1 -1
- package/dist/cli/session-list-liveness.js +6 -0
- package/dist/cli/session-list-liveness.js.map +1 -1
- package/dist/cli/session-picker-layout.d.ts +26 -0
- package/dist/cli/session-picker-layout.d.ts.map +1 -0
- package/dist/cli/session-picker-layout.js +123 -0
- package/dist/cli/session-picker-layout.js.map +1 -0
- package/dist/cli/session-picker-viewport.d.ts +49 -0
- package/dist/cli/session-picker-viewport.d.ts.map +1 -0
- package/dist/cli/session-picker-viewport.js +46 -0
- package/dist/cli/session-picker-viewport.js.map +1 -0
- package/dist/cli/supervisor-shutdown-client.d.ts +31 -0
- package/dist/cli/supervisor-shutdown-client.d.ts.map +1 -0
- package/dist/cli/supervisor-shutdown-client.js +146 -0
- package/dist/cli/supervisor-shutdown-client.js.map +1 -0
- package/dist/cli/terminal-width.d.ts +48 -0
- package/dist/cli/terminal-width.d.ts.map +1 -0
- package/dist/cli/terminal-width.js +119 -0
- package/dist/cli/terminal-width.js.map +1 -0
- package/dist/cli/vc-agent.d.ts.map +1 -1
- package/dist/cli/vc-agent.js +1 -1
- package/dist/cli/vc-agent.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2269 -716
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +1630 -125
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/ask-api.d.ts +8 -1
- package/dist/core/ask-api.d.ts.map +1 -1
- package/dist/core/ask-api.js +18 -0
- package/dist/core/ask-api.js.map +1 -1
- package/dist/core/ask-broker.d.ts +20 -0
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +467 -47
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/ask-persist-store.d.ts +126 -0
- package/dist/core/ask-persist-store.d.ts.map +1 -0
- package/dist/core/ask-persist-store.js +188 -0
- package/dist/core/ask-persist-store.js.map +1 -0
- package/dist/core/ask-types.d.ts +80 -0
- package/dist/core/ask-types.d.ts.map +1 -1
- package/dist/core/ask-types.js +62 -0
- package/dist/core/ask-types.js.map +1 -1
- package/dist/core/cli-session-id-publisher.d.ts +20 -0
- package/dist/core/cli-session-id-publisher.d.ts.map +1 -0
- package/dist/core/cli-session-id-publisher.js +21 -0
- package/dist/core/cli-session-id-publisher.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +427 -255
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +13 -0
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +385 -26
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +9 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +842 -288
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/explicit-session-backing-cleanup.d.ts +49 -0
- package/dist/core/explicit-session-backing-cleanup.d.ts.map +1 -0
- package/dist/core/explicit-session-backing-cleanup.js +76 -0
- package/dist/core/explicit-session-backing-cleanup.js.map +1 -0
- package/dist/core/idle-worker-sweeper.d.ts +20 -0
- package/dist/core/idle-worker-sweeper.d.ts.map +1 -1
- package/dist/core/idle-worker-sweeper.js +18 -0
- package/dist/core/idle-worker-sweeper.js.map +1 -1
- package/dist/core/inflight-input-tracker.d.ts +10 -0
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +7 -0
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/managed-origin-attestation.d.ts +51 -0
- package/dist/core/managed-origin-attestation.d.ts.map +1 -0
- package/dist/core/managed-origin-attestation.js +208 -0
- package/dist/core/managed-origin-attestation.js.map +1 -0
- package/dist/core/managed-origin-capability.d.ts +62 -3
- package/dist/core/managed-origin-capability.d.ts.map +1 -1
- package/dist/core/managed-origin-capability.js +419 -9
- package/dist/core/managed-origin-capability.js.map +1 -1
- package/dist/core/pending-repo-journal.d.ts +6 -0
- package/dist/core/pending-repo-journal.d.ts.map +1 -0
- package/dist/core/pending-repo-journal.js +85 -0
- package/dist/core/pending-repo-journal.js.map +1 -0
- package/dist/core/persistent-backend.d.ts +6 -1
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +12 -6
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/process-start-identity.d.ts +3 -0
- package/dist/core/process-start-identity.d.ts.map +1 -0
- package/dist/core/process-start-identity.js +62 -0
- package/dist/core/process-start-identity.js.map +1 -0
- package/dist/core/raw-command-writer.d.ts +34 -0
- package/dist/core/raw-command-writer.d.ts.map +1 -0
- package/dist/core/raw-command-writer.js +48 -0
- package/dist/core/raw-command-writer.js.map +1 -0
- package/dist/core/reply-target.d.ts +85 -22
- package/dist/core/reply-target.d.ts.map +1 -1
- package/dist/core/reply-target.js +267 -32
- package/dist/core/reply-target.js.map +1 -1
- package/dist/core/resource-monitor/runtime.d.ts.map +1 -1
- package/dist/core/resource-monitor/runtime.js +4 -1
- package/dist/core/resource-monitor/runtime.js.map +1 -1
- package/dist/core/restart-report.d.ts +6 -1
- package/dist/core/restart-report.d.ts.map +1 -1
- package/dist/core/restart-report.js +22 -4
- package/dist/core/restart-report.js.map +1 -1
- package/dist/core/riff-shutdown-detach.d.ts +164 -0
- package/dist/core/riff-shutdown-detach.d.ts.map +1 -0
- package/dist/core/riff-shutdown-detach.js +787 -0
- package/dist/core/riff-shutdown-detach.js.map +1 -0
- package/dist/core/riff-worker-shutdown-readiness.d.ts +17 -0
- package/dist/core/riff-worker-shutdown-readiness.d.ts.map +1 -0
- package/dist/core/riff-worker-shutdown-readiness.js +21 -0
- package/dist/core/riff-worker-shutdown-readiness.js.map +1 -0
- package/dist/core/session-manager.d.ts +6 -6
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1227 -594
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +1 -1
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +2 -2
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/session-mutation-guard.d.ts +17 -0
- package/dist/core/session-mutation-guard.d.ts.map +1 -0
- package/dist/core/session-mutation-guard.js +33 -0
- package/dist/core/session-mutation-guard.js.map +1 -0
- package/dist/core/shutdown-budgets.d.ts +27 -0
- package/dist/core/shutdown-budgets.d.ts.map +1 -0
- package/dist/core/shutdown-budgets.js +47 -0
- package/dist/core/shutdown-budgets.js.map +1 -0
- package/dist/core/supervisor-shutdown-ipc.d.ts +10 -0
- package/dist/core/supervisor-shutdown-ipc.d.ts.map +1 -0
- package/dist/core/supervisor-shutdown-ipc.js +10 -0
- package/dist/core/supervisor-shutdown-ipc.js.map +1 -0
- package/dist/core/supervisor-shutdown-protocol.d.ts +16 -0
- package/dist/core/supervisor-shutdown-protocol.d.ts.map +1 -0
- package/dist/core/supervisor-shutdown-protocol.js +16 -0
- package/dist/core/supervisor-shutdown-protocol.js.map +1 -0
- package/dist/core/trigger-final-suppression.d.ts +4 -0
- package/dist/core/trigger-final-suppression.d.ts.map +1 -1
- package/dist/core/trigger-final-suppression.js +6 -11
- package/dist/core/trigger-final-suppression.js.map +1 -1
- package/dist/core/trigger-session.d.ts +70 -0
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +923 -145
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +94 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +194 -13
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2597 -547
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +76 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +2255 -773
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +20 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +24 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/feed-groups.d.ts +17 -0
- package/dist/dashboard/feed-groups.d.ts.map +1 -0
- package/dist/dashboard/feed-groups.js +75 -0
- package/dist/dashboard/feed-groups.js.map +1 -0
- package/dist/dashboard/session-card-model.d.ts +1 -1
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +8 -5
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +4 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +139 -46
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +4 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +40 -3
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +95 -2
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +86 -40
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/kanban-model.js +1 -1
- package/dist/dashboard/web/kanban-model.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +3 -2
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/overview.d.ts +3 -0
- package/dist/dashboard/web/overview.d.ts.map +1 -1
- package/dist/dashboard/web/overview.js +2 -0
- package/dist/dashboard/web/overview.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-kanban.js +2 -0
- package/dist/dashboard/web/sessions-kanban.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +103 -2
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +3 -2
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/ui.d.ts +8 -0
- package/dist/dashboard/web/ui.d.ts.map +1 -1
- package/dist/dashboard/web/ui.js +15 -0
- package/dist/dashboard/web/ui.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-GED4FEMS.js +10 -0
- package/dist/dashboard-web/chunks/chunk-6J5LS5AU.js +51 -0
- package/dist/dashboard-web/chunks/{chunk-ZU3UUKAR.js → chunk-HK7NIBJG.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-3UE7S77S.js → chunk-KRHWZEXU.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-VBXJOJFH.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-EELM66G3.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-T2ZX2RWL.js → insights-page-54UBPPOC.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-YNVBAGR6.js → monitor-room-PORHVKRH.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-LHM55YWN.js → monitoring-page-XGA7AXNL.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-ATXVP7PW.js → office-page-AO3AFG45.js} +1 -1
- package/dist/dashboard-web/chunks/overview-page-F5BUTYR6.js +1 -0
- package/dist/dashboard-web/chunks/{roles-page-56VWM6CD.js → roles-page-M5GIASJU.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-S5K6U4EO.js → schedules-page-O232WQRR.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-YFRPSTIL.js +6 -0
- package/dist/dashboard-web/chunks/{settings-page-QUZDQARR.js → settings-page-OJAZLZQT.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-IFY7AEND.js → skills-page-EFZQPWV4.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-C7FJQPFZ.js → team-federation-page-ZJVAP7HW.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-2LMF3WWR.js → v3-page-GYWTRGO2.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-3XC6QRMY.js → whiteboards-page-MSDAG6P7.js} +1 -1
- package/dist/dashboard-web/style.css +255 -0
- package/dist/dashboard.js +172 -7
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/renderer/app.js +21 -0
- package/dist/desktop/renderer/app.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +35 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +35 -9
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts +23 -0
- package/dist/im/lark/ask-card.d.ts.map +1 -1
- package/dist/im/lark/ask-card.js +94 -4
- package/dist/im/lark/ask-card.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +6 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +112 -15
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +496 -310
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +7 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +39 -26
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts +7 -4
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +19 -6
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +16 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +88 -23
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/forward-followup-content.d.ts.map +1 -1
- package/dist/im/lark/forward-followup-content.js +9 -1
- package/dist/im/lark/forward-followup-content.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +7 -4
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +11 -0
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +46 -0
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +23 -2
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +58 -3
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/overview-card.d.ts.map +1 -1
- package/dist/im/lark/overview-card.js +2 -1
- package/dist/im/lark/overview-card.js.map +1 -1
- package/dist/services/async-trigger-state.d.ts +6 -1
- package/dist/services/async-trigger-state.d.ts.map +1 -1
- package/dist/services/async-trigger-state.js +21 -0
- package/dist/services/async-trigger-state.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +23 -1
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +96 -13
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +40 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +124 -24
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +8 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
- package/dist/services/codex-app-runner-protocol.js +9 -2
- package/dist/services/codex-app-runner-protocol.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +1 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +1 -0
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-service-tier.d.ts +2 -0
- package/dist/services/codex-service-tier.d.ts.map +1 -1
- package/dist/services/codex-service-tier.js +1 -0
- package/dist/services/codex-service-tier.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +27 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +340 -2
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/grant-policy.d.ts +3 -0
- package/dist/services/grant-policy.d.ts.map +1 -1
- package/dist/services/grant-policy.js +5 -0
- package/dist/services/grant-policy.js.map +1 -1
- package/dist/services/grant-prefs-store.d.ts +6 -3
- package/dist/services/grant-prefs-store.d.ts.map +1 -1
- package/dist/services/grant-prefs-store.js +42 -12
- package/dist/services/grant-prefs-store.js.map +1 -1
- package/dist/services/hook-runner.d.ts +20 -1
- package/dist/services/hook-runner.d.ts.map +1 -1
- package/dist/services/hook-runner.js +17 -13
- package/dist/services/hook-runner.js.map +1 -1
- package/dist/services/idempotency-store.d.ts +134 -0
- package/dist/services/idempotency-store.d.ts.map +1 -0
- package/dist/services/idempotency-store.js +299 -0
- package/dist/services/idempotency-store.js.map +1 -0
- package/dist/services/jsonl-cursor.d.ts +7 -3
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +55 -31
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/open-platform-rename.d.ts.map +1 -1
- package/dist/services/open-platform-rename.js +1 -108
- package/dist/services/open-platform-rename.js.map +1 -1
- package/dist/services/restart-intent-store.d.ts +22 -2
- package/dist/services/restart-intent-store.d.ts.map +1 -1
- package/dist/services/restart-intent-store.js +160 -18
- package/dist/services/restart-intent-store.js.map +1 -1
- package/dist/services/sandbox-store.d.ts +22 -0
- package/dist/services/sandbox-store.d.ts.map +1 -1
- package/dist/services/sandbox-store.js +37 -8
- package/dist/services/sandbox-store.js.map +1 -1
- package/dist/services/send-policy.d.ts +41 -33
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +39 -40
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-store.d.ts +66 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +403 -67
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/submit-notification.d.ts +3 -0
- package/dist/services/submit-notification.d.ts.map +1 -0
- package/dist/services/submit-notification.js +15 -0
- package/dist/services/submit-notification.js.map +1 -0
- package/dist/services/traex-transcript.d.ts +25 -2
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +133 -1
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +13 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +39 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/voice/index.d.ts +3 -2
- package/dist/services/voice/index.d.ts.map +1 -1
- package/dist/services/voice/index.js +5 -5
- package/dist/services/voice/index.js.map +1 -1
- package/dist/services/voice/openai.d.ts +2 -1
- package/dist/services/voice/openai.d.ts.map +1 -1
- package/dist/services/voice/openai.js +2 -1
- package/dist/services/voice/openai.js.map +1 -1
- package/dist/services/voice/sami.d.ts +5 -2
- package/dist/services/voice/sami.d.ts.map +1 -1
- package/dist/services/voice/sami.js +19 -4
- package/dist/services/voice/sami.js.map +1 -1
- package/dist/setup/bots-store.d.ts.map +1 -1
- package/dist/setup/bots-store.js +10 -4
- package/dist/setup/bots-store.js.map +1 -1
- package/dist/setup/lark-scopes.json +2 -0
- package/dist/setup/open-platform-automation.d.ts +9 -1
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +44 -15
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/open-platform-visibility.d.ts +42 -0
- package/dist/setup/open-platform-visibility.d.ts.map +1 -0
- package/dist/setup/open-platform-visibility.js +133 -0
- package/dist/setup/open-platform-visibility.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +6 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.js +2 -2
- package/dist/types.d.ts +290 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +1 -0
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +1 -1
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +9 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/codex-app-control.d.ts +438 -0
- package/dist/utils/codex-app-control.d.ts.map +1 -0
- package/dist/utils/codex-app-control.js +2336 -0
- package/dist/utils/codex-app-control.js.map +1 -0
- package/dist/utils/codex-app-dispatch-ledger.d.ts +78 -0
- package/dist/utils/codex-app-dispatch-ledger.d.ts.map +1 -0
- package/dist/utils/codex-app-dispatch-ledger.js +149 -0
- package/dist/utils/codex-app-dispatch-ledger.js.map +1 -0
- package/dist/utils/codex-app-turn-dispatch.d.ts +77 -0
- package/dist/utils/codex-app-turn-dispatch.d.ts.map +1 -0
- package/dist/utils/codex-app-turn-dispatch.js +141 -0
- package/dist/utils/codex-app-turn-dispatch.js.map +1 -0
- package/dist/utils/codex-app-turn-liveness.d.ts +125 -0
- package/dist/utils/codex-app-turn-liveness.d.ts.map +1 -0
- package/dist/utils/codex-app-turn-liveness.js +301 -0
- package/dist/utils/codex-app-turn-liveness.js.map +1 -0
- package/dist/utils/idle-detector.d.ts +12 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +19 -0
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/input-gate.d.ts +87 -0
- package/dist/utils/input-gate.d.ts.map +1 -1
- package/dist/utils/input-gate.js +86 -0
- package/dist/utils/input-gate.js.map +1 -1
- package/dist/utils/lark-upload.d.ts.map +1 -1
- package/dist/utils/lark-upload.js +52 -1
- package/dist/utils/lark-upload.js.map +1 -1
- package/dist/utils/pending-input-queue.d.ts +15 -0
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +5 -1
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +53 -2
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker-ipc-preload.d.ts +12 -0
- package/dist/worker-ipc-preload.d.ts.map +1 -0
- package/dist/worker-ipc-preload.js +44 -0
- package/dist/worker-ipc-preload.js.map +1 -0
- package/dist/worker.js +2604 -325
- package/dist/worker.js.map +1 -1
- package/dist/workflows/v3/session-relay-client.d.ts +1 -0
- package/dist/workflows/v3/session-relay-client.d.ts.map +1 -1
- package/dist/workflows/v3/session-relay-client.js +12 -3
- package/dist/workflows/v3/session-relay-client.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-LTVOUDIS.js +0 -10
- package/dist/dashboard-web/chunks/chunk-DCS35UMD.js +0 -1
- package/dist/dashboard-web/chunks/chunk-MFQPCVHY.js +0 -51
- package/dist/dashboard-web/chunks/connectors-page-5KWDIMKC.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-FHOKYXMW.js +0 -8
- package/dist/dashboard-web/chunks/overview-page-QYI3KBDD.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-WBP4N7D2.js +0 -6
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-owned attribution for Codex App's serial runner queue.
|
|
3
|
+
*
|
|
4
|
+
* The runner can echo a stable clientUserMessageId, but it must never choose
|
|
5
|
+
* the daemon delivery attempt. A worker may also finish writing turn N+1
|
|
6
|
+
* before turn N's final transaction arrives, so the mutable "current turn"
|
|
7
|
+
* globals are not an attribution boundary. Reserve one immutable entry per
|
|
8
|
+
* control-line write and settle final transactions strictly from the head.
|
|
9
|
+
*/
|
|
10
|
+
export class CodexAppTurnDispatchQueue {
|
|
11
|
+
queue = [];
|
|
12
|
+
nextHandle = 1;
|
|
13
|
+
reserve(turnId, dispatchAttempt, dispatchId, recovered = false, replyTurnId, codexAppSteerable) {
|
|
14
|
+
if (!turnId)
|
|
15
|
+
throw new Error('Codex App dispatch turn id must be non-empty');
|
|
16
|
+
const reservation = {
|
|
17
|
+
handle: this.nextHandle++,
|
|
18
|
+
...(dispatchId ? { dispatchId } : {}),
|
|
19
|
+
turnId,
|
|
20
|
+
...(replyTurnId ? { replyTurnId } : {}),
|
|
21
|
+
...(dispatchAttempt !== undefined ? { dispatchAttempt } : {}),
|
|
22
|
+
...(recovered ? { recovered: true } : {}),
|
|
23
|
+
...(codexAppSteerable ? { codexAppSteerable: true } : {}),
|
|
24
|
+
};
|
|
25
|
+
this.queue.push(reservation);
|
|
26
|
+
return { ...reservation };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A replacement worker cannot recover the old in-memory queue. It may
|
|
30
|
+
* recover exactly the daemon-frozen active identity supplied in `init`, and
|
|
31
|
+
* only while no locally submitted entry exists. A runner marker still has
|
|
32
|
+
* to assert equality before this entry can settle.
|
|
33
|
+
*/
|
|
34
|
+
recoverWarmReattach(turnId, dispatchAttempt, dispatchId, replyTurnId) {
|
|
35
|
+
if (!turnId || this.queue.length > 0)
|
|
36
|
+
return undefined;
|
|
37
|
+
return this.reserve(turnId, dispatchAttempt, dispatchId, true, replyTurnId);
|
|
38
|
+
}
|
|
39
|
+
restore(entries) {
|
|
40
|
+
if (this.queue.length > 0)
|
|
41
|
+
throw new Error('Codex App dispatch queue is already populated');
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
this.reserve(entry.turnId, entry.dispatchAttempt, entry.dispatchId, true, entry.replyTurnId, entry.codexAppSteerable);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
recoveredPrefix() {
|
|
47
|
+
const prefix = [];
|
|
48
|
+
for (const entry of this.queue) {
|
|
49
|
+
if (!entry.recovered)
|
|
50
|
+
break;
|
|
51
|
+
prefix.push({ ...entry });
|
|
52
|
+
}
|
|
53
|
+
return prefix;
|
|
54
|
+
}
|
|
55
|
+
/** Remove the exact write that threw or reported submitted=false. */
|
|
56
|
+
cancelExact(handle) {
|
|
57
|
+
const index = this.queue.findIndex(entry => entry.handle === handle);
|
|
58
|
+
if (index < 0)
|
|
59
|
+
return false;
|
|
60
|
+
this.queue.splice(index, 1);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
markRecovered(handle) {
|
|
64
|
+
const entry = this.queue.find(candidate => candidate.handle === handle);
|
|
65
|
+
if (!entry)
|
|
66
|
+
return false;
|
|
67
|
+
entry.recovered = true;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
findExact(turnId, dispatchAttempt) {
|
|
71
|
+
const entry = this.queue.find(candidate => candidate.turnId === turnId
|
|
72
|
+
&& candidate.dispatchAttempt === dispatchAttempt);
|
|
73
|
+
return entry ? { ...entry } : undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validate and consume one complete final transaction. The head remains in
|
|
77
|
+
* place on every rejection, so a stale/mismatched marker cannot steal the
|
|
78
|
+
* next turn or advance the FIFO.
|
|
79
|
+
*/
|
|
80
|
+
settleFinal(payload, consume = true) {
|
|
81
|
+
const head = this.queue[0];
|
|
82
|
+
if (!head)
|
|
83
|
+
return { ok: false, reason: 'no_pending_turn' };
|
|
84
|
+
const markerTurnId = typeof payload.turnId === 'string' && payload.turnId.length > 0
|
|
85
|
+
? payload.turnId
|
|
86
|
+
: undefined;
|
|
87
|
+
if (markerTurnId && markerTurnId !== head.turnId) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
reason: 'turn_mismatch',
|
|
91
|
+
markerTurnId,
|
|
92
|
+
expectedTurnId: head.turnId,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Attempt identity is worker-owned. A runner may redundantly assert it,
|
|
96
|
+
// but an assertion of any other value (including a malformed one) is a
|
|
97
|
+
// rejection and can never select another queue entry.
|
|
98
|
+
if (payload.dispatchAttempt !== undefined
|
|
99
|
+
&& payload.dispatchAttempt !== head.dispatchAttempt) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
reason: 'dispatch_attempt_mismatch',
|
|
103
|
+
markerDispatchAttempt: payload.dispatchAttempt,
|
|
104
|
+
...(head.dispatchAttempt !== undefined
|
|
105
|
+
? { expectedDispatchAttempt: head.dispatchAttempt }
|
|
106
|
+
: {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const nativeTurnId = typeof payload.nativeTurnId === 'string' && payload.nativeTurnId.length > 0
|
|
110
|
+
? payload.nativeTurnId
|
|
111
|
+
: undefined;
|
|
112
|
+
if (consume)
|
|
113
|
+
this.queue.shift();
|
|
114
|
+
return {
|
|
115
|
+
ok: true,
|
|
116
|
+
handle: head.handle,
|
|
117
|
+
...(head.dispatchId ? { dispatchId: head.dispatchId } : {}),
|
|
118
|
+
turnId: head.turnId,
|
|
119
|
+
...(head.replyTurnId ? { replyTurnId: head.replyTurnId } : {}),
|
|
120
|
+
...(head.dispatchAttempt !== undefined
|
|
121
|
+
? { dispatchAttempt: head.dispatchAttempt }
|
|
122
|
+
: {}),
|
|
123
|
+
...(nativeTurnId ? { nativeTurnId } : {}),
|
|
124
|
+
...(head.codexAppSteerable ? { codexAppSteerable: true } : {}),
|
|
125
|
+
remaining: this.queue.length - (consume ? 0 : 1),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
commitExactHead(handle) {
|
|
129
|
+
if (this.queue[0]?.handle !== handle)
|
|
130
|
+
return false;
|
|
131
|
+
this.queue.shift();
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
size() {
|
|
135
|
+
return this.queue.length;
|
|
136
|
+
}
|
|
137
|
+
clear() {
|
|
138
|
+
this.queue.length = 0;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=codex-app-turn-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-turn-dispatch.js","sourceRoot":"","sources":["../../src/utils/codex-app-turn-dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { BackendType } from '../adapters/backend/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Codex App turn liveness, driven by the app-server runner's explicit turn
|
|
4
|
+
* activity markers. This deliberately reports "no observable progress"
|
|
5
|
+
* rather than failure: a long-running tool may recover and emit activity
|
|
6
|
+
* later, at which point the stalled projection clears without replaying work.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CODEX_APP_NO_PROGRESS_TIMEOUT_MS = 90000;
|
|
9
|
+
/**
|
|
10
|
+
* Decide whether an existing persistent pane needs a synthetic observation.
|
|
11
|
+
* This deliberately does not depend on pipe mode: Zellij reattaches through
|
|
12
|
+
* its own PTY (`isPipeMode=false`) but preserves the same running CLI.
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldBeginCodexAppReattachObservation(input: {
|
|
15
|
+
cliId?: string;
|
|
16
|
+
backendType: BackendType;
|
|
17
|
+
isReattach: boolean;
|
|
18
|
+
}): boolean;
|
|
19
|
+
export interface CodexAppLivenessPoll {
|
|
20
|
+
active: boolean;
|
|
21
|
+
stalled: boolean;
|
|
22
|
+
/** True only on the working -> stalled edge. */
|
|
23
|
+
newlyStalled: boolean;
|
|
24
|
+
/** True at most once for one submitted turn, even if it later recovers. */
|
|
25
|
+
shouldNotify: boolean;
|
|
26
|
+
turnId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CodexAppActivityApplyResult {
|
|
29
|
+
accepted: boolean;
|
|
30
|
+
phase?: 'submitted' | 'progress' | 'completed';
|
|
31
|
+
/** A previously rejected inter-turn prompt became authoritative. */
|
|
32
|
+
shouldReplayPrompt?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface CodexAppStateApplyResult {
|
|
35
|
+
accepted: boolean;
|
|
36
|
+
busy?: boolean;
|
|
37
|
+
tracksTurn?: boolean;
|
|
38
|
+
/** Signed idle arrived after the tracker's explicit queue drained. */
|
|
39
|
+
shouldPublishReady?: boolean;
|
|
40
|
+
atMs?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Signed runner state is the Codex App ready authority. Terminal prompt bytes
|
|
44
|
+
* remain useful as a recovery hint, but PTY/tmux/Herdr/Zellij delivery can be
|
|
45
|
+
* delayed or lost and must never publish idle ahead of the signed final queue.
|
|
46
|
+
*/
|
|
47
|
+
export declare class CodexAppReadyAuthority {
|
|
48
|
+
private signedIdle;
|
|
49
|
+
private latePromptRecoveryArmed;
|
|
50
|
+
reset(): void;
|
|
51
|
+
beginWork(): void;
|
|
52
|
+
/** Returns true only for an authenticated runner's idle boundary. */
|
|
53
|
+
noteSignedState(busy: boolean): boolean;
|
|
54
|
+
canPublishPromptReady(): boolean;
|
|
55
|
+
/** Arm only after the worker cancels the exact local submit slot. */
|
|
56
|
+
armLatePromptRecovery(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Consume one late terminal prompt after the cancelled slot left no tracked
|
|
59
|
+
* work. New work, authenticated activity/state, or reset clears the arm.
|
|
60
|
+
*/
|
|
61
|
+
consumeLatePromptRecovery(trackerEmpty: boolean): boolean;
|
|
62
|
+
}
|
|
63
|
+
/** Apply a state payload from an already authenticated runner connection. */
|
|
64
|
+
export declare function applyTrustedCodexAppStateMarker(tracker: CodexAppTurnLiveness, authority: CodexAppReadyAuthority, payload: unknown, receivedAtMs?: number): CodexAppStateApplyResult;
|
|
65
|
+
export declare class CodexAppTurnLiveness {
|
|
66
|
+
private readonly timeoutMs;
|
|
67
|
+
private readonly turns;
|
|
68
|
+
private nextHandle;
|
|
69
|
+
private promptDeferred;
|
|
70
|
+
constructor(timeoutMs?: number);
|
|
71
|
+
/**
|
|
72
|
+
* Queue one Botmux input immediately before its control line is submitted.
|
|
73
|
+
* Codex App's runner is serial, so only the head turn owns activity/stall
|
|
74
|
+
* state; queued turns get a fresh clock when the head completes.
|
|
75
|
+
*/
|
|
76
|
+
begin(turnId?: string, nowMs?: number): number;
|
|
77
|
+
/** Observe an authenticated runner whose in-memory turn state survived reattach. */
|
|
78
|
+
beginReattachObservation(nowMs?: number): number | undefined;
|
|
79
|
+
/** Drop only the synthetic reconnect slot when signed state identifies work
|
|
80
|
+
* as a native Goal continuation rather than a Botmux-owned turn. */
|
|
81
|
+
discardReattachObservation(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Record runner/app-server activity. Activity after a stall makes the turn
|
|
84
|
+
* working again, but the same turn will not notify the user a second time.
|
|
85
|
+
*/
|
|
86
|
+
noteActivity(nowMs?: number): void;
|
|
87
|
+
/**
|
|
88
|
+
* A signed submitted record can be the first event after worker reattach.
|
|
89
|
+
* Recover an explicit slot when no local flush state survived the restart.
|
|
90
|
+
*/
|
|
91
|
+
noteSubmitted(nowMs?: number): void;
|
|
92
|
+
/** Complete only the runner's current turn and activate the next queued one. */
|
|
93
|
+
completeCurrent(nowMs?: number): boolean;
|
|
94
|
+
/** Remove the exact control-line submission that failed, preserving peers. */
|
|
95
|
+
cancelExact(handle: number, nowMs?: number): {
|
|
96
|
+
cancelled: boolean;
|
|
97
|
+
shouldReplayPrompt: boolean;
|
|
98
|
+
};
|
|
99
|
+
/** Backwards-compatible shorthand for callers that only need replay state. */
|
|
100
|
+
cancel(handle: number, nowMs?: number): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* A prompt is authoritative only for the synthetic reattach observation.
|
|
103
|
+
* Returns whether no explicit/queued turn remains, so the worker can reject
|
|
104
|
+
* a transient inter-turn prompt instead of publishing prompt_ready / idle.
|
|
105
|
+
*/
|
|
106
|
+
notePrompt(nowMs?: number): boolean;
|
|
107
|
+
hasActiveTurn(): boolean;
|
|
108
|
+
/** Drop every queued turn on CLI exit, kill, or worker reinitialization. */
|
|
109
|
+
clear(): void;
|
|
110
|
+
poll(nowMs?: number): CodexAppLivenessPoll;
|
|
111
|
+
private consumeDeferredPrompt;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* One flush may cancel a queued liveness slot because writeInput throws or
|
|
115
|
+
* it returns submitted=false. Preserve the deferred real prompt across that
|
|
116
|
+
* async boundary, but replay it only after every peer slot has drained.
|
|
117
|
+
*/
|
|
118
|
+
export declare class CodexAppFlushPromptReplay {
|
|
119
|
+
private replayRequested;
|
|
120
|
+
cancelSubmission(tracker: CodexAppTurnLiveness, authority: CodexAppReadyAuthority, handle: number | undefined, nowMs?: number): void;
|
|
121
|
+
consumeAfterFlush(tracker: CodexAppTurnLiveness): boolean;
|
|
122
|
+
}
|
|
123
|
+
/** Apply an activity payload whose signed socket connection was authenticated. */
|
|
124
|
+
export declare function applyTrustedCodexAppActivityMarker(tracker: CodexAppTurnLiveness, payload: unknown, receivedAtMs?: number): CodexAppActivityApplyResult;
|
|
125
|
+
//# sourceMappingURL=codex-app-turn-liveness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-turn-liveness.d.ts","sourceRoot":"","sources":["../../src/utils/codex-app-turn-liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex App turn liveness, driven by the app-server runner's explicit turn
|
|
3
|
+
* activity markers. This deliberately reports "no observable progress"
|
|
4
|
+
* rather than failure: a long-running tool may recover and emit activity
|
|
5
|
+
* later, at which point the stalled projection clears without replaying work.
|
|
6
|
+
*/
|
|
7
|
+
export const CODEX_APP_NO_PROGRESS_TIMEOUT_MS = 90_000;
|
|
8
|
+
const PERSISTENT_BACKEND_TYPES = new Set(['tmux', 'herdr', 'zellij']);
|
|
9
|
+
/**
|
|
10
|
+
* Decide whether an existing persistent pane needs a synthetic observation.
|
|
11
|
+
* This deliberately does not depend on pipe mode: Zellij reattaches through
|
|
12
|
+
* its own PTY (`isPipeMode=false`) but preserves the same running CLI.
|
|
13
|
+
*/
|
|
14
|
+
export function shouldBeginCodexAppReattachObservation(input) {
|
|
15
|
+
return input.cliId === 'codex-app'
|
|
16
|
+
&& input.isReattach
|
|
17
|
+
&& PERSISTENT_BACKEND_TYPES.has(input.backendType);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Signed runner state is the Codex App ready authority. Terminal prompt bytes
|
|
21
|
+
* remain useful as a recovery hint, but PTY/tmux/Herdr/Zellij delivery can be
|
|
22
|
+
* delayed or lost and must never publish idle ahead of the signed final queue.
|
|
23
|
+
*/
|
|
24
|
+
export class CodexAppReadyAuthority {
|
|
25
|
+
signedIdle = false;
|
|
26
|
+
latePromptRecoveryArmed = false;
|
|
27
|
+
reset() {
|
|
28
|
+
this.signedIdle = false;
|
|
29
|
+
this.latePromptRecoveryArmed = false;
|
|
30
|
+
}
|
|
31
|
+
beginWork() {
|
|
32
|
+
this.signedIdle = false;
|
|
33
|
+
this.latePromptRecoveryArmed = false;
|
|
34
|
+
}
|
|
35
|
+
/** Returns true only for an authenticated runner's idle boundary. */
|
|
36
|
+
noteSignedState(busy) {
|
|
37
|
+
this.latePromptRecoveryArmed = false;
|
|
38
|
+
this.signedIdle = !busy;
|
|
39
|
+
return this.signedIdle;
|
|
40
|
+
}
|
|
41
|
+
canPublishPromptReady() {
|
|
42
|
+
return this.signedIdle;
|
|
43
|
+
}
|
|
44
|
+
/** Arm only after the worker cancels the exact local submit slot. */
|
|
45
|
+
armLatePromptRecovery() {
|
|
46
|
+
this.signedIdle = false;
|
|
47
|
+
this.latePromptRecoveryArmed = true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Consume one late terminal prompt after the cancelled slot left no tracked
|
|
51
|
+
* work. New work, authenticated activity/state, or reset clears the arm.
|
|
52
|
+
*/
|
|
53
|
+
consumeLatePromptRecovery(trackerEmpty) {
|
|
54
|
+
if (!trackerEmpty || !this.latePromptRecoveryArmed)
|
|
55
|
+
return false;
|
|
56
|
+
this.latePromptRecoveryArmed = false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Apply a state payload from an already authenticated runner connection. */
|
|
61
|
+
export function applyTrustedCodexAppStateMarker(tracker, authority, payload, receivedAtMs = Date.now()) {
|
|
62
|
+
if (!payload || typeof payload !== 'object')
|
|
63
|
+
return { accepted: false };
|
|
64
|
+
const marker = payload;
|
|
65
|
+
if (typeof marker.busy !== 'boolean')
|
|
66
|
+
return { accepted: false };
|
|
67
|
+
const runnerAtMs = typeof marker.atMs === 'number' && Number.isFinite(marker.atMs)
|
|
68
|
+
? Math.min(marker.atMs, receivedAtMs)
|
|
69
|
+
: receivedAtMs;
|
|
70
|
+
if (marker.busy) {
|
|
71
|
+
authority.noteSignedState(true);
|
|
72
|
+
// Goal auto-continuations are native work but do not own a Botmux dispatch
|
|
73
|
+
// slot. Tracking them as a synthetic user turn would leave an extra slot
|
|
74
|
+
// after a later Lark message steers the same native turn and completes.
|
|
75
|
+
const tracksTurn = marker.tracksTurn !== false;
|
|
76
|
+
if (tracksTurn)
|
|
77
|
+
tracker.noteSubmitted(runnerAtMs);
|
|
78
|
+
else
|
|
79
|
+
tracker.discardReattachObservation();
|
|
80
|
+
return { accepted: true, busy: true, tracksTurn, shouldPublishReady: false, atMs: runnerAtMs };
|
|
81
|
+
}
|
|
82
|
+
authority.noteSignedState(false);
|
|
83
|
+
return {
|
|
84
|
+
accepted: true,
|
|
85
|
+
busy: false,
|
|
86
|
+
shouldPublishReady: tracker.notePrompt(runnerAtMs),
|
|
87
|
+
atMs: runnerAtMs,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export class CodexAppTurnLiveness {
|
|
91
|
+
timeoutMs;
|
|
92
|
+
turns = [];
|
|
93
|
+
nextHandle = 1;
|
|
94
|
+
promptDeferred = false;
|
|
95
|
+
constructor(timeoutMs = CODEX_APP_NO_PROGRESS_TIMEOUT_MS) {
|
|
96
|
+
this.timeoutMs = timeoutMs;
|
|
97
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
98
|
+
throw new Error('Codex App liveness timeout must be a positive finite number');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Queue one Botmux input immediately before its control line is submitted.
|
|
103
|
+
* Codex App's runner is serial, so only the head turn owns activity/stall
|
|
104
|
+
* state; queued turns get a fresh clock when the head completes.
|
|
105
|
+
*/
|
|
106
|
+
begin(turnId, nowMs = Date.now()) {
|
|
107
|
+
// A prompt deferred for an earlier queue has no authority over a new queue.
|
|
108
|
+
if (this.turns.length === 0)
|
|
109
|
+
this.promptDeferred = false;
|
|
110
|
+
const handle = this.nextHandle++;
|
|
111
|
+
this.turns.push({
|
|
112
|
+
handle,
|
|
113
|
+
turnId,
|
|
114
|
+
lastActivityAtMs: nowMs,
|
|
115
|
+
stalled: false,
|
|
116
|
+
notified: false,
|
|
117
|
+
reattachObservation: false,
|
|
118
|
+
});
|
|
119
|
+
return handle;
|
|
120
|
+
}
|
|
121
|
+
/** Observe an authenticated runner whose in-memory turn state survived reattach. */
|
|
122
|
+
beginReattachObservation(nowMs = Date.now()) {
|
|
123
|
+
if (this.turns.length > 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
const handle = this.nextHandle++;
|
|
126
|
+
this.turns.push({
|
|
127
|
+
handle,
|
|
128
|
+
lastActivityAtMs: nowMs,
|
|
129
|
+
stalled: false,
|
|
130
|
+
notified: false,
|
|
131
|
+
reattachObservation: true,
|
|
132
|
+
});
|
|
133
|
+
return handle;
|
|
134
|
+
}
|
|
135
|
+
/** Drop only the synthetic reconnect slot when signed state identifies work
|
|
136
|
+
* as a native Goal continuation rather than a Botmux-owned turn. */
|
|
137
|
+
discardReattachObservation() {
|
|
138
|
+
if (!this.turns[0]?.reattachObservation)
|
|
139
|
+
return;
|
|
140
|
+
this.turns.shift();
|
|
141
|
+
this.promptDeferred = false;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Record runner/app-server activity. Activity after a stall makes the turn
|
|
145
|
+
* working again, but the same turn will not notify the user a second time.
|
|
146
|
+
*/
|
|
147
|
+
noteActivity(nowMs = Date.now()) {
|
|
148
|
+
const active = this.turns[0];
|
|
149
|
+
if (!active)
|
|
150
|
+
return;
|
|
151
|
+
// Real work for the head turn supersedes a prompt rendered in the narrow
|
|
152
|
+
// inter-turn gap before its chunked control line finished arriving.
|
|
153
|
+
this.promptDeferred = false;
|
|
154
|
+
// Signed socket records can be buffered behind other process work. Never
|
|
155
|
+
// let an older runner timestamp move the worker's clock backwards.
|
|
156
|
+
active.lastActivityAtMs = Math.max(active.lastActivityAtMs, nowMs);
|
|
157
|
+
active.stalled = false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* A signed submitted record can be the first event after worker reattach.
|
|
161
|
+
* Recover an explicit slot when no local flush state survived the restart.
|
|
162
|
+
*/
|
|
163
|
+
noteSubmitted(nowMs = Date.now()) {
|
|
164
|
+
if (this.turns.length === 0)
|
|
165
|
+
this.begin(undefined, nowMs);
|
|
166
|
+
else if (this.turns[0].reattachObservation)
|
|
167
|
+
this.turns[0].reattachObservation = false;
|
|
168
|
+
this.noteActivity(nowMs);
|
|
169
|
+
}
|
|
170
|
+
/** Complete only the runner's current turn and activate the next queued one. */
|
|
171
|
+
completeCurrent(nowMs = Date.now()) {
|
|
172
|
+
if (this.turns.length === 0)
|
|
173
|
+
return false;
|
|
174
|
+
this.turns.shift();
|
|
175
|
+
const next = this.turns[0];
|
|
176
|
+
if (!next)
|
|
177
|
+
return this.consumeDeferredPrompt();
|
|
178
|
+
// Time spent waiting behind the previous turn is not lack of progress for
|
|
179
|
+
// this turn. Its own timeout begins when it becomes runner-current.
|
|
180
|
+
next.lastActivityAtMs = Math.max(next.lastActivityAtMs, nowMs);
|
|
181
|
+
next.stalled = false;
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
/** Remove the exact control-line submission that failed, preserving peers. */
|
|
185
|
+
cancelExact(handle, nowMs = Date.now()) {
|
|
186
|
+
const index = this.turns.findIndex(turn => turn.handle === handle);
|
|
187
|
+
if (index < 0)
|
|
188
|
+
return { cancelled: false, shouldReplayPrompt: false };
|
|
189
|
+
const wasCurrent = index === 0;
|
|
190
|
+
this.turns.splice(index, 1);
|
|
191
|
+
if (wasCurrent && this.turns[0]) {
|
|
192
|
+
this.turns[0].lastActivityAtMs = Math.max(this.turns[0].lastActivityAtMs, nowMs);
|
|
193
|
+
this.turns[0].stalled = false;
|
|
194
|
+
}
|
|
195
|
+
return { cancelled: true, shouldReplayPrompt: this.consumeDeferredPrompt() };
|
|
196
|
+
}
|
|
197
|
+
/** Backwards-compatible shorthand for callers that only need replay state. */
|
|
198
|
+
cancel(handle, nowMs = Date.now()) {
|
|
199
|
+
return this.cancelExact(handle, nowMs).shouldReplayPrompt;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* A prompt is authoritative only for the synthetic reattach observation.
|
|
203
|
+
* Returns whether no explicit/queued turn remains, so the worker can reject
|
|
204
|
+
* a transient inter-turn prompt instead of publishing prompt_ready / idle.
|
|
205
|
+
*/
|
|
206
|
+
notePrompt(nowMs = Date.now()) {
|
|
207
|
+
if (this.turns[0]?.reattachObservation)
|
|
208
|
+
this.completeCurrent(nowMs);
|
|
209
|
+
if (this.turns.length === 0) {
|
|
210
|
+
this.promptDeferred = false;
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
this.promptDeferred = true;
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
hasActiveTurn() {
|
|
217
|
+
return this.turns.length > 0;
|
|
218
|
+
}
|
|
219
|
+
/** Drop every queued turn on CLI exit, kill, or worker reinitialization. */
|
|
220
|
+
clear() {
|
|
221
|
+
this.turns.length = 0;
|
|
222
|
+
this.promptDeferred = false;
|
|
223
|
+
}
|
|
224
|
+
poll(nowMs = Date.now()) {
|
|
225
|
+
const active = this.turns[0];
|
|
226
|
+
if (!active)
|
|
227
|
+
return { active: false, stalled: false, newlyStalled: false, shouldNotify: false };
|
|
228
|
+
const timedOut = nowMs - active.lastActivityAtMs >= this.timeoutMs;
|
|
229
|
+
const newlyStalled = timedOut && !active.stalled;
|
|
230
|
+
if (newlyStalled)
|
|
231
|
+
active.stalled = true;
|
|
232
|
+
const shouldNotify = newlyStalled && !active.notified;
|
|
233
|
+
if (shouldNotify)
|
|
234
|
+
active.notified = true;
|
|
235
|
+
return {
|
|
236
|
+
active: true,
|
|
237
|
+
stalled: active.stalled,
|
|
238
|
+
newlyStalled,
|
|
239
|
+
shouldNotify,
|
|
240
|
+
turnId: active.turnId,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
consumeDeferredPrompt() {
|
|
244
|
+
if (this.turns.length > 0 || !this.promptDeferred)
|
|
245
|
+
return false;
|
|
246
|
+
this.promptDeferred = false;
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* One flush may cancel a queued liveness slot because writeInput throws or
|
|
252
|
+
* it returns submitted=false. Preserve the deferred real prompt across that
|
|
253
|
+
* async boundary, but replay it only after every peer slot has drained.
|
|
254
|
+
*/
|
|
255
|
+
export class CodexAppFlushPromptReplay {
|
|
256
|
+
replayRequested = false;
|
|
257
|
+
cancelSubmission(tracker, authority, handle, nowMs = Date.now()) {
|
|
258
|
+
if (handle === undefined)
|
|
259
|
+
return;
|
|
260
|
+
const cancelled = tracker.cancelExact(handle, nowMs);
|
|
261
|
+
if (!cancelled.cancelled)
|
|
262
|
+
return;
|
|
263
|
+
authority.armLatePromptRecovery();
|
|
264
|
+
if (cancelled.shouldReplayPrompt)
|
|
265
|
+
this.replayRequested = true;
|
|
266
|
+
}
|
|
267
|
+
consumeAfterFlush(tracker) {
|
|
268
|
+
const shouldReplay = this.replayRequested && !tracker.hasActiveTurn();
|
|
269
|
+
this.replayRequested = false;
|
|
270
|
+
return shouldReplay;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** Apply an activity payload whose signed socket connection was authenticated. */
|
|
274
|
+
export function applyTrustedCodexAppActivityMarker(tracker, payload, receivedAtMs = Date.now()) {
|
|
275
|
+
if (!payload || typeof payload !== 'object')
|
|
276
|
+
return { accepted: false };
|
|
277
|
+
const marker = payload;
|
|
278
|
+
const phase = marker.phase;
|
|
279
|
+
if (phase !== 'submitted' && phase !== 'progress' && phase !== 'completed') {
|
|
280
|
+
return { accepted: false };
|
|
281
|
+
}
|
|
282
|
+
const runnerAtMs = typeof marker.atMs === 'number' && Number.isFinite(marker.atMs)
|
|
283
|
+
? marker.atMs
|
|
284
|
+
: receivedAtMs;
|
|
285
|
+
// Runner and worker share one host clock. A marker may arrive late, but it
|
|
286
|
+
// may never push the activity clock into the future and suppress stalls.
|
|
287
|
+
const atMs = Math.min(runnerAtMs, receivedAtMs);
|
|
288
|
+
if (phase === 'completed') {
|
|
289
|
+
return {
|
|
290
|
+
accepted: true,
|
|
291
|
+
phase,
|
|
292
|
+
shouldReplayPrompt: tracker.completeCurrent(atMs),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
if (phase === 'submitted')
|
|
296
|
+
tracker.noteSubmitted(atMs);
|
|
297
|
+
else
|
|
298
|
+
tracker.noteActivity(atMs);
|
|
299
|
+
return { accepted: true, phase };
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=codex-app-turn-liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-turn-liveness.js","sourceRoot":"","sources":["../../src/utils/codex-app-turn-liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,18 @@ export declare class IdleDetector {
|
|
|
15
15
|
constructor(cli: CliAdapter);
|
|
16
16
|
onIdle(cb: (source: IdleEvidenceSource) => void): void;
|
|
17
17
|
onBusy(cb: () => void): void;
|
|
18
|
+
/**
|
|
19
|
+
* Seed readyPattern evidence for a prompt that IS on screen but was rendered
|
|
20
|
+
* before resetReadyEvidence() cleared the flag. A new session (SessionStart
|
|
21
|
+
* source=startup) never redraws after that boundary, so Strategy 2's
|
|
22
|
+
* `!readySeen` early return would suppress quiescence detection forever.
|
|
23
|
+
*
|
|
24
|
+
* The caller must first confirm the PTY is quiet AND the current rendered
|
|
25
|
+
* screen matches readyPattern. This only restores readySeen — a full
|
|
26
|
+
* quiescence check (spinner guard included) still runs on top of it, so no
|
|
27
|
+
* existing check is bypassed.
|
|
28
|
+
*/
|
|
29
|
+
seedReadyEvidence(): boolean;
|
|
18
30
|
feed(data: string): void;
|
|
19
31
|
reset(): void;
|
|
20
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/utils/idle-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAYvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,UAAU;IAM3B,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAItD,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqExB,KAAK,IAAI,IAAI;IASb;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI;IAS1B;;;;4EAIwE;IACxE,QAAQ,IAAI,IAAI;IAKhB,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAKlB"}
|
|
1
|
+
{"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/utils/idle-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAYvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,UAAU;IAM3B,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAItD,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5B;;;;;;;;;;OAUG;IACH,iBAAiB,IAAI,OAAO;IAQ5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqExB,KAAK,IAAI,IAAI;IASb;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI;IAS1B;;;;4EAIwE;IACxE,QAAQ,IAAI,IAAI;IAKhB,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAKlB"}
|
|
@@ -29,6 +29,25 @@ export class IdleDetector {
|
|
|
29
29
|
onBusy(cb) {
|
|
30
30
|
this.busyCallback = cb;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Seed readyPattern evidence for a prompt that IS on screen but was rendered
|
|
34
|
+
* before resetReadyEvidence() cleared the flag. A new session (SessionStart
|
|
35
|
+
* source=startup) never redraws after that boundary, so Strategy 2's
|
|
36
|
+
* `!readySeen` early return would suppress quiescence detection forever.
|
|
37
|
+
*
|
|
38
|
+
* The caller must first confirm the PTY is quiet AND the current rendered
|
|
39
|
+
* screen matches readyPattern. This only restores readySeen — a full
|
|
40
|
+
* quiescence check (spinner guard included) still runs on top of it, so no
|
|
41
|
+
* existing check is bypassed.
|
|
42
|
+
*/
|
|
43
|
+
seedReadyEvidence() {
|
|
44
|
+
if (this.isIdle || this.readySeen)
|
|
45
|
+
return false;
|
|
46
|
+
this.readySeen = true;
|
|
47
|
+
this.clearTimer();
|
|
48
|
+
this.quiescenceCheck();
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
32
51
|
feed(data) {
|
|
33
52
|
// A botmux-owned submit calls reset() before writing input, but adopted
|
|
34
53
|
// panes can also receive local terminal input while we are already idle.
|