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
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
* Extracted from daemon.ts for modularity.
|
|
4
4
|
*/
|
|
5
5
|
import { type ChildProcess } from 'node:child_process';
|
|
6
|
+
import { type RestartObserver } from './restart-coordinator.js';
|
|
6
7
|
export declare function getDaemonBootId(): string;
|
|
7
8
|
import type { CliId } from '../adapters/cli/types.js';
|
|
8
9
|
import type { CliTurnPayload, WorkerToDaemon, Session } from '../types.js';
|
|
9
10
|
import { type DaemonSession } from './types.js';
|
|
10
11
|
import { type CliUsageLimitState } from '../utils/cli-usage-limit.js';
|
|
12
|
+
import { type VcMeetingListenerTopicKey } from '../services/vc-meeting-listener-topic-store.js';
|
|
11
13
|
type WorkerStartupState = {
|
|
12
14
|
ready: boolean;
|
|
13
15
|
failureNotified: boolean;
|
|
@@ -30,6 +32,10 @@ export interface WorkerSessionReplyOptions {
|
|
|
30
32
|
* share a visible chat anchor with ordinary sessions, so the anchor alone
|
|
31
33
|
* cannot identify the transcript/lifecycle owner. */
|
|
32
34
|
sourceSessionId?: string;
|
|
35
|
+
/** Automatic VC delivery presentation. Explicit human IM replies omit this
|
|
36
|
+
* and continue to follow their quote/thread context. */
|
|
37
|
+
placement?: 'auto' | 'chat' | 'topic';
|
|
38
|
+
meetingTopicKey?: VcMeetingListenerTopicKey;
|
|
33
39
|
}
|
|
34
40
|
export interface WorkerPoolCallbacks {
|
|
35
41
|
sessionReply: (rootId: string, content: string, msgType?: string, larkAppId?: string, turnId?: string, opts?: WorkerSessionReplyOptions) => Promise<string>;
|
|
@@ -326,6 +332,19 @@ export declare function sweepGlobalBotmuxSkills(): void;
|
|
|
326
332
|
* clobbers other keys; any failure is swallowed so it can't block spawn. */
|
|
327
333
|
export declare function ensureClaudeFolderTrust(workingDir: string, stateJsonPath?: string): void;
|
|
328
334
|
export declare function killWorker(ds: DaemonSession): void;
|
|
335
|
+
/**
|
|
336
|
+
* Whether a worker-less restart must first destroy the session's persistent
|
|
337
|
+
* backing pane. Adopt sessions are excluded — botmux never owned the user's
|
|
338
|
+
* pane, so killing it would violate the bridge invariant. Pure so the
|
|
339
|
+
* adopt-skip decision is unit-testable without spawning a worker.
|
|
340
|
+
*/
|
|
341
|
+
export declare function shouldDestroyPaneBeforeRestart(ds: Pick<DaemonSession, 'initConfig' | 'adoptedFrom'>): boolean;
|
|
342
|
+
/** Join or start one correlated physical restart for a session. */
|
|
343
|
+
export declare function requestSessionRestart(ds: DaemonSession, observer: RestartObserver): {
|
|
344
|
+
attemptId: string;
|
|
345
|
+
joined: boolean;
|
|
346
|
+
};
|
|
347
|
+
export declare function __testOnly_resetRestartCoordinator(): void;
|
|
329
348
|
export declare function suspendWorker(ds: DaemonSession, reason?: string): boolean;
|
|
330
349
|
/**
|
|
331
350
|
* Idempotent close: kill worker if alive, mark Session status='closed' + closedAt,
|
|
@@ -440,6 +459,7 @@ export declare function forkWorker(ds: DaemonSession, promptInput: string | CliT
|
|
|
440
459
|
resume?: boolean;
|
|
441
460
|
turnId?: string;
|
|
442
461
|
dispatchAttempt?: number;
|
|
462
|
+
restartAttemptId?: string;
|
|
443
463
|
}): void;
|
|
444
464
|
/**
|
|
445
465
|
* Clear the stuck-warning authority markers WITHOUT patching the card. Used by
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/core/worker-pool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAkB,KAAK,YAAY,EAAoB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/core/worker-pool.ts"],"names":[],"mappings":"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"}
|
package/dist/core/worker-pool.js
CHANGED
|
@@ -16,6 +16,7 @@ import { hookCommandFor } from '../adapters/hook-command.js';
|
|
|
16
16
|
import { randomBytes, randomUUID } from 'node:crypto';
|
|
17
17
|
import { config } from '../config.js';
|
|
18
18
|
import * as sessionStore from '../services/session-store.js';
|
|
19
|
+
import * as asyncTriggerStore from '../services/async-trigger-store.js';
|
|
19
20
|
import { persistStreamCardState, rememberLastCliInput } from './session-manager.js';
|
|
20
21
|
import { fallbackTurnId, isSubstituteTurn } from './reply-target.js';
|
|
21
22
|
import { updateMessage, deleteMessage, sendEphemeralCard, sendUserMessage, addReaction, removeReaction, getMessageChatId, MessageWithdrawnError } from '../im/lark/client.js';
|
|
@@ -35,12 +36,15 @@ import { listDocSubscriptionsForSession, removeDocSubscription } from '../servic
|
|
|
35
36
|
import { TmuxBackend } from '../adapters/backend/tmux-backend.js';
|
|
36
37
|
import { HerdrBackend } from '../adapters/backend/herdr-backend.js';
|
|
37
38
|
import { sandboxEnabled } from '../adapters/backend/sandbox.js';
|
|
38
|
-
import { isSuspendableBackendType, getSessionPersistentBackendType, persistentBackendTargetForSession, killPersistentBackendTarget, managedTargetsForCliChange, resolvePairedSpawnBackendType, resolvePersistentBackendTarget } from './persistent-backend.js';
|
|
39
|
+
import { isSuspendableBackendType, getSessionPersistentBackendType, persistentBackendTargetForSession, killPersistentBackendTarget, probePersistentBackendTarget, managedTargetsForCliChange, resolvePairedSpawnBackendType, resolvePersistentBackendTarget } from './persistent-backend.js';
|
|
39
40
|
import { getBot, getAllBots, resolveBrandLabel } from '../bot-registry.js';
|
|
41
|
+
import { RestartCoordinator } from './restart-coordinator.js';
|
|
42
|
+
import { runtimeBuildIdentity } from '../utils/runtime-build-id.js';
|
|
40
43
|
/** A random id minted once per daemon process (this lifetime). Stamped onto
|
|
41
44
|
* isolated persistent panes so a suspend→resume reattach (same id) is
|
|
42
45
|
* distinguishable from a pane surviving a daemon restart (different id). */
|
|
43
46
|
const DAEMON_BOOT_ID = randomUUID();
|
|
47
|
+
const restartCoordinator = new RestartCoordinator();
|
|
44
48
|
export function getDaemonBootId() {
|
|
45
49
|
return DAEMON_BOOT_ID;
|
|
46
50
|
}
|
|
@@ -76,8 +80,11 @@ import { evaluateVcMeetingManagedSend, resolveVcMeetingImTurnOrigin, } from '../
|
|
|
76
80
|
import { finishVcMeetingImReply, prepareVcMeetingDeliveryReply, prepareVcMeetingImReply, } from '../services/vc-meeting-im-reply.js';
|
|
77
81
|
import { neutralizeLarkAtTags } from '../services/send-policy.js';
|
|
78
82
|
import { recordVcMeetingListenerMessage } from '../services/vc-meeting-listener-message-store.js';
|
|
83
|
+
import { getVcMeetingListenerTopicRoot, recordVcMeetingListenerTopicRoot, } from '../services/vc-meeting-listener-topic-store.js';
|
|
84
|
+
import { parseVcMeetingListenerOutput } from '../services/vc-meeting-listener-output-protocol.js';
|
|
79
85
|
import { isLocalCliOpenEnabled, isLocalCliOpenReady } from '../services/local-cli-opener.js';
|
|
80
86
|
import { isSilentScheduledTurn } from './silent-schedule-turns.js';
|
|
87
|
+
import { isTriggerFinalSuppressed } from './trigger-final-suppression.js';
|
|
81
88
|
import { writeDeferredTopicBinding } from './deferred-topic-binding.js';
|
|
82
89
|
import { deferWorkerSpawnDuringDeviceIsolation } from './device-isolation-activation.js';
|
|
83
90
|
import { buildBotmuxLarkNativeSessionTitle, extractBotmuxLarkNativeSessionTitlePrompt, } from './session-title.js';
|
|
@@ -94,6 +101,12 @@ function workerForkEnv(base) {
|
|
|
94
101
|
delete env[key];
|
|
95
102
|
return env;
|
|
96
103
|
}
|
|
104
|
+
/** Fresh workers always start with hidden output, so restore the daemon-owned mode. */
|
|
105
|
+
function syncWorkerDisplayMode(ds) {
|
|
106
|
+
if (!ds.worker || !ds.displayMode || ds.displayMode === 'hidden')
|
|
107
|
+
return;
|
|
108
|
+
ds.worker.send({ type: 'set_display_mode', mode: ds.displayMode });
|
|
109
|
+
}
|
|
97
110
|
let callbacks;
|
|
98
111
|
/**
|
|
99
112
|
* Initialise worker-pool callbacks. Must be called once before forkWorker().
|
|
@@ -1089,6 +1102,7 @@ export function ensureClaudeFolderTrust(workingDir, stateJsonPath = join(homedir
|
|
|
1089
1102
|
}
|
|
1090
1103
|
// ─── Kill worker ────────────────────────────────────────────────────────────
|
|
1091
1104
|
export function killWorker(ds) {
|
|
1105
|
+
restartCoordinator.cancelSession(ds.session.sessionId);
|
|
1092
1106
|
clearUsageLimitState(ds);
|
|
1093
1107
|
ds.localProcessAttestation = undefined;
|
|
1094
1108
|
// A managed-turn capability belongs to one concrete worker generation.
|
|
@@ -1126,6 +1140,111 @@ export function killWorker(ds) {
|
|
|
1126
1140
|
ds.workerToken = null;
|
|
1127
1141
|
ds.workerViewToken = null;
|
|
1128
1142
|
}
|
|
1143
|
+
/**
|
|
1144
|
+
* Whether a worker-less restart must first destroy the session's persistent
|
|
1145
|
+
* backing pane. Adopt sessions are excluded — botmux never owned the user's
|
|
1146
|
+
* pane, so killing it would violate the bridge invariant. Pure so the
|
|
1147
|
+
* adopt-skip decision is unit-testable without spawning a worker.
|
|
1148
|
+
*/
|
|
1149
|
+
export function shouldDestroyPaneBeforeRestart(ds) {
|
|
1150
|
+
return !ds.initConfig?.adoptMode && !ds.adoptedFrom;
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* Destroy a still-alive persistent backing pane (tmux/herdr/zellij) before a
|
|
1154
|
+
* worker-less restart forks a fresh worker. Without this, a session that lost
|
|
1155
|
+
* its worker but kept its pane (the normal post-daemon-restart state) would let
|
|
1156
|
+
* spawnCli REATTACH the surviving CLI instead of relaunching it — the CLI is
|
|
1157
|
+
* never actually restarted, yet prompt-ready still fires `restart_result:
|
|
1158
|
+
* succeeded`, so the user sees "restarted" while a wedged CLI stays wedged.
|
|
1159
|
+
* Killing the pane first forces a genuine physical fresh spawn, making the
|
|
1160
|
+
* success receipt truthful.
|
|
1161
|
+
*
|
|
1162
|
+
* Fail-safe (codex 复审观察): the kill primitives swallow their own failures
|
|
1163
|
+
* (TmuxBackend.killSession `catch {}`, Herdr `runHerdr` returns false), so a
|
|
1164
|
+
* plain try/catch here can NEVER observe a failed kill — a wedged tmux server
|
|
1165
|
+
* could leave the pane alive and the fork would silently reattach. So we PROBE
|
|
1166
|
+
* after killing and retry once if the pane survives, escalating to a loud warn
|
|
1167
|
+
* when it still exists. A surviving pane still forks (refusing would strand the
|
|
1168
|
+
* session with no restart at all, strictly worse than the original bug), but
|
|
1169
|
+
* the warn makes the rare failure diagnosable instead of a silent false
|
|
1170
|
+
* success. A fully reattach-proof path (forceFresh signal into spawnCli) is a
|
|
1171
|
+
* larger, separate change — tracked as a follow-up, not blocking this fix.
|
|
1172
|
+
*
|
|
1173
|
+
* Scope: persistent panes only (getSessionPersistentBackendType excludes riff,
|
|
1174
|
+
* which never reattaches — it always builds a fresh RiffBackend — and whose
|
|
1175
|
+
* remote task must survive a restart to preserve follow-up lineage). Adopt
|
|
1176
|
+
* sessions are skipped: botmux never owned the user's pane.
|
|
1177
|
+
*/
|
|
1178
|
+
function destroyLivePaneBeforeRestart(ds) {
|
|
1179
|
+
if (!shouldDestroyPaneBeforeRestart(ds))
|
|
1180
|
+
return;
|
|
1181
|
+
const target = persistentBackendTargetForSession(ds);
|
|
1182
|
+
if (!target)
|
|
1183
|
+
return;
|
|
1184
|
+
const killOnce = () => {
|
|
1185
|
+
try {
|
|
1186
|
+
killPersistentBackendTarget(target);
|
|
1187
|
+
}
|
|
1188
|
+
catch (err) {
|
|
1189
|
+
// The primitives normally swallow their own errors; this only catches a
|
|
1190
|
+
// truly unexpected throw (e.g. target resolution). Non-fatal — the probe
|
|
1191
|
+
// below is the real signal.
|
|
1192
|
+
logger.warn(`[${tag(ds)}] restart: kill of ${target.backendType} pane threw: ${err}`);
|
|
1193
|
+
}
|
|
1194
|
+
};
|
|
1195
|
+
killOnce();
|
|
1196
|
+
// Advance a single probe result monotonically through the real retry path so
|
|
1197
|
+
// an 'unknown' first probe is never mislabelled as a post-retry survivor:
|
|
1198
|
+
// - 'missing' → gone, fork is genuinely fresh.
|
|
1199
|
+
// - 'unknown' → probe indeterminate (e.g. tmux server hiccup); do NOT retry
|
|
1200
|
+
// and do NOT block the restart — pre-fix always forked, stranding is worse.
|
|
1201
|
+
// - 'exists' → confirmed alive: warn, kill once more, re-probe. Only this
|
|
1202
|
+
// branch performs (and can report) a retry.
|
|
1203
|
+
let probe = probePersistentBackendTarget(target);
|
|
1204
|
+
if (probe === 'exists') {
|
|
1205
|
+
logger.warn(`[${tag(ds)}] restart: ${target.backendType} pane survived first kill — retrying before refork`);
|
|
1206
|
+
killOnce();
|
|
1207
|
+
probe = probePersistentBackendTarget(target);
|
|
1208
|
+
}
|
|
1209
|
+
if (probe === 'exists') {
|
|
1210
|
+
// The kill genuinely failed (twice). Forking will likely reattach the live
|
|
1211
|
+
// pane (the very bug this guards), so the eventual `restart_result:
|
|
1212
|
+
// succeeded` may again be untruthful — but leave a loud, greppable trail.
|
|
1213
|
+
logger.error(`[${tag(ds)}] restart: ${target.backendType} pane STILL alive after retry — `
|
|
1214
|
+
+ 'the refork may reattach instead of relaunching (restart success may be untruthful)');
|
|
1215
|
+
}
|
|
1216
|
+
else if (probe === 'unknown') {
|
|
1217
|
+
// Do NOT over-promise a relaunch: an indeterminate probe could still be a
|
|
1218
|
+
// live pane the fork reattaches. Fork proceeds (stranding is worse) but the
|
|
1219
|
+
// diagnostic must not claim a fresh relaunch it can't guarantee.
|
|
1220
|
+
logger.warn(`[${tag(ds)}] restart: ${target.backendType} kill outcome indeterminate — `
|
|
1221
|
+
+ 'refork may reattach instead of relaunching');
|
|
1222
|
+
}
|
|
1223
|
+
else {
|
|
1224
|
+
logger.info(`[${tag(ds)}] restart: ${target.backendType} pane missing after kill — CLI will physically relaunch`);
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
/** Join or start one correlated physical restart for a session. */
|
|
1228
|
+
export function requestSessionRestart(ds, observer) {
|
|
1229
|
+
return restartCoordinator.request(ds.session.sessionId, observer, attemptId => {
|
|
1230
|
+
if (ds.worker && !ds.worker.killed) {
|
|
1231
|
+
ds.worker.send({ type: 'restart', attemptId });
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1234
|
+
// No live worker but the persistent pane may still be alive (e.g. after a
|
|
1235
|
+
// daemon restart). Tear it down first so forkWorker → spawnCli spawns a
|
|
1236
|
+
// fresh CLI instead of reattaching the old one and falsely reporting a
|
|
1237
|
+
// successful restart.
|
|
1238
|
+
destroyLivePaneBeforeRestart(ds);
|
|
1239
|
+
forkWorker(ds, '', {
|
|
1240
|
+
resume: ds.hasHistory,
|
|
1241
|
+
restartAttemptId: attemptId,
|
|
1242
|
+
});
|
|
1243
|
+
});
|
|
1244
|
+
}
|
|
1245
|
+
export function __testOnly_resetRestartCoordinator() {
|
|
1246
|
+
restartCoordinator.reset();
|
|
1247
|
+
}
|
|
1129
1248
|
/**
|
|
1130
1249
|
* Tear down a persistent backing session (tmux/herdr/zellij) directly from the
|
|
1131
1250
|
* daemon when there is no live worker to do it via the 'close' IPC. The session
|
|
@@ -1299,26 +1418,21 @@ export async function closeSession(sessionId) {
|
|
|
1299
1418
|
// crash/limited turn may never have reached an idle edge).
|
|
1300
1419
|
recordUsageForDaemonSession(ds);
|
|
1301
1420
|
killWorker(ds);
|
|
1302
|
-
//
|
|
1303
|
-
//
|
|
1304
|
-
// /
|
|
1305
|
-
|
|
1306
|
-
const anchor = sessionAnchorId(ds);
|
|
1307
|
-
const subs = listDocSubscriptionsForSession(config.session.dataDir, ds.larkAppId, anchor);
|
|
1308
|
-
for (const sub of subs) {
|
|
1309
|
-
if (sub.managedBy !== 'watch-comment') {
|
|
1310
|
-
await unsubscribeDocFile(ds.larkAppId, { fileToken: sub.fileToken, fileType: sub.fileType });
|
|
1311
|
-
}
|
|
1312
|
-
removeDocSubscription(config.session.dataDir, ds.larkAppId, sub.fileToken);
|
|
1313
|
-
}
|
|
1314
|
-
if (subs.length)
|
|
1315
|
-
logger.info(`[doc-comment] session ${sessionId.slice(0, 8)} closed → removed ${subs.length} doc binding(s)`);
|
|
1316
|
-
}
|
|
1317
|
-
catch (err) {
|
|
1318
|
-
logger.warn(`[doc-comment] cleanup on close failed for ${sessionId.slice(0, 8)}: ${err?.message ?? err}`);
|
|
1319
|
-
}
|
|
1421
|
+
// Commit the daemon-visible close barrier before any network await below.
|
|
1422
|
+
// `botmux delete` may be running inside the session being destroyed; once
|
|
1423
|
+
// its worker/backing pane exits, a new IM message must not find this stale
|
|
1424
|
+
// entry and resurrect the old logical session while doc cleanup is pending.
|
|
1320
1425
|
activeSessionsRegistry?.delete(activeSessionKey(ds));
|
|
1321
1426
|
killedLive = true;
|
|
1427
|
+
}
|
|
1428
|
+
// Persistence is part of the same no-await barrier as Map eviction. If the
|
|
1429
|
+
// daemon crashes during best-effort doc cleanup, restart recovery must not
|
|
1430
|
+
// restore a session that was already explicitly closed.
|
|
1431
|
+
const stored = sessionStore.getSession(sessionId);
|
|
1432
|
+
const wasOpen = !!stored && stored.status !== 'closed';
|
|
1433
|
+
if (wasOpen)
|
|
1434
|
+
sessionStore.closeSession(sessionId);
|
|
1435
|
+
if (ds) {
|
|
1322
1436
|
if (!ds.exitEventEmitted) {
|
|
1323
1437
|
ds.exitEventEmitted = true;
|
|
1324
1438
|
dashboardEventBus.publish({
|
|
@@ -1328,11 +1442,10 @@ export async function closeSession(sessionId) {
|
|
|
1328
1442
|
emitSessionLifecycleHook(ds, 'session.exit', { reason: 'dashboard_close' });
|
|
1329
1443
|
}
|
|
1330
1444
|
}
|
|
1331
|
-
//
|
|
1332
|
-
|
|
1333
|
-
|
|
1445
|
+
// Preserve the existing externally-visible event order: exit first, then
|
|
1446
|
+
// the final persisted-row update. Persistence itself was already committed
|
|
1447
|
+
// above as part of the close barrier.
|
|
1334
1448
|
if (wasOpen) {
|
|
1335
|
-
sessionStore.closeSession(sessionId);
|
|
1336
1449
|
const after = sessionStore.getSession(sessionId);
|
|
1337
1450
|
dashboardEventBus.publish({
|
|
1338
1451
|
type: 'session.update',
|
|
@@ -1346,6 +1459,27 @@ export async function closeSession(sessionId) {
|
|
|
1346
1459
|
},
|
|
1347
1460
|
});
|
|
1348
1461
|
}
|
|
1462
|
+
if (ds) {
|
|
1463
|
+
// 文档入口清理:会话关闭即删除其绑定。只有旧
|
|
1464
|
+
// /subscribe-lark-doc 记录需要调飞书逐文件退订 API;
|
|
1465
|
+
// /watch-comment 仅依赖应用级评论事件,删本地监听表即可。此段允许 await,
|
|
1466
|
+
// 因为上面的内存 + 持久化关闭屏障已经提交。
|
|
1467
|
+
try {
|
|
1468
|
+
const anchor = sessionAnchorId(ds);
|
|
1469
|
+
const subs = listDocSubscriptionsForSession(config.session.dataDir, ds.larkAppId, anchor);
|
|
1470
|
+
for (const sub of subs) {
|
|
1471
|
+
if (sub.managedBy !== 'watch-comment') {
|
|
1472
|
+
await unsubscribeDocFile(ds.larkAppId, { fileToken: sub.fileToken, fileType: sub.fileType });
|
|
1473
|
+
}
|
|
1474
|
+
removeDocSubscription(config.session.dataDir, ds.larkAppId, sub.fileToken);
|
|
1475
|
+
}
|
|
1476
|
+
if (subs.length)
|
|
1477
|
+
logger.info(`[doc-comment] session ${sessionId.slice(0, 8)} closed → removed ${subs.length} doc binding(s)`);
|
|
1478
|
+
}
|
|
1479
|
+
catch (err) {
|
|
1480
|
+
logger.warn(`[doc-comment] cleanup on close failed for ${sessionId.slice(0, 8)}: ${err?.message ?? err}`);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1349
1483
|
// alreadyClosed = nothing happened on either path.
|
|
1350
1484
|
const alreadyClosed = !killedLive && !wasOpen;
|
|
1351
1485
|
return { ok: true, alreadyClosed };
|
|
@@ -1707,6 +1841,7 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1707
1841
|
let resume = false;
|
|
1708
1842
|
let initTurnId;
|
|
1709
1843
|
let initDispatchAttempt;
|
|
1844
|
+
let restartAttemptId;
|
|
1710
1845
|
if (typeof resumeOrTurnId === 'string') {
|
|
1711
1846
|
initTurnId = resumeOrTurnId;
|
|
1712
1847
|
}
|
|
@@ -1714,6 +1849,7 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1714
1849
|
resume = resumeOrTurnId.resume === true;
|
|
1715
1850
|
initTurnId = resumeOrTurnId.turnId;
|
|
1716
1851
|
initDispatchAttempt = resumeOrTurnId.dispatchAttempt;
|
|
1852
|
+
restartAttemptId = resumeOrTurnId.restartAttemptId;
|
|
1717
1853
|
}
|
|
1718
1854
|
else {
|
|
1719
1855
|
resume = resumeOrTurnId;
|
|
@@ -1927,6 +2063,7 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1927
2063
|
});
|
|
1928
2064
|
// Send init config — use per-bot settings
|
|
1929
2065
|
const promptCodexAppInput = codexAppInputForSession(ds, promptPayload.codexAppInput, initAttributionTurnId);
|
|
2066
|
+
const runtimeIdentity = runtimeBuildIdentity();
|
|
1930
2067
|
const initMsg = {
|
|
1931
2068
|
type: 'init',
|
|
1932
2069
|
sessionId: ds.session.sessionId,
|
|
@@ -1998,6 +2135,11 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1998
2135
|
vcMeetingImTurnOrigin: resolveVcMeetingImTurnOrigin(ds.session, initAttributionTurnId),
|
|
1999
2136
|
pluginBindings: botCfg.plugins,
|
|
2000
2137
|
skillPolicy: botCfg.skills,
|
|
2138
|
+
...(runtimeIdentity.status === 'known'
|
|
2139
|
+
? { runnerBuildId: runtimeIdentity.id }
|
|
2140
|
+
: {}),
|
|
2141
|
+
...(ds.session.runnerBuildId ? { persistedRunnerBuildId: ds.session.runnerBuildId } : {}),
|
|
2142
|
+
...(restartAttemptId ? { restartAttemptId } : {}),
|
|
2001
2143
|
};
|
|
2002
2144
|
worker.send(initMsg);
|
|
2003
2145
|
ds.initConfig = initMsg;
|
|
@@ -2139,6 +2281,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2139
2281
|
const managedFinalOutputSuppressed = (turnId, dispatchAttempt) => {
|
|
2140
2282
|
if (isSilentScheduledTurn(ds, turnId))
|
|
2141
2283
|
return true;
|
|
2284
|
+
if (isTriggerFinalSuppressed(ds, turnId))
|
|
2285
|
+
return true;
|
|
2142
2286
|
if (!ds.session.vcMeetingReceiver) {
|
|
2143
2287
|
return ordinaryManagedSuppression(turnId, dispatchAttempt);
|
|
2144
2288
|
}
|
|
@@ -2309,6 +2453,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2309
2453
|
// (if any) is left untouched. The next real user turn clears this flag
|
|
2310
2454
|
// (rememberLastCliInput) and the normal card flow resumes.
|
|
2311
2455
|
if (ds.suppressRecoveryCard) {
|
|
2456
|
+
syncWorkerDisplayMode(ds);
|
|
2312
2457
|
logger.info(`[${t}] Restored session — suppressing recovery streaming card (silent restart)`);
|
|
2313
2458
|
break;
|
|
2314
2459
|
}
|
|
@@ -2343,9 +2488,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2343
2488
|
}
|
|
2344
2489
|
persistStreamCardState(ds);
|
|
2345
2490
|
// Re-sync worker's display mode (it starts fresh in 'hidden')
|
|
2346
|
-
|
|
2347
|
-
ds.worker.send({ type: 'set_display_mode', mode: ds.displayMode });
|
|
2348
|
-
}
|
|
2491
|
+
syncWorkerDisplayMode(ds);
|
|
2349
2492
|
// The restored card is now the active one — withdraw any cards
|
|
2350
2493
|
// frozen before the daemon went down so they don't pile up in the
|
|
2351
2494
|
// thread on each restart.
|
|
@@ -2395,9 +2538,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2395
2538
|
ds.streamCardPending = false;
|
|
2396
2539
|
persistStreamCardState(ds);
|
|
2397
2540
|
// Re-sync worker's display mode (it starts fresh in 'hidden')
|
|
2398
|
-
|
|
2399
|
-
ds.worker.send({ type: 'set_display_mode', mode: ds.displayMode });
|
|
2400
|
-
}
|
|
2541
|
+
syncWorkerDisplayMode(ds);
|
|
2401
2542
|
// New card is live — recall any cards frozen by previous turns.
|
|
2402
2543
|
// Done after `streamCardId` is committed so we never delete the old
|
|
2403
2544
|
// card without a successor visible to the user.
|
|
@@ -2494,6 +2635,28 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2494
2635
|
invalidateStuckWarning(ds, 'prompt_ready');
|
|
2495
2636
|
break;
|
|
2496
2637
|
}
|
|
2638
|
+
case 'runner_build_ready': {
|
|
2639
|
+
const identity = runtimeBuildIdentity();
|
|
2640
|
+
if (ds.worker === worker
|
|
2641
|
+
&& effectiveCliId === 'codex-app'
|
|
2642
|
+
&& identity.status === 'known'
|
|
2643
|
+
&& msg.runnerBuildId === identity.id) {
|
|
2644
|
+
ds.session.runnerBuildId = msg.runnerBuildId;
|
|
2645
|
+
sessionStore.updateSession(ds.session);
|
|
2646
|
+
}
|
|
2647
|
+
else {
|
|
2648
|
+
logger.warn(`[${t}] Ignored invalid or stale runner_build_ready`);
|
|
2649
|
+
}
|
|
2650
|
+
break;
|
|
2651
|
+
}
|
|
2652
|
+
case 'restart_result': {
|
|
2653
|
+
if (ds.worker !== worker) {
|
|
2654
|
+
logger.warn(`[${t}] Ignored restart_result from stale worker generation`);
|
|
2655
|
+
break;
|
|
2656
|
+
}
|
|
2657
|
+
restartCoordinator.resolve(ds.session.sessionId, msg.attemptId, msg.status);
|
|
2658
|
+
break;
|
|
2659
|
+
}
|
|
2497
2660
|
case 'cli_session_id': {
|
|
2498
2661
|
const wasLocalCliOpenReady = isLocalCliOpenReady(ds, { cliId: effectiveCliId });
|
|
2499
2662
|
ds.session.cliSessionId = msg.cliSessionId;
|
|
@@ -3113,6 +3276,25 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
3113
3276
|
}
|
|
3114
3277
|
break;
|
|
3115
3278
|
}
|
|
3279
|
+
case 'steer_accepted': {
|
|
3280
|
+
if (ds.worker !== worker) {
|
|
3281
|
+
logger.warn(`[${t}] Ignored steer_accepted from stale worker generation`);
|
|
3282
|
+
break;
|
|
3283
|
+
}
|
|
3284
|
+
logger.info(`[${t}] Codex App steer accepted `
|
|
3285
|
+
+ `appTurn=${msg.appTurnId.slice(0, 12)} replyTurn=${msg.turnId.slice(0, 12)}`);
|
|
3286
|
+
if (managedAuxUiSuppressed(msg.turnId, undefined))
|
|
3287
|
+
break;
|
|
3288
|
+
try {
|
|
3289
|
+
await scopedReply(tr('worker.steer_accepted', undefined, loc), 'text', msg.turnId);
|
|
3290
|
+
}
|
|
3291
|
+
catch {
|
|
3292
|
+
logger.error(`[${t}] Failed to deliver steer acknowledgement `
|
|
3293
|
+
+ `appTurn=${msg.appTurnId.slice(0, 12)} replyTurn=${msg.turnId.slice(0, 12)} `
|
|
3294
|
+
+ 'category=delivery');
|
|
3295
|
+
}
|
|
3296
|
+
break;
|
|
3297
|
+
}
|
|
3116
3298
|
case 'turn_terminal': {
|
|
3117
3299
|
if (ds.worker !== worker) {
|
|
3118
3300
|
logger.warn(`[${t}] Ignored turn_terminal from stale worker generation`);
|
|
@@ -3243,6 +3425,17 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
3243
3425
|
// Worker pops the turn off its queue right after emit, so it will
|
|
3244
3426
|
// NOT re-send this payload on its own. Daemon owns retry on
|
|
3245
3427
|
// transient Lark failures.
|
|
3428
|
+
// A real harvested answer is a definitive self-heal signal: if the
|
|
3429
|
+
// session was parked in `limited` by a structured rate-limit emit
|
|
3430
|
+
// (Claude adopt/bridge sessions where the user recovers in their own
|
|
3431
|
+
// terminal — no Lark turn, retry button, or kill to clear it), the
|
|
3432
|
+
// model is plainly working again. Clear the stale limit so the card /
|
|
3433
|
+
// Dashboard「需要你」 don't stay pinned with a dead retry countdown.
|
|
3434
|
+
if (ds.usageLimit) {
|
|
3435
|
+
clearUsageLimitState(ds);
|
|
3436
|
+
if (ds.lastScreenStatus === 'limited')
|
|
3437
|
+
ds.lastScreenStatus = 'idle';
|
|
3438
|
+
}
|
|
3246
3439
|
deliverFinalOutput(ds, msg, t, 0);
|
|
3247
3440
|
break;
|
|
3248
3441
|
}
|
|
@@ -3299,6 +3492,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
3299
3492
|
// A stale takeover worker never clears the replacement — during takeover the
|
|
3300
3493
|
// old worker's exit fires AFTER the new worker has been assigned.
|
|
3301
3494
|
if (ds.worker === worker) {
|
|
3495
|
+
restartCoordinator.failSession(ds.session.sessionId);
|
|
3302
3496
|
ds.worker = null;
|
|
3303
3497
|
ds.workerPort = null;
|
|
3304
3498
|
ds.managedTurnOrigin = undefined;
|
|
@@ -3445,9 +3639,14 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
3445
3639
|
}
|
|
3446
3640
|
const asyncResult = managedReceiver ? undefined : ds.asyncTriggerResults?.get(msg.turnId);
|
|
3447
3641
|
if (asyncResult) {
|
|
3642
|
+
const completedAt = Date.now();
|
|
3448
3643
|
asyncResult.status = 'completed';
|
|
3449
3644
|
asyncResult.content = msg.content;
|
|
3450
|
-
asyncResult.completedAt =
|
|
3645
|
+
asyncResult.completedAt = completedAt;
|
|
3646
|
+
// Durably persist the outcome so trigger-result can rebuild `completed`
|
|
3647
|
+
// (with content) after a daemon restart drops the in-memory Map. Stamp the
|
|
3648
|
+
// owning bot for cross-bot isolation.
|
|
3649
|
+
asyncTriggerStore.recordCompleted(ds.session.sessionId, msg.turnId, msg.content, completedAt, ds.larkAppId);
|
|
3451
3650
|
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3452
3651
|
logger.info(`[${t}] Captured final_output for Async HTTP request (turn ${msg.turnId.substring(0, 8)})`);
|
|
3453
3652
|
return;
|
|
@@ -3545,12 +3744,48 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
3545
3744
|
&& managedDecision.kind === 'listener_thread'
|
|
3546
3745
|
? managedDecision.meetingOwner
|
|
3547
3746
|
: undefined;
|
|
3747
|
+
const listenerOutputPlacement = managedDecision?.ok
|
|
3748
|
+
&& managedDecision.kind === 'listener_thread'
|
|
3749
|
+
? managedDecision.outputPlacement
|
|
3750
|
+
: 'auto';
|
|
3751
|
+
const listenerOutputProtocol = managedDecision?.ok
|
|
3752
|
+
&& managedDecision.kind === 'listener_thread'
|
|
3753
|
+
? managedDecision.listenerOutputProtocol
|
|
3754
|
+
: 'plain';
|
|
3755
|
+
const meetingTopicKey = !imOrigin
|
|
3756
|
+
&& listenerOutputOwner
|
|
3757
|
+
&& listenerOutputPlacement === 'topic'
|
|
3758
|
+
? {
|
|
3759
|
+
...listenerOutputOwner,
|
|
3760
|
+
targetChatId: ds.chatId,
|
|
3761
|
+
}
|
|
3762
|
+
: undefined;
|
|
3763
|
+
let visibleAssistantText = msg.content;
|
|
3764
|
+
if (!imOrigin
|
|
3765
|
+
&& listenerOutputOwner
|
|
3766
|
+
&& msg.dispatchAttempt !== undefined
|
|
3767
|
+
&& listenerOutputProtocol === 'decision_v1') {
|
|
3768
|
+
const controlledOutput = parseVcMeetingListenerOutput(msg.content);
|
|
3769
|
+
if (!controlledOutput.ok) {
|
|
3770
|
+
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3771
|
+
logger.error(`[${t}] VC listener output suppressed: invalid control envelope `
|
|
3772
|
+
+ `(${controlledOutput.reason}) turn=${msg.turnId.substring(0, 8)}`);
|
|
3773
|
+
return;
|
|
3774
|
+
}
|
|
3775
|
+
if (controlledOutput.decision === 'skip') {
|
|
3776
|
+
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3777
|
+
logger.info(`[${t}] VC listener output skipped by agent decision `
|
|
3778
|
+
+ `(turn ${msg.turnId.substring(0, 8)})`);
|
|
3779
|
+
return;
|
|
3780
|
+
}
|
|
3781
|
+
visibleAssistantText = controlledOutput.content;
|
|
3782
|
+
}
|
|
3548
3783
|
// Meeting-derived text is untrusted card markdown. A model-authored
|
|
3549
3784
|
// native <at> tag and the ordinary owner footer would both create a
|
|
3550
3785
|
// second addressing side effect outside the action ledger.
|
|
3551
3786
|
const safeAssistantText = managedReceiver
|
|
3552
|
-
? neutralizeLarkAtTags(
|
|
3553
|
-
:
|
|
3787
|
+
? neutralizeLarkAtTags(visibleAssistantText)
|
|
3788
|
+
: visibleAssistantText;
|
|
3554
3789
|
const safeUserText = managedReceiver && msg.userText !== undefined
|
|
3555
3790
|
? neutralizeLarkAtTags(msg.userText)
|
|
3556
3791
|
: msg.userText;
|
|
@@ -3577,6 +3812,9 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
3577
3812
|
const proposedOutput = {
|
|
3578
3813
|
targetChatId: ds.chatId,
|
|
3579
3814
|
...(imOrigin ? { quoteTargetId: imOrigin.larkMessageId } : {}),
|
|
3815
|
+
...(!imOrigin && listenerOutputOwner
|
|
3816
|
+
? { placement: listenerOutputPlacement }
|
|
3817
|
+
: {}),
|
|
3580
3818
|
msgType: 'interactive',
|
|
3581
3819
|
content: cardJson,
|
|
3582
3820
|
};
|
|
@@ -3607,6 +3845,13 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
3607
3845
|
const recordPrimaryOutput = (messageId) => {
|
|
3608
3846
|
if (!listenerOutputOwner)
|
|
3609
3847
|
return;
|
|
3848
|
+
if (meetingTopicKey
|
|
3849
|
+
&& !getVcMeetingListenerTopicRoot(config.session.dataDir, meetingTopicKey)) {
|
|
3850
|
+
const topic = recordVcMeetingListenerTopicRoot(config.session.dataDir, meetingTopicKey, messageId);
|
|
3851
|
+
if (!topic.ok) {
|
|
3852
|
+
logger.error(`[${t}] VC listener topic anchor rejected message=${messageId} reason=${topic.reason}`);
|
|
3853
|
+
}
|
|
3854
|
+
}
|
|
3610
3855
|
try {
|
|
3611
3856
|
const recorded = recordVcMeetingListenerMessage(config.session.dataDir, {
|
|
3612
3857
|
...listenerOutputOwner,
|
|
@@ -3644,6 +3889,12 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
3644
3889
|
// provider call). Never fan meeting content out to user hooks,
|
|
3645
3890
|
// including the first attempt and crash reconciliation replay.
|
|
3646
3891
|
suppressHook: true,
|
|
3892
|
+
...(!imOrigin && listenerOutputOwner
|
|
3893
|
+
? {
|
|
3894
|
+
placement: canonicalOutput.placement ?? 'auto',
|
|
3895
|
+
...(meetingTopicKey ? { meetingTopicKey } : {}),
|
|
3896
|
+
}
|
|
3897
|
+
: {}),
|
|
3647
3898
|
}
|
|
3648
3899
|
: undefined);
|
|
3649
3900
|
recordPrimaryOutput(messageId);
|