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/bot-registry.js
CHANGED
|
@@ -11,6 +11,21 @@ import { sanitizePerBotEnv } from './core/per-bot-env.js';
|
|
|
11
11
|
import { normalizeSubstituteMode } from './services/substitute-mode-normalize.js';
|
|
12
12
|
import { normalizePluginIdList } from './core/plugins/ids.js';
|
|
13
13
|
import { normalizeVcMeetingProfileInstructions } from './services/vc-meeting-profile-instructions.js';
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when any Feishu client is requested for a core-only (`apiOnly`) bot.
|
|
16
|
+
* Defined here (the lowest-level module that owns bot config + client) so both
|
|
17
|
+
* `getBotClient` and higher layers (im/lark/client.ts primitives, doc-comment)
|
|
18
|
+
* throw the SAME typed error without an import cycle. apiOnly = zero Feishu
|
|
19
|
+
* network (reads AND writes); reaching a client request is genuine misuse.
|
|
20
|
+
*/
|
|
21
|
+
export class LarkTransportDisabledError extends Error {
|
|
22
|
+
constructor(larkAppId, op) {
|
|
23
|
+
super(`Feishu transport is disabled for core-only bot ${larkAppId} (attempted: ${op})`);
|
|
24
|
+
this.name = 'LarkTransportDisabledError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Default when a bot sets nothing: usage rides the live streaming card. */
|
|
28
|
+
export const DEFAULT_USAGE_DISPLAY = 'streaming';
|
|
14
29
|
function normalizeChatReplyModeConfig(raw) {
|
|
15
30
|
if (typeof raw !== 'string')
|
|
16
31
|
return undefined;
|
|
@@ -37,6 +52,13 @@ function normalizeContentTriggerScope(raw) {
|
|
|
37
52
|
return 'regularGroup';
|
|
38
53
|
return undefined;
|
|
39
54
|
}
|
|
55
|
+
function normalizeMessageListenerSenderType(raw) {
|
|
56
|
+
if (raw === 'user' || raw === 'human')
|
|
57
|
+
return 'user';
|
|
58
|
+
if (raw === 'bot' || raw === 'app')
|
|
59
|
+
return 'bot';
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
40
62
|
function normalizeNonNegativeInt(raw) {
|
|
41
63
|
if (typeof raw !== 'number')
|
|
42
64
|
return undefined;
|
|
@@ -662,12 +684,88 @@ function normalizeContentTriggers(raw, botIndex) {
|
|
|
662
684
|
});
|
|
663
685
|
return out.length > 0 ? out : undefined;
|
|
664
686
|
}
|
|
687
|
+
function normalizeMessageListenerStringList(raw) {
|
|
688
|
+
const values = normalizeStringList(raw);
|
|
689
|
+
return values.length > 0 ? [...new Set(values)] : undefined;
|
|
690
|
+
}
|
|
691
|
+
function normalizeMessageListenerSenderTypes(raw) {
|
|
692
|
+
if (!Array.isArray(raw))
|
|
693
|
+
return undefined;
|
|
694
|
+
const values = raw
|
|
695
|
+
.map(normalizeMessageListenerSenderType)
|
|
696
|
+
.filter((value) => !!value);
|
|
697
|
+
return values.length > 0 ? [...new Set(values)] : undefined;
|
|
698
|
+
}
|
|
699
|
+
function normalizeMessageListenerConfig(raw, botIndex, chatId) {
|
|
700
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
701
|
+
return undefined;
|
|
702
|
+
const entry = raw;
|
|
703
|
+
const prompt = normalizeNonEmptyString(entry.prompt);
|
|
704
|
+
const enabled = entry.enabled === true;
|
|
705
|
+
if (enabled && !prompt) {
|
|
706
|
+
logger.warn(`Bot config [${botIndex}] messageListeners[${chatId}] ignored: enabled listener requires prompt`);
|
|
707
|
+
return undefined;
|
|
708
|
+
}
|
|
709
|
+
const senderRaw = entry.senderPolicy && typeof entry.senderPolicy === 'object' && !Array.isArray(entry.senderPolicy)
|
|
710
|
+
? entry.senderPolicy
|
|
711
|
+
: {};
|
|
712
|
+
const senderPolicy = {};
|
|
713
|
+
const mode = senderRaw.mode === 'include_only' ? 'include_only' : 'all_except_excluded';
|
|
714
|
+
const includeSenderOpenIds = normalizeMessageListenerStringList(senderRaw.includeSenderOpenIds);
|
|
715
|
+
const excludeSenderOpenIds = normalizeMessageListenerStringList(senderRaw.excludeSenderOpenIds);
|
|
716
|
+
const includeSenderTypes = normalizeMessageListenerSenderTypes(senderRaw.includeSenderTypes);
|
|
717
|
+
const excludeSenderTypes = normalizeMessageListenerSenderTypes(senderRaw.excludeSenderTypes);
|
|
718
|
+
if (mode !== 'all_except_excluded')
|
|
719
|
+
senderPolicy.mode = mode;
|
|
720
|
+
if (includeSenderOpenIds)
|
|
721
|
+
senderPolicy.includeSenderOpenIds = includeSenderOpenIds;
|
|
722
|
+
if (excludeSenderOpenIds)
|
|
723
|
+
senderPolicy.excludeSenderOpenIds = excludeSenderOpenIds;
|
|
724
|
+
if (includeSenderTypes)
|
|
725
|
+
senderPolicy.includeSenderTypes = includeSenderTypes;
|
|
726
|
+
if (excludeSenderTypes)
|
|
727
|
+
senderPolicy.excludeSenderTypes = excludeSenderTypes;
|
|
728
|
+
if (senderRaw.excludeSelf === false)
|
|
729
|
+
senderPolicy.excludeSelf = false;
|
|
730
|
+
const messageRaw = entry.messagePolicy && typeof entry.messagePolicy === 'object' && !Array.isArray(entry.messagePolicy)
|
|
731
|
+
? entry.messagePolicy
|
|
732
|
+
: {};
|
|
733
|
+
const messagePolicy = {};
|
|
734
|
+
const includeMsgTypes = normalizeMessageListenerStringList(messageRaw.includeMsgTypes);
|
|
735
|
+
if (includeMsgTypes)
|
|
736
|
+
messagePolicy.includeMsgTypes = includeMsgTypes;
|
|
737
|
+
messagePolicy.scope = 'top_level';
|
|
738
|
+
return {
|
|
739
|
+
enabled,
|
|
740
|
+
...(normalizeNonEmptyString(entry.name) ? { name: normalizeNonEmptyString(entry.name) } : {}),
|
|
741
|
+
...(normalizeNonEmptyString(entry.replyCardTitle) ? { replyCardTitle: normalizeNonEmptyString(entry.replyCardTitle) } : {}),
|
|
742
|
+
...(normalizeNonEmptyString(entry.workingDir) ? { workingDir: normalizeNonEmptyString(entry.workingDir) } : {}),
|
|
743
|
+
prompt: prompt ?? '',
|
|
744
|
+
...(Object.keys(senderPolicy).length > 0 ? { senderPolicy } : {}),
|
|
745
|
+
...(Object.keys(messagePolicy).length > 0 ? { messagePolicy } : {}),
|
|
746
|
+
replyPolicy: { mode: 'thread', sessionMode: 'per_message' },
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
function normalizeMessageListeners(raw, botIndex) {
|
|
750
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
751
|
+
return undefined;
|
|
752
|
+
const out = {};
|
|
753
|
+
for (const [chatId, listenerRaw] of Object.entries(raw)) {
|
|
754
|
+
if (typeof chatId !== 'string' || !chatId.trim())
|
|
755
|
+
continue;
|
|
756
|
+
const listener = normalizeMessageListenerConfig(listenerRaw, botIndex, chatId.trim());
|
|
757
|
+
if (listener)
|
|
758
|
+
out[chatId.trim()] = listener;
|
|
759
|
+
}
|
|
760
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
761
|
+
}
|
|
665
762
|
const bots = new Map();
|
|
666
763
|
export function __testOnly_resetBotRegistry() {
|
|
667
764
|
bots.clear();
|
|
668
765
|
loadedConfigPath = undefined;
|
|
669
766
|
oncallChatCache = null;
|
|
670
767
|
brandLabelCache = null;
|
|
768
|
+
usageDisplayCache = null;
|
|
671
769
|
}
|
|
672
770
|
// Wire the i18n lookup so `localeForBot()` can resolve per-bot locale without
|
|
673
771
|
// a hard import cycle between `i18n` and `bot-registry`.
|
|
@@ -762,15 +860,45 @@ const larkLogger = {
|
|
|
762
860
|
debug: (...msg) => logger.debug(`[lark] ${fmtLark(msg)}`),
|
|
763
861
|
trace: (..._msg) => { },
|
|
764
862
|
};
|
|
863
|
+
/**
|
|
864
|
+
* Pure predicate: is this bot's VC-meeting-agent config ACTIVE (should the daemon
|
|
865
|
+
* attend meetings / restore VC runtime sessions / poll `lark-cli vc` for it)?
|
|
866
|
+
*
|
|
867
|
+
* Returns the config only when it is `enabled` AND the bot is NOT apiOnly. An
|
|
868
|
+
* apiOnly (core-only) bot has no Feishu connection — attending a VC meeting drives
|
|
869
|
+
* `lark-cli vc +meeting-events --as bot`, which categorically violates the
|
|
870
|
+
* zero-Feishu-network contract. Gating here (rather than only at each call site)
|
|
871
|
+
* means the daemon's central `effectiveVcMeetingAgentConfig` accessor — and every
|
|
872
|
+
* one of its ~24 consumers, including the boot-time `restoreVcMeetingRuntimeSessions`
|
|
873
|
+
* path that runs OUTSIDE the `!cfg.apiOnly` boot block — fail-closes for apiOnly by
|
|
874
|
+
* construction. The dashboard already refuses to SET an apiOnly listener; this also
|
|
875
|
+
* covers a hand-edited / migrated bots.json (a normal VC bot flipped to apiOnly with
|
|
876
|
+
* `vcMeetingAgent.enabled:true` + a stale on-disk runtime record).
|
|
877
|
+
*/
|
|
878
|
+
export function vcMeetingAgentConfigActive(cfg) {
|
|
879
|
+
if (!cfg)
|
|
880
|
+
return undefined;
|
|
881
|
+
if (cfg.apiOnly === true)
|
|
882
|
+
return undefined;
|
|
883
|
+
return cfg.vcMeetingAgent?.enabled === true ? cfg.vcMeetingAgent : undefined;
|
|
884
|
+
}
|
|
765
885
|
export function registerBot(cfg) {
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
886
|
+
// apiOnly (core-only) bots have NO Feishu credential (empty appSecret). The Lark
|
|
887
|
+
// SDK Client ctor throws "appSecret or clientAssertionProvider is required" on an
|
|
888
|
+
// empty secret, so constructing it would fatal the whole daemon at boot — the
|
|
889
|
+
// exact failure riff hit in a clean sandbox. An apiOnly bot never uses the client
|
|
890
|
+
// (getBotClient throws LarkTransportDisabledError first; getAllBotClients filters
|
|
891
|
+
// apiOnly), so leave it null. Zero Feishu transport is the whole contract.
|
|
892
|
+
const client = cfg.apiOnly === true
|
|
893
|
+
? null
|
|
894
|
+
: new Lark.Client({
|
|
895
|
+
appId: cfg.larkAppId,
|
|
896
|
+
appSecret: cfg.larkAppSecret,
|
|
897
|
+
// brand → SDK domain。缺省走 feishu,国际版租户走 larksuite.com。
|
|
898
|
+
// 这一行同时修好了所有经由 SDK 的调用(发消息 / 文件 / contact 等)。
|
|
899
|
+
domain: sdkDomain(normalizeBrand(cfg.brand)),
|
|
900
|
+
logger: larkLogger,
|
|
901
|
+
});
|
|
774
902
|
const state = {
|
|
775
903
|
config: cfg,
|
|
776
904
|
client,
|
|
@@ -794,7 +922,25 @@ export function getBot(larkAppId) {
|
|
|
794
922
|
return state;
|
|
795
923
|
}
|
|
796
924
|
export function getBotClient(larkAppId) {
|
|
797
|
-
|
|
925
|
+
const bot = getBot(larkAppId);
|
|
926
|
+
// Bot-level transport boundary at the TRUE shared base. `apiOnly` (core-only)
|
|
927
|
+
// means zero Feishu network — reads AND writes — not merely "no sends". Every
|
|
928
|
+
// Feishu call in the codebase resolves its client here (client.ts primitives,
|
|
929
|
+
// doc-comment drive API, open-platform rename/avatar, identity cache…), so
|
|
930
|
+
// throwing here is the single authoritative gate no caller can bypass. A
|
|
931
|
+
// correctly-built apiOnly flow never reaches this (session/CLI gates fire
|
|
932
|
+
// first); reaching it is genuine misuse and must fail loud, not silently.
|
|
933
|
+
if (bot.config.apiOnly === true) {
|
|
934
|
+
throw new LarkTransportDisabledError(larkAppId, 'getBotClient');
|
|
935
|
+
}
|
|
936
|
+
// Non-apiOnly bots always have a constructed client (registerBot builds one for
|
|
937
|
+
// every non-apiOnly config). The null-guard is defensive — a null here would mean
|
|
938
|
+
// a misconfigured bot slipped the apiOnly gate, which must fail loud, not NPE deep
|
|
939
|
+
// in an SDK call.
|
|
940
|
+
if (!bot.client) {
|
|
941
|
+
throw new Error(`Bot ${larkAppId} has no Lark client (apiOnly misconfiguration)`);
|
|
942
|
+
}
|
|
943
|
+
return bot.client;
|
|
798
944
|
}
|
|
799
945
|
/** Owner = bot 首个已授权 open_id,与「缺权限警告私信对象」同口径(见 admin 解析)。 */
|
|
800
946
|
export function getOwnerOpenId(larkAppId) {
|
|
@@ -941,6 +1087,20 @@ export function isChatOncallBoundForAnyBot(chatId) {
|
|
|
941
1087
|
// Per-bot brand label, mtime-cached for the disk fallback. Keyed by larkAppId →
|
|
942
1088
|
// the configured value (undefined when the bot has no brandLabel key).
|
|
943
1089
|
let brandLabelCache = null;
|
|
1090
|
+
let usageDisplayCache = null;
|
|
1091
|
+
/** Normalize a raw bots.json entry's usage-display intent to the enum, applying
|
|
1092
|
+
* backward compat: an explicit `usageDisplay` wins; otherwise a legacy
|
|
1093
|
+
* `showUsageInCardFooter: false` maps to `'off'`; everything else is the
|
|
1094
|
+
* default (`'streaming'`). Single source of truth for both the in-memory parse
|
|
1095
|
+
* and the disk-fallback resolver so they cannot drift. */
|
|
1096
|
+
export function normalizeUsageDisplay(entry) {
|
|
1097
|
+
if (entry.usageDisplay === 'streaming' || entry.usageDisplay === 'footer' || entry.usageDisplay === 'off') {
|
|
1098
|
+
return entry.usageDisplay;
|
|
1099
|
+
}
|
|
1100
|
+
if (entry.showUsageInCardFooter === false)
|
|
1101
|
+
return 'off';
|
|
1102
|
+
return DEFAULT_USAGE_DISPLAY;
|
|
1103
|
+
}
|
|
944
1104
|
/** Resolve the bots.json path the same way loadBotConfigs does, without
|
|
945
1105
|
* requiring the registry to have been loaded (works in one-shot CLI processes
|
|
946
1106
|
* like `botmux send`). Returns null when no config file exists. */
|
|
@@ -996,6 +1156,46 @@ export function resolveBrandLabel(larkAppId) {
|
|
|
996
1156
|
return undefined;
|
|
997
1157
|
}
|
|
998
1158
|
}
|
|
1159
|
+
/**
|
|
1160
|
+
* Resolve the per-bot usage-display mode (default `'streaming'`). A freshly
|
|
1161
|
+
* loaded registry wins over the spawn-time env so long-lived panes observe
|
|
1162
|
+
* `/botconfig` hot updates; sandboxed/env-only processes carry the value in
|
|
1163
|
+
* their synthetic registered bot and otherwise fall back to the injected env.
|
|
1164
|
+
*/
|
|
1165
|
+
export function resolveUsageDisplay(larkAppId) {
|
|
1166
|
+
const inMem = bots.get(larkAppId);
|
|
1167
|
+
if (inMem)
|
|
1168
|
+
return normalizeUsageDisplay(inMem.config);
|
|
1169
|
+
if (process.env.BOTMUX_LARK_APP_ID === larkAppId
|
|
1170
|
+
&& 'BOTMUX_USAGE_DISPLAY' in process.env) {
|
|
1171
|
+
const env = process.env.BOTMUX_USAGE_DISPLAY;
|
|
1172
|
+
if (env === 'streaming' || env === 'footer' || env === 'off')
|
|
1173
|
+
return env;
|
|
1174
|
+
return DEFAULT_USAGE_DISPLAY;
|
|
1175
|
+
}
|
|
1176
|
+
const path = loadedConfigPath ?? botsConfigDiskPath();
|
|
1177
|
+
if (!path)
|
|
1178
|
+
return DEFAULT_USAGE_DISPLAY;
|
|
1179
|
+
try {
|
|
1180
|
+
const stat = statSync(path);
|
|
1181
|
+
if (!usageDisplayCache || usageDisplayCache.mtimeMs !== stat.mtimeMs) {
|
|
1182
|
+
const raw = JSON.parse(readFileSync(path, 'utf-8'));
|
|
1183
|
+
const map = new Map();
|
|
1184
|
+
if (Array.isArray(raw)) {
|
|
1185
|
+
for (const entry of raw) {
|
|
1186
|
+
if (entry && typeof entry.larkAppId === 'string') {
|
|
1187
|
+
map.set(entry.larkAppId, normalizeUsageDisplay(entry));
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
usageDisplayCache = { mtimeMs: stat.mtimeMs, map };
|
|
1192
|
+
}
|
|
1193
|
+
return usageDisplayCache.map.get(larkAppId) ?? DEFAULT_USAGE_DISPLAY;
|
|
1194
|
+
}
|
|
1195
|
+
catch {
|
|
1196
|
+
return DEFAULT_USAGE_DISPLAY;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
999
1199
|
/**
|
|
1000
1200
|
* 只读 accessor:该 bot 配置的 tuiSlashAllow allowlist(TUI 通用 slash 注入用)。
|
|
1001
1201
|
* 仅读内存态注册表,daemon 进程内使用;无需 bots.json 磁盘回退(不同于
|
|
@@ -1008,10 +1208,55 @@ export function getBotTuiSlashAllow(larkAppId) {
|
|
|
1008
1208
|
* Load bot configurations from one of (in priority order):
|
|
1009
1209
|
* 1. BOTS_CONFIG env var — path to a JSON file
|
|
1010
1210
|
* 2. ~/.botmux/bots.json — default config path
|
|
1211
|
+
* 3. Core-only (BOTMUX_CORE_ONLY=1) with NEITHER of the above present:
|
|
1212
|
+
* synthesize a single apiOnly bot from env — no bots.json / no Feishu creds
|
|
1213
|
+
* (riff's in-sandbox headless service).
|
|
1011
1214
|
*/
|
|
1012
1215
|
export function loadBotConfigs() {
|
|
1216
|
+
const synthetic = maybeSynthesizeCoreOnlyConfig();
|
|
1217
|
+
if (synthetic)
|
|
1218
|
+
return synthetic;
|
|
1013
1219
|
return parseBotConfigFile(resolveBotConfigPath());
|
|
1014
1220
|
}
|
|
1221
|
+
/**
|
|
1222
|
+
* Core-only headless config: when BOTMUX_CORE_ONLY=1, synthesize ONE apiOnly bot
|
|
1223
|
+
* from env so the daemon boots with zero Feishu credentials and no on-disk config.
|
|
1224
|
+
*
|
|
1225
|
+
* Core-only is AUTHORITATIVE about identity and IGNORES all ambient config inputs
|
|
1226
|
+
* — both ~/.botmux/bots.json AND the BOTS_CONFIG env (codex P1-2). Otherwise a
|
|
1227
|
+
* core-only service started on a host that happens to have a real fleet config —
|
|
1228
|
+
* or with an inherited/leaked BOTS_CONFIG — would silently boot a REAL,
|
|
1229
|
+
* transport-enabled Feishu bot (WSClient, real credentials, `--bot` ignored)
|
|
1230
|
+
* instead of the headless apiOnly one, the exact opposite of "no Feishu". There
|
|
1231
|
+
* is deliberately NO file-based override in this mode: the identity is exactly the
|
|
1232
|
+
* one synthesized here (frozen: apiOnly, `local_<slug>`, no secret). Returns null
|
|
1233
|
+
* only when not in core-only mode.
|
|
1234
|
+
*
|
|
1235
|
+
* The synthesized `loadedConfigPath` is pinned to the DEFAULT ~/.botmux/bots.json
|
|
1236
|
+
* path (even though the file is absent/ignored) so the no-transport fs-policy sees
|
|
1237
|
+
* the config as living INSIDE the default botmux authority root — never an external
|
|
1238
|
+
* path or a carve-out, which would trip buildFsPolicy's fail-closed checks.
|
|
1239
|
+
*/
|
|
1240
|
+
function maybeSynthesizeCoreOnlyConfig() {
|
|
1241
|
+
if (process.env.BOTMUX_CORE_ONLY !== '1')
|
|
1242
|
+
return null;
|
|
1243
|
+
const larkAppId = process.env.BOTMUX_API_ONLY_BOT || 'local_riff';
|
|
1244
|
+
if (!/^local_[A-Za-z0-9._-]+$/.test(larkAppId)) {
|
|
1245
|
+
throw new Error(`Core-only BOTMUX_API_ONLY_BOT must match local_<slug> (letters/digits/._-), got: ${larkAppId}`);
|
|
1246
|
+
}
|
|
1247
|
+
const cliId = process.env.BOTMUX_CORE_CLI || 'codex-app';
|
|
1248
|
+
const entry = { larkAppId, apiOnly: true, cliId };
|
|
1249
|
+
if (process.env.BOTMUX_CORE_WORKING_DIR)
|
|
1250
|
+
entry.workingDir = process.env.BOTMUX_CORE_WORKING_DIR;
|
|
1251
|
+
if (process.env.BOTMUX_CORE_MODEL)
|
|
1252
|
+
entry.model = process.env.BOTMUX_CORE_MODEL;
|
|
1253
|
+
// Route through the normal parser so the synthesized entry gets identical
|
|
1254
|
+
// validation + normalization as a file-loaded one (apiOnly secret exemption,
|
|
1255
|
+
// cliId check, defaults). Pin loadedConfigPath to the default in-root path.
|
|
1256
|
+
const configs = parseBotConfigsFromText(JSON.stringify([entry]));
|
|
1257
|
+
loadedConfigPath = resolve(homedir(), '.botmux', 'bots.json');
|
|
1258
|
+
return configs;
|
|
1259
|
+
}
|
|
1015
1260
|
function resolveBotConfigPath() {
|
|
1016
1261
|
// 1. BOTS_CONFIG env var
|
|
1017
1262
|
const botsConfigPath = process.env.BOTS_CONFIG;
|
|
@@ -1163,7 +1408,19 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1163
1408
|
if (!entry.larkAppId || typeof entry.larkAppId !== 'string') {
|
|
1164
1409
|
throw new Error(`Bot config [${i}]: larkAppId is required and must be a string`);
|
|
1165
1410
|
}
|
|
1166
|
-
|
|
1411
|
+
// apiOnly (core-only) bots drive purely over the HTTP control API and never
|
|
1412
|
+
// connect to Feishu, so a real app secret is not required. larkAppId is still
|
|
1413
|
+
// mandatory (daemon identity + dashboard routing + cachedLarkAppId gate); use
|
|
1414
|
+
// a synthetic local id like `local_<slug>`. Normal Feishu bots keep the hard
|
|
1415
|
+
// requirement — a missing secret there is a misconfig, not a headless bot.
|
|
1416
|
+
// The rule for apiOnly is "may be omitted; if present it must still be a
|
|
1417
|
+
// string" — a number/object/array/false must NOT slip into a string field.
|
|
1418
|
+
if (entry.apiOnly === true) {
|
|
1419
|
+
if (entry.larkAppSecret !== undefined && typeof entry.larkAppSecret !== 'string') {
|
|
1420
|
+
throw new Error(`Bot config [${i}]: larkAppSecret must be a string when provided (apiOnly bots may omit it)`);
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
else if (!entry.larkAppSecret || typeof entry.larkAppSecret !== 'string') {
|
|
1167
1424
|
throw new Error(`Bot config [${i}]: larkAppSecret is required and must be a string`);
|
|
1168
1425
|
}
|
|
1169
1426
|
// MOSA-managed onboarding persists the exact App/secret/owner binding so
|
|
@@ -1257,7 +1514,7 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1257
1514
|
if (ids.length > 0)
|
|
1258
1515
|
globalGrants = ids;
|
|
1259
1516
|
}
|
|
1260
|
-
// messageQuota.defaultLimit:仅保留正整数;非法/缺省 → undefined
|
|
1517
|
+
// messageQuota.defaultLimit:仅保留正整数;非法/缺省 → undefined(卡片用产品默认 3 条)。
|
|
1261
1518
|
let messageQuota;
|
|
1262
1519
|
const rawMq = entry.messageQuota;
|
|
1263
1520
|
if (rawMq && typeof rawMq === 'object' && !Array.isArray(rawMq)) {
|
|
@@ -1285,6 +1542,22 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1285
1542
|
if (Object.keys(out).length > 0)
|
|
1286
1543
|
quotaState = out;
|
|
1287
1544
|
}
|
|
1545
|
+
let grantExpiryState;
|
|
1546
|
+
if (entry.grantExpiryState && typeof entry.grantExpiryState === 'object' && !Array.isArray(entry.grantExpiryState)) {
|
|
1547
|
+
const out = {};
|
|
1548
|
+
for (const [k, v] of Object.entries(entry.grantExpiryState)) {
|
|
1549
|
+
if (!/^(chat:.+:.+|global:.+)$/.test(k))
|
|
1550
|
+
continue;
|
|
1551
|
+
if (!v || typeof v !== 'object')
|
|
1552
|
+
continue;
|
|
1553
|
+
const expiresAt = v.expiresAt;
|
|
1554
|
+
if (typeof expiresAt !== 'number' || !Number.isFinite(expiresAt) || expiresAt <= 0)
|
|
1555
|
+
continue;
|
|
1556
|
+
out[k] = { expiresAt };
|
|
1557
|
+
}
|
|
1558
|
+
if (Object.keys(out).length > 0)
|
|
1559
|
+
grantExpiryState = out;
|
|
1560
|
+
}
|
|
1288
1561
|
// customPassthroughCommands:用户额外放行透传的 slash 命令。归一化:转小写、
|
|
1289
1562
|
// 自动补前导 `/`、按 /^\/[a-z0-9][a-z0-9:_-]*$/ 过滤、去重。非法/缺省 → undefined。
|
|
1290
1563
|
// 注意:与 daemon 命令的冲突过滤放在 resolvePassthroughCommands(运行时合并)做,
|
|
@@ -1353,6 +1626,7 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1353
1626
|
: undefined;
|
|
1354
1627
|
const summaryRange = normalizeSummaryRange(entry.summaryRange ?? entry.summary);
|
|
1355
1628
|
const contentTriggers = normalizeContentTriggers(entry.contentTriggers, i);
|
|
1629
|
+
const messageListeners = normalizeMessageListeners(entry.messageListeners, i);
|
|
1356
1630
|
const vcMeetingAgent = normalizeVcMeetingAgentConfig(entry.vcMeetingAgent);
|
|
1357
1631
|
// voice:per-bot 语音引擎覆盖。结构化保留(engine ∈ sami|openai,sami/openai
|
|
1358
1632
|
// 为对象,speaker/rate 透传);非对象或 engine 非法 → undefined。深度校验
|
|
@@ -1381,7 +1655,11 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1381
1655
|
}
|
|
1382
1656
|
configs.push({
|
|
1383
1657
|
larkAppId: entry.larkAppId,
|
|
1384
|
-
|
|
1658
|
+
// apiOnly bots may omit the secret (never used — no Feishu connection);
|
|
1659
|
+
// fall back to '' so downstream env plumbing stays a string. Feishu image
|
|
1660
|
+
// upload etc. already degrade gracefully on an empty secret.
|
|
1661
|
+
larkAppSecret: entry.larkAppSecret ?? '',
|
|
1662
|
+
apiOnly: entry.apiOnly === true || undefined,
|
|
1385
1663
|
// brand:只认精确的 'lark',其余 → undefined(下游 normalizeBrand 当
|
|
1386
1664
|
// feishu)。feishu 故意存成 undefined,保持旧 bots.json 干净、不写死字段。
|
|
1387
1665
|
brand: entry.brand === 'lark' ? 'lark' : undefined,
|
|
@@ -1450,6 +1728,7 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1450
1728
|
p2pOpen: entry.p2pOpen === true || undefined,
|
|
1451
1729
|
messageQuota,
|
|
1452
1730
|
quotaState,
|
|
1731
|
+
grantExpiryState,
|
|
1453
1732
|
restrictGrantCommands: entry.restrictGrantCommands === true || undefined,
|
|
1454
1733
|
// Default is ON, so only explicit false is meaningful/persisted.
|
|
1455
1734
|
autoGrantRequestCards: entry.autoGrantRequestCards === false ? false : undefined,
|
|
@@ -1466,6 +1745,12 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1466
1745
|
// Preserve '' distinctly from undefined: '' means "brand off", undefined
|
|
1467
1746
|
// means "use default botmux brand". Don't trim-to-undefined here.
|
|
1468
1747
|
brandLabel: typeof entry.brandLabel === 'string' ? entry.brandLabel : undefined,
|
|
1748
|
+
// Persist only a non-default usage-display mode; 'streaming' (default) and
|
|
1749
|
+
// an absent key both mean streaming. Legacy showUsageInCardFooter:false is
|
|
1750
|
+
// still honored on read (see normalizeUsageDisplay) but never re-emitted.
|
|
1751
|
+
usageDisplay: normalizeUsageDisplay(entry) === DEFAULT_USAGE_DISPLAY
|
|
1752
|
+
? undefined
|
|
1753
|
+
: normalizeUsageDisplay(entry),
|
|
1469
1754
|
disableStreamingCard: entry.disableStreamingCard === true || undefined,
|
|
1470
1755
|
silentTurnReactions: entry.silentTurnReactions === true || undefined,
|
|
1471
1756
|
receivedReactionEmoji: typeof entry.receivedReactionEmoji === 'string' && entry.receivedReactionEmoji.trim()
|
|
@@ -1492,6 +1777,7 @@ export function parseBotConfigsFromText(jsonText) {
|
|
|
1492
1777
|
? entry.autoStartOnGroupJoinPrompt
|
|
1493
1778
|
: undefined,
|
|
1494
1779
|
autoStartOnNewTopic: entry.autoStartOnNewTopic === true || undefined,
|
|
1780
|
+
messageListeners,
|
|
1495
1781
|
worktreeMultiPicker: entry.worktreeMultiPicker === true || undefined,
|
|
1496
1782
|
// Per-bot regular-group default mode. Default is 'chat-topic' (顶层平铺
|
|
1497
1783
|
// 连续会话;群内原生话题各自独立会话), so only the NON-default modes
|