botmux 3.7.1 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/capabilities.d.ts +17 -0
- package/dist/adapters/backend/capabilities.d.ts.map +1 -0
- package/dist/adapters/backend/capabilities.js +22 -0
- package/dist/adapters/backend/capabilities.js.map +1 -0
- package/dist/adapters/backend/critical-control-key.d.ts +19 -0
- package/dist/adapters/backend/critical-control-key.d.ts.map +1 -0
- package/dist/adapters/backend/critical-control-key.js +34 -0
- package/dist/adapters/backend/critical-control-key.js.map +1 -0
- package/dist/adapters/backend/herdr-backend.d.ts +9 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +23 -4
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +3 -2
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +61 -6
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +173 -9
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +10 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +25 -8
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +3 -2
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +45 -4
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js +11 -0
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +3 -2
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/backend/zmx-backend.d.ts +286 -0
- package/dist/adapters/backend/zmx-backend.d.ts.map +1 -0
- package/dist/adapters/backend/zmx-backend.js +2396 -0
- package/dist/adapters/backend/zmx-backend.js.map +1 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +3 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +5 -1
- 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 +26 -1
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +79 -1
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +290 -13
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +4 -1
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
- package/dist/adapters/cli/oh-my-pi.js +5 -3
- package/dist/adapters/cli/oh-my-pi.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +7 -4
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +52 -35
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/strict-input-handle.d.ts +13 -0
- package/dist/adapters/cli/strict-input-handle.d.ts.map +1 -0
- package/dist/adapters/cli/strict-input-handle.js +39 -0
- package/dist/adapters/cli/strict-input-handle.js.map +1 -0
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +6 -4
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +16 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +137 -8
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +298 -12
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/session-list-liveness.d.ts +1 -1
- package/dist/cli/session-list-liveness.js +1 -1
- package/dist/cli/zmx-managed-attach.d.ts +41 -0
- package/dist/cli/zmx-managed-attach.d.ts.map +1 -0
- package/dist/cli/zmx-managed-attach.js +72 -0
- package/dist/cli/zmx-managed-attach.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +780 -131
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +90 -2
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts.map +1 -1
- package/dist/codex-rpc-engine.js +22 -6
- package/dist/codex-rpc-engine.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ask-broker.d.ts +22 -1
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +12 -5
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/botmux-wrapper.d.ts +18 -0
- package/dist/core/botmux-wrapper.d.ts.map +1 -1
- package/dist/core/botmux-wrapper.js +25 -1
- package/dist/core/botmux-wrapper.js.map +1 -1
- package/dist/core/chat-rename.d.ts +27 -0
- package/dist/core/chat-rename.d.ts.map +1 -0
- package/dist/core/chat-rename.js +53 -0
- package/dist/core/chat-rename.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +160 -12
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +25 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +102 -4
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +16 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +611 -62
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +22 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +61 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/dashboard-url.d.ts +6 -0
- package/dist/core/dashboard-url.d.ts.map +1 -1
- package/dist/core/dashboard-url.js +11 -1
- package/dist/core/dashboard-url.js.map +1 -1
- package/dist/core/device-isolation-daemon.d.ts +28 -6
- package/dist/core/device-isolation-daemon.d.ts.map +1 -1
- package/dist/core/device-isolation-daemon.js +96 -13
- package/dist/core/device-isolation-daemon.js.map +1 -1
- package/dist/core/host-overload-alert.d.ts +75 -0
- package/dist/core/host-overload-alert.d.ts.map +1 -1
- package/dist/core/host-overload-alert.js +103 -0
- package/dist/core/host-overload-alert.js.map +1 -1
- package/dist/core/idle-worker-sweeper.js +1 -1
- package/dist/core/idle-worker-sweeper.js.map +1 -1
- package/dist/core/inflight-input-tracker.d.ts +3 -0
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +9 -0
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +10 -0
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/persistent-backend.d.ts +32 -4
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +75 -6
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/plugins/mcp/gateway.js +2 -2
- package/dist/core/plugins/mcp/gateway.js.map +1 -1
- package/dist/core/plugins/runtime.d.ts +3 -0
- package/dist/core/plugins/runtime.d.ts.map +1 -1
- package/dist/core/plugins/runtime.js.map +1 -1
- package/dist/core/plugins/service-manager.d.ts +4 -1
- package/dist/core/plugins/service-manager.d.ts.map +1 -1
- package/dist/core/plugins/service-manager.js +11 -6
- package/dist/core/plugins/service-manager.js.map +1 -1
- package/dist/core/role-library.d.ts +48 -1
- package/dist/core/role-library.d.ts.map +1 -1
- package/dist/core/role-library.js +111 -3
- package/dist/core/role-library.js.map +1 -1
- package/dist/core/role-resolver.d.ts +14 -2
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +47 -4
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-activity.d.ts +14 -0
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-activity.js +46 -1
- package/dist/core/session-activity.js.map +1 -1
- package/dist/core/session-board.d.ts +5 -2
- package/dist/core/session-board.d.ts.map +1 -1
- package/dist/core/session-board.js +5 -2
- package/dist/core/session-board.js.map +1 -1
- package/dist/core/session-liveness.d.ts +6 -5
- package/dist/core/session-liveness.d.ts.map +1 -1
- package/dist/core/session-liveness.js +34 -13
- package/dist/core/session-liveness.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +397 -103
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +11 -2
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +50 -11
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/session-message-preview.d.ts +20 -0
- package/dist/core/session-message-preview.d.ts.map +1 -0
- package/dist/core/session-message-preview.js +188 -0
- package/dist/core/session-message-preview.js.map +1 -0
- package/dist/core/session-title.d.ts +5 -1
- package/dist/core/session-title.d.ts.map +1 -1
- package/dist/core/session-title.js +20 -3
- package/dist/core/session-title.js.map +1 -1
- package/dist/core/startup-commands.d.ts +1 -1
- package/dist/core/startup-commands.js +1 -1
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +3 -2
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +75 -12
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +23 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-ipc.d.ts +11 -0
- package/dist/core/worker-ipc.d.ts.map +1 -0
- package/dist/core/worker-ipc.js +26 -0
- package/dist/core/worker-ipc.js.map +1 -0
- package/dist/core/worker-pool.d.ts +179 -29
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2118 -331
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +132 -3
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +1327 -449
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +2 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +9 -0
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +4 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +5 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/federation-api.d.ts.map +1 -1
- package/dist/dashboard/federation-api.js +4 -0
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +32 -5
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/public-redact.d.ts +8 -2
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +34 -7
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +10 -2
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +35 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +88 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +0 -1
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +15 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +212 -58
- 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/bot-onboarding.d.ts +2 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/clipboard.d.ts +2 -0
- package/dist/dashboard/web/clipboard.d.ts.map +1 -0
- package/dist/dashboard/web/clipboard.js +42 -0
- package/dist/dashboard/web/clipboard.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +12 -8
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/dashboard-components.d.ts +17 -16
- package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-components.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +7 -3
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +205 -12
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -1
- package/dist/dashboard/web/icon-tooltip.js +16 -1
- package/dist/dashboard/web/icon-tooltip.js.map +1 -1
- package/dist/dashboard/web/listener-filters.d.ts +23 -0
- package/dist/dashboard/web/listener-filters.d.ts.map +1 -0
- package/dist/dashboard/web/listener-filters.js +36 -0
- package/dist/dashboard/web/listener-filters.js.map +1 -0
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
- package/dist/dashboard/web/plugin-page.js.map +1 -1
- package/dist/dashboard/web/preview-markdown.d.ts +5 -0
- package/dist/dashboard/web/preview-markdown.d.ts.map +1 -0
- package/dist/dashboard/web/preview-markdown.js +52 -0
- package/dist/dashboard/web/preview-markdown.js.map +1 -0
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +535 -10
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard/web/roles.d.ts +77 -0
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +98 -0
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/session-terminal.d.ts.map +1 -1
- package/dist/dashboard/web/session-terminal.js +6 -4
- package/dist/dashboard/web/session-terminal.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts +4 -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 +3 -2
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +163 -28
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +25 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +58 -7
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +28 -3
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +61 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts +6 -5
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +2 -0
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/web/v3-components.d.ts +3 -2
- package/dist/dashboard/web/v3-components.d.ts.map +1 -1
- package/dist/dashboard/web/v3-components.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +12 -2
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -9
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
- package/dist/dashboard/web/webhook-logs-page.d.ts +2 -1
- package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -1
- package/dist/dashboard/web/webhook-logs-page.js +4 -1
- package/dist/dashboard/web/webhook-logs-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-FAPIMQV3.js +10 -0
- package/dist/dashboard-web/chunks/{chunk-QFMH6ITB.js → chunk-5CJMHTT4.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KQB42ML5.js → chunk-DLZK52JU.js} +14 -12
- package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +16 -0
- package/dist/dashboard-web/chunks/{chunk-3QAUJXAS.js → chunk-GTAJV5YC.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FNPGOZMX.js → chunk-IHNG6KE6.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FLGXZJTD.js → chunk-VA6QWSGQ.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
- package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-LKWRT3GS.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-V6654ICQ.js +8 -0
- package/dist/dashboard-web/chunks/insights-page-237RMFQ5.js +7 -0
- package/dist/dashboard-web/chunks/{monitor-room-7IVIS75W.js → monitor-room-OO5Y4FRQ.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-5SSJRQZF.js → monitoring-page-OUEITM5P.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-EOND3L5D.js → office-page-4KNAHQ4Q.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-NISBVBBJ.js → overview-page-QDP4YK2S.js} +1 -1
- package/dist/dashboard-web/chunks/{plugin-page-JXC5F5YV.js → plugin-page-VEGTCEAS.js} +1 -1
- package/dist/dashboard-web/chunks/roles-page-PGXNZZNP.js +1 -0
- package/dist/dashboard-web/chunks/{schedules-page-AVOOKLUH.js → schedules-page-BJNC5TID.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-M2ZYYCMO.js +6 -0
- package/dist/dashboard-web/chunks/settings-page-IJFZKUUW.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-5MW54PCC.js → skills-page-YRAIRZOQ.js} +3 -3
- package/dist/dashboard-web/chunks/{team-federation-page-2SNIMVXI.js → team-federation-page-DEU27GRU.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-W6SBXXQC.js → v3-page-6KHEW2YL.js} +5 -5
- package/dist/dashboard-web/chunks/{whiteboards-page-STC54KTP.js → whiteboards-page-VDECAALH.js} +1 -1
- package/dist/dashboard-web/style.css +12545 -11432
- package/dist/dashboard.js +215 -36
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +41 -2
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +47 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +71 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +71 -19
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/callback-button-marker.d.ts +34 -0
- package/dist/im/lark/callback-button-marker.d.ts.map +1 -0
- package/dist/im/lark/callback-button-marker.js +99 -0
- package/dist/im/lark/callback-button-marker.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +46 -10
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +299 -78
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +3 -4
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +380 -148
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +24 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +101 -8
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +6 -1
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +115 -3
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +534 -147
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +16 -12
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +48 -151
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/grant-pending.d.ts +12 -4
- package/dist/im/lark/grant-pending.d.ts.map +1 -1
- package/dist/im/lark/grant-pending.js +31 -8
- package/dist/im/lark/grant-pending.js.map +1 -1
- package/dist/im/lark/invite-command.d.ts +20 -0
- package/dist/im/lark/invite-command.d.ts.map +1 -0
- package/dist/im/lark/invite-command.js +239 -0
- package/dist/im/lark/invite-command.js.map +1 -0
- package/dist/im/lark/md-card.d.ts +66 -4
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +201 -31
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/mention-targets.d.ts +43 -0
- package/dist/im/lark/mention-targets.d.ts.map +1 -0
- package/dist/im/lark/mention-targets.js +190 -0
- package/dist/im/lark/mention-targets.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +31 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +305 -32
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/reply-card-footer-signature.d.ts +7 -0
- package/dist/im/lark/reply-card-footer-signature.d.ts.map +1 -0
- package/dist/im/lark/reply-card-footer-signature.js +7 -0
- package/dist/im/lark/reply-card-footer-signature.js.map +1 -0
- package/dist/im/lark/sessions-card.d.ts.map +1 -1
- package/dist/im/lark/sessions-card.js +4 -1
- package/dist/im/lark/sessions-card.js.map +1 -1
- package/dist/im/lark/substitute-command.d.ts.map +1 -1
- package/dist/im/lark/substitute-command.js +8 -0
- package/dist/im/lark/substitute-command.js.map +1 -1
- package/dist/im/lark/topic-root-context.d.ts +35 -0
- package/dist/im/lark/topic-root-context.d.ts.map +1 -0
- package/dist/im/lark/topic-root-context.js +37 -0
- package/dist/im/lark/topic-root-context.js.map +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card.js +2 -1
- package/dist/im/lark/v3-blocked-card.js.map +1 -1
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card.js +2 -1
- package/dist/im/lark/v3-gate-card.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.js +2 -1
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
- package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
- package/dist/im/lark/v3-progress-card.js +2 -1
- package/dist/im/lark/v3-progress-card.js.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js +2 -1
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
- package/dist/index-core-only.d.ts +3 -0
- package/dist/index-core-only.d.ts.map +1 -0
- package/dist/index-core-only.js +107 -0
- package/dist/index-core-only.js.map +1 -0
- package/dist/services/async-trigger-state.d.ts +8 -0
- package/dist/services/async-trigger-state.d.ts.map +1 -1
- package/dist/services/async-trigger-state.js +3 -2
- package/dist/services/async-trigger-state.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +10 -2
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +3 -2
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/backend-availability.d.ts +3 -1
- package/dist/services/backend-availability.d.ts.map +1 -1
- package/dist/services/backend-availability.js +14 -1
- package/dist/services/backend-availability.js.map +1 -1
- package/dist/services/backend-type-store.d.ts.map +1 -1
- package/dist/services/backend-type-store.js +1 -1
- package/dist/services/backend-type-store.js.map +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +2 -1
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +14 -1
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +65 -1
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +7 -2
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +30 -4
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +9 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
- package/dist/services/codex-app-runner-protocol.js +17 -0
- package/dist/services/codex-app-runner-protocol.js.map +1 -1
- package/dist/services/codex-app-token-usage.d.ts +93 -0
- package/dist/services/codex-app-token-usage.d.ts.map +1 -0
- package/dist/services/codex-app-token-usage.js +190 -0
- package/dist/services/codex-app-token-usage.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +6 -1
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +103 -32
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/federation-roster.d.ts +4 -0
- package/dist/services/federation-roster.d.ts.map +1 -1
- package/dist/services/federation-roster.js +3 -0
- package/dist/services/federation-roster.js.map +1 -1
- package/dist/services/federation-store.d.ts +6 -0
- package/dist/services/federation-store.d.ts.map +1 -1
- package/dist/services/federation-store.js.map +1 -1
- package/dist/services/grant-policy.d.ts +13 -0
- package/dist/services/grant-policy.d.ts.map +1 -0
- package/dist/services/grant-policy.js +40 -0
- package/dist/services/grant-policy.js.map +1 -0
- package/dist/services/grant-store.d.ts +24 -3
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +196 -12
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/groups-store.d.ts +36 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +123 -1
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +8 -2
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +32 -0
- package/dist/services/local-cli-opener.js.map +1 -1
- package/dist/services/message-listener-run-preview-store.d.ts +43 -0
- package/dist/services/message-listener-run-preview-store.d.ts.map +1 -0
- package/dist/services/message-listener-run-preview-store.js +152 -0
- package/dist/services/message-listener-run-preview-store.js.map +1 -0
- package/dist/services/message-listener-store.d.ts +26 -0
- package/dist/services/message-listener-store.d.ts.map +1 -0
- package/dist/services/message-listener-store.js +138 -0
- package/dist/services/message-listener-store.js.map +1 -0
- package/dist/services/message-listener.d.ts +112 -0
- package/dist/services/message-listener.d.ts.map +1 -0
- package/dist/services/message-listener.js +391 -0
- package/dist/services/message-listener.js.map +1 -0
- package/dist/services/overload-alert-migration.d.ts +15 -0
- package/dist/services/overload-alert-migration.d.ts.map +1 -0
- package/dist/services/overload-alert-migration.js +115 -0
- package/dist/services/overload-alert-migration.js.map +1 -0
- package/dist/services/send-policy.d.ts +38 -0
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +34 -0
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-store.d.ts +12 -1
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +44 -2
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +87 -12
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/substitute-mode-normalize.d.ts +3 -0
- package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
- package/dist/services/substitute-mode-normalize.js +8 -0
- package/dist/services/substitute-mode-normalize.js.map +1 -1
- package/dist/services/substitute-mode-store.d.ts.map +1 -1
- package/dist/services/substitute-mode-store.js +8 -1
- package/dist/services/substitute-mode-store.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts +6 -1
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +145 -29
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/services/trigger-types.d.ts +16 -0
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +6 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-zmx.d.ts +31 -0
- package/dist/setup/ensure-zmx.d.ts.map +1 -0
- package/dist/setup/ensure-zmx.js +161 -0
- package/dist/setup/ensure-zmx.js.map +1 -0
- package/dist/setup/index.d.ts +1 -1
- package/dist/setup/index.js +1 -1
- package/dist/setup/open-platform-automation.d.ts +9 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +15 -2
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/setup-args.d.ts +1 -1
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +32 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +6 -2
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +10 -5
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/types.d.ts +79 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +4 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/effort-confirm-dialog.d.ts +40 -0
- package/dist/utils/effort-confirm-dialog.d.ts.map +1 -0
- package/dist/utils/effort-confirm-dialog.js +74 -0
- package/dist/utils/effort-confirm-dialog.js.map +1 -0
- package/dist/utils/pending-input-queue.d.ts +56 -0
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +80 -0
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/utils/render-dimensions.d.ts +8 -0
- package/dist/utils/render-dimensions.d.ts.map +1 -1
- package/dist/utils/render-dimensions.js +10 -0
- package/dist/utils/render-dimensions.js.map +1 -1
- package/dist/utils/stuck-key-guard.d.ts +3 -2
- package/dist/utils/stuck-key-guard.d.ts.map +1 -1
- package/dist/utils/stuck-key-guard.js +3 -3
- package/dist/utils/stuck-key-guard.js.map +1 -1
- package/dist/utils/terminal-renderer.d.ts +6 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +15 -0
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/tui-input-delivery.d.ts +32 -0
- package/dist/utils/tui-input-delivery.d.ts.map +1 -0
- package/dist/utils/tui-input-delivery.js +53 -0
- package/dist/utils/tui-input-delivery.js.map +1 -0
- package/dist/utils/xml.d.ts +19 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +26 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/worker.js +1852 -374
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +8 -8
- package/dist/workflows/events/payloads.d.ts +8 -8
- package/dist/workflows/events/schema.d.ts +160 -160
- package/dist/workflows/v3/session-relay-client.js +1 -1
- package/dist/workflows/v3/session-relay-client.js.map +1 -1
- package/dist/workflows/v3/worker-fence.d.ts.map +1 -1
- package/dist/workflows/v3/worker-fence.js +15 -10
- package/dist/workflows/v3/worker-fence.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-UKA7K4JV.js +0 -10
- package/dist/dashboard-web/chunks/chunk-DFLNXQNT.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-A77YAB5Y.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-RUZNVXQB.js +0 -8
- package/dist/dashboard-web/chunks/insights-page-RF7U7RTA.js +0 -22
- package/dist/dashboard-web/chunks/roles-page-BUMKD7Y4.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-6HLSEAB7.js +0 -2
- package/dist/dashboard-web/chunks/settings-page-MJDZHQ4X.js +0 -2
package/dist/dashboard.js
CHANGED
|
@@ -8,9 +8,9 @@ import { homedir } from 'node:os';
|
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { randomBytes } from 'node:crypto';
|
|
10
10
|
import { logger } from './utils/logger.js';
|
|
11
|
-
import { config } from './config.js';
|
|
11
|
+
import { config, isWildcardBindHost } from './config.js';
|
|
12
12
|
import { listenWithProbe } from './utils/listen-with-probe.js';
|
|
13
|
-
import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
|
|
13
|
+
import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, 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
16
|
import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
|
|
@@ -27,6 +27,7 @@ import { handleConnectorApi } from './dashboard/connector-api.js';
|
|
|
27
27
|
import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
|
|
28
28
|
import { handleWebhookRoute } from './dashboard/webhook-routes.js';
|
|
29
29
|
import { handleFederationApi } from './dashboard/federation-api.js';
|
|
30
|
+
import { buildFederatedRoster } from './services/federation-roster.js';
|
|
30
31
|
import { handleFederationSpokeApi, syncAllMemberships, autoBindOwnerIfUnambiguous } from './dashboard/federation-spoke-api.js';
|
|
31
32
|
import { BotOnboardingManager } from './dashboard/bot-onboarding.js';
|
|
32
33
|
import { FeishuLoginManager } from './dashboard/feishu-login.js';
|
|
@@ -44,6 +45,7 @@ import { isLocalDevInstall, botmuxVersionAt, botmuxCliEntry, botmuxInstallRoot }
|
|
|
44
45
|
import { checkNode, detectBotmuxInstalls, resolveCurrentVersion } from './utils/install-diagnostics.js';
|
|
45
46
|
import { fetchLatestVersion, fetchReleasesSince, fetchRollbackVersions, compareVersions, isCanonicalStableVersion, isNewerVersion, } from './core/update-check.js';
|
|
46
47
|
import { GITHUB_REPO } from './core/restart-report.js';
|
|
48
|
+
import { DEFAULT_OVERLOAD_THRESHOLDS } from './core/host-overload-alert.js';
|
|
47
49
|
import { spawnDetachedRestart, globalInstallUpdateLockTarget, globalInstallUpdateCwd } from './core/maintenance.js';
|
|
48
50
|
import { detectGlobalInstallManager, formatGlobalInstallCommand, resolveGlobalInstallPlan, tryResolveGlobalInstallPlan, withGlobalInstallRegistry, UnsupportedGlobalInstallError, } from './utils/global-install.js';
|
|
49
51
|
import { listCliRuntimeUpdateEntries } from './core/cli-runtime-update.js';
|
|
@@ -131,8 +133,9 @@ function loadOrCreateSecret() {
|
|
|
131
133
|
}
|
|
132
134
|
}
|
|
133
135
|
// The active dashboard token is persisted to disk so a previously-issued
|
|
134
|
-
// dashboard URL survives `botmux restart
|
|
135
|
-
//
|
|
136
|
+
// dashboard URL survives `botmux restart`. A platform-bound dashboard creates
|
|
137
|
+
// the first token on startup; only `botmux dashboard` (the /__cli/rotate
|
|
138
|
+
// endpoint) replaces it and thereby invalidates the old link.
|
|
136
139
|
// The start/restart hint reads it via the non-rotating /__cli/current endpoint
|
|
137
140
|
// so it can show the live link without invalidating it.
|
|
138
141
|
let activeToken = loadPersistedToken(TOKEN_PATH);
|
|
@@ -140,9 +143,6 @@ let activeToken = loadPersistedToken(TOKEN_PATH);
|
|
|
140
143
|
// EADDRINUSE probe). Used for the rotation-URL and persisted for the CLI.
|
|
141
144
|
let boundDashboardPort = config.dashboard.port;
|
|
142
145
|
const SECRET = loadOrCreateSecret();
|
|
143
|
-
function isWildcardBindHost(host) {
|
|
144
|
-
return host === '0.0.0.0' || host === '::' || host === '';
|
|
145
|
-
}
|
|
146
146
|
function tcpPortAvailable(host, port) {
|
|
147
147
|
return new Promise((resolve) => {
|
|
148
148
|
const probe = createTcpServer();
|
|
@@ -415,7 +415,11 @@ const attaching = new Set(); // dedup concurrent attaches per appId
|
|
|
415
415
|
function vcMeetingListenerBotOptions() {
|
|
416
416
|
try {
|
|
417
417
|
const onlineByAppId = new Map(registry.list().map(bot => [bot.larkAppId, bot]));
|
|
418
|
-
|
|
418
|
+
// Exclude core-only (apiOnly) bots: a VC listener attends real Feishu
|
|
419
|
+
// meetings and needs open-platform scopes + a live Lark connection, which a
|
|
420
|
+
// no-Feishu bot categorically cannot have. Offering it would let setup
|
|
421
|
+
// raw-fetch token/application APIs with its synthetic/empty credentials.
|
|
422
|
+
return loadBotConfigs().filter(bot => bot.apiOnly !== true).map(bot => ({
|
|
419
423
|
larkAppId: bot.larkAppId,
|
|
420
424
|
botName: bot.displayName ?? onlineByAppId.get(bot.larkAppId)?.botName ?? bot.name ?? null,
|
|
421
425
|
cliId: onlineByAppId.get(bot.larkAppId)?.cliId ?? bot.cliId,
|
|
@@ -438,6 +442,12 @@ async function validateVcMeetingListenerBotAppId(appId) {
|
|
|
438
442
|
const bot = bots.find(b => b.larkAppId === appId);
|
|
439
443
|
if (!bot)
|
|
440
444
|
return { ok: false, error: 'vcMeetingAgent_listenerBot_unknown' };
|
|
445
|
+
// Core-only (apiOnly) bots cannot attend Feishu meetings (no Feishu connection,
|
|
446
|
+
// no open-platform scopes). Reject at the settings WRITE boundary so a manual
|
|
447
|
+
// PUT can't select one and drive syncVcMeetingListenerBotConfig →
|
|
448
|
+
// automateOpenPlatformSetup against the open platform with synthetic creds.
|
|
449
|
+
if (bot.apiOnly === true)
|
|
450
|
+
return { ok: false, error: 'vcMeetingAgent_listenerBot_api_only' };
|
|
441
451
|
return { ok: true };
|
|
442
452
|
}
|
|
443
453
|
async function validateCodexNotifierTargetBotAppId(appId, options = {}) {
|
|
@@ -485,6 +495,55 @@ function codexNotifierBotOptions() {
|
|
|
485
495
|
return [];
|
|
486
496
|
}
|
|
487
497
|
}
|
|
498
|
+
/** Validate an overload-alert notifier bot. Unlike codexNotifier this is NOT
|
|
499
|
+
* codex-only — any non-apiOnly bot that can resolve an admin recipient works.
|
|
500
|
+
* On enable (requireReady) the target daemon must be online, else the alert
|
|
501
|
+
* can't be delivered (this feature is best-effort, no outbox). */
|
|
502
|
+
async function validateHostOverloadAlertTargetBotAppId(appId, options = {}) {
|
|
503
|
+
try {
|
|
504
|
+
const bot = loadBotConfigs().find(candidate => candidate.larkAppId === appId);
|
|
505
|
+
if (!bot)
|
|
506
|
+
return { ok: false, error: 'hostOverloadAlert_target_unknown' };
|
|
507
|
+
if (bot.apiOnly === true)
|
|
508
|
+
return { ok: false, error: 'hostOverloadAlert_target_apiOnly' };
|
|
509
|
+
if (!(bot.allowedUsers ?? []).some(user => typeof user === 'string' && user.trim())) {
|
|
510
|
+
return { ok: false, error: 'hostOverloadAlert_target_owner_missing' };
|
|
511
|
+
}
|
|
512
|
+
if (options.requireReady !== true)
|
|
513
|
+
return { ok: true };
|
|
514
|
+
const daemon = registry.list().find(candidate => candidate.larkAppId === appId);
|
|
515
|
+
if (!daemon)
|
|
516
|
+
return { ok: false, error: 'hostOverloadAlert_target_offline' };
|
|
517
|
+
const resolvedOwners = daemon.resolvedAllowedUsers ?? [];
|
|
518
|
+
if (!hasResolvedCodexNotifierRecipient(resolvedOwners)) {
|
|
519
|
+
return { ok: false, error: 'hostOverloadAlert_target_owner_missing' };
|
|
520
|
+
}
|
|
521
|
+
return { ok: true };
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
return { ok: false, error: 'hostOverloadAlert_target_unknown' };
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
function hostOverloadAlertBotOptions() {
|
|
528
|
+
try {
|
|
529
|
+
const onlineByAppId = new Map(registry.list().map(bot => [bot.larkAppId, bot]));
|
|
530
|
+
return loadBotConfigs()
|
|
531
|
+
.filter(bot => bot.apiOnly !== true) // apiOnly bots can't send Feishu messages
|
|
532
|
+
.map(bot => {
|
|
533
|
+
const resolvedOwners = onlineByAppId.get(bot.larkAppId)?.resolvedAllowedUsers ?? [];
|
|
534
|
+
return {
|
|
535
|
+
larkAppId: bot.larkAppId,
|
|
536
|
+
botName: bot.displayName ?? onlineByAppId.get(bot.larkAppId)?.botName ?? bot.name ?? null,
|
|
537
|
+
cliId: onlineByAppId.get(bot.larkAppId)?.cliId ?? bot.cliId,
|
|
538
|
+
apiOnly: bot.apiOnly === true,
|
|
539
|
+
...resolveCodexNotifierRecipientView(bot.allowedUsers, resolvedOwners),
|
|
540
|
+
};
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
catch {
|
|
544
|
+
return [];
|
|
545
|
+
}
|
|
546
|
+
}
|
|
488
547
|
function normalizeVcMeetingAgentRecord(raw) {
|
|
489
548
|
return raw && typeof raw === 'object' && !Array.isArray(raw)
|
|
490
549
|
? { ...raw }
|
|
@@ -552,6 +611,13 @@ async function reloadVcMeetingBotConfigOnDaemons(appIds) {
|
|
|
552
611
|
* actually applied (not just "requested").
|
|
553
612
|
*/
|
|
554
613
|
async function fetchGrantedScopesForBot(bot) {
|
|
614
|
+
// Core-only (apiOnly) bots have no real Feishu credentials — refuse the raw
|
|
615
|
+
// token/application fetch outright rather than dialing the open platform with
|
|
616
|
+
// a synthetic/empty secret. (Belt-and-suspenders: apiOnly is already excluded
|
|
617
|
+
// from listener options, but a pre-existing VC config could still reach here.)
|
|
618
|
+
if (bot.apiOnly === true) {
|
|
619
|
+
return { ok: false, error: 'api_only_bot_has_no_feishu_credentials' };
|
|
620
|
+
}
|
|
555
621
|
const brand = bot.brand === 'lark' ? 'lark' : 'feishu';
|
|
556
622
|
const openApi = larkHosts(brand).openApi;
|
|
557
623
|
const ac = new AbortController();
|
|
@@ -635,6 +701,18 @@ async function syncVcMeetingListenerBotConfig(listenerBotAppId, previousListener
|
|
|
635
701
|
const prevAppId = previousListenerBotAppId?.trim() || null;
|
|
636
702
|
if (!nextAppId && !prevAppId)
|
|
637
703
|
return { ok: true };
|
|
704
|
+
// Defense-in-depth: even though the settings validator rejects apiOnly, guard
|
|
705
|
+
// the sync entry too so no caller reaches automateOpenPlatformSetup / the
|
|
706
|
+
// open-platform raw fetches for a core-only bot.
|
|
707
|
+
if (nextAppId) {
|
|
708
|
+
try {
|
|
709
|
+
const bot = loadBotConfigs().find(b => b.larkAppId === nextAppId);
|
|
710
|
+
if (bot?.apiOnly === true) {
|
|
711
|
+
return { ok: false, error: 'vcMeetingAgent_listenerBot_api_only' };
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
catch { /* fall through to normal errors below */ }
|
|
715
|
+
}
|
|
638
716
|
// Require lark-cli >= MIN_LARK_CLI_VERSION_FOR_VC_BOT for VC bot meeting commands
|
|
639
717
|
// (vc +meeting-join/events/message-send --as bot). Earlier versions silently reject
|
|
640
718
|
// `--as bot` with "this command only supports: user", so the listener bot can
|
|
@@ -862,6 +940,8 @@ function resolveDashboardSettings() {
|
|
|
862
940
|
recommendedRef: TRAEX_RECOMMENDED_REF,
|
|
863
941
|
},
|
|
864
942
|
codexRpcInput: dashboard.codexRpcInput === true, // default OFF until live-verified
|
|
943
|
+
// default ON — only an explicit stored false disables (matches config.ts getter)
|
|
944
|
+
bypassCodexHookTrust: dashboard.bypassCodexHookTrust !== false,
|
|
865
945
|
codexNotifier: {
|
|
866
946
|
enabled: codexNotifier.enabled,
|
|
867
947
|
targetBotAppId: codexNotifier.targetBotAppId ?? null,
|
|
@@ -875,6 +955,16 @@ function resolveDashboardSettings() {
|
|
|
875
955
|
workerOnline: isCodexNotifierWorkerStateFresh(codexNotifierState),
|
|
876
956
|
lastError: codexNotifierState?.lastError ?? null,
|
|
877
957
|
},
|
|
958
|
+
hostOverloadAlert: {
|
|
959
|
+
enabled: global.hostOverloadAlert?.enabled === true,
|
|
960
|
+
targetBotAppId: global.hostOverloadAlert?.targetBotAppId ?? null,
|
|
961
|
+
enterLoadRatio: global.hostOverloadAlert?.enterLoadRatio ?? DEFAULT_OVERLOAD_THRESHOLDS.enterLoadRatio,
|
|
962
|
+
enterMemUsedFrac: global.hostOverloadAlert?.enterMemUsedFrac ?? DEFAULT_OVERLOAD_THRESHOLDS.enterMemUsedFrac,
|
|
963
|
+
botOptions: hostOverloadAlertBotOptions(),
|
|
964
|
+
targetDaemonOnline: !!global.hostOverloadAlert?.targetBotAppId
|
|
965
|
+
&& registry.list().some(bot => bot.larkAppId === global.hostOverloadAlert?.targetBotAppId),
|
|
966
|
+
},
|
|
967
|
+
noVisibleOutputHint: dashboard.noVisibleOutputHint === true, // default OFF; opt-in anti-resend guidance
|
|
878
968
|
vcMeetingAgent: {
|
|
879
969
|
enabled: global.vcMeetingAgent?.enabled !== false,
|
|
880
970
|
listenerBotAppId: global.vcMeetingAgent?.listenerBotAppId ?? null,
|
|
@@ -904,6 +994,7 @@ const settingsWriteApplierDeps = defaultSettingsWriteApplierDeps(resolveDashboar
|
|
|
904
994
|
settingsWriteApplierDeps.syncVcMeetingListenerBotConfig = syncVcMeetingListenerBotConfig;
|
|
905
995
|
settingsWriteApplierDeps.validateVcMeetingListenerBotAppId = validateVcMeetingListenerBotAppId;
|
|
906
996
|
settingsWriteApplierDeps.validateCodexNotifierTargetBotAppId = validateCodexNotifierTargetBotAppId;
|
|
997
|
+
settingsWriteApplierDeps.validateHostOverloadAlertTargetBotAppId = validateHostOverloadAlertTargetBotAppId;
|
|
907
998
|
/** Helper to render a {status, body} HandlerResult through `res`. */
|
|
908
999
|
function writeHandlerResult(res, result) {
|
|
909
1000
|
const headers = { 'content-type': 'application/json', ...(result.headers ?? {}) };
|
|
@@ -1787,8 +1878,33 @@ async function createTeamGroup(args) {
|
|
|
1787
1878
|
// Only auto-invite the web user when their paired bot is the creator (open_id
|
|
1788
1879
|
// is scoped to that app); otherwise create the group but don't forward a
|
|
1789
1880
|
// wrong-scope open_id — UI will flag autoInviteUnavailable.
|
|
1790
|
-
|
|
1791
|
-
|
|
1881
|
+
// Two DISTINCT predicates — conflating them regressed federation:
|
|
1882
|
+
// • isNoTransportBot: a bot with no Feishu transport (core-only apiOnly).
|
|
1883
|
+
// Checked from LOCAL config AND, for a remote federated bot, from the
|
|
1884
|
+
// aggregated roster's `larkTransportEnabled === false` (propagated
|
|
1885
|
+
// spoke→sync→store→roster). undefined/absent (legacy spoke) → normal.
|
|
1886
|
+
// Does NOT require local-registry presence, so a remote normal bot stays.
|
|
1887
|
+
// • canBeCreator: creator must be a locally-online daemon AND have transport
|
|
1888
|
+
// (getBotClient throws for apiOnly). Remote bots can be members, not creator.
|
|
1889
|
+
let noTransportRosterIds = new Set();
|
|
1890
|
+
try {
|
|
1891
|
+
noTransportRosterIds = new Set(buildFederatedRoster(config.session.dataDir, undefined, undefined, undefined, liveBots())
|
|
1892
|
+
.bots.filter(b => b.larkTransportEnabled === false).map(b => b.larkAppId));
|
|
1893
|
+
}
|
|
1894
|
+
catch { /* roster unavailable → rely on local config only */ }
|
|
1895
|
+
const isNoTransportBot = (id) => {
|
|
1896
|
+
if (noTransportRosterIds.has(id))
|
|
1897
|
+
return true;
|
|
1898
|
+
try {
|
|
1899
|
+
return loadBotConfigs().find(b => b.larkAppId === id)?.apiOnly === true;
|
|
1900
|
+
}
|
|
1901
|
+
catch {
|
|
1902
|
+
return false;
|
|
1903
|
+
}
|
|
1904
|
+
};
|
|
1905
|
+
const canBeCreator = (id) => !!registry.getByAppId(id) && !isNoTransportBot(id);
|
|
1906
|
+
const plan = planGroupCreator(selectedIds, args.preferredCreator, canBeCreator, (ids) => {
|
|
1907
|
+
const p = pickCreatorForGroup(ids.filter(canBeCreator), (id) => {
|
|
1792
1908
|
const d = registry.getByAppId(id);
|
|
1793
1909
|
return d ? { larkAppId: d.larkAppId, resolvedAllowedUsers: d.resolvedAllowedUsers ?? [] } : undefined;
|
|
1794
1910
|
});
|
|
@@ -1798,12 +1914,16 @@ async function createTeamGroup(args) {
|
|
|
1798
1914
|
return { ok: false, error: 'no_online_daemon' };
|
|
1799
1915
|
const userOpenIds = plan.inviteUser && args.userOpenId ? [args.userOpenId] : [];
|
|
1800
1916
|
try {
|
|
1917
|
+
// Exclude ONLY apiOnly bots from the member payload (they have no Feishu
|
|
1918
|
+
// identity to invite). Federation remote NORMAL bots stay — the fix for the
|
|
1919
|
+
// creator-predicate regression that also dropped them.
|
|
1920
|
+
const memberIds = selectedIds.filter(id => !isNoTransportBot(id));
|
|
1801
1921
|
const upstream = await proxyToDaemon(plan.creatorLarkAppId, '/api/groups/create', {
|
|
1802
1922
|
method: 'POST',
|
|
1803
1923
|
headers: { 'content-type': 'application/json' },
|
|
1804
1924
|
body: JSON.stringify(buildTeamGroupCreatePayload({
|
|
1805
1925
|
name: args.name,
|
|
1806
|
-
larkAppIds:
|
|
1926
|
+
larkAppIds: memberIds,
|
|
1807
1927
|
userOpenIds,
|
|
1808
1928
|
ownerUnionIds: args.ownerUnionIds ?? [],
|
|
1809
1929
|
transferOwnerUnionId: args.transferOwnerUnionId,
|
|
@@ -1930,7 +2050,7 @@ async function buildGroupsMatrix() {
|
|
|
1930
2050
|
return;
|
|
1931
2051
|
const j = await r.json();
|
|
1932
2052
|
for (const c of j.chats ?? []) {
|
|
1933
|
-
const { oncallChat, firstSeenAt, hasRole, observedBotNames, ...chatBase } = c;
|
|
2053
|
+
const { oncallChat, firstSeenAt, hasRole, hasMessageListener, observedBotNames, ...chatBase } = c;
|
|
1934
2054
|
const cur = out.get(c.chatId) ?? {
|
|
1935
2055
|
...chatBase,
|
|
1936
2056
|
memberBots: [],
|
|
@@ -1947,6 +2067,7 @@ async function buildGroupsMatrix() {
|
|
|
1947
2067
|
inChat: true,
|
|
1948
2068
|
oncallChat: oncallChat ?? null,
|
|
1949
2069
|
hasRole: hasRole ?? false,
|
|
2070
|
+
hasMessageListener: hasMessageListener ?? false,
|
|
1950
2071
|
});
|
|
1951
2072
|
if (typeof firstSeenAt === 'number') {
|
|
1952
2073
|
cur._firstSeenAt = cur._firstSeenAt === null
|
|
@@ -1962,7 +2083,7 @@ async function buildGroupsMatrix() {
|
|
|
1962
2083
|
const present = new Set(c.memberBots.map((mb) => mb.larkAppId));
|
|
1963
2084
|
for (const b of onlineBots) {
|
|
1964
2085
|
if (!present.has(b.larkAppId)) {
|
|
1965
|
-
c.memberBots.push({ larkAppId: b.larkAppId, botName: b.botName, cliId: b.cliId, inChat: false, oncallChat: null, hasRole: false });
|
|
2086
|
+
c.memberBots.push({ larkAppId: b.larkAppId, botName: b.botName, cliId: b.cliId, inChat: false, oncallChat: null, hasRole: false, hasMessageListener: false });
|
|
1966
2087
|
}
|
|
1967
2088
|
}
|
|
1968
2089
|
}
|
|
@@ -3650,28 +3771,6 @@ const server = createServer(async (req, res) => {
|
|
|
3650
3771
|
res.end(await upstream.text());
|
|
3651
3772
|
return;
|
|
3652
3773
|
}
|
|
3653
|
-
// Sandbox landing: review the clone's diff (GET) then apply/discard (POST).
|
|
3654
|
-
if (req.method === 'GET' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/sandbox-diff$/))) {
|
|
3655
|
-
const sid = decodeURIComponent(m[1]);
|
|
3656
|
-
const owner = aggregator.ownerOf(sid);
|
|
3657
|
-
if (!owner)
|
|
3658
|
-
return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
|
|
3659
|
-
const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/sandbox-diff`, { method: 'GET' });
|
|
3660
|
-
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3661
|
-
res.end(await upstream.text());
|
|
3662
|
-
return;
|
|
3663
|
-
}
|
|
3664
|
-
if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/sandbox-land\/(apply|discard)$/))) {
|
|
3665
|
-
const sid = decodeURIComponent(m[1]);
|
|
3666
|
-
const action = m[2];
|
|
3667
|
-
const owner = aggregator.ownerOf(sid);
|
|
3668
|
-
if (!owner)
|
|
3669
|
-
return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
|
|
3670
|
-
const upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/sandbox-land/${action}`, { method: 'POST' });
|
|
3671
|
-
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3672
|
-
res.end(await upstream.text());
|
|
3673
|
-
return;
|
|
3674
|
-
}
|
|
3675
3774
|
if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/schedules\/([^/]+)\/(run|pause|resume|delivery)$/))) {
|
|
3676
3775
|
const id = decodeURIComponent(m[1]);
|
|
3677
3776
|
const op = m[2];
|
|
@@ -3832,6 +3931,82 @@ const server = createServer(async (req, res) => {
|
|
|
3832
3931
|
return;
|
|
3833
3932
|
}
|
|
3834
3933
|
}
|
|
3934
|
+
// ─── Message listeners (proxy to daemon) ───────────────────────────────
|
|
3935
|
+
// GET /api/message-listeners/:larkAppId/:chatId
|
|
3936
|
+
// PUT /api/message-listeners/:larkAppId/:chatId
|
|
3937
|
+
// DELETE /api/message-listeners/:larkAppId/:chatId
|
|
3938
|
+
// POST /api/message-listeners/:larkAppId/:chatId/(preview|run-preview)
|
|
3939
|
+
// GET /api/message-listeners/:larkAppId/:chatId/run-preview/:runId
|
|
3940
|
+
let mMessageListener;
|
|
3941
|
+
if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)\/run-preview\/([^/]+)$/))) {
|
|
3942
|
+
const larkAppId = decodeURIComponent(mMessageListener[1]);
|
|
3943
|
+
const chatId = decodeURIComponent(mMessageListener[2]);
|
|
3944
|
+
const runId = decodeURIComponent(mMessageListener[3]);
|
|
3945
|
+
if (req.method === 'GET') {
|
|
3946
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}/run-preview/${encodeURIComponent(runId)}`, { method: 'GET' });
|
|
3947
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3948
|
+
res.end(await upstream.text());
|
|
3949
|
+
return;
|
|
3950
|
+
}
|
|
3951
|
+
}
|
|
3952
|
+
if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)\/(preview|run-preview)$/))) {
|
|
3953
|
+
const larkAppId = decodeURIComponent(mMessageListener[1]);
|
|
3954
|
+
const chatId = decodeURIComponent(mMessageListener[2]);
|
|
3955
|
+
const op = mMessageListener[3];
|
|
3956
|
+
if (req.method === 'POST') {
|
|
3957
|
+
const chunks = [];
|
|
3958
|
+
for await (const c of req)
|
|
3959
|
+
chunks.push(c);
|
|
3960
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
3961
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}/${op}`, {
|
|
3962
|
+
method: 'POST',
|
|
3963
|
+
headers: { 'content-type': 'application/json' },
|
|
3964
|
+
body: raw,
|
|
3965
|
+
});
|
|
3966
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3967
|
+
res.end(await upstream.text());
|
|
3968
|
+
return;
|
|
3969
|
+
}
|
|
3970
|
+
}
|
|
3971
|
+
if ((mMessageListener = url.pathname.match(/^\/api\/message-listeners\/([^/]+)\/([^/]+)$/))) {
|
|
3972
|
+
const larkAppId = decodeURIComponent(mMessageListener[1]);
|
|
3973
|
+
const chatId = decodeURIComponent(mMessageListener[2]);
|
|
3974
|
+
if (req.method === 'GET') {
|
|
3975
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, { method: 'GET' });
|
|
3976
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3977
|
+
res.end(await upstream.text());
|
|
3978
|
+
return;
|
|
3979
|
+
}
|
|
3980
|
+
if (req.method === 'PUT') {
|
|
3981
|
+
const chunks = [];
|
|
3982
|
+
for await (const c of req)
|
|
3983
|
+
chunks.push(c);
|
|
3984
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
3985
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, {
|
|
3986
|
+
method: 'PUT',
|
|
3987
|
+
headers: { 'content-type': 'application/json' },
|
|
3988
|
+
body: raw,
|
|
3989
|
+
});
|
|
3990
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3991
|
+
res.end(await upstream.text());
|
|
3992
|
+
return;
|
|
3993
|
+
}
|
|
3994
|
+
if (req.method === 'DELETE') {
|
|
3995
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/message-listeners/${encodeURIComponent(chatId)}`, { method: 'DELETE' });
|
|
3996
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3997
|
+
res.end(await upstream.text());
|
|
3998
|
+
return;
|
|
3999
|
+
}
|
|
4000
|
+
}
|
|
4001
|
+
let mGroupMembersDisplay;
|
|
4002
|
+
if (req.method === 'GET' && (mGroupMembersDisplay = url.pathname.match(/^\/api\/groups\/([^/]+)\/([^/]+)\/members-display$/))) {
|
|
4003
|
+
const larkAppId = decodeURIComponent(mGroupMembersDisplay[1]);
|
|
4004
|
+
const chatId = decodeURIComponent(mGroupMembersDisplay[2]);
|
|
4005
|
+
const upstream = await proxyToDaemon(larkAppId, `/api/groups/${encodeURIComponent(chatId)}/members-display`, { method: 'GET' });
|
|
4006
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4007
|
+
res.end(await upstream.text());
|
|
4008
|
+
return;
|
|
4009
|
+
}
|
|
3835
4010
|
// ─── Profiles (aggregate/proxy to daemon) ─────────────────────────────
|
|
3836
4011
|
// ─── 会议角色预设(私有 API:不在 PUBLIC_READ_PATHS,未认证已被 401) ───
|
|
3837
4012
|
if (url.pathname === '/api/vc-meeting/consumer-profiles') {
|
|
@@ -4334,7 +4509,7 @@ const server = createServer(async (req, res) => {
|
|
|
4334
4509
|
return;
|
|
4335
4510
|
}
|
|
4336
4511
|
// PUT /api/bots/:appId/backend-type — proxy to that bot's daemon. Body
|
|
4337
|
-
// `{ backendType: 'pty'|'tmux'|'herdr'|'zellij'|'' }` ('' / 'auto' clears the override).
|
|
4512
|
+
// `{ backendType: 'pty'|'tmux'|'herdr'|'zellij'|'zmx'|'' }` ('' / 'auto' clears the override).
|
|
4338
4513
|
let mBotBackendType;
|
|
4339
4514
|
if (req.method === 'PUT' && (mBotBackendType = url.pathname.match(/^\/api\/bots\/([^/]+)\/backend-type$/))) {
|
|
4340
4515
|
const appId = decodeURIComponent(mBotBackendType[1]);
|
|
@@ -5038,6 +5213,10 @@ function startPlatformTunnelIfBound() {
|
|
|
5038
5213
|
const binding = readPlatformBinding();
|
|
5039
5214
|
if (!binding)
|
|
5040
5215
|
return;
|
|
5216
|
+
if (!activeToken) {
|
|
5217
|
+
activeToken = loadOrCreatePersistedToken(TOKEN_PATH);
|
|
5218
|
+
logger.info('[platform-tunnel] 已初始化 dashboard token');
|
|
5219
|
+
}
|
|
5041
5220
|
const version = readBotmuxVersion();
|
|
5042
5221
|
platformTunnel = startPlatformTunnelClient({
|
|
5043
5222
|
binding,
|