botmux 3.5.0 → 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/backend/sandbox.d.ts +99 -279
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +424 -826
- package/dist/adapters/backend/sandbox.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +9 -5
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +244 -0
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -0
- package/dist/adapters/cli/fs-policy.js +537 -0
- package/dist/adapters/cli/fs-policy.js.map +1 -0
- 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/read-isolation.d.ts +14 -200
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +18 -477
- package/dist/adapters/cli/read-isolation.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 +54 -23
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +91 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +297 -104
- 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 +53 -73
- 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 +356 -84
- 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 +20 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
- package/dist/core/plugins/mcp/gateway-installer.js +14 -2
- package/dist/core/plugins/mcp/gateway-installer.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-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +90 -60
- package/dist/core/session-manager.js.map +1 -1
- 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 +44 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +333 -38
- 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 +526 -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 +8 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +10 -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 +16 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +288 -7
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +10 -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 +130 -22
- 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 +78 -67
- 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-QCPPKCX3.js → chunk-JMRGZQDB.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-EJDYUINZ.js → chunk-NP4JUBGS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-WXPMNEYV.js → chunk-P327LXOT.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-SNKATZWK.js +49 -0
- package/dist/dashboard-web/chunks/connectors-page-DOY4J3ZL.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-3P4TLUMF.js → groups-page-74TS2DIH.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-TDCZV56A.js → insights-page-AYCO65JC.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-QWCWL3SX.js → monitor-room-YKYLTSAN.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-IOWFSNVC.js → monitoring-page-QBIUNRBR.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-5AUPEHZP.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-WJVB52ET.js → roles-page-U4BTOQ7F.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-RVRWHP4V.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-7YT5TIX5.js → skills-page-SYOIGGXH.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-NJZKTU7A.js → team-federation-page-RMBLASTW.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-NQ73UA2Q.js → v3-page-XJXKKJRN.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-DSM3MDMN.js → whiteboards-page-K3YVSTHJ.js} +1 -1
- package/dist/dashboard-web/style.css +571 -3
- package/dist/dashboard.js +238 -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 +27 -1
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +6 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +6 -19
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +1 -14
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +1 -35
- package/dist/im/lark/card-builder.js.map +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 +161 -44
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +47 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +127 -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 +48 -3
- 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/sandbox-migration.d.ts +14 -0
- package/dist/services/sandbox-migration.d.ts.map +1 -0
- package/dist/services/sandbox-migration.js +85 -0
- package/dist/services/sandbox-migration.js.map +1 -0
- package/dist/services/sandbox-store.d.ts +28 -0
- package/dist/services/sandbox-store.d.ts.map +1 -1
- package/dist/services/sandbox-store.js +82 -0
- package/dist/services/sandbox-store.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 +53 -4
- 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 +4 -3
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +16 -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 +1010 -669
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +56 -0
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +9 -0
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +86 -0
- package/dist/workflows/events/schema.d.ts.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/shared/sandbox-policy.d.ts +10 -1
- package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -1
- package/dist/workflows/shared/sandbox-policy.js +12 -0
- package/dist/workflows/shared/sandbox-policy.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/bot-resolve.d.ts.map +1 -1
- package/dist/workflows/v3/bot-resolve.js +36 -0
- package/dist/workflows/v3/bot-resolve.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/contract.d.ts +8 -0
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.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-O376WSER.js +0 -5
- package/dist/dashboard-web/chunks/chunk-H7P5UV4W.js +0 -49
- package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-IR54AOAI.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-QJMI6NLW.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-TNZEPC7V.js +0 -2
- package/dist/services/sandbox-land.d.ts +0 -45
- package/dist/services/sandbox-land.d.ts.map +0 -1
- package/dist/services/sandbox-land.js +0 -394
- package/dist/services/sandbox-land.js.map +0 -1
- 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
package/dist/dashboard.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/dashboard.ts
|
|
2
2
|
import { createServer, get as httpGet, request as httpRequest } from 'node:http';
|
|
3
3
|
import { createServer as createTcpServer, connect as netConnect } from 'node:net';
|
|
4
|
-
import { readFileSync, existsSync, mkdirSync, readdirSync, statSync, createReadStream, } from 'node:fs';
|
|
4
|
+
import { readFileSync, existsSync, mkdirSync, readdirSync, statSync, createReadStream, realpathSync, } from 'node:fs';
|
|
5
5
|
import { atomicWriteFileSync } from './utils/atomic-write.js';
|
|
6
6
|
import { join, dirname, extname, resolve, relative, isAbsolute } from 'node:path';
|
|
7
7
|
import { homedir } from 'node:os';
|
|
@@ -13,6 +13,8 @@ import { listenWithProbe } from './utils/listen-with-probe.js';
|
|
|
13
13
|
import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
|
|
14
14
|
import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
|
|
15
15
|
import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
|
|
16
|
+
import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
|
|
17
|
+
import { parseDashboardAskAnswerRequest, proxyDashboardAskAnswer, } from './dashboard/desktop-asks.js';
|
|
16
18
|
import { createDebugTerminalManager } from './dashboard/debug-terminal.js';
|
|
17
19
|
import { pickCreatorForGroup } from './dashboard/operator-selector.js';
|
|
18
20
|
import { buildTeamGroupCreatePayload, planGroupCreator } from './dashboard/team-group.js';
|
|
@@ -22,7 +24,7 @@ import { defaultRunsDir as v3RunsDir } from './workflows/v3/ops-projection.js';
|
|
|
22
24
|
import { verifyWorkflowDaemonIpcResponse, workflowDaemonIpcHeaders, WORKFLOW_DAEMON_IPC_ROUTE_PREFIX, } from './workflows/v3/daemon-ipc-auth.js';
|
|
23
25
|
import { handleDashboardTriggerApi } from './dashboard/trigger-api.js';
|
|
24
26
|
import { handleConnectorApi } from './dashboard/connector-api.js';
|
|
25
|
-
import { redactGroupsForPublic, redactSchedulesForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
|
|
27
|
+
import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
|
|
26
28
|
import { handleWebhookRoute } from './dashboard/webhook-routes.js';
|
|
27
29
|
import { handleFederationApi } from './dashboard/federation-api.js';
|
|
28
30
|
import { handleFederationSpokeApi, syncAllMemberships, autoBindOwnerIfUnambiguous } from './dashboard/federation-spoke-api.js';
|
|
@@ -36,6 +38,7 @@ import { hostLocalTimeZone, scheduleTimeZone } from './utils/timezone.js';
|
|
|
36
38
|
import { buildDashboardUrls } from './core/dashboard-url.js';
|
|
37
39
|
import { resolveBotmuxDataDir } from './core/data-dir.js';
|
|
38
40
|
import { dashboardSecretPath } from './core/dashboard-secret.js';
|
|
41
|
+
import { getGitRepoInfo } from './core/session-row-enrichment.js';
|
|
39
42
|
import { deleteWhiteboard, listWhiteboards, readWhiteboard, whiteboardEnabled } from './services/whiteboard-store.js';
|
|
40
43
|
import { isLocalDevInstall, botmuxVersionAt, botmuxCliEntry, botmuxInstallRoot } from './utils/install-info.js';
|
|
41
44
|
import { checkNode, detectBotmuxInstalls, resolveCurrentVersion } from './utils/install-diagnostics.js';
|
|
@@ -74,7 +77,7 @@ import { startPlatformTunnelClient } from './platform/tunnel-client.js';
|
|
|
74
77
|
import { applyPlatformTeamSync, getPlatformTeamSyncRev, listPlatformTeams } from './services/platform-team-store.js';
|
|
75
78
|
import { getBotUnionId } from './services/bot-union-ids-store.js';
|
|
76
79
|
import { cleanupIdleSessions, parseIdleCleanupHours } from './dashboard/session-cleanup.js';
|
|
77
|
-
import { handleDesktopCompat } from './dashboard/compat.js';
|
|
80
|
+
import { compatMachineIdForAuthenticatedRequest, handleDesktopCompat, } from './dashboard/compat.js';
|
|
78
81
|
import { isDashboardChunkJsPath, missingDashboardChunkModule } from './dashboard/stale-chunk-module.js';
|
|
79
82
|
import { aggregateRoleBatch, parseRoleBatchTargets } from './dashboard/roles-batch.js';
|
|
80
83
|
import { automateOpenPlatformSetup, vcListenerEventGateError } from './setup/open-platform-automation.js';
|
|
@@ -191,6 +194,13 @@ function verifyDashboardBinding(port) {
|
|
|
191
194
|
mkdirSync(REGISTRY_DIR, { recursive: true });
|
|
192
195
|
const registry = new DaemonRegistry(REGISTRY_DIR);
|
|
193
196
|
const aggregator = new Aggregator();
|
|
197
|
+
const sessionPresentation = createSessionPresentationCoordinator(aggregator, getGitRepoInfo);
|
|
198
|
+
// Keep Git-derived fields in the central read-model so REST snapshots and SSE
|
|
199
|
+
// share one row shape. Idle/limited turn boundaries force a branch refresh
|
|
200
|
+
// after the CLI has had a chance to change repositories — that is one
|
|
201
|
+
// `git rev-parse` per session per turn, bounded by the resolver's concurrency
|
|
202
|
+
// cap, NOT a slow background poll.
|
|
203
|
+
aggregator.on(sessionPresentation.onEvent);
|
|
194
204
|
// 调试终端(owner-only 裸 bash)。默认工作目录取当前所有 session 的工作目录去重,
|
|
195
205
|
// 让 owner 从熟悉的目录起终端复现问题;都没有时模块内退回 homedir。
|
|
196
206
|
const debugTerminalManager = createDebugTerminalManager({
|
|
@@ -212,6 +222,64 @@ const debugTerminalManager = createDebugTerminalManager({
|
|
|
212
222
|
* tasks (see scheduler.belongsToOwner). Returns undefined when the row is
|
|
213
223
|
* genuinely unknown or no daemon is online.
|
|
214
224
|
*/
|
|
225
|
+
/**
|
|
226
|
+
* Read-only directory listing for the dashboard sandbox-paths tree picker.
|
|
227
|
+
* Served locally by the dashboard process (same host as the daemons). Returns
|
|
228
|
+
* immediate CHILD DIRECTORIES only — never file contents. Trust model matches
|
|
229
|
+
* validateWorkingDir: the caller is an authed admin and the daemon already runs
|
|
230
|
+
* prompts with full FS access, so this is a convenience browser, not a security
|
|
231
|
+
* boundary. Symlinks are realpath-resolved; a raw path is never echoed into an
|
|
232
|
+
* error the browser renders verbatim.
|
|
233
|
+
*/
|
|
234
|
+
function listDirLocally(rawPath) {
|
|
235
|
+
// Canonicalize $HOME so the root entry + the `~` the frontend expands both use
|
|
236
|
+
// the SAME canonical form the child listings (realpathSync below) and the
|
|
237
|
+
// worker's sandbox binds use. On a symlinked-$HOME host (/home/u →
|
|
238
|
+
// /data00/home/u) the lexical homedir() would make `~/.claude` expand to
|
|
239
|
+
// /home/u/.claude while the tree's child nodes come back as /data00/... — the
|
|
240
|
+
// picker would then never match `~`-relative tier entries.
|
|
241
|
+
let home = homedir();
|
|
242
|
+
try {
|
|
243
|
+
home = realpathSync(home);
|
|
244
|
+
}
|
|
245
|
+
catch { /* lexical fallback if unresolvable */ }
|
|
246
|
+
if (!rawPath) {
|
|
247
|
+
// Root view: HOME first (the common case), then filesystem root. `home` is
|
|
248
|
+
// also returned explicitly so the frontend doesn't guess from entries[0].
|
|
249
|
+
const roots = [...new Set([home, '/'])];
|
|
250
|
+
return {
|
|
251
|
+
ok: true, path: null, parent: null, home,
|
|
252
|
+
entries: roots.map(p => ({ name: p, path: p, kind: 'dir' })),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const expanded = rawPath.startsWith('~') ? join(home, rawPath.slice(1)) : rawPath;
|
|
256
|
+
let resolved;
|
|
257
|
+
try {
|
|
258
|
+
resolved = realpathSync(expanded);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return { ok: false, path: null, parent: null, entries: [], error: 'path_not_found' };
|
|
262
|
+
}
|
|
263
|
+
let entries;
|
|
264
|
+
try {
|
|
265
|
+
entries = readdirSync(resolved, { withFileTypes: true })
|
|
266
|
+
.filter(d => {
|
|
267
|
+
try {
|
|
268
|
+
return d.isDirectory() || (d.isSymbolicLink() && statSync(join(resolved, d.name)).isDirectory());
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
})
|
|
274
|
+
.map(d => ({ name: d.name, path: join(resolved, d.name), kind: 'dir' }))
|
|
275
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
276
|
+
}
|
|
277
|
+
catch (e) {
|
|
278
|
+
return { ok: false, path: resolved, parent: null, entries: [], error: e?.code === 'EACCES' ? 'permission_denied' : 'cannot_read_dir' };
|
|
279
|
+
}
|
|
280
|
+
const parent = resolved === '/' ? null : dirname(resolved);
|
|
281
|
+
return { ok: true, path: resolved, parent, entries };
|
|
282
|
+
}
|
|
215
283
|
function resolveScheduleOwner(id) {
|
|
216
284
|
const explicit = aggregator.scheduleOwnerOf(id);
|
|
217
285
|
if (explicit)
|
|
@@ -780,6 +848,7 @@ function resolveDashboardSettings() {
|
|
|
780
848
|
const codexNotifierState = readCodexNotifierWorkerState(config.session.dataDir);
|
|
781
849
|
const larkCli = checkLarkCliVersion();
|
|
782
850
|
return {
|
|
851
|
+
groupNamePrefix: global.groupNamePrefix ?? '',
|
|
783
852
|
publicReadOnly: dashboard.publicReadOnly ?? config.dashboard.publicReadOnly,
|
|
784
853
|
openTerminalInFeishu: dashboard.openTerminalInFeishu === true,
|
|
785
854
|
enableLocalCliOpen: dashboard.enableLocalCliOpen === true,
|
|
@@ -1028,7 +1097,10 @@ async function attachDaemon(d) {
|
|
|
1028
1097
|
]);
|
|
1029
1098
|
const s = await sRes.json();
|
|
1030
1099
|
const sch = await schRes.json();
|
|
1031
|
-
|
|
1100
|
+
const rows = (s.sessions ?? []).map((row) => (d.botAvatarUrl ? { ...row, botAvatarUrl: d.botAvatarUrl } : row));
|
|
1101
|
+
aggregator.hydrateSessions(d.larkAppId, rows);
|
|
1102
|
+
for (const row of rows)
|
|
1103
|
+
sessionPresentation.schedule(d.larkAppId, row);
|
|
1032
1104
|
aggregator.hydrateSchedules(sch.schedules ?? []);
|
|
1033
1105
|
}
|
|
1034
1106
|
catch (e) {
|
|
@@ -1044,14 +1116,26 @@ async function attachDaemon(d) {
|
|
|
1044
1116
|
}
|
|
1045
1117
|
}
|
|
1046
1118
|
function syncSubscriptions() {
|
|
1047
|
-
const
|
|
1119
|
+
const daemons = registry.list();
|
|
1120
|
+
const online = new Set(daemons.map(d => d.larkAppId));
|
|
1048
1121
|
// Attach (hydrate + subscribe) any newly-online daemon. Fire-and-forget
|
|
1049
1122
|
// because the registry callback is sync and the attach is per-daemon
|
|
1050
1123
|
// independent.
|
|
1051
|
-
for (const d of
|
|
1124
|
+
for (const d of daemons) {
|
|
1052
1125
|
if (!subs.has(d.larkAppId)) {
|
|
1053
1126
|
void attachDaemon(d);
|
|
1054
1127
|
}
|
|
1128
|
+
// Push avatar changes in BOTH directions: gating on `d.botAvatarUrl` would
|
|
1129
|
+
// leave the stale image on every row when a bot's avatar is cleared.
|
|
1130
|
+
const avatar = d.botAvatarUrl ?? null;
|
|
1131
|
+
for (const row of aggregator.getSessions()) {
|
|
1132
|
+
if (row.larkAppId !== d.larkAppId || (row.botAvatarUrl ?? null) === avatar)
|
|
1133
|
+
continue;
|
|
1134
|
+
aggregator.applyEvent(d.larkAppId, {
|
|
1135
|
+
type: 'session.update',
|
|
1136
|
+
body: { sessionId: row.sessionId, patch: { botAvatarUrl: avatar } },
|
|
1137
|
+
});
|
|
1138
|
+
}
|
|
1055
1139
|
}
|
|
1056
1140
|
// Close subscriptions for daemons that went offline. Cache entries are
|
|
1057
1141
|
// intentionally retained — the user may still want to see the last-known
|
|
@@ -2149,7 +2233,13 @@ const server = createServer(async (req, res) => {
|
|
|
2149
2233
|
// Desktop shell compatibility probe (read-only, no token required). Keep it
|
|
2150
2234
|
// outside the browser auth gate so packaged desktop apps can decide whether
|
|
2151
2235
|
// this runtime speaks their dashboard protocol before loading the SPA.
|
|
2152
|
-
if (
|
|
2236
|
+
if (req.method === 'GET' && url.pathname === '/__desktop/compat') {
|
|
2237
|
+
const presentedToken = authedToken(req, url);
|
|
2238
|
+
const boundMachineId = activeToken && presentedToken === activeToken
|
|
2239
|
+
? readPlatformBinding()?.machineId
|
|
2240
|
+
: null;
|
|
2241
|
+
const compatMachineId = compatMachineIdForAuthenticatedRequest(presentedToken, activeToken, boundMachineId);
|
|
2242
|
+
handleDesktopCompat(req, res, url, { machineId: compatMachineId ?? undefined });
|
|
2153
2243
|
return;
|
|
2154
2244
|
}
|
|
2155
2245
|
// Web terminal reverse-proxy: `/s/<sessionId>/*` → the owning bot daemon's
|
|
@@ -2401,7 +2491,52 @@ const server = createServer(async (req, res) => {
|
|
|
2401
2491
|
? { ...s, botName: n }
|
|
2402
2492
|
: s;
|
|
2403
2493
|
});
|
|
2404
|
-
return jsonRes(res, 200, {
|
|
2494
|
+
return jsonRes(res, 200, {
|
|
2495
|
+
sessions: authed ? sessions : redactSessionsForPublic(sessions),
|
|
2496
|
+
});
|
|
2497
|
+
}
|
|
2498
|
+
// Desktop / operator UI: aggregate pending ask-hooks across daemons.
|
|
2499
|
+
if (req.method === 'GET' && url.pathname === '/api/asks/pending') {
|
|
2500
|
+
const daemons = registry.list();
|
|
2501
|
+
const asks = [];
|
|
2502
|
+
await Promise.all(daemons.map(async (d) => {
|
|
2503
|
+
try {
|
|
2504
|
+
const upstream = await fetchDaemonIpc(d.ipcPort, '/api/asks/pending', {
|
|
2505
|
+
signal: AbortSignal.timeout(2_000),
|
|
2506
|
+
});
|
|
2507
|
+
if (!upstream.ok)
|
|
2508
|
+
return;
|
|
2509
|
+
const body = await upstream.json();
|
|
2510
|
+
for (const a of body.asks ?? []) {
|
|
2511
|
+
asks.push({
|
|
2512
|
+
...(typeof a === 'object' && a ? a : {}),
|
|
2513
|
+
botName: d.botName,
|
|
2514
|
+
larkAppId: d.larkAppId,
|
|
2515
|
+
});
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
catch {
|
|
2519
|
+
/* offline daemon */
|
|
2520
|
+
}
|
|
2521
|
+
}));
|
|
2522
|
+
return jsonRes(res, 200, { asks });
|
|
2523
|
+
}
|
|
2524
|
+
if (req.method === 'POST' && url.pathname === '/api/asks/answer') {
|
|
2525
|
+
let body;
|
|
2526
|
+
try {
|
|
2527
|
+
body = await readJsonBody(req);
|
|
2528
|
+
}
|
|
2529
|
+
catch {
|
|
2530
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
2531
|
+
}
|
|
2532
|
+
const parsed = parseDashboardAskAnswerRequest(body);
|
|
2533
|
+
if (!parsed.ok) {
|
|
2534
|
+
return jsonRes(res, 400, { ok: false, error: parsed.error });
|
|
2535
|
+
}
|
|
2536
|
+
const upstream = await proxyDashboardAskAnswer(parsed.value, proxyToDaemon);
|
|
2537
|
+
res.writeHead(upstream.status, { 'content-type': upstream.contentType });
|
|
2538
|
+
res.end(upstream.body);
|
|
2539
|
+
return;
|
|
2405
2540
|
}
|
|
2406
2541
|
if (req.method === 'POST' && url.pathname === '/api/sessions/cleanup-idle') {
|
|
2407
2542
|
let body;
|
|
@@ -3437,6 +3572,35 @@ const server = createServer(async (req, res) => {
|
|
|
3437
3572
|
res.end(await upstream.text());
|
|
3438
3573
|
return;
|
|
3439
3574
|
}
|
|
3575
|
+
// 单会话元信息(状态/标题/cli/工作目录等)。dashboard 之前只代理了
|
|
3576
|
+
// GET /api/sessions(列表),没有单会话 :id 路由,编程式调用方(如任务
|
|
3577
|
+
// 编排器的「任务详情」面板)走 getMeta 会落到最底的 404 not_found_yet。
|
|
3578
|
+
// owner-only;ownerOf 对已关闭会话仍可解析。放在 trigger-result 之后,
|
|
3579
|
+
// 避免把 /trigger-result、/insight 等子路径吞进这个单段匹配。
|
|
3580
|
+
if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)$/))) {
|
|
3581
|
+
const sid = decodeURIComponent(m[1]);
|
|
3582
|
+
const owner = aggregator.ownerOf(sid);
|
|
3583
|
+
if (!owner)
|
|
3584
|
+
return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
|
|
3585
|
+
const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}`, { method: 'GET' });
|
|
3586
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3587
|
+
res.end(await upstream.text());
|
|
3588
|
+
return;
|
|
3589
|
+
}
|
|
3590
|
+
// 异步 trigger 结果轮询(asyncReturnSessionId 模式的权威查询端点)。
|
|
3591
|
+
// 四态 running/completed/failed/not_found,daemon 重启后从持久化结果兜底
|
|
3592
|
+
// 重建 completed。owner-only(写权限 cookie),代理到 owner daemon 同名 IPC。
|
|
3593
|
+
// ownerOf 对已关闭会话仍可解析(aggregator 的 /api/sessions 含 closed)。
|
|
3594
|
+
if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/trigger-result$/))) {
|
|
3595
|
+
const sid = decodeURIComponent(m[1]);
|
|
3596
|
+
const owner = aggregator.ownerOf(sid);
|
|
3597
|
+
if (!owner)
|
|
3598
|
+
return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
|
|
3599
|
+
const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/trigger-result${url.search ?? ''}`, { method: 'GET' });
|
|
3600
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3601
|
+
res.end(await upstream.text());
|
|
3602
|
+
return;
|
|
3603
|
+
}
|
|
3440
3604
|
// 会话 insight(只读 trace 分析:动作 span / 失败聚合 / 规则建议)。
|
|
3441
3605
|
// owner-only:不在公开读白名单 → decideDashboardAuth 已对只读访客 401,
|
|
3442
3606
|
// 公开/联邦访客看不到 tab 也拿不到 span。代理到 owner daemon 的同名 IPC。
|
|
@@ -4018,6 +4182,42 @@ const server = createServer(async (req, res) => {
|
|
|
4018
4182
|
res.end(await upstream.text());
|
|
4019
4183
|
return;
|
|
4020
4184
|
}
|
|
4185
|
+
// PUT /api/bots/:appId/custom-passthrough — proxy to that bot's daemon. Body
|
|
4186
|
+
// `{ customPassthroughCommands: string }` (raw text, comma/space separated; '' = clear).
|
|
4187
|
+
let mBotPassthrough;
|
|
4188
|
+
if (req.method === 'PUT' && (mBotPassthrough = url.pathname.match(/^\/api\/bots\/([^/]+)\/custom-passthrough$/))) {
|
|
4189
|
+
const appId = decodeURIComponent(mBotPassthrough[1]);
|
|
4190
|
+
const chunks = [];
|
|
4191
|
+
for await (const c of req)
|
|
4192
|
+
chunks.push(c);
|
|
4193
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
4194
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-custom-passthrough`, {
|
|
4195
|
+
method: 'PUT',
|
|
4196
|
+
headers: { 'content-type': 'application/json' },
|
|
4197
|
+
body: raw,
|
|
4198
|
+
});
|
|
4199
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4200
|
+
res.end(await upstream.text());
|
|
4201
|
+
return;
|
|
4202
|
+
}
|
|
4203
|
+
// PUT /api/bots/:appId/cantalk-daemon-commands — proxy to that bot's daemon. Body
|
|
4204
|
+
// `{ canTalkDaemonCommands: string }` (raw text, comma/space separated; '' = clear).
|
|
4205
|
+
let mBotCanTalk;
|
|
4206
|
+
if (req.method === 'PUT' && (mBotCanTalk = url.pathname.match(/^\/api\/bots\/([^/]+)\/cantalk-daemon-commands$/))) {
|
|
4207
|
+
const appId = decodeURIComponent(mBotCanTalk[1]);
|
|
4208
|
+
const chunks = [];
|
|
4209
|
+
for await (const c of req)
|
|
4210
|
+
chunks.push(c);
|
|
4211
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
4212
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-cantalk-daemon-commands`, {
|
|
4213
|
+
method: 'PUT',
|
|
4214
|
+
headers: { 'content-type': 'application/json' },
|
|
4215
|
+
body: raw,
|
|
4216
|
+
});
|
|
4217
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4218
|
+
res.end(await upstream.text());
|
|
4219
|
+
return;
|
|
4220
|
+
}
|
|
4021
4221
|
// PUT /api/bots/:appId/launch-shell — proxy to that bot's daemon. Body
|
|
4022
4222
|
// `{ launchShell: string }` (shell name or absolute path; '' = clear → $SHELL).
|
|
4023
4223
|
let mBotLaunchShell;
|
|
@@ -4072,6 +4272,33 @@ const server = createServer(async (req, res) => {
|
|
|
4072
4272
|
res.end(await upstream.text());
|
|
4073
4273
|
return;
|
|
4074
4274
|
}
|
|
4275
|
+
// PUT /api/bots/:appId/sandbox-paths — proxy to that bot's daemon.
|
|
4276
|
+
// Body `{ readWrite?: string[]; readOnly?: string[]; deny?: string[] }`.
|
|
4277
|
+
let mBotSandboxPaths;
|
|
4278
|
+
if (req.method === 'PUT' && (mBotSandboxPaths = url.pathname.match(/^\/api\/bots\/([^/]+)\/sandbox-paths$/))) {
|
|
4279
|
+
const appId = decodeURIComponent(mBotSandboxPaths[1]);
|
|
4280
|
+
const chunks = [];
|
|
4281
|
+
for await (const c of req)
|
|
4282
|
+
chunks.push(c);
|
|
4283
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
4284
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-sandbox-paths`, {
|
|
4285
|
+
method: 'PUT',
|
|
4286
|
+
headers: { 'content-type': 'application/json' },
|
|
4287
|
+
body: raw,
|
|
4288
|
+
});
|
|
4289
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4290
|
+
res.end(await upstream.text());
|
|
4291
|
+
return;
|
|
4292
|
+
}
|
|
4293
|
+
// GET /api/fs/list?path=… — read-only directory listing for the sandbox-paths
|
|
4294
|
+
// tree picker. Not bot-specific (the filesystem is shared with this host's
|
|
4295
|
+
// daemons — the dashboard process runs on the SAME machine), so serve it
|
|
4296
|
+
// locally instead of proxying. Returns immediate child directories only.
|
|
4297
|
+
if (req.method === 'GET' && url.pathname === '/api/fs/list') {
|
|
4298
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
4299
|
+
res.end(JSON.stringify(listDirLocally(url.searchParams.get('path') ?? '')));
|
|
4300
|
+
return;
|
|
4301
|
+
}
|
|
4075
4302
|
// PUT /api/bots/:appId/sandbox — proxy to that bot's daemon. Body `{ enabled: boolean }`.
|
|
4076
4303
|
let mBotSandbox;
|
|
4077
4304
|
if (req.method === 'PUT' && (mBotSandbox = url.pathname.match(/^\/api\/bots\/([^/]+)\/sandbox$/))) {
|
|
@@ -4578,7 +4805,9 @@ const server = createServer(async (req, res) => {
|
|
|
4578
4805
|
// full task object — strip the prompt AND workingDir for anonymous SSE
|
|
4579
4806
|
// listeners, or the REST-side scrub would be trivially bypassed by
|
|
4580
4807
|
// `/events`.
|
|
4581
|
-
let body =
|
|
4808
|
+
let body = authed
|
|
4809
|
+
? ev.body
|
|
4810
|
+
: redactSessionEventForPublic(ev.type, ev.body);
|
|
4582
4811
|
if (!authed && (ev.type === 'schedule.created' || ev.type === 'schedule.updated')) {
|
|
4583
4812
|
const b = body;
|
|
4584
4813
|
body = {
|