botmux 3.5.2 → 3.6.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/README.en.md +56 -396
- package/README.md +55 -396
- package/dist/.runtime-build-id +1 -0
- package/dist/adapters/cli/claude-code.d.ts +6 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +197 -11
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.js +4 -4
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +9 -6
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/codex.js +5 -5
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +5 -7
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts +2 -1
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +2 -1
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/hermes.d.ts.map +1 -1
- package/dist/adapters/cli/hermes.js +8 -4
- package/dist/adapters/cli/hermes.js.map +1 -1
- package/dist/adapters/cli/mtr.d.ts.map +1 -1
- package/dist/adapters/cli/mtr.js +3 -2
- package/dist/adapters/cli/mtr.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +5 -4
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/relay.js +2 -2
- package/dist/adapters/cli/relay.js.map +1 -1
- package/dist/adapters/cli/runner-input.d.ts +2 -2
- package/dist/adapters/cli/runner-input.d.ts.map +1 -1
- package/dist/adapters/cli/runner-input.js +9 -6
- package/dist/adapters/cli/runner-input.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts.map +1 -1
- package/dist/adapters/cli/seed.js +2 -1
- package/dist/adapters/cli/seed.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +3 -2
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +25 -18
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +28 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +75 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +272 -86
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +85 -192
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/config.d.ts +0 -16
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -30
- package/dist/config.js.map +1 -1
- package/dist/core/ask-broker.d.ts +12 -0
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +41 -0
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/bot-turn-mutation-gate.d.ts +24 -0
- package/dist/core/bot-turn-mutation-gate.d.ts.map +1 -0
- package/dist/core/bot-turn-mutation-gate.js +369 -0
- package/dist/core/bot-turn-mutation-gate.js.map +1 -0
- package/dist/core/command-handler.d.ts +5 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +38 -16
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +330 -57
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +8 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/host-overload-alert.d.ts +157 -0
- package/dist/core/host-overload-alert.d.ts.map +1 -0
- package/dist/core/host-overload-alert.js +251 -0
- package/dist/core/host-overload-alert.js.map +1 -0
- package/dist/core/passthrough-commands.d.ts +8 -0
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +19 -0
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/restart-coordinator.d.ts +28 -0
- package/dist/core/restart-coordinator.d.ts.map +1 -0
- package/dist/core/restart-coordinator.js +82 -0
- package/dist/core/restart-coordinator.js.map +1 -0
- package/dist/core/restart-followup-policy.d.ts +112 -0
- package/dist/core/restart-followup-policy.d.ts.map +1 -0
- package/dist/core/restart-followup-policy.js +49 -0
- package/dist/core/restart-followup-policy.js.map +1 -0
- package/dist/core/role-library.d.ts +1 -1
- package/dist/core/role-library.js +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +8 -0
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-discovery.d.ts +14 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +25 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-liveness.d.ts +15 -0
- package/dist/core/session-liveness.d.ts.map +1 -0
- package/dist/core/session-liveness.js +76 -0
- package/dist/core/session-liveness.js.map +1 -0
- package/dist/core/session-row-enrichment.d.ts +15 -0
- package/dist/core/session-row-enrichment.d.ts.map +1 -0
- package/dist/core/session-row-enrichment.js +93 -0
- package/dist/core/session-row-enrichment.js.map +1 -0
- package/dist/core/slash-inject.js +1 -1
- package/dist/core/slash-inject.js.map +1 -1
- package/dist/core/trigger-final-suppression.d.ts +24 -0
- package/dist/core/trigger-final-suppression.d.ts.map +1 -0
- package/dist/core/trigger-final-suppression.js +97 -0
- package/dist/core/trigger-final-suppression.js.map +1 -0
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +64 -4
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +20 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +283 -32
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +5 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +520 -35
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +1 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +34 -6
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +3 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +3 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/compat.d.ts +102 -2
- package/dist/dashboard/compat.d.ts.map +1 -1
- package/dist/dashboard/compat.js +78 -14
- package/dist/dashboard/compat.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +1 -0
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/desktop-asks.d.ts +21 -0
- package/dist/dashboard/desktop-asks.d.ts.map +1 -0
- package/dist/dashboard/desktop-asks.js +49 -0
- package/dist/dashboard/desktop-asks.js.map +1 -0
- package/dist/dashboard/public-redact.d.ts +7 -0
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +35 -3
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/session-presentation.d.ts +16 -0
- package/dist/dashboard/session-presentation.d.ts.map +1 -0
- package/dist/dashboard/session-presentation.js +62 -0
- package/dist/dashboard/session-presentation.js.map +1 -0
- package/dist/dashboard/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +19 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/trigger-api.d.ts.map +1 -1
- package/dist/dashboard/trigger-api.js +19 -1
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.d.ts +7 -2
- package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.js +13 -0
- package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +18 -5
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +97 -35
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +3 -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/client-shell.d.ts +29 -0
- package/dist/dashboard/web/client-shell.d.ts.map +1 -0
- package/dist/dashboard/web/client-shell.js +89 -0
- package/dist/dashboard/web/client-shell.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +5 -1
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +100 -8
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +7 -0
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +32 -0
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-kanban.js +1 -1
- 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 +77 -23
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +4 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +14 -1
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +6 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +55 -30
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +1 -2
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +69 -20
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.js +128 -42
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +9 -2
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-VQMPUJ4Y.js +10 -0
- package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-KPQAUX7V.js → chunk-JMRGZQDB.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-R7IAKAYX.js → chunk-NP4JUBGS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-NRL6CVAS.js → chunk-P327LXOT.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-X2L65IOM.js → chunk-SNKATZWK.js} +15 -15
- package/dist/dashboard-web/chunks/connectors-page-DOY4J3ZL.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-6DKXBYOM.js → groups-page-74TS2DIH.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-NWARTJ6J.js → insights-page-AYCO65JC.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-AGX3XRJX.js → monitor-room-YKYLTSAN.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-GGGIWN4C.js → monitoring-page-QBIUNRBR.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-6SIVKSK3.js → office-page-4PH2A26P.js} +1 -1
- package/dist/dashboard-web/chunks/overview-page-H73D5UT4.js +1 -0
- package/dist/dashboard-web/chunks/{roles-page-WE2YB7KN.js → roles-page-U4BTOQ7F.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-TB3I24XN.js → schedules-page-RHRHX7R7.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-VSC6AM5G.js +2 -0
- package/dist/dashboard-web/chunks/settings-page-LF3RKM5P.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-3QAT2IWD.js → skills-page-SYOIGGXH.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-K4VVAVAK.js → team-federation-page-RMBLASTW.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-V6IOJR2B.js → v3-page-XJXKKJRN.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-V6CGKRNX.js → whiteboards-page-K3YVSTHJ.js} +1 -1
- package/dist/dashboard-web/style.css +551 -0
- package/dist/dashboard.js +153 -9
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +11 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +23 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +5 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +5 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +1 -1
- package/dist/im/lark/card-builder.js +1 -1
- package/dist/im/lark/card-handler.d.ts +10 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +163 -17
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +11 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +47 -18
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +13 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +20 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts +25 -1
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +47 -1
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/overload-nonce.d.ts +19 -0
- package/dist/im/lark/overload-nonce.d.ts.map +1 -0
- package/dist/im/lark/overload-nonce.js +72 -0
- package/dist/im/lark/overload-nonce.js.map +1 -0
- package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
- package/dist/im/lark/v3-progress-card.js +5 -0
- package/dist/im/lark/v3-progress-card.js.map +1 -1
- package/dist/services/async-trigger-state.d.ts +82 -0
- package/dist/services/async-trigger-state.d.ts.map +1 -0
- package/dist/services/async-trigger-state.js +95 -0
- package/dist/services/async-trigger-state.js.map +1 -0
- package/dist/services/async-trigger-store.d.ts +28 -0
- package/dist/services/async-trigger-store.d.ts.map +1 -0
- package/dist/services/async-trigger-store.js +120 -0
- package/dist/services/async-trigger-store.js.map +1 -0
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +34 -2
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +32 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +39 -0
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/bridge-turn-queue.d.ts.map +1 -1
- package/dist/services/bridge-turn-queue.js +15 -1
- package/dist/services/bridge-turn-queue.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +4 -0
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +8 -0
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/claude-transcript.d.ts +23 -0
- package/dist/services/claude-transcript.d.ts.map +1 -1
- package/dist/services/claude-transcript.js +33 -0
- package/dist/services/claude-transcript.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +61 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -0
- package/dist/services/codex-app-runner-protocol.js +170 -0
- package/dist/services/codex-app-runner-protocol.js.map +1 -0
- package/dist/services/codex-app-turn-controller.d.ts +72 -0
- package/dist/services/codex-app-turn-controller.d.ts.map +1 -0
- package/dist/services/codex-app-turn-controller.js +524 -0
- package/dist/services/codex-app-turn-controller.js.map +1 -0
- package/dist/services/codex-runner-freshness.d.ts +39 -0
- package/dist/services/codex-runner-freshness.d.ts.map +1 -0
- package/dist/services/codex-runner-freshness.js +78 -0
- package/dist/services/codex-runner-freshness.js.map +1 -0
- package/dist/services/connector-store.d.ts +6 -0
- package/dist/services/connector-store.d.ts.map +1 -1
- package/dist/services/connector-store.js.map +1 -1
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +16 -0
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/hermes-transcript.d.ts +1 -0
- package/dist/services/hermes-transcript.d.ts.map +1 -1
- package/dist/services/hermes-transcript.js +49 -0
- package/dist/services/hermes-transcript.js.map +1 -1
- package/dist/services/schedule-split-migration.d.ts +2 -0
- package/dist/services/schedule-split-migration.d.ts.map +1 -0
- package/dist/services/schedule-split-migration.js +159 -0
- package/dist/services/schedule-split-migration.js.map +1 -0
- package/dist/services/schedule-store.d.ts +28 -4
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +118 -33
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/trigger-types.d.ts +18 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +3 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-store.js +1 -0
- package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-templates.d.ts +32 -0
- package/dist/services/vc-meeting-consumer-profile-templates.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-templates.js +106 -0
- package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -0
- package/dist/services/vc-meeting-delivery-feed.d.ts +1 -1
- package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-feed.js +2 -1
- package/dist/services/vc-meeting-delivery-feed.js.map +1 -1
- package/dist/services/vc-meeting-delivery-hub-store.d.ts +3 -1
- package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-hub-store.js +11 -0
- package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -1
- package/dist/services/vc-meeting-delivery-protocol.d.ts +9 -2
- package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-protocol.js +10 -1
- package/dist/services/vc-meeting-delivery-protocol.js.map +1 -1
- package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-receiver.js +10 -1
- package/dist/services/vc-meeting-delivery-receiver.js.map +1 -1
- package/dist/services/vc-meeting-delivery-store.d.ts +12 -2
- package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-store.js +14 -2
- package/dist/services/vc-meeting-delivery-store.js.map +1 -1
- package/dist/services/vc-meeting-im-reply.d.ts +2 -1
- package/dist/services/vc-meeting-im-reply.d.ts.map +1 -1
- package/dist/services/vc-meeting-im-reply.js +19 -3
- package/dist/services/vc-meeting-im-reply.js.map +1 -1
- package/dist/services/vc-meeting-listener-output-protocol.d.ts +27 -0
- package/dist/services/vc-meeting-listener-output-protocol.d.ts.map +1 -0
- package/dist/services/vc-meeting-listener-output-protocol.js +58 -0
- package/dist/services/vc-meeting-listener-output-protocol.js.map +1 -0
- package/dist/services/vc-meeting-listener-topic-store.d.ts +31 -0
- package/dist/services/vc-meeting-listener-topic-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-listener-topic-store.js +120 -0
- package/dist/services/vc-meeting-listener-topic-store.js.map +1 -0
- package/dist/services/vc-meeting-runtime-store.d.ts +2 -1
- package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-runtime-store.js +8 -0
- package/dist/services/vc-meeting-runtime-store.js.map +1 -1
- package/dist/services/vc-meeting-send-policy.d.ts +8 -1
- package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
- package/dist/services/vc-meeting-send-policy.js +8 -0
- package/dist/services/vc-meeting-send-policy.js.map +1 -1
- package/dist/types.d.ts +40 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/allowed-users-apply.d.ts +76 -0
- package/dist/utils/allowed-users-apply.d.ts.map +1 -0
- package/dist/utils/allowed-users-apply.js +123 -0
- package/dist/utils/allowed-users-apply.js.map +1 -0
- package/dist/utils/allowed-users-cache.d.ts +29 -0
- package/dist/utils/allowed-users-cache.d.ts.map +1 -0
- package/dist/utils/allowed-users-cache.js +82 -0
- package/dist/utils/allowed-users-cache.js.map +1 -0
- package/dist/utils/child-env.d.ts +2 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +2 -1
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/cli-usage-limit.d.ts +27 -1
- package/dist/utils/cli-usage-limit.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.js +92 -20
- package/dist/utils/cli-usage-limit.js.map +1 -1
- package/dist/utils/input-gate.d.ts +2 -0
- package/dist/utils/input-gate.d.ts.map +1 -1
- package/dist/utils/input-gate.js +2 -0
- package/dist/utils/input-gate.js.map +1 -1
- package/dist/utils/runtime-build-id.d.ts +21 -0
- package/dist/utils/runtime-build-id.d.ts.map +1 -0
- package/dist/utils/runtime-build-id.js +83 -0
- package/dist/utils/runtime-build-id.js.map +1 -0
- package/dist/utils/terminal-renderer.d.ts +3 -3
- package/dist/utils/terminal-renderer.js +3 -3
- package/dist/vc-agent/cards.d.ts.map +1 -1
- package/dist/vc-agent/cards.js +21 -1
- package/dist/vc-agent/cards.js.map +1 -1
- package/dist/worker.js +601 -179
- package/dist/worker.js.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.js +13 -1
- package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
- package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -1
- package/dist/workflows/migration/v2-to-v3.js +5 -1
- package/dist/workflows/migration/v2-to-v3.js.map +1 -1
- package/dist/workflows/v3/architect.d.ts.map +1 -1
- package/dist/workflows/v3/architect.js +1 -0
- package/dist/workflows/v3/architect.js.map +1 -1
- package/dist/workflows/v3/cli-run.d.ts +9 -0
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +17 -2
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/goal-cli.d.ts +58 -0
- package/dist/workflows/v3/goal-cli.d.ts.map +1 -0
- package/dist/workflows/v3/goal-cli.js +430 -0
- package/dist/workflows/v3/goal-cli.js.map +1 -0
- package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
- package/dist/workflows/v3/library-materialize.js +5 -1
- package/dist/workflows/v3/library-materialize.js.map +1 -1
- package/dist/workflows/v3/library-schema.d.ts +21 -0
- package/dist/workflows/v3/library-schema.d.ts.map +1 -1
- package/dist/workflows/v3/library-schema.js +95 -1
- package/dist/workflows/v3/library-schema.js.map +1 -1
- package/dist/workflows/v3/progress-projection.d.ts +3 -0
- package/dist/workflows/v3/progress-projection.d.ts.map +1 -1
- package/dist/workflows/v3/progress-projection.js +23 -1
- package/dist/workflows/v3/progress-projection.js.map +1 -1
- package/dist/workflows/v3/run-envelope.d.ts +46 -1
- package/dist/workflows/v3/run-envelope.d.ts.map +1 -1
- package/dist/workflows/v3/run-envelope.js +32 -1
- package/dist/workflows/v3/run-envelope.js.map +1 -1
- package/package.json +2 -2
- package/dist/dashboard-web/chunks/bot-defaults-page-AUKV7P4L.js +0 -10
- package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-HDQFEXZI.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-FVR3NKAF.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-KOOOASIL.js +0 -2
- package/dist/dashboard-web/chunks/settings-page-IEBR7TGN.js +0 -2
- package/dist/utils/screen-analyzer.d.ts +0 -75
- package/dist/utils/screen-analyzer.d.ts.map +0 -1
- package/dist/utils/screen-analyzer.js +0 -333
- package/dist/utils/screen-analyzer.js.map +0 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide how to apply a startup / refresh resolve of allowedUsers.
|
|
3
|
+
*
|
|
4
|
+
* Runtime permission (canTalk/canOperate) only matches app-scoped open_ids
|
|
5
|
+
* (`ou_…`). Config may store stable `on_…` / emails that must be resolved each
|
|
6
|
+
* boot. A transient contact API failure used to overwrite the runtime list with
|
|
7
|
+
* `[]`, which fail-closed locks out even the real owner with almost no signal.
|
|
8
|
+
*
|
|
9
|
+
* This module merges the fresh resolve with a last-known-good `raw → ou_` cache,
|
|
10
|
+
* but ONLY per-entry and ONLY when that entry both (a) transient-failed this
|
|
11
|
+
* pass and (b) is still present in the current raw config. That guards against
|
|
12
|
+
* two revival hazards a bare `ou_[]` fallback list would create:
|
|
13
|
+
* - config swaps owner `on_old → on_new`, contact API blips → `ou_old` would
|
|
14
|
+
* be resurrected from cache even though the operator removed it;
|
|
15
|
+
* - an owner is definitively removed from the tenant (errored=false,
|
|
16
|
+
* resolved=[]) → they would be revived indefinitely.
|
|
17
|
+
* The cache is keyed by raw entry, so an entry no longer in config, or one that
|
|
18
|
+
* resolved definitively-gone, is never reused.
|
|
19
|
+
*/
|
|
20
|
+
/** Config entries that require a contact resolve (email / union / literal ou_). */
|
|
21
|
+
function needsContactResolve(rawEntries) {
|
|
22
|
+
return rawEntries.some(u => u.includes('@') || u.startsWith('on_') || u.startsWith('ou_'));
|
|
23
|
+
}
|
|
24
|
+
function entryStatusOf(status, entry) {
|
|
25
|
+
// Absent → definitive: never revive an entry the resolver did not explicitly
|
|
26
|
+
// flag as transient. Safer to drop than to resurrect a stale grant.
|
|
27
|
+
return status?.get(entry) ?? 'definitive';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pure merge of a fresh resolve result + a last-known-good `raw → ou_` cache.
|
|
31
|
+
*
|
|
32
|
+
* Walk raw config in order. For each entry:
|
|
33
|
+
* - fresh `ou_` from this resolve → use it (authoritative);
|
|
34
|
+
* - else if this entry transient-failed AND has a cached `ou_` → reuse cache
|
|
35
|
+
* (marks usedFallback + failed);
|
|
36
|
+
* - else (definitive miss / no cache / non-resolvable literal) → drop it.
|
|
37
|
+
* Never leaves bare `on_` / emails in the runtime list — those cannot match
|
|
38
|
+
* message senders and would still lock the owner out. Output `map` mirrors the
|
|
39
|
+
* chosen `resolved` set so downstream `/revoke` + sidecar stay consistent.
|
|
40
|
+
*/
|
|
41
|
+
export function applyAllowedUsersResolve(input) {
|
|
42
|
+
const rawEntries = input.rawEntries.filter(u => typeof u === 'string' && u.trim().length > 0);
|
|
43
|
+
const prevMap = input.previousResolvedMap ?? {};
|
|
44
|
+
const { map: freshMap, errored, entryStatus } = input.resolveResult;
|
|
45
|
+
if (rawEntries.length === 0) {
|
|
46
|
+
return { resolved: [], map: new Map(), usedFallback: false, failed: false, notice: null };
|
|
47
|
+
}
|
|
48
|
+
const outMap = new Map();
|
|
49
|
+
const resolved = [];
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
let usedFallback = false;
|
|
52
|
+
let transientMissWithoutCache = false;
|
|
53
|
+
const recoveredEntries = [];
|
|
54
|
+
const push = (rawEntry, oid) => {
|
|
55
|
+
if (!oid.startsWith('ou_'))
|
|
56
|
+
return;
|
|
57
|
+
outMap.set(rawEntry, oid);
|
|
58
|
+
if (!seen.has(oid)) {
|
|
59
|
+
seen.add(oid);
|
|
60
|
+
resolved.push(oid);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
for (const entry of rawEntries) {
|
|
64
|
+
const fresh = freshMap.get(entry);
|
|
65
|
+
if (fresh && fresh.startsWith('ou_')) {
|
|
66
|
+
push(entry, fresh);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// No fresh ou_. Only reuse cache if this entry TRANSIENT-failed this pass —
|
|
70
|
+
// a definitive miss (removed / invalid / swapped out) must not be revived.
|
|
71
|
+
if (entryStatusOf(entryStatus, entry) === 'transient') {
|
|
72
|
+
const cached = prevMap[entry];
|
|
73
|
+
if (typeof cached === 'string' && cached.startsWith('ou_')) {
|
|
74
|
+
push(entry, cached);
|
|
75
|
+
usedFallback = true;
|
|
76
|
+
recoveredEntries.push(entry);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
transientMissWithoutCache = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// definitive / resolved-without-ou_ / non-resolvable literal → drop entry.
|
|
83
|
+
}
|
|
84
|
+
// A resolve is "healthy" only when nothing transient-failed. Definitive
|
|
85
|
+
// drops (removed owners) are expected and do NOT mark failed — the config
|
|
86
|
+
// is simply reflecting reality; there is nothing to retry.
|
|
87
|
+
const anyTransient = rawEntries.some(e => entryStatusOf(entryStatus, e) === 'transient');
|
|
88
|
+
const failed = !!errored || anyTransient;
|
|
89
|
+
if (!failed) {
|
|
90
|
+
// Clean pass. resolved may still be empty here if config holds only
|
|
91
|
+
// definitively-gone / non-resolvable entries — that is a legitimate empty
|
|
92
|
+
// allowlist, not a fallback situation. Non-resolvable-only configs (no
|
|
93
|
+
// contact entries) also land here with no notice.
|
|
94
|
+
return { resolved, map: outMap, usedFallback: false, failed: false, notice: null };
|
|
95
|
+
}
|
|
96
|
+
// Degraded pass (something transient-failed). Build an operator-facing notice.
|
|
97
|
+
let notice;
|
|
98
|
+
if (resolved.length > 0 && usedFallback) {
|
|
99
|
+
notice =
|
|
100
|
+
`allowedUsers resolve degraded: contact API transiently failed for ` +
|
|
101
|
+
`${recoveredEntries.length} entr${recoveredEntries.length === 1 ? 'y' : 'ies'} ` +
|
|
102
|
+
`(${recoveredEntries.join(', ')}); reused last-known ou_ from cache so owner talk keeps working. ` +
|
|
103
|
+
`Retrying automatically; restart after Feishu contact recovers if needed.`;
|
|
104
|
+
}
|
|
105
|
+
else if (resolved.length > 0) {
|
|
106
|
+
notice =
|
|
107
|
+
`allowedUsers resolve degraded: some entries transiently failed but ` +
|
|
108
|
+
`${resolved.length} open_id(s) resolved/recovered. Raw entries: ${rawEntries.join(', ')}. Retrying.`;
|
|
109
|
+
}
|
|
110
|
+
else if (transientMissWithoutCache || needsContactResolve(rawEntries)) {
|
|
111
|
+
notice =
|
|
112
|
+
`allowedUsers resolve failed: contact API unavailable and no last-known ou_ cache for the ` +
|
|
113
|
+
`affected entr${recoveredEntries.length === 1 ? 'y' : 'ies'}; runtime allowlist is empty so ` +
|
|
114
|
+
`everyone (including the real owner) is denied. Raw entries: ${rawEntries.join(', ')}. ` +
|
|
115
|
+
`Check Feishu contact API / bot scopes; retrying automatically.`;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
notice =
|
|
119
|
+
`allowedUsers resolve degraded; runtime allowlist is empty. Raw entries: ${rawEntries.join(', ')}.`;
|
|
120
|
+
}
|
|
121
|
+
return { resolved, map: outMap, usedFallback, failed: true, notice };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=allowed-users-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-users-apply.js","sourceRoot":"","sources":["../../src/utils/allowed-users-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare function allowedUsersCachePath(dataDir: string, larkAppId: string): string;
|
|
2
|
+
/** Read the persisted `raw → ou_` cache (ou_ values only). `{}` on any error. */
|
|
3
|
+
export declare function readAllowedUsersResolveCache(dataDir: string, larkAppId: string): Record<string, string>;
|
|
4
|
+
export interface WriteAllowedUsersCacheOpts {
|
|
5
|
+
/**
|
|
6
|
+
* Fresh `raw → ou_` pairs to upsert (only ou_ values are kept). Callers pass
|
|
7
|
+
* the resolve/mutation result map.
|
|
8
|
+
*/
|
|
9
|
+
map: Map<string, string> | Record<string, string>;
|
|
10
|
+
/**
|
|
11
|
+
* Entries to delete from the cache regardless of `map` — e.g. definitively-gone
|
|
12
|
+
* ids (removed from tenant) or a raw entry just revoked. Pruned so a later
|
|
13
|
+
* restart during an API blip can't mark them transient and revive a stale owner.
|
|
14
|
+
*/
|
|
15
|
+
deleteEntries?: Iterable<string>;
|
|
16
|
+
/**
|
|
17
|
+
* When provided, the cache is pruned to ONLY these raw keys (plus whatever
|
|
18
|
+
* `map` upserts). Pass the current raw allowedUsers config so keys no longer
|
|
19
|
+
* configured (owner swap) never linger. Omit to merge without pruning.
|
|
20
|
+
*/
|
|
21
|
+
retainKeys?: Iterable<string>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Persist the `raw → ou_` cache. Merges `map` over the existing cache, deletes
|
|
25
|
+
* `deleteEntries`, and — when `retainKeys` is given — drops every key not in
|
|
26
|
+
* that set. Best-effort; never throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function writeAllowedUsersResolveCache(dataDir: string, larkAppId: string, opts: WriteAllowedUsersCacheOpts): void;
|
|
29
|
+
//# sourceMappingURL=allowed-users-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-users-cache.d.ts","sourceRoot":"","sources":["../../src/utils/allowed-users-cache.ts"],"names":[],"mappings":"AAsBA,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,iFAAiF;AACjF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAevG;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD;;;;OAIG;IACH,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,0BAA0B,GAC/B,IAAI,CA+BN"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent last-known-good `raw entry → ou_` cache for allowedUsers.
|
|
3
|
+
*
|
|
4
|
+
* This is DELIBERATELY NOT the dashboard descriptor: that descriptor is
|
|
5
|
+
* (a) overwritten unconditionally early in daemon boot with the still-unresolved
|
|
6
|
+
* raw config (so its `resolvedAllowedUsers` is `[]` for an on_/email-only owner),
|
|
7
|
+
* and (b) deleted on every clean shutdown. Reading it as a fallback source is
|
|
8
|
+
* dead-on-arrival for the transient-failure-on-restart scenario this cache
|
|
9
|
+
* exists to survive. This sidecar lives in the persistent data dir, is written
|
|
10
|
+
* whenever a healthy/partial resolve or a hot config/grant mutation produces a
|
|
11
|
+
* fresh `raw → ou_` mapping, and is never deleted on shutdown.
|
|
12
|
+
*
|
|
13
|
+
* Keyed by raw config entry so recovery is per-entry: an entry removed from
|
|
14
|
+
* config (owner swap / revoke) or definitively gone is never revived. Both the
|
|
15
|
+
* daemon startup/retry path and the runtime set/revoke paths write through here
|
|
16
|
+
* so the cache never diverges from the live allowlist.
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { atomicWriteFileSync } from './atomic-write.js';
|
|
21
|
+
import { logger } from './logger.js';
|
|
22
|
+
export function allowedUsersCachePath(dataDir, larkAppId) {
|
|
23
|
+
return join(dataDir, `allowed-users-cache-${larkAppId}.json`);
|
|
24
|
+
}
|
|
25
|
+
/** Read the persisted `raw → ou_` cache (ou_ values only). `{}` on any error. */
|
|
26
|
+
export function readAllowedUsersResolveCache(dataDir, larkAppId) {
|
|
27
|
+
try {
|
|
28
|
+
const fp = allowedUsersCachePath(dataDir, larkAppId);
|
|
29
|
+
if (!existsSync(fp))
|
|
30
|
+
return {};
|
|
31
|
+
const raw = JSON.parse(readFileSync(fp, 'utf8'));
|
|
32
|
+
const m = raw?.map;
|
|
33
|
+
if (!m || typeof m !== 'object' || Array.isArray(m))
|
|
34
|
+
return {};
|
|
35
|
+
const out = {};
|
|
36
|
+
for (const [k, v] of Object.entries(m)) {
|
|
37
|
+
if (typeof k === 'string' && typeof v === 'string' && v.startsWith('ou_'))
|
|
38
|
+
out[k] = v;
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Persist the `raw → ou_` cache. Merges `map` over the existing cache, deletes
|
|
48
|
+
* `deleteEntries`, and — when `retainKeys` is given — drops every key not in
|
|
49
|
+
* that set. Best-effort; never throws.
|
|
50
|
+
*/
|
|
51
|
+
export function writeAllowedUsersResolveCache(dataDir, larkAppId, opts) {
|
|
52
|
+
try {
|
|
53
|
+
let merged = readAllowedUsersResolveCache(dataDir, larkAppId);
|
|
54
|
+
if (opts.retainKeys) {
|
|
55
|
+
const keep = new Set();
|
|
56
|
+
for (const k of opts.retainKeys)
|
|
57
|
+
if (typeof k === 'string')
|
|
58
|
+
keep.add(k);
|
|
59
|
+
const pruned = {};
|
|
60
|
+
for (const [k, v] of Object.entries(merged))
|
|
61
|
+
if (keep.has(k))
|
|
62
|
+
pruned[k] = v;
|
|
63
|
+
merged = pruned;
|
|
64
|
+
}
|
|
65
|
+
for (const e of opts.deleteEntries ?? []) {
|
|
66
|
+
if (typeof e === 'string')
|
|
67
|
+
delete merged[e];
|
|
68
|
+
}
|
|
69
|
+
const entries = opts.map instanceof Map
|
|
70
|
+
? opts.map.entries()
|
|
71
|
+
: Object.entries(opts.map);
|
|
72
|
+
for (const [k, v] of entries) {
|
|
73
|
+
if (typeof k === 'string' && typeof v === 'string' && v.startsWith('ou_'))
|
|
74
|
+
merged[k] = v;
|
|
75
|
+
}
|
|
76
|
+
atomicWriteFileSync(allowedUsersCachePath(dataDir, larkAppId), JSON.stringify({ map: merged, updatedAt: Date.now() }), { mode: 0o600 });
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
logger.debug(`[${larkAppId}] failed to persist allowedUsers cache: ${err?.message ?? err}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=allowed-users-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-users-cache.js","sourceRoot":"","sources":["../../src/utils/allowed-users-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,7 +77,8 @@ export declare const BOTMUX_INJECTED_ENV_KEYS: readonly ["__OWNER_OPEN_ID", "BOT
|
|
|
77
77
|
/** Proxy env vars that must reach the CLI child process so it can dial the
|
|
78
78
|
* upstream API on hosts without direct internet access. Forwarded explicitly
|
|
79
79
|
* by buildBotmuxEnvAssignments (tmux/tmux-pipe/zellij backends) and
|
|
80
|
-
*
|
|
80
|
+
* prepareDirectSandbox (bwrap --setenv); the pty backend inherits them via the
|
|
81
|
+
* full child env.
|
|
81
82
|
* Deliberately NOT in BOTMUX_INJECTED_ENV_KEYS: that list drives tmuxEnv()
|
|
82
83
|
* stripping and scrubTmuxServerGlobalEnv() cleanup — adding proxy keys there
|
|
83
84
|
* would delete the user's own tmux server proxy config. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-env.d.ts","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,4GAiB1B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,yBAAyB,8CAA+C,CAAC;AAEtF;;;iBAGiB;AACjB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,qpBA+C3B,CAAC;AAEX
|
|
1
|
+
{"version":3,"file":"child-env.d.ts","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,4GAiB1B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,yBAAyB,8CAA+C,CAAC;AAEtF;;;iBAGiB;AACjB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,qpBA+C3B,CAAC;AAEX;;;;;;;4DAO4D;AAC5D,eAAO,MAAM,cAAc,uHAGjB,CAAC;AAsBX;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAIzE"}
|
package/dist/utils/child-env.js
CHANGED
|
@@ -144,7 +144,8 @@ export const BOTMUX_INJECTED_ENV_KEYS = [
|
|
|
144
144
|
/** Proxy env vars that must reach the CLI child process so it can dial the
|
|
145
145
|
* upstream API on hosts without direct internet access. Forwarded explicitly
|
|
146
146
|
* by buildBotmuxEnvAssignments (tmux/tmux-pipe/zellij backends) and
|
|
147
|
-
*
|
|
147
|
+
* prepareDirectSandbox (bwrap --setenv); the pty backend inherits them via the
|
|
148
|
+
* full child env.
|
|
148
149
|
* Deliberately NOT in BOTMUX_INJECTED_ENV_KEYS: that list drives tmuxEnv()
|
|
149
150
|
* stripping and scrubTmuxServerGlobalEnv() cleanup — adding proxy keys there
|
|
150
151
|
* would delete the user's own tmux server proxy config. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-env.js","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,YAAY;IACZ,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,+EAA+E;IAC/E,4EAA4E;IAC5E,2EAA2E;IAC3E,gFAAgF;IAChF,6EAA6E;IAC7E,mEAAmE;IACnE,MAAM;IACN,WAAW;CACH,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAU,CAAC;AAEtF;;;iBAGiB;AACjB,MAAM,UAAU,sBAAsB,CAAC,GAAsB;IAC3D,KAAK,MAAM,GAAG,IAAI,yBAAyB;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iBAAiB;IACjB,QAAQ;IACR,kBAAkB;IAClB,YAAY;IACZ,wEAAwE;IACxE,mEAAmE;IACnE,mBAAmB;IACnB,gBAAgB;IAChB,0EAA0E;IAC1E,wEAAwE;IACxE,wCAAwC;IACxC,2BAA2B;IAC3B,6BAA6B;IAC7B,qEAAqE;IACrE,kBAAkB;IAClB,oBAAoB;IACpB,wBAAwB;IACxB,sEAAsE;IACtE,2EAA2E;IAC3E,sBAAsB;IACtB,gBAAgB;IAChB,yBAAyB;IACzB,0EAA0E;IAC1E,sDAAsD;IACtD,oBAAoB;IACpB,4EAA4E;IAC5E,+BAA+B;IAC/B,4EAA4E;IAC5E,uEAAuE;IACvE,yEAAyE;IACzE,6EAA6E;IAC7E,wBAAwB;IACxB,2EAA2E;IAC3E,mCAAmC;IACnC,sCAAsC;IACtC,sBAAsB;IACtB,qEAAqE;IACrE,aAAa;IACb,2BAA2B;IAC3B,6BAA6B;IAC7B,gDAAgD;IAChD,mBAAmB;IACnB,YAAY;IACZ,wDAAwD;IACxD,oCAAoC;IACpC,mBAAmB;CACX,CAAC;AAEX
|
|
1
|
+
{"version":3,"file":"child-env.js","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,UAAU;IACV,YAAY;IACZ,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,+EAA+E;IAC/E,4EAA4E;IAC5E,2EAA2E;IAC3E,gFAAgF;IAChF,6EAA6E;IAC7E,mEAAmE;IACnE,MAAM;IACN,WAAW;CACH,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAU,CAAC;AAEtF;;;iBAGiB;AACjB,MAAM,UAAU,sBAAsB,CAAC,GAAsB;IAC3D,KAAK,MAAM,GAAG,IAAI,yBAAyB;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iBAAiB;IACjB,QAAQ;IACR,kBAAkB;IAClB,YAAY;IACZ,wEAAwE;IACxE,mEAAmE;IACnE,mBAAmB;IACnB,gBAAgB;IAChB,0EAA0E;IAC1E,wEAAwE;IACxE,wCAAwC;IACxC,2BAA2B;IAC3B,6BAA6B;IAC7B,qEAAqE;IACrE,kBAAkB;IAClB,oBAAoB;IACpB,wBAAwB;IACxB,sEAAsE;IACtE,2EAA2E;IAC3E,sBAAsB;IACtB,gBAAgB;IAChB,yBAAyB;IACzB,0EAA0E;IAC1E,sDAAsD;IACtD,oBAAoB;IACpB,4EAA4E;IAC5E,+BAA+B;IAC/B,4EAA4E;IAC5E,uEAAuE;IACvE,yEAAyE;IACzE,6EAA6E;IAC7E,wBAAwB;IACxB,2EAA2E;IAC3E,mCAAmC;IACnC,sCAAsC;IACtC,sBAAsB;IACtB,qEAAqE;IACrE,aAAa;IACb,2BAA2B;IAC3B,6BAA6B;IAC7B,gDAAgD;IAChD,mBAAmB;IACnB,YAAY;IACZ,wDAAwD;IACxD,oCAAoC;IACpC,mBAAmB;CACX,CAAC;AAEX;;;;;;;4DAO4D;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa;IACxD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;CACxC,CAAC;AAEX,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC1D,GAAG,wBAAwB;IAC3B,GAAG,uBAAuB;IAC1B,uEAAuE;IACvE,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IACxE,yEAAyE;IACzE,4EAA4E;IAC5E,6BAA6B;IAC7B,GAAG,cAAc;CAClB,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IACjE,GAAG,wBAAwB;IAC3B,aAAa;IACb,iBAAiB;IACjB,YAAY;CACb,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qCAAqC,CAAC,GAAW;IAC/D,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuB;IACpD,MAAM,GAAG,GAAsB,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,uBAAuB;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -10,6 +10,32 @@ export interface CliUsageLimitNotDetected {
|
|
|
10
10
|
limited: false;
|
|
11
11
|
}
|
|
12
12
|
export type CliUsageLimitDetection = CliUsageLimitState | CliUsageLimitNotDetected;
|
|
13
|
-
export declare
|
|
13
|
+
export declare const HARD_RATE_LIMIT_COOLDOWN_MS: number;
|
|
14
|
+
export interface DetectUsageLimitOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Suppress the screen-scan `rate` verdict entirely. Set for CLIs that have an
|
|
17
|
+
* authoritative structured rate-limit signal (Claude family via transcript
|
|
18
|
+
* `error:"rate_limit"`): there, scraping the screen for "429" / "rate limit"
|
|
19
|
+
* only produces false positives (the model's own output, or a dev editing
|
|
20
|
+
* rate-limit code, puts those phrases on screen). `usage` quota detection is
|
|
21
|
+
* unaffected — it has no structured equivalent yet.
|
|
22
|
+
*/
|
|
23
|
+
suppressRateKind?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function detectCliUsageLimit(text: string, now?: Date, opts?: DetectUsageLimitOptions): CliUsageLimitDetection;
|
|
14
26
|
export declare function usageLimitStateKey(state: CliUsageLimitState): string;
|
|
27
|
+
/**
|
|
28
|
+
* Build a rate-limit state from a STRUCTURED signal (e.g. Claude Code's
|
|
29
|
+
* transcript `error: "rate_limit"` record) instead of screen text.
|
|
30
|
+
*
|
|
31
|
+
* The caller has already decided this IS a rate limit via a machine field, so
|
|
32
|
+
* unlike detectCliUsageLimit() there is no pattern gate here — we only need to
|
|
33
|
+
* fix the retry time. Claude's rate-limit records usually carry a human clock
|
|
34
|
+
* in their text ("You've hit your session limit · resets 10:40pm"); when
|
|
35
|
+
* `text` yields a parseable time we honor it (accurate retry_ready flip),
|
|
36
|
+
* otherwise we reuse the same wall-clock-bucketed fallback the screen-text
|
|
37
|
+
* hard-429 path uses so the usageLimitStateKey stays stable across repeated
|
|
38
|
+
* ticks within a bucket (no persist/timer churn on the daemon side).
|
|
39
|
+
*/
|
|
40
|
+
export declare function structuredRateLimitState(text?: string, now?: Date): CliUsageLimitState;
|
|
15
41
|
//# sourceMappingURL=cli-usage-limit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-usage-limit.d.ts","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-usage-limit.d.ts","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,wBAAwB,CAAC;AAoCnF,eAAO,MAAM,2BAA2B,QAAgB,CAAC;AA0DzD,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,OAAa,EAChB,IAAI,GAAE,uBAA4B,GACjC,sBAAsB,CAsCxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAK,EAAE,GAAG,OAAa,GAAG,kBAAkB,CAUxF"}
|
|
@@ -7,7 +7,29 @@ const USAGE_LIMIT_PATTERNS = [
|
|
|
7
7
|
const RATE_LIMIT_PATTERNS = [
|
|
8
8
|
/\brate limits?.*(?:reached|exceeded)\b/i,
|
|
9
9
|
/\brate limited\b/i,
|
|
10
|
+
// HTTP-style hard rate limits from CLI/provider retries (Codex/OpenAI path).
|
|
11
|
+
// Anchor 429 to rate-limit context. A bare /\b429\b/ (or a bare "too many
|
|
12
|
+
// requests") false-positives on ordinary TUI content — port numbers, log
|
|
13
|
+
// line numbers, and especially agent command output (e.g. code/docs that
|
|
14
|
+
// literally print "Too Many Requests"). This detector runs on every screen
|
|
15
|
+
// frame, so keep it tight: only 429 that sits next to a status word or the
|
|
16
|
+
// full "429 Too Many Requests" phrase, plus the explicit retry-exhaustion line.
|
|
17
|
+
/status:\s*429\b/i,
|
|
18
|
+
/\b429\s+too many requests\b/i,
|
|
19
|
+
/\bexceeded retry limit\b/i,
|
|
10
20
|
];
|
|
21
|
+
// Hard rate-limit signatures that often omit a wall-clock retry time.
|
|
22
|
+
// Only these get the fixed-cooldown fallback so generic "try again later"
|
|
23
|
+
// usage copy stays non-blocking (existing product decision). Same tightened
|
|
24
|
+
// contexts as above — never a bare 429 / bare "too many requests".
|
|
25
|
+
const HARD_RATE_LIMIT_WITHOUT_TIME_PATTERNS = [
|
|
26
|
+
/status:\s*429\b/i,
|
|
27
|
+
/\b429\s+too many requests\b/i,
|
|
28
|
+
/\bexceeded retry limit\b/i,
|
|
29
|
+
];
|
|
30
|
+
// Quantized cooldown for hard 429-style errors without a parseable clock time.
|
|
31
|
+
// Bucketed so repeated screen ticks produce a stable usageLimitStateKey.
|
|
32
|
+
export const HARD_RATE_LIMIT_COOLDOWN_MS = 5 * 60 * 1000;
|
|
11
33
|
const RETRY_TIME_PATTERNS = [
|
|
12
34
|
/\btry\s+again\s+at\s+(\d{1,2})(?::(\d{2}))?\s*([ap]\.?m\.?)\b/i,
|
|
13
35
|
/\bresets?(?:\s+at)?\s+(\d{1,2})(?::(\d{2}))?\s*([ap]\.?m\.?)\b/i,
|
|
@@ -46,31 +68,81 @@ function parseMeridiemTime(text, now) {
|
|
|
46
68
|
}
|
|
47
69
|
return null;
|
|
48
70
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
71
|
+
/** Stable fixed cooldown pinned to wall-clock buckets for hard 429 fallbacks. */
|
|
72
|
+
function hardRateLimitFallbackTime(now) {
|
|
73
|
+
const nowMs = now.getTime();
|
|
74
|
+
const bucketStart = Math.floor(nowMs / HARD_RATE_LIMIT_COOLDOWN_MS) * HARD_RATE_LIMIT_COOLDOWN_MS;
|
|
75
|
+
// End of the *next* full bucket so the wait is always in (5min, 10min].
|
|
76
|
+
// Within one bucket every screen tick returns the same retryAtMs/key.
|
|
77
|
+
const retryAtMs = bucketStart + 2 * HARD_RATE_LIMIT_COOLDOWN_MS;
|
|
78
|
+
return {
|
|
79
|
+
retryAtMs,
|
|
80
|
+
// Label reflects the real (5min, 10min] window, not an optimistic "~5 min":
|
|
81
|
+
// the card's countdown text must not undersell how long the wait can be.
|
|
82
|
+
retryLabel: '5-10 min',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export function detectCliUsageLimit(text, now = new Date(), opts = {}) {
|
|
86
|
+
// Hot path: runs on every screen tick for every active session. Gate heavier
|
|
87
|
+
// regex work behind one cheap scan for the >99% no-limit case.
|
|
88
|
+
// Include 429 / retry-limit tokens — "retry" does not contain "again".
|
|
89
|
+
if (!/again|reset|429|too many requests|rate limit|retry limit/i.test(text)) {
|
|
54
90
|
return { limited: false };
|
|
91
|
+
}
|
|
55
92
|
const time = parseMeridiemTime(text, now);
|
|
56
|
-
|
|
93
|
+
const isRate = !opts.suppressRateKind && hasPattern(text, RATE_LIMIT_PATTERNS);
|
|
94
|
+
const isUsage = !isRate && hasPattern(text, USAGE_LIMIT_PATTERNS);
|
|
95
|
+
if (!isRate && !isUsage)
|
|
57
96
|
return { limited: false };
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
? 'usage'
|
|
62
|
-
:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
if (time) {
|
|
98
|
+
return {
|
|
99
|
+
limited: true,
|
|
100
|
+
kind: isRate ? 'rate' : 'usage',
|
|
101
|
+
retryAtMs: time.retryAtMs,
|
|
102
|
+
retryLabel: time.retryLabel,
|
|
103
|
+
retryReady: now.getTime() >= time.retryAtMs,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Usage limits without a concrete clock time stay non-blocking (existing tests).
|
|
107
|
+
// Hard HTTP 429 / exceeded-retry-limit paths get a stable cooldown fallback so
|
|
108
|
+
// the session can still surface as limited → Dashboard「需要你」.
|
|
109
|
+
if (isRate && hasPattern(text, HARD_RATE_LIMIT_WITHOUT_TIME_PATTERNS)) {
|
|
110
|
+
const fallback = hardRateLimitFallbackTime(now);
|
|
111
|
+
return {
|
|
112
|
+
limited: true,
|
|
113
|
+
kind: 'rate',
|
|
114
|
+
retryAtMs: fallback.retryAtMs,
|
|
115
|
+
retryLabel: fallback.retryLabel,
|
|
116
|
+
retryReady: now.getTime() >= fallback.retryAtMs,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { limited: false };
|
|
72
120
|
}
|
|
73
121
|
export function usageLimitStateKey(state) {
|
|
74
122
|
return `${state.kind}:${state.retryAtMs}:${state.retryLabel}`;
|
|
75
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Build a rate-limit state from a STRUCTURED signal (e.g. Claude Code's
|
|
126
|
+
* transcript `error: "rate_limit"` record) instead of screen text.
|
|
127
|
+
*
|
|
128
|
+
* The caller has already decided this IS a rate limit via a machine field, so
|
|
129
|
+
* unlike detectCliUsageLimit() there is no pattern gate here — we only need to
|
|
130
|
+
* fix the retry time. Claude's rate-limit records usually carry a human clock
|
|
131
|
+
* in their text ("You've hit your session limit · resets 10:40pm"); when
|
|
132
|
+
* `text` yields a parseable time we honor it (accurate retry_ready flip),
|
|
133
|
+
* otherwise we reuse the same wall-clock-bucketed fallback the screen-text
|
|
134
|
+
* hard-429 path uses so the usageLimitStateKey stays stable across repeated
|
|
135
|
+
* ticks within a bucket (no persist/timer churn on the daemon side).
|
|
136
|
+
*/
|
|
137
|
+
export function structuredRateLimitState(text = '', now = new Date()) {
|
|
138
|
+
const parsed = parseMeridiemTime(text, now);
|
|
139
|
+
const { retryAtMs, retryLabel } = parsed ?? hardRateLimitFallbackTime(now);
|
|
140
|
+
return {
|
|
141
|
+
limited: true,
|
|
142
|
+
kind: 'rate',
|
|
143
|
+
retryAtMs,
|
|
144
|
+
retryLabel,
|
|
145
|
+
retryReady: now.getTime() >= retryAtMs,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
76
148
|
//# sourceMappingURL=cli-usage-limit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"AAgBA,MAAM,oBAAoB,GAAG;IAC3B,uCAAuC;IACvC,oDAAoD;IACpD,2CAA2C;IAC3C,gEAAgE;CACjE,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC1B,yCAAyC;IACzC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,8 @@ export declare function shouldWriteNow(state: {
|
|
|
27
27
|
supportsTypeAhead: boolean;
|
|
28
28
|
/** True until the CLI has reached its first ready state (boot / re-attach window). */
|
|
29
29
|
awaitingFirstPrompt: boolean;
|
|
30
|
+
/** A stale Codex App runner must not receive normal or type-ahead input. */
|
|
31
|
+
holdForRunnerReload?: boolean;
|
|
30
32
|
}): boolean;
|
|
31
33
|
/**
|
|
32
34
|
* Claude runs every matching SessionStart hook in parallel and waits for all of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,OAAO,CAKV;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2CAA2C,CAAC,KAAK,EAAE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAMV;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,sEAAsE;IACtE,iCAAiC,EAAE,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAIV;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,sBAAsB,EAAE,OAAO,CAAC;IAChC,+BAA+B,EAAE,OAAO,CAAC;IACzC,0BAA0B,EAAE,OAAO,CAAC;CACrC,GAAG,OAAO,CAEV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,CAE1F"}
|
package/dist/utils/input-gate.js
CHANGED
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
* QUEUE even type-ahead messages and let `markPromptReady()`'s flush deliver them.
|
|
20
20
|
*/
|
|
21
21
|
export function shouldWriteNow(state) {
|
|
22
|
+
if (state.holdForRunnerReload)
|
|
23
|
+
return false;
|
|
22
24
|
if (state.isPromptReady || state.isFlushing)
|
|
23
25
|
return true;
|
|
24
26
|
// Type-ahead is only safe after the TUI has booted at least once.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,KAW9B;IACC,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACzD,kEAAkE;IAClE,OAAO,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2CAA2C,CAAC,KAM3D;IACC,OAAO,KAAK,CAAC,cAAc;WACtB,KAAK,CAAC,eAAe;WACrB,KAAK,CAAC,mBAAmB;WACzB,CAAC,KAAK,CAAC,aAAa;WACpB,CAAC,KAAK,CAAC,cAAc,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAS/C;IACC,IAAI,CAAC,KAAK,CAAC,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,OAAO,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,CAAC,0BAA0B,CAAC;AACnH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,iBAA0B;IAChE,OAAO,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface RuntimeBuildEntry {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string | Buffer;
|
|
4
|
+
}
|
|
5
|
+
export type RuntimeBuildIdentity = {
|
|
6
|
+
status: 'known';
|
|
7
|
+
id: string;
|
|
8
|
+
source: 'artifact' | 'source';
|
|
9
|
+
} | {
|
|
10
|
+
status: 'unknown';
|
|
11
|
+
reason: 'artifact_invalid' | 'source_unavailable' | 'read_failed';
|
|
12
|
+
};
|
|
13
|
+
export declare function computeRuntimeBuildId(entries: readonly RuntimeBuildEntry[]): string;
|
|
14
|
+
export declare function isRuntimeBuildId(value: unknown): value is string;
|
|
15
|
+
export declare function collectCompiledRuntimeEntries(sourceRoot: string, distRoot: string): RuntimeBuildEntry[];
|
|
16
|
+
export declare function resolveRuntimeBuildIdentity(options: {
|
|
17
|
+
artifactPath: string;
|
|
18
|
+
sourceRoot?: string;
|
|
19
|
+
}): RuntimeBuildIdentity;
|
|
20
|
+
export declare function runtimeBuildIdentity(): RuntimeBuildIdentity;
|
|
21
|
+
//# sourceMappingURL=runtime-build-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-build-id.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-build-id.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,aAAa,CAAA;CAAE,CAAC;AAK7F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAUnF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAwBD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,iBAAiB,EAAE,CAKrB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,oBAAoB,CAsBvB;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,CAQ3D"}
|