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,387 @@
|
|
|
1
|
+
import { parsePm2Integer } from './pm2-jlist.js';
|
|
2
|
+
function errorText(err) {
|
|
3
|
+
return err instanceof Error ? err.message : String(err);
|
|
4
|
+
}
|
|
5
|
+
function rowsForName(entries, name) {
|
|
6
|
+
return entries.filter(entry => entry.name === name);
|
|
7
|
+
}
|
|
8
|
+
function isLiveGeneration(entry, runtime) {
|
|
9
|
+
// OS liveness is authority. PM2 can expose a real launching/stopping PID
|
|
10
|
+
// while its status is not yet `online`; such a generation is never quiet.
|
|
11
|
+
return entry.pid > 0 && runtime.isAlive(entry.pid);
|
|
12
|
+
}
|
|
13
|
+
export function isFleetEntryProvenFreeOfAutorestartTimer(entry) {
|
|
14
|
+
if (entry.status === 'errored')
|
|
15
|
+
return true;
|
|
16
|
+
// PM2 handleExit labels delayed post-exit rows `waiting restart` even when
|
|
17
|
+
// stop_exit_codes/autorestart suppresses creation of restart_task. A bare
|
|
18
|
+
// `stopped` status is not enough: handleExit can publish STOPPED before a
|
|
19
|
+
// zero-delay restart task is installed. Policy fields still do not make
|
|
20
|
+
// launching/stopping/online-dead rows quiescent.
|
|
21
|
+
if (entry.status !== 'waiting restart' && entry.status !== 'stopped')
|
|
22
|
+
return false;
|
|
23
|
+
if (entry.autorestart === false || entry.autorestart === 'false')
|
|
24
|
+
return true;
|
|
25
|
+
if (!Number.isFinite(entry.exitCode) || !Array.isArray(entry.stopExitCodes))
|
|
26
|
+
return false;
|
|
27
|
+
return entry.stopExitCodes.some(code => parsePm2Integer(code) === entry.exitCode);
|
|
28
|
+
}
|
|
29
|
+
function rawStopCodeMatchesExitCode(code, exitCode) {
|
|
30
|
+
return (typeof code === 'number' && Number.isSafeInteger(code) && code === exitCode)
|
|
31
|
+
|| (typeof code === 'string' && code === String(exitCode));
|
|
32
|
+
}
|
|
33
|
+
/** Being timer-free is sufficient for initial admission and compensation, but
|
|
34
|
+
* not proof that a signalled generation completed its shutdown transaction.
|
|
35
|
+
* PM2 can mark an abrupt exit `errored` after max_restarts and suppress a
|
|
36
|
+
* successor even though exit_code=0 is not the daemon's graceful sentinel. */
|
|
37
|
+
export function isFleetEntryProvenTerminalAfterSignal(entry) {
|
|
38
|
+
if (entry.status !== 'errored'
|
|
39
|
+
&& entry.status !== 'waiting restart'
|
|
40
|
+
&& entry.status !== 'stopped')
|
|
41
|
+
return false;
|
|
42
|
+
if (!Number.isSafeInteger(entry.exitCode) || !Array.isArray(entry.stopExitCodes))
|
|
43
|
+
return false;
|
|
44
|
+
return entry.stopExitCodes.some(code => rawStopCodeMatchesExitCode(code, entry.exitCode));
|
|
45
|
+
}
|
|
46
|
+
function isProvenInitiallyQuiescent(entry, runtime) {
|
|
47
|
+
if (isLiveGeneration(entry, runtime))
|
|
48
|
+
return false;
|
|
49
|
+
return isFleetEntryProvenFreeOfAutorestartTimer(entry);
|
|
50
|
+
}
|
|
51
|
+
/** Signal every observed generation in parallel. Success requires a bounded
|
|
52
|
+
* quiet window with no online successor for any target name. If one generation
|
|
53
|
+
* refuses, restore only names proven truly offline and never touch a live
|
|
54
|
+
* refuser or an already-auto-restarted healthy successor. */
|
|
55
|
+
export function signalAndAwaitFleet(entries, operation, timeoutMs, runtime) {
|
|
56
|
+
const duplicateNames = [...new Set(entries.map(entry => entry.name))]
|
|
57
|
+
.filter(name => entries.filter(entry => entry.name === name).length > 1);
|
|
58
|
+
if (duplicateNames.length > 0) {
|
|
59
|
+
throw new Error(`[${operation}] refusing PM2 mutation: duplicate registry row(s) for singleton botmux name(s): `
|
|
60
|
+
+ duplicateNames.join(', '));
|
|
61
|
+
}
|
|
62
|
+
const uncertainLive = entries.filter(entry => !entry.online && entry.pid > 0 && runtime.isAlive(entry.pid));
|
|
63
|
+
if (uncertainLive.length > 0) {
|
|
64
|
+
throw new Error(`[${operation}] refusing PM2 mutation: non-online registry rows still have live PID(s): `
|
|
65
|
+
+ uncertainLive.map(entry => `${entry.name}:${entry.pid}`).join(', '));
|
|
66
|
+
}
|
|
67
|
+
const unverifiedDormant = entries.filter(entry => !isLiveGeneration(entry, runtime) && !isProvenInitiallyQuiescent(entry, runtime));
|
|
68
|
+
if (unverifiedDormant.length > 0) {
|
|
69
|
+
throw new Error(`[${operation}] refusing PM2 mutation: dormant registry row(s) may still restart: `
|
|
70
|
+
+ unverifiedDormant.map(entry => `${entry.name}:${entry.status ?? 'unknown'}`).join(', '));
|
|
71
|
+
}
|
|
72
|
+
const targets = entries.filter(entry => entry.online && entry.pid > 0);
|
|
73
|
+
const deadline = runtime.now() + Math.max(0, timeoutMs);
|
|
74
|
+
const remainingMs = () => Math.max(0, Math.floor(deadline - runtime.now()));
|
|
75
|
+
const listWithinDeadline = (purpose, capMs = Number.POSITIVE_INFINITY) => {
|
|
76
|
+
let lastError;
|
|
77
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
78
|
+
const budgetMs = remainingMs();
|
|
79
|
+
if (budgetMs <= 0) {
|
|
80
|
+
throw new Error(`fleet deadline exhausted before ${purpose}`);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const projection = runtime.list(Math.max(1, Math.min(budgetMs, Math.floor(capMs))));
|
|
84
|
+
if (remainingMs() <= 0) {
|
|
85
|
+
throw new Error(`fleet deadline exhausted during ${purpose}`);
|
|
86
|
+
}
|
|
87
|
+
return projection;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
lastError = error;
|
|
91
|
+
if (remainingMs() <= 0 || attempt === 2)
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw lastError;
|
|
96
|
+
};
|
|
97
|
+
// Later PM2 stop/delete mutates every supplied registry name, including
|
|
98
|
+
// initially stopped rows. Every one must remain live-PID-free for the same
|
|
99
|
+
// successor settle window before that name mutation is safe.
|
|
100
|
+
const targetNames = new Set(entries.map(entry => entry.name));
|
|
101
|
+
const signalledPids = new Set();
|
|
102
|
+
const provenTerminalPids = new Set();
|
|
103
|
+
const latestTrackedPidByName = new Map();
|
|
104
|
+
const tracked = new Map();
|
|
105
|
+
const signalGeneration = (entry) => {
|
|
106
|
+
if (signalledPids.has(entry.pid))
|
|
107
|
+
return;
|
|
108
|
+
signalledPids.add(entry.pid);
|
|
109
|
+
tracked.set(entry.pid, entry);
|
|
110
|
+
latestTrackedPidByName.set(entry.name, entry.pid);
|
|
111
|
+
// The concrete runtime handles a proven ESRCH. Capability/generation
|
|
112
|
+
// authorization failures must escape; swallowing them here could turn a
|
|
113
|
+
// rollout fence into a partially signalled fleet.
|
|
114
|
+
runtime.signal(entry.pid);
|
|
115
|
+
};
|
|
116
|
+
if (runtime.signalInitial) {
|
|
117
|
+
for (const target of targets) {
|
|
118
|
+
signalledPids.add(target.pid);
|
|
119
|
+
tracked.set(target.pid, target);
|
|
120
|
+
latestTrackedPidByName.set(target.name, target.pid);
|
|
121
|
+
}
|
|
122
|
+
runtime.signalInitial(targets);
|
|
123
|
+
if (remainingMs() <= 0) {
|
|
124
|
+
throw new Error(`[${operation}] fleet deadline exhausted during bounded initial daemon dispatch; `
|
|
125
|
+
+ 'no later fleet action was attempted');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
for (const target of targets) {
|
|
130
|
+
if (remainingMs() <= 0) {
|
|
131
|
+
throw new Error(`[${operation}] fleet deadline exhausted while signalling initial daemon generations; `
|
|
132
|
+
+ 'no later fleet action was attempted');
|
|
133
|
+
}
|
|
134
|
+
signalGeneration(target);
|
|
135
|
+
// A runtime signal implementation is synchronous and may itself consume
|
|
136
|
+
// the remaining budget. Never signal the next target or begin polling
|
|
137
|
+
// after such a late return.
|
|
138
|
+
if (remainingMs() <= 0) {
|
|
139
|
+
throw new Error(`[${operation}] fleet deadline exhausted during initial daemon signalling; `
|
|
140
|
+
+ 'no later fleet action was attempted');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const pollMs = Math.max(1, runtime.pollMs ?? 50);
|
|
145
|
+
const successorSettleMs = Math.max(0, runtime.successorSettleMs ?? 3_500);
|
|
146
|
+
// A live refuser is decided early enough to leave one explicitly partitioned
|
|
147
|
+
// compensation tail. All-dead fleets may continue their normal successor
|
|
148
|
+
// settle beyond this point; they need no compensation subprocesses.
|
|
149
|
+
const productionBudget = timeoutMs >= 10_000;
|
|
150
|
+
const compensationReserveMs = productionBudget
|
|
151
|
+
? Math.min(25_000, Math.max(10_000, Math.floor(timeoutMs / 3)))
|
|
152
|
+
: Math.min(6_000, Math.max(5, Math.floor(timeoutMs / 5)));
|
|
153
|
+
const liveRefusalDeadline = Math.max(runtime.now(), deadline - compensationReserveMs);
|
|
154
|
+
const preProjectionCapMs = productionBudget
|
|
155
|
+
? Math.max(5_000, Math.floor(compensationReserveMs / 4))
|
|
156
|
+
: Math.max(1, Math.floor(compensationReserveMs / 5));
|
|
157
|
+
const exactStartCapMs = productionBudget
|
|
158
|
+
? Math.max(10_000, Math.floor(compensationReserveMs / 2))
|
|
159
|
+
: Math.max(1, Math.floor(compensationReserveMs / 2));
|
|
160
|
+
const postProjectionCapMs = preProjectionCapMs;
|
|
161
|
+
const successorProjectionCapMs = preProjectionCapMs;
|
|
162
|
+
let quietSince = null;
|
|
163
|
+
let verificationFailure = null;
|
|
164
|
+
let signalAuthorityFailure = null;
|
|
165
|
+
let terminalOutcomeFailure = null;
|
|
166
|
+
while (runtime.now() < deadline) {
|
|
167
|
+
const aliveTracked = [...tracked.values()].filter(entry => runtime.isAlive(entry.pid));
|
|
168
|
+
if (aliveTracked.length > 0) {
|
|
169
|
+
quietSince = null;
|
|
170
|
+
if (runtime.now() >= liveRefusalDeadline)
|
|
171
|
+
break;
|
|
172
|
+
runtime.sleep(Math.min(pollMs, Math.max(1, liveRefusalDeadline - runtime.now())));
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
let projection;
|
|
176
|
+
try {
|
|
177
|
+
projection = listWithinDeadline('PM2 successor verification', successorProjectionCapMs);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
verificationFailure = `PM2 successor verification failed: ${errorText(err)}`;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const successors = projection.filter(entry => targetNames.has(entry.name)
|
|
184
|
+
&& isLiveGeneration(entry, runtime)
|
|
185
|
+
&& !signalledPids.has(entry.pid));
|
|
186
|
+
// PM2 restart overlimit is timer-free but not necessarily graceful. Before
|
|
187
|
+
// following a successor or starting the quiet window, prove the terminal
|
|
188
|
+
// outcome of every dead generation that this transaction signalled. A
|
|
189
|
+
// live replacement still carries the prior generation's exit_code, so it
|
|
190
|
+
// may prove that outcome before receiving its own shutdown request.
|
|
191
|
+
let terminalOutcomePending = false;
|
|
192
|
+
for (const [pid, trackedEntry] of tracked) {
|
|
193
|
+
const isLatestTrackedGeneration = latestTrackedPidByName.get(trackedEntry.name) === pid;
|
|
194
|
+
// A predecessor may be cached only after a fresh successor carrying its
|
|
195
|
+
// accepted exit_code was observed and then became the newly signalled
|
|
196
|
+
// generation. The latest generation must re-prove its terminal row on
|
|
197
|
+
// every quiet-window projection; a later missing row is never success.
|
|
198
|
+
if (runtime.isAlive(pid)
|
|
199
|
+
|| (provenTerminalPids.has(pid) && !isLatestTrackedGeneration))
|
|
200
|
+
continue;
|
|
201
|
+
const sameNameRows = rowsForName(projection, trackedEntry.name);
|
|
202
|
+
const exactRows = Number.isInteger(trackedEntry.pmId)
|
|
203
|
+
? sameNameRows.filter(row => row.pmId === trackedEntry.pmId)
|
|
204
|
+
: sameNameRows;
|
|
205
|
+
if (exactRows.length !== 1) {
|
|
206
|
+
terminalOutcomePending = true;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const exactState = exactRows[0];
|
|
210
|
+
const replacementPublished = exactState.pid > 0 && exactState.pid !== pid;
|
|
211
|
+
const liveReplacementPublished = replacementPublished
|
|
212
|
+
&& isLiveGeneration(exactState, runtime);
|
|
213
|
+
const liveReplacementCarriesAcceptedExit = liveReplacementPublished
|
|
214
|
+
&& Number.isSafeInteger(exactState.exitCode)
|
|
215
|
+
&& Array.isArray(exactState.stopExitCodes)
|
|
216
|
+
&& exactState.stopExitCodes.some(code => rawStopCodeMatchesExitCode(code, exactState.exitCode));
|
|
217
|
+
if (liveReplacementCarriesAcceptedExit) {
|
|
218
|
+
// This cache becomes usable only after signalGeneration records the
|
|
219
|
+
// replacement as this name's latest tracked generation.
|
|
220
|
+
provenTerminalPids.add(pid);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
// A dead different-PID row may already contain that replacement's own
|
|
224
|
+
// exit_code, so it can never prove the predecessor's terminal outcome.
|
|
225
|
+
if (!replacementPublished && isFleetEntryProvenTerminalAfterSignal(exactState))
|
|
226
|
+
continue;
|
|
227
|
+
const terminalStatus = exactState.status === 'errored'
|
|
228
|
+
|| exactState.status === 'waiting restart'
|
|
229
|
+
|| exactState.status === 'stopped';
|
|
230
|
+
if (terminalStatus || replacementPublished) {
|
|
231
|
+
terminalOutcomeFailure = `${trackedEntry.name}/${pid} exited without an accepted `
|
|
232
|
+
+ `stop_exit_codes terminal (status=${exactState.status ?? 'unknown'}, `
|
|
233
|
+
+ `exit_code=${exactState.exitCode ?? 'missing'})`;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
terminalOutcomePending = true;
|
|
237
|
+
}
|
|
238
|
+
if (terminalOutcomeFailure)
|
|
239
|
+
break;
|
|
240
|
+
if (terminalOutcomePending) {
|
|
241
|
+
quietSince = null;
|
|
242
|
+
if (runtime.now() >= liveRefusalDeadline)
|
|
243
|
+
break;
|
|
244
|
+
runtime.sleep(Math.min(pollMs, Math.max(1, liveRefusalDeadline - runtime.now())));
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (successors.length > 0) {
|
|
248
|
+
quietSince = null;
|
|
249
|
+
if (runtime.now() >= liveRefusalDeadline) {
|
|
250
|
+
// This is a positively verified live refuser, not an unreadable fleet.
|
|
251
|
+
// Leave the late generation untouched, but retain it in the refusal
|
|
252
|
+
// accounting and compensate unrelated exact offline originals.
|
|
253
|
+
for (const successor of successors)
|
|
254
|
+
tracked.set(successor.pid, successor);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
// A projection can consume its entire subprocess timeout. Never act on
|
|
258
|
+
// an observation returned at or beyond the absolute fleet deadline.
|
|
259
|
+
if (remainingMs() <= 0) {
|
|
260
|
+
verificationFailure = 'fleet deadline exhausted before signalling a PM2 successor';
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
for (const successor of successors) {
|
|
264
|
+
if (remainingMs() <= 0) {
|
|
265
|
+
verificationFailure = 'fleet deadline exhausted while signalling PM2 successors';
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
signalGeneration(successor);
|
|
269
|
+
}
|
|
270
|
+
if (verificationFailure)
|
|
271
|
+
break;
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
// No live PID is not enough: PM2 may still own a delayed restart_task or a
|
|
275
|
+
// launching/stopping transition. Do not begin the quiet window until every
|
|
276
|
+
// visible target row proves that no successor timer exists.
|
|
277
|
+
const unprovenDormant = projection.filter(entry => targetNames.has(entry.name)
|
|
278
|
+
&& !isLiveGeneration(entry, runtime)
|
|
279
|
+
&& !isFleetEntryProvenFreeOfAutorestartTimer(entry));
|
|
280
|
+
if (unprovenDormant.length > 0) {
|
|
281
|
+
quietSince = null;
|
|
282
|
+
if (runtime.now() >= liveRefusalDeadline)
|
|
283
|
+
break;
|
|
284
|
+
runtime.sleep(Math.min(pollMs, Math.max(1, liveRefusalDeadline - runtime.now())));
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
const now = runtime.now();
|
|
288
|
+
quietSince ??= now;
|
|
289
|
+
if (now - quietSince >= successorSettleMs) {
|
|
290
|
+
try {
|
|
291
|
+
runtime.assertSignalAuthorityComplete?.();
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
signalAuthorityFailure = errorText(error);
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
runtime.sleep(Math.min(pollMs, Math.max(1, deadline - now)));
|
|
300
|
+
}
|
|
301
|
+
const liveSignalled = [...tracked.values()].filter(entry => runtime.isAlive(entry.pid));
|
|
302
|
+
const refusal = `[${operation}] ${liveSignalled.length}/${targetNames.size} daemon generation(s) `
|
|
303
|
+
+ `refused or could not be verified within ${timeoutMs}ms`
|
|
304
|
+
+ (signalAuthorityFailure ? ` (signal authority: ${signalAuthorityFailure})` : '')
|
|
305
|
+
+ (terminalOutcomeFailure
|
|
306
|
+
? ` (post-signal terminal proof: ${terminalOutcomeFailure})`
|
|
307
|
+
: '');
|
|
308
|
+
if (verificationFailure) {
|
|
309
|
+
throw new Error(`${refusal}; fleet state is unverified and no compensation was attempted `
|
|
310
|
+
+ `(${verificationFailure})`);
|
|
311
|
+
}
|
|
312
|
+
// A refusal path must fresh-read BEFORE any mutation. The old original-PID
|
|
313
|
+
// projection is not authority: PM2 may already have published a healthy
|
|
314
|
+
// successor for a peer that exited.
|
|
315
|
+
let beforeCompensation;
|
|
316
|
+
try {
|
|
317
|
+
beforeCompensation = listWithinDeadline('PM2 verification before compensation', preProjectionCapMs);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
throw new Error(`${refusal}; fleet state is unverified and no compensation was attempted `
|
|
321
|
+
+ `(PM2 verification before compensation failed: ${errorText(err)})`);
|
|
322
|
+
}
|
|
323
|
+
const offlineEntries = targets
|
|
324
|
+
.map(target => {
|
|
325
|
+
if (runtime.isAlive(target.pid))
|
|
326
|
+
return false;
|
|
327
|
+
const sameNameRows = rowsForName(beforeCompensation, target.name);
|
|
328
|
+
if (sameNameRows.some(state => isLiveGeneration(state, runtime)))
|
|
329
|
+
return false;
|
|
330
|
+
// Compensation is allowed only against the exact original PM2 row.
|
|
331
|
+
// If it was deleted/recreated (or the projection omitted pm_id), there
|
|
332
|
+
// is no race-free way to recreate it by name.
|
|
333
|
+
if (!Number.isInteger(target.pmId))
|
|
334
|
+
return false;
|
|
335
|
+
if (sameNameRows.length !== 1 || sameNameRows[0].pmId !== target.pmId)
|
|
336
|
+
return false;
|
|
337
|
+
const exactState = sameNameRows[0];
|
|
338
|
+
if (!exactState || !isFleetEntryProvenFreeOfAutorestartTimer(exactState))
|
|
339
|
+
return false;
|
|
340
|
+
// God.startProcessId does not clear restart_task. Restrict compensation
|
|
341
|
+
// to rows whose exit policy proves PM2 could not have scheduled one.
|
|
342
|
+
return exactState;
|
|
343
|
+
})
|
|
344
|
+
.filter((entry) => !!entry);
|
|
345
|
+
const offlineNames = offlineEntries.map(entry => entry.name);
|
|
346
|
+
const compensationErrors = [];
|
|
347
|
+
if (offlineEntries.length > 0) {
|
|
348
|
+
try {
|
|
349
|
+
const compensationBudgetMs = remainingMs();
|
|
350
|
+
if (compensationBudgetMs <= 0) {
|
|
351
|
+
throw new Error('fleet deadline exhausted before compensation');
|
|
352
|
+
}
|
|
353
|
+
runtime.startOffline(offlineEntries, Math.min(compensationBudgetMs, exactStartCapMs));
|
|
354
|
+
if (remainingMs() <= 0) {
|
|
355
|
+
throw new Error('fleet deadline exhausted during compensation');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
compensationErrors.push(errorText(err));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
let afterCompensation = [];
|
|
363
|
+
try {
|
|
364
|
+
afterCompensation = listWithinDeadline('PM2 verification after compensation', postProjectionCapMs);
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
compensationErrors.push(`PM2 verification after compensation failed: ${errorText(err)}`);
|
|
368
|
+
}
|
|
369
|
+
const unavailable = targets
|
|
370
|
+
.filter(target => {
|
|
371
|
+
if (runtime.isAlive(target.pid))
|
|
372
|
+
return false;
|
|
373
|
+
return !rowsForName(afterCompensation, target.name)
|
|
374
|
+
.some(state => isLiveGeneration(state, runtime));
|
|
375
|
+
})
|
|
376
|
+
.map(target => target.name);
|
|
377
|
+
if (unavailable.length > 0 || compensationErrors.length > 0) {
|
|
378
|
+
throw new Error(`${refusal}; fleet is partially stopped`
|
|
379
|
+
+ (unavailable.length > 0 ? ` (offline: ${unavailable.join(', ')})` : '')
|
|
380
|
+
+ (compensationErrors.length > 0
|
|
381
|
+
? ` (restore errors: ${compensationErrors.join('; ')})`
|
|
382
|
+
: ''));
|
|
383
|
+
}
|
|
384
|
+
throw new Error(`${refusal}; restored ${offlineNames.length} offline PM2 `
|
|
385
|
+
+ `entr${offlineNames.length === 1 ? 'y' : 'ies'} and left every live generation untouched`);
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=fleet-shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-shutdown.js","sourceRoot":"","sources":["../../src/cli/fleet-shutdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface Pm2DescriptorProjectionEntry {
|
|
2
|
+
pid: number;
|
|
3
|
+
}
|
|
4
|
+
export interface Pm2DescriptorGuardRuntime {
|
|
5
|
+
now(): number;
|
|
6
|
+
exists(path: string): boolean;
|
|
7
|
+
readdir(path: string): string[];
|
|
8
|
+
read(path: string): string;
|
|
9
|
+
mtime(path: string): number;
|
|
10
|
+
isAlive(pid: number): boolean;
|
|
11
|
+
readStartIdentity(pid: number): string | undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Reconcile PM2 registry authority with daemon-owned descriptors before a
|
|
14
|
+
* core mutation. Fresh semantic corruption is fail-closed. A stale descriptor
|
|
15
|
+
* is not automatically harmless: an event-loop-frozen/orphan daemon can remain
|
|
16
|
+
* live after PM2 loses its registry. Ignore a semantically parseable stale
|
|
17
|
+
* record only after proving its PID dead or owned by a different process birth. */
|
|
18
|
+
export declare function assertNoUnregisteredLiveDaemonDescriptorsIn(operation: string, projections: Pm2DescriptorProjectionEntry[], registryDir: string, runtime?: Pm2DescriptorGuardRuntime): void;
|
|
19
|
+
//# sourceMappingURL=pm2-descriptor-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-descriptor-guard.d.ts","sourceRoot":"","sources":["../../src/cli/pm2-descriptor-guard.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,IAAI,MAAM,CAAC;IACd,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACpD;AAcD;;;;mFAImF;AACnF,wBAAgB,2CAA2C,CACzD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,4BAA4B,EAAE,EAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,yBAA0C,GAClD,IAAI,CAuGN"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readSupervisorProcessStartIdentity } from '../core/process-start-identity.js';
|
|
4
|
+
const FRESH_MS = 90_000;
|
|
5
|
+
const defaultRuntime = {
|
|
6
|
+
now: () => Date.now(),
|
|
7
|
+
exists: path => existsSync(path),
|
|
8
|
+
readdir: path => readdirSync(path),
|
|
9
|
+
read: path => readFileSync(path, 'utf8'),
|
|
10
|
+
mtime: path => statSync(path).mtimeMs,
|
|
11
|
+
isAlive: pid => { try {
|
|
12
|
+
process.kill(pid, 0);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
} },
|
|
18
|
+
readStartIdentity: pid => readSupervisorProcessStartIdentity(pid),
|
|
19
|
+
};
|
|
20
|
+
/** Reconcile PM2 registry authority with daemon-owned descriptors before a
|
|
21
|
+
* core mutation. Fresh semantic corruption is fail-closed. A stale descriptor
|
|
22
|
+
* is not automatically harmless: an event-loop-frozen/orphan daemon can remain
|
|
23
|
+
* live after PM2 loses its registry. Ignore a semantically parseable stale
|
|
24
|
+
* record only after proving its PID dead or owned by a different process birth. */
|
|
25
|
+
export function assertNoUnregisteredLiveDaemonDescriptorsIn(operation, projections, registryDir, runtime = defaultRuntime) {
|
|
26
|
+
const registeredPids = new Set(projections.map(entry => entry.pid).filter(pid => Number.isSafeInteger(pid) && pid > 1));
|
|
27
|
+
if (!runtime.exists(registryDir))
|
|
28
|
+
return;
|
|
29
|
+
const now = runtime.now();
|
|
30
|
+
let names;
|
|
31
|
+
try {
|
|
32
|
+
names = runtime.readdir(registryDir);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
throw new Error(`[${operation}] daemon descriptor registry is unreadable; refusing PM2 mutation: `
|
|
36
|
+
+ `${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
}
|
|
38
|
+
const unregistered = [];
|
|
39
|
+
for (const name of names) {
|
|
40
|
+
if (!name.endsWith('.json'))
|
|
41
|
+
continue;
|
|
42
|
+
const path = join(registryDir, name);
|
|
43
|
+
let mtimeMs;
|
|
44
|
+
try {
|
|
45
|
+
mtimeMs = runtime.mtime(path);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err.code === 'ENOENT')
|
|
49
|
+
continue;
|
|
50
|
+
throw new Error(`[${operation}] cannot inspect daemon descriptor ${name}; refusing PM2 mutation: `
|
|
51
|
+
+ `${err instanceof Error ? err.message : String(err)}`);
|
|
52
|
+
}
|
|
53
|
+
const mtimeFresh = now - mtimeMs <= FRESH_MS;
|
|
54
|
+
let value;
|
|
55
|
+
try {
|
|
56
|
+
value = JSON.parse(runtime.read(path));
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (!mtimeFresh)
|
|
60
|
+
continue;
|
|
61
|
+
throw new Error(`[${operation}] fresh daemon descriptor ${name} is unreadable or malformed; `
|
|
62
|
+
+ `refusing PM2 mutation: ${err instanceof Error ? err.message : String(err)}`);
|
|
63
|
+
}
|
|
64
|
+
const record = value && typeof value === 'object' && !Array.isArray(value)
|
|
65
|
+
? value
|
|
66
|
+
: undefined;
|
|
67
|
+
const heartbeat = record?.lastHeartbeat;
|
|
68
|
+
const heartbeatValid = typeof heartbeat === 'number' && Number.isFinite(heartbeat);
|
|
69
|
+
const heartbeatFresh = heartbeatValid && now - heartbeat <= FRESH_MS;
|
|
70
|
+
const pid = record?.pid;
|
|
71
|
+
const appId = record?.larkAppId;
|
|
72
|
+
if (!mtimeFresh && !heartbeatFresh) {
|
|
73
|
+
// Unparseable old debris has no PID authority to reconcile. But once a
|
|
74
|
+
// stale record names a canonical PID, liveness + process birth decide;
|
|
75
|
+
// age alone must never authorize a second fleet.
|
|
76
|
+
if (!record || !Number.isSafeInteger(pid) || pid <= 1)
|
|
77
|
+
continue;
|
|
78
|
+
if (!runtime.isAlive(pid))
|
|
79
|
+
continue;
|
|
80
|
+
const describedStart = record.processStartIdentity;
|
|
81
|
+
if (typeof describedStart !== 'string' || !describedStart) {
|
|
82
|
+
throw new Error(`[${operation}] stale daemon descriptor ${name} still names live PID ${pid} `
|
|
83
|
+
+ 'but has no process-start identity; refusing PM2 mutation');
|
|
84
|
+
}
|
|
85
|
+
const currentStart = runtime.readStartIdentity(pid);
|
|
86
|
+
if (!currentStart) {
|
|
87
|
+
if (!runtime.isAlive(pid))
|
|
88
|
+
continue;
|
|
89
|
+
throw new Error(`[${operation}] cannot revalidate process-start identity for live stale descriptor `
|
|
90
|
+
+ `${name}/${pid}; refusing PM2 mutation`);
|
|
91
|
+
}
|
|
92
|
+
if (currentStart !== describedStart)
|
|
93
|
+
continue;
|
|
94
|
+
if (typeof appId !== 'string' || !appId.trim()) {
|
|
95
|
+
throw new Error(`[${operation}] stale daemon descriptor ${name} matches live PID ${pid} `
|
|
96
|
+
+ 'but has no canonical app id; refusing PM2 mutation');
|
|
97
|
+
}
|
|
98
|
+
if (!registeredPids.has(pid)) {
|
|
99
|
+
unregistered.push({ appId: appId.trim(), pid: pid });
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (!record
|
|
104
|
+
|| !heartbeatValid
|
|
105
|
+
|| now - heartbeat > FRESH_MS
|
|
106
|
+
|| !Number.isSafeInteger(pid)
|
|
107
|
+
|| pid <= 1
|
|
108
|
+
|| typeof appId !== 'string'
|
|
109
|
+
|| !appId.trim()) {
|
|
110
|
+
throw new Error(`[${operation}] fresh daemon descriptor ${name} has invalid pid/app id/heartbeat; `
|
|
111
|
+
+ 'refusing PM2 mutation');
|
|
112
|
+
}
|
|
113
|
+
if (runtime.isAlive(pid) && !registeredPids.has(pid)) {
|
|
114
|
+
unregistered.push({ appId: appId.trim(), pid: pid });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (unregistered.length > 0) {
|
|
118
|
+
throw new Error(`[${operation}] refusing PM2 mutation: daemon descriptor PID(s) are live but absent `
|
|
119
|
+
+ `from PM2 registry (${unregistered.map(item => `${item.appId}:${item.pid}`).join(', ')})`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=pm2-descriptor-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-descriptor-guard.js","sourceRoot":"","sources":["../../src/cli/pm2-descriptor-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Pm2ExactStartClient {
|
|
2
|
+
launchRPC(callback: (error?: unknown) => void): void;
|
|
3
|
+
executeRemote(method: 'startProcessId', processId: number, callback: (error?: unknown) => void): void;
|
|
4
|
+
close(callback: (error?: unknown) => void): void;
|
|
5
|
+
}
|
|
6
|
+
/** `God.startProcessId` rejects these states before executeApp and therefore
|
|
7
|
+
* cannot have killed or restarted a live generation. The final jlist remains
|
|
8
|
+
* authoritative about whether the fleet is available. */
|
|
9
|
+
export declare function isNonMutatingPm2StartRefusal(error: unknown): boolean;
|
|
10
|
+
/** Connect once and concurrently issue PM2's conditional startProcessId RPC
|
|
11
|
+
* for distinct exact registry identities. The caller must hold Botmux's shared
|
|
12
|
+
* fleet-operation lock: PM2 checks a row before an async fork and is not itself
|
|
13
|
+
* a CAS across two clients. Unlike `pm2 start <name|id>`, this never routes
|
|
14
|
+
* through restartProcessId or intentionally interrupts a live successor. */
|
|
15
|
+
export declare function startExactPm2ProcessIds(processIds: number[], client: Pm2ExactStartClient): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=pm2-exact-start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-exact-start.d.ts","sourceRoot":"","sources":["../../src/cli/pm2-exact-start.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD,aAAa,CACX,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAClC,IAAI,CAAC;IACR,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAClD;AAQD;;yDAEyD;AACzD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGpE;AA2BD;;;;4EAI4E;AAC5E,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|