botmux 3.13.0 → 3.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +1 -1
- package/README.md +25 -1
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/adopt-route.d.ts +58 -0
- package/dist/adapters/adopt-route.d.ts.map +1 -1
- package/dist/adapters/adopt-route.js +136 -0
- package/dist/adapters/adopt-route.js.map +1 -1
- package/dist/adapters/backend/capabilities.js +1 -1
- package/dist/adapters/backend/capabilities.js.map +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +2 -1
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +97 -0
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +380 -66
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +8 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +16 -2
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +12 -13
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +113 -53
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +34 -3
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +72 -9
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +7 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts +2 -3
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +6 -13
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts +2 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +6 -3
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zmx-backend.js +40 -18
- package/dist/adapters/backend/zmx-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +12 -1
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +3 -2
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +13 -1
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/dsh.d.ts +4 -0
- package/dist/adapters/cli/dsh.d.ts.map +1 -0
- package/dist/adapters/cli/dsh.js +100 -0
- package/dist/adapters/cli/dsh.js.map +1 -0
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +5 -0
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts +52 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +117 -76
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/opencode2.d.ts +4 -0
- package/dist/adapters/cli/opencode2.d.ts.map +1 -0
- package/dist/adapters/cli/opencode2.js +137 -0
- package/dist/adapters/cli/opencode2.js.map +1 -0
- package/dist/adapters/cli/pi.d.ts +14 -1
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +21 -1
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +1 -1
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +5 -2
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +7 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +19 -6
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +41 -23
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +28 -3
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-command.d.ts +8 -0
- package/dist/adapters/hook-command.d.ts.map +1 -1
- package/dist/adapters/hook-command.js +11 -0
- package/dist/adapters/hook-command.js.map +1 -1
- package/dist/adapters/hook-installer.d.ts +16 -1
- package/dist/adapters/hook-installer.d.ts.map +1 -1
- package/dist/adapters/hook-installer.js +232 -2
- package/dist/adapters/hook-installer.js.map +1 -1
- package/dist/bot-registry.d.ts +138 -8
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +76 -4
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/pm2-start-transaction.d.ts +14 -0
- package/dist/cli/pm2-start-transaction.d.ts.map +1 -1
- package/dist/cli/pm2-start-transaction.js +25 -9
- package/dist/cli/pm2-start-transaction.js.map +1 -1
- package/dist/cli/restart-failure-notification.d.ts +54 -0
- package/dist/cli/restart-failure-notification.d.ts.map +1 -0
- package/dist/cli/restart-failure-notification.js +142 -0
- package/dist/cli/restart-failure-notification.js.map +1 -0
- package/dist/cli/restart-failure-owner.d.ts +20 -0
- package/dist/cli/restart-failure-owner.d.ts.map +1 -0
- package/dist/cli/restart-failure-owner.js +27 -0
- package/dist/cli/restart-failure-owner.js.map +1 -0
- package/dist/cli/restart-shutdown-preflight.d.ts +24 -0
- package/dist/cli/restart-shutdown-preflight.d.ts.map +1 -0
- package/dist/cli/restart-shutdown-preflight.js +105 -0
- package/dist/cli/restart-shutdown-preflight.js.map +1 -0
- package/dist/cli/send-dispatch.d.ts +26 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +30 -0
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli.d.ts +4 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +673 -402
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +38 -15
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/codex-rpc-lifecycle.d.ts +14 -2
- package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
- package/dist/codex-rpc-lifecycle.js +13 -3
- package/dist/codex-rpc-lifecycle.js.map +1 -1
- package/dist/core/ask-broker.d.ts +3 -0
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +29 -7
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/ask-hook/registry.d.ts.map +1 -1
- package/dist/core/ask-hook/registry.js +4 -0
- package/dist/core/ask-hook/registry.js.map +1 -1
- package/dist/core/ask-types.d.ts +5 -1
- package/dist/core/ask-types.d.ts.map +1 -1
- package/dist/core/ask-types.js.map +1 -1
- package/dist/core/browser-restart.d.ts +112 -0
- package/dist/core/browser-restart.d.ts.map +1 -0
- package/dist/core/browser-restart.js +233 -0
- package/dist/core/browser-restart.js.map +1 -0
- package/dist/core/command-discovery.d.ts.map +1 -1
- package/dist/core/command-discovery.js +4 -1
- package/dist/core/command-discovery.js.map +1 -1
- package/dist/core/command-handler.d.ts +19 -11
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +237 -43
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/current-turn-provenance.d.ts.map +1 -1
- package/dist/core/current-turn-provenance.js +7 -27
- package/dist/core/current-turn-provenance.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +359 -11
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dispatch-registry.d.ts.map +1 -1
- package/dist/core/dispatch-registry.js +6 -0
- package/dist/core/dispatch-registry.js.map +1 -1
- package/dist/core/dispatch-report-binding.d.ts +31 -0
- package/dist/core/dispatch-report-binding.d.ts.map +1 -0
- package/dist/core/dispatch-report-binding.js +88 -0
- package/dist/core/dispatch-report-binding.js.map +1 -0
- package/dist/core/doc-comment-prompt.d.ts +2 -0
- package/dist/core/doc-comment-prompt.d.ts.map +1 -1
- package/dist/core/doc-comment-prompt.js +6 -0
- package/dist/core/doc-comment-prompt.js.map +1 -1
- package/dist/core/host-overload-alert.d.ts +25 -1
- package/dist/core/host-overload-alert.d.ts.map +1 -1
- package/dist/core/host-overload-alert.js +69 -8
- package/dist/core/host-overload-alert.js.map +1 -1
- package/dist/core/local-terminal-opener.js +1 -1
- package/dist/core/local-terminal-opener.js.map +1 -1
- package/dist/core/managed-origin-capability.d.ts +7 -6
- package/dist/core/managed-origin-capability.d.ts.map +1 -1
- package/dist/core/managed-origin-capability.js +32 -1
- package/dist/core/managed-origin-capability.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +3 -2
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/plugins/materializer.d.ts.map +1 -1
- package/dist/core/plugins/materializer.js +1 -0
- package/dist/core/plugins/materializer.js.map +1 -1
- package/dist/core/producer-quiescence.d.ts +70 -0
- package/dist/core/producer-quiescence.d.ts.map +1 -0
- package/dist/core/producer-quiescence.js +90 -0
- package/dist/core/producer-quiescence.js.map +1 -0
- package/dist/core/raw-command-write-options.d.ts +10 -0
- package/dist/core/raw-command-write-options.d.ts.map +1 -0
- package/dist/core/raw-command-write-options.js +23 -0
- package/dist/core/raw-command-write-options.js.map +1 -0
- package/dist/core/raw-command-writer.d.ts +4 -0
- package/dist/core/raw-command-writer.d.ts.map +1 -1
- package/dist/core/raw-command-writer.js +15 -6
- package/dist/core/raw-command-writer.js.map +1 -1
- package/dist/core/reply-target.d.ts +11 -0
- package/dist/core/reply-target.d.ts.map +1 -1
- package/dist/core/reply-target.js +22 -7
- package/dist/core/reply-target.js.map +1 -1
- package/dist/core/report-session-relay.d.ts +53 -0
- package/dist/core/report-session-relay.d.ts.map +1 -0
- package/dist/core/report-session-relay.js +116 -0
- package/dist/core/report-session-relay.js.map +1 -0
- package/dist/core/session-discovery.d.ts +5 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +13 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-group-birth.d.ts +7 -0
- package/dist/core/session-group-birth.d.ts.map +1 -0
- package/dist/core/session-group-birth.js +145 -0
- package/dist/core/session-group-birth.js.map +1 -0
- package/dist/core/session-manager.d.ts +16 -21
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +140 -21
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills/frontmatter.d.ts.map +1 -1
- package/dist/core/skills/frontmatter.js +6 -1
- package/dist/core/skills/frontmatter.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +18 -3
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +18 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +63 -11
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +262 -21
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +33 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +904 -147
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +20 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +86 -1
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +9 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +5 -1
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +27 -3
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/feedback-analytics-api.d.ts +6 -0
- package/dist/dashboard/feedback-analytics-api.d.ts.map +1 -0
- package/dist/dashboard/feedback-analytics-api.js +39 -0
- package/dist/dashboard/feedback-analytics-api.js.map +1 -0
- package/dist/dashboard/session-action-timeout.d.ts +3 -0
- package/dist/dashboard/session-action-timeout.d.ts.map +1 -0
- package/dist/dashboard/session-action-timeout.js +12 -0
- package/dist/dashboard/session-action-timeout.js.map +1 -0
- package/dist/dashboard/vc-consumer-profiles-api.d.ts +9 -3
- package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.js +2 -1
- package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +48 -5
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +368 -36
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +8 -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/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +1 -0
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/feedback-page.d.ts +3 -0
- package/dist/dashboard/web/feedback-page.d.ts.map +1 -0
- package/dist/dashboard/web/feedback-page.js +34 -0
- package/dist/dashboard/web/feedback-page.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +7 -2
- 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 +122 -22
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +4 -2
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation-page.js +26 -2
- package/dist/dashboard/web/team-federation-page.js.map +1 -1
- package/dist/dashboard/web/team-federation.d.ts +19 -0
- package/dist/dashboard/web/team-federation.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation.js +3 -0
- package/dist/dashboard/web/team-federation.js.map +1 -1
- package/dist/dashboard/web/update-action.d.ts +8 -0
- package/dist/dashboard/web/update-action.d.ts.map +1 -1
- package/dist/dashboard/web/update-action.js +10 -0
- package/dist/dashboard/web/update-action.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.js +58 -9
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +10 -0
- package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +1 -0
- package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-6JTZJRQJ.js → chunk-VMWNR3SV.js} +15 -15
- package/dist/dashboard-web/chunks/{chunk-CU4SUKK3.js → chunk-Z7B3E3US.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-5QJB24I2.js → chunk-Z7DO42GJ.js} +1 -1
- package/dist/dashboard-web/chunks/connectors-page-CPH6VVFY.js +1 -0
- package/dist/dashboard-web/chunks/feedback-page-J2FKQ3LK.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-EVGGJI5L.js → insights-page-A2LWTKJD.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-HRGR2ENP.js → monitor-room-2YR752E3.js} +1 -1
- package/dist/dashboard-web/chunks/monitoring-page-BGYSKZGM.js +2 -0
- package/dist/dashboard-web/chunks/office-page-ZZHTEAE4.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-YUC4YLJG.js +1 -0
- package/dist/dashboard-web/chunks/schedules-page-2L2NKTDJ.js +1 -0
- package/dist/dashboard-web/chunks/{sessions-page-DXBCDWCS.js → sessions-page-DYZZMKFL.js} +1 -1
- package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-2QAVB2SA.js → skills-page-DQPBBI3T.js} +2 -2
- package/dist/dashboard-web/chunks/team-federation-page-LQKLDV4K.js +1 -0
- package/dist/dashboard-web/chunks/{v3-page-AY35LKCX.js → v3-page-RVKQIMAP.js} +1 -1
- package/dist/dashboard-web/chunks/whiteboards-page-S5K55HRZ.js +1 -0
- package/dist/dashboard-web/style.css +35 -0
- package/dist/dashboard.js +210 -13
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/shared/shell-path-probes.d.ts +1 -1
- package/dist/desktop/shared/shell-path-probes.js +2 -2
- package/dist/desktop/shared/shell-path-probes.js.map +1 -1
- package/dist/dsh-runner.d.ts +3 -0
- package/dist/dsh-runner.d.ts.map +1 -0
- package/dist/dsh-runner.js +673 -0
- package/dist/dsh-runner.js.map +1 -0
- package/dist/global-config.d.ts +24 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +35 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +39 -31
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +39 -31
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts +3 -1
- package/dist/im/lark/ask-card.d.ts.map +1 -1
- package/dist/im/lark/ask-card.js +61 -5
- package/dist/im/lark/ask-card.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +13 -6
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +2 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +145 -5
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +18 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +41 -28
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +18 -0
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +21 -0
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
- package/dist/im/lark/relay-target-routing.js +3 -2
- package/dist/im/lark/relay-target-routing.js.map +1 -1
- package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
- package/dist/im/lark/reply-mode-command.js +19 -8
- package/dist/im/lark/reply-mode-command.js.map +1 -1
- package/dist/im/lark/skill-feedback-card.d.ts +15 -0
- package/dist/im/lark/skill-feedback-card.d.ts.map +1 -0
- package/dist/im/lark/skill-feedback-card.js +149 -0
- package/dist/im/lark/skill-feedback-card.js.map +1 -0
- package/dist/services/bot-config-store.d.ts +10 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +103 -3
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +29 -7
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +58 -16
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/codex-reasoning-effort.d.ts +9 -0
- package/dist/services/codex-reasoning-effort.d.ts.map +1 -0
- package/dist/services/codex-reasoning-effort.js +23 -0
- package/dist/services/codex-reasoning-effort.js.map +1 -0
- package/dist/services/codex-service-tier.d.ts +1 -1
- package/dist/services/codex-service-tier.d.ts.map +1 -1
- package/dist/services/codex-transcript.d.ts +9 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +13 -6
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/feed-group-tagger.d.ts +15 -0
- package/dist/services/feed-group-tagger.d.ts.map +1 -0
- package/dist/services/feed-group-tagger.js +348 -0
- package/dist/services/feed-group-tagger.js.map +1 -0
- package/dist/services/feedback-analytics.d.ts +82 -0
- package/dist/services/feedback-analytics.d.ts.map +1 -0
- package/dist/services/feedback-analytics.js +95 -0
- package/dist/services/feedback-analytics.js.map +1 -0
- package/dist/services/feedback-outbox.d.ts +24 -0
- package/dist/services/feedback-outbox.d.ts.map +1 -0
- package/dist/services/feedback-outbox.js +12 -0
- package/dist/services/feedback-outbox.js.map +1 -0
- package/dist/services/feedback-policy-resolver.d.ts +56 -0
- package/dist/services/feedback-policy-resolver.d.ts.map +1 -0
- package/dist/services/feedback-policy-resolver.js +156 -0
- package/dist/services/feedback-policy-resolver.js.map +1 -0
- package/dist/services/feedback-policy.d.ts +41 -0
- package/dist/services/feedback-policy.d.ts.map +1 -0
- package/dist/services/feedback-policy.js +102 -0
- package/dist/services/feedback-policy.js.map +1 -0
- package/dist/services/feedback-webhook-dispatcher.d.ts +76 -0
- package/dist/services/feedback-webhook-dispatcher.d.ts.map +1 -0
- package/dist/services/feedback-webhook-dispatcher.js +237 -0
- package/dist/services/feedback-webhook-dispatcher.js.map +1 -0
- package/dist/services/grant-prefs-store.d.ts +3 -0
- package/dist/services/grant-prefs-store.d.ts.map +1 -1
- package/dist/services/grant-prefs-store.js +30 -1
- package/dist/services/grant-prefs-store.js.map +1 -1
- package/dist/services/groups-store.d.ts +14 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +23 -0
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +2 -0
- package/dist/services/local-cli-opener.js.map +1 -1
- package/dist/services/peer-cross-ref-store.d.ts +8 -0
- package/dist/services/peer-cross-ref-store.d.ts.map +1 -0
- package/dist/services/peer-cross-ref-store.js +95 -0
- package/dist/services/peer-cross-ref-store.js.map +1 -0
- package/dist/services/pi-transcript.d.ts.map +1 -1
- package/dist/services/pi-transcript.js +10 -6
- package/dist/services/pi-transcript.js.map +1 -1
- package/dist/services/prompt-context-store.d.ts +29 -0
- package/dist/services/prompt-context-store.d.ts.map +1 -0
- package/dist/services/prompt-context-store.js +205 -0
- package/dist/services/prompt-context-store.js.map +1 -0
- package/dist/services/session-group-avatar.d.ts +6 -0
- package/dist/services/session-group-avatar.d.ts.map +1 -0
- package/dist/services/session-group-avatar.js +96 -0
- package/dist/services/session-group-avatar.js.map +1 -0
- package/dist/services/session-group-title.d.ts +47 -0
- package/dist/services/session-group-title.d.ts.map +1 -0
- package/dist/services/session-group-title.js +226 -0
- package/dist/services/session-group-title.js.map +1 -0
- package/dist/services/session-groups-store.d.ts +30 -0
- package/dist/services/session-groups-store.d.ts.map +1 -0
- package/dist/services/session-groups-store.js +132 -0
- package/dist/services/session-groups-store.js.map +1 -0
- package/dist/services/session-store.d.ts +58 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +174 -0
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/skill-feedback-store.d.ts +252 -0
- package/dist/services/skill-feedback-store.d.ts.map +1 -0
- package/dist/services/skill-feedback-store.js +795 -0
- package/dist/services/skill-feedback-store.js.map +1 -0
- package/dist/services/skill-registry-store.d.ts +23 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +93 -7
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/structured-bridge-clis.d.ts +13 -4
- package/dist/services/structured-bridge-clis.d.ts.map +1 -1
- package/dist/services/structured-bridge-clis.js +13 -3
- package/dist/services/structured-bridge-clis.js.map +1 -1
- package/dist/services/team-store.d.ts +4 -0
- package/dist/services/team-store.d.ts.map +1 -1
- package/dist/services/team-store.js +16 -0
- package/dist/services/team-store.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +32 -4
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +116 -8
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +1 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +2 -2
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/turn-completion-events.d.ts +57 -0
- package/dist/services/turn-completion-events.d.ts.map +1 -0
- package/dist/services/turn-completion-events.js +179 -0
- package/dist/services/turn-completion-events.js.map +1 -0
- package/dist/services/vc-meeting-consumer-isolation.d.ts +21 -12
- package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -1
- package/dist/services/vc-meeting-consumer-isolation.js +25 -19
- package/dist/services/vc-meeting-consumer-isolation.js.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +8 -2
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js +18 -10
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +6 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/cli-availability.d.ts +2 -1
- package/dist/setup/cli-availability.d.ts.map +1 -1
- package/dist/setup/cli-availability.js +2 -1
- package/dist/setup/cli-availability.js.map +1 -1
- package/dist/setup/cli-selection.d.ts +8 -0
- package/dist/setup/cli-selection.d.ts.map +1 -1
- package/dist/setup/cli-selection.js +31 -0
- package/dist/setup/cli-selection.js.map +1 -1
- package/dist/setup/ensure-fonts.d.ts +5 -0
- package/dist/setup/ensure-fonts.d.ts.map +1 -1
- package/dist/setup/ensure-fonts.js +26 -1
- package/dist/setup/ensure-fonts.js.map +1 -1
- package/dist/setup/lark-scopes.json +3 -1
- package/dist/setup/open-platform-automation.d.ts +1 -1
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +15 -3
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/skills/definitions.d.ts +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +9 -2
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +11 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +1 -1
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/user-token.d.ts +38 -0
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +76 -1
- package/dist/utils/user-token.js.map +1 -1
- package/dist/utils/web-terminal-scroll.d.ts +27 -0
- package/dist/utils/web-terminal-scroll.d.ts.map +1 -0
- package/dist/utils/web-terminal-scroll.js +60 -0
- package/dist/utils/web-terminal-scroll.js.map +1 -0
- package/dist/vc-agent/polling-source.d.ts +70 -0
- package/dist/vc-agent/polling-source.d.ts.map +1 -1
- package/dist/vc-agent/polling-source.js +115 -0
- package/dist/vc-agent/polling-source.js.map +1 -1
- package/dist/worker.js +469 -86
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +22 -22
- package/dist/workflows/events/payloads.d.ts +8 -8
- package/dist/workflows/events/schema.d.ts +20 -20
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
- package/package.json +5 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-NQJFJ45Z.js +0 -10
- package/dist/dashboard-web/chunks/chunk-KEEYQ3WF.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-HADHZXXZ.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +0 -8
- package/dist/dashboard-web/chunks/monitoring-page-LBU7TTTW.js +0 -2
- package/dist/dashboard-web/chunks/office-page-DF6RRBMN.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-ZB6QH2EX.js +0 -1
- package/dist/dashboard-web/chunks/roles-page-ZBZGHIIF.js +0 -1
- package/dist/dashboard-web/chunks/schedules-page-NQVQC3QY.js +0 -1
- package/dist/dashboard-web/chunks/settings-page-E7NN4NVQ.js +0 -2
- package/dist/dashboard-web/chunks/team-federation-page-VGWL53AE.js +0 -1
- package/dist/dashboard-web/chunks/whiteboards-page-BNWUU4KG.js +0 -1
package/dist/dashboard.js
CHANGED
|
@@ -11,7 +11,7 @@ import { logger } from './utils/logger.js';
|
|
|
11
11
|
import { gracefulProcessExitCode } from './pm2-graceful-exit.js';
|
|
12
12
|
import { config, isWildcardBindHost } from './config.js';
|
|
13
13
|
import { listenWithProbe } from './utils/listen-with-probe.js';
|
|
14
|
-
import { parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, rotatePersistedToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
|
|
14
|
+
import { parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, rotatePersistedToken, loadDashboardSecret, loadOrCreateDashboardSecret, describeDashboardTokenError, } from './dashboard/auth.js';
|
|
15
15
|
import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
|
|
16
16
|
import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
|
|
17
17
|
import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
|
|
@@ -28,6 +28,8 @@ import { handleDashboardTriggerApi } from './dashboard/trigger-api.js';
|
|
|
28
28
|
import { handleConnectorApi } from './dashboard/connector-api.js';
|
|
29
29
|
import { redactGroupsForPublic, redactSchedulesForPublic, redactSessionEventForPublic, redactSessionsForPublic, redactSettingsForPublic, } from './dashboard/public-redact.js';
|
|
30
30
|
import { handleWebhookRoute } from './dashboard/webhook-routes.js';
|
|
31
|
+
import { handleFeedbackAnalyticsApi } from './dashboard/feedback-analytics-api.js';
|
|
32
|
+
import { FeedbackAnalyticsService } from './services/feedback-analytics.js';
|
|
31
33
|
import { handleFederationApi } from './dashboard/federation-api.js';
|
|
32
34
|
import { buildFederatedRoster } from './services/federation-roster.js';
|
|
33
35
|
import { resolveLiveBotTransport } from './services/team-roster.js';
|
|
@@ -54,6 +56,7 @@ import { detectGlobalInstallManager, formatGlobalInstallCommand, resolveGlobalIn
|
|
|
54
56
|
import { filterCliRuntimeUpdateEntriesForTargets, listCliRuntimeUpdateEntries, selectCodexRuntimeUpdateTargets, } from './core/cli-runtime-update.js';
|
|
55
57
|
import { claimRestartLease, clearRestartIntent, clearRestartLease, hasActiveRestartLease, writeManualIntentIfAbsent, writeRestartIntent, } from './services/restart-intent-store.js';
|
|
56
58
|
import { withFileLock } from './utils/file-lock.js';
|
|
59
|
+
import { evaluateRestartShutdownPreflight } from './cli/restart-shutdown-preflight.js';
|
|
57
60
|
import { spawn } from 'node:child_process';
|
|
58
61
|
import { applySettingsWrite, defaultSettingsWriteApplierDeps, hasResolvedCodexNotifierRecipient, resolveCodexNotifierRecipientView, } from './dashboard/settings-write-applier.js';
|
|
59
62
|
import { addBotsToGroup, bindOncall, disbandGroup, leaveGroup, unbindOncall, } from './dashboard/groups-action-helpers.js';
|
|
@@ -61,8 +64,9 @@ import { createDaemonInternalApi } from './dashboard/daemon-internal-api.js';
|
|
|
61
64
|
import { listTeamReports, readTeamBoard, setTeamBoardEntry } from './services/team-board-store.js';
|
|
62
65
|
import { createCliAdapterSync } from './adapters/cli/registry.js';
|
|
63
66
|
import { hd2dAssetPath, hd2dStatus, startHd2dDownload } from './dashboard/hd2d-assets.js';
|
|
64
|
-
import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
|
|
67
|
+
import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, sweepStoreTrash, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
|
|
65
68
|
import { readSkillPackRegistry } from './services/skill-pack-store.js';
|
|
69
|
+
import { dashboardSessionActionTimeoutMs } from './dashboard/session-action-timeout.js';
|
|
66
70
|
import { cloneSkillPack, createSkillPack, deleteSkillPack, getSkillPack, listSkillPacks, updateSkillPack, SkillPackStoreError, } from './services/skill-pack-store.js';
|
|
67
71
|
import { redactGitUrlCredentials } from './core/skills/sources.js';
|
|
68
72
|
import { enrichPackForDashboard, enrichPacksForDashboard, sanitizeSkillForDashboard, } from './dashboard/skill-pack-response.js';
|
|
@@ -618,11 +622,19 @@ function vcMeetingConsumerProfilesApiDeps() {
|
|
|
618
622
|
return false;
|
|
619
623
|
}
|
|
620
624
|
},
|
|
621
|
-
|
|
625
|
+
managedSideEffectEligible: bot => evaluateVcMeetingConsumerIsolation({
|
|
622
626
|
sandbox: bot.sandbox,
|
|
623
627
|
platform: process.platform,
|
|
624
628
|
backendType: resolvePairedSpawnBackendType(bot.cliId ?? config.daemon.cliId, undefined, bot.backendType, config.daemon.backendType),
|
|
625
629
|
}).ok,
|
|
630
|
+
sandboxIsolated: bot => {
|
|
631
|
+
const decision = evaluateVcMeetingConsumerIsolation({
|
|
632
|
+
sandbox: bot.sandbox,
|
|
633
|
+
platform: process.platform,
|
|
634
|
+
backendType: resolvePairedSpawnBackendType(bot.cliId ?? config.daemon.cliId, undefined, bot.backendType, config.daemon.backendType),
|
|
635
|
+
});
|
|
636
|
+
return decision.ok && decision.isolated;
|
|
637
|
+
},
|
|
626
638
|
reloadDaemons: reloadVcMeetingBotConfigOnDaemons,
|
|
627
639
|
};
|
|
628
640
|
}
|
|
@@ -1898,6 +1910,8 @@ function configuredBotAgentFields() {
|
|
|
1898
1910
|
cliPathOverride: b.cliRuntime ? undefined : b.cliPathOverride,
|
|
1899
1911
|
wrapperCli: b.wrapperCli,
|
|
1900
1912
|
model: b.model,
|
|
1913
|
+
reasoningEffort: b.reasoningEffort,
|
|
1914
|
+
turnTimeoutMs: b.turnTimeoutMs,
|
|
1901
1915
|
}]));
|
|
1902
1916
|
}
|
|
1903
1917
|
catch {
|
|
@@ -1914,6 +1928,8 @@ function withConfiguredCliId(bot, ids) {
|
|
|
1914
1928
|
cliPathOverride: bot.cliPathOverride || fallback?.cliPathOverride,
|
|
1915
1929
|
wrapperCli: bot.wrapperCli || fallback?.wrapperCli,
|
|
1916
1930
|
model: bot.model || fallback?.model,
|
|
1931
|
+
reasoningEffort: bot.reasoningEffort || fallback?.reasoningEffort,
|
|
1932
|
+
turnTimeoutMs: bot.turnTimeoutMs ?? fallback?.turnTimeoutMs,
|
|
1917
1933
|
};
|
|
1918
1934
|
}
|
|
1919
1935
|
function liveBots() {
|
|
@@ -2317,7 +2333,7 @@ function dashboardSkillCliIds() {
|
|
|
2317
2333
|
const ids = new Set();
|
|
2318
2334
|
// Always scan all known CLI skill dirs, not just configured bots — users may
|
|
2319
2335
|
// want to discover codex/trae/... skills even before creating a bot for them.
|
|
2320
|
-
const allCliIds = ['claude-code', 'seed', 'relay', 'aiden', 'coco', 'codex', 'codex-app', 'cursor', 'gemini', 'genius', 'opencode', 'antigravity', 'mtr', 'hermes', 'mira', 'mir', 'traex', 'pi', 'copilot', 'oh-my-pi', 'kimi', 'grok', 'kiro-cli', 'riff'];
|
|
2336
|
+
const allCliIds = ['claude-code', 'seed', 'relay', 'aiden', 'coco', 'codex', 'codex-app', 'cursor', 'gemini', 'genius', 'opencode', 'opencode2', 'antigravity', 'mtr', 'hermes', 'mira', 'mir', 'traex', 'pi', 'copilot', 'oh-my-pi', 'kimi', 'grok', 'kiro-cli', 'riff', 'reasonix', 'dsh'];
|
|
2321
2337
|
for (const cliId of allCliIds)
|
|
2322
2338
|
ids.add(cliId);
|
|
2323
2339
|
try {
|
|
@@ -2533,6 +2549,10 @@ const dashboardSummaryEndpoint = createDashboardSummaryEndpoint({
|
|
|
2533
2549
|
logger.warn(`[dashboard-summary] live snapshot unavailable: ${error instanceof Error ? error.message : String(error)}`);
|
|
2534
2550
|
},
|
|
2535
2551
|
});
|
|
2552
|
+
let feedbackAnalyticsService;
|
|
2553
|
+
function analyticsService() {
|
|
2554
|
+
return feedbackAnalyticsService ??= new FeedbackAnalyticsService(config.session.dataDir);
|
|
2555
|
+
}
|
|
2536
2556
|
const server = createServer(async (req, res) => {
|
|
2537
2557
|
try {
|
|
2538
2558
|
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
@@ -2614,6 +2634,45 @@ const server = createServer(async (req, res) => {
|
|
|
2614
2634
|
if (await daemonInternalApi.handle(req, res, url)) {
|
|
2615
2635
|
return;
|
|
2616
2636
|
}
|
|
2637
|
+
// OAuth 回调接收页(/oauth/callback)— 也在 cookie/token gate 之前:飞书
|
|
2638
|
+
// authorize 跳回来的浏览器请求不带 dashboard token(redirect_uri 固定),
|
|
2639
|
+
// 挡在门外用户就只能回到人肉贴 URL 的旧流程。安全面:URL 里只有一次性
|
|
2640
|
+
// code + 随机 state;处理方仍要求 state 命中某个 daemon 进程的 pending
|
|
2641
|
+
// 表(5 分钟过期、一次即焚)并用 app_secret 换 token——本页面自身不持有
|
|
2642
|
+
// 任何敏感能力,等价于把「用户手工回贴」自动化。
|
|
2643
|
+
if (req.method === 'GET' && url.pathname === '/oauth/callback') {
|
|
2644
|
+
const page = (title, body, ok) => {
|
|
2645
|
+
res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
|
|
2646
|
+
res.end(`<!doctype html><meta name="viewport" content="width=device-width,initial-scale=1"><title>${title}</title><body style="font-family:system-ui;display:flex;align-items:center;justify-content:center;min-height:90vh;background:#f5f6f8"><div style="text-align:center;padding:32px 40px;background:#fff;border-radius:16px;box-shadow:0 4px 24px rgba(0,0,0,.08)"><div style="font-size:56px">${ok ? '✅' : '❌'}</div><h2 style="margin:12px 0 8px">${title}</h2><p style="color:#666;max-width:420px">${body}</p></div></body>`);
|
|
2647
|
+
};
|
|
2648
|
+
if (!url.searchParams.get('code') || !url.searchParams.get('state')) {
|
|
2649
|
+
page('回调参数缺失', '未收到授权码。请回到 Dashboard 重新发起授权。', false);
|
|
2650
|
+
return;
|
|
2651
|
+
}
|
|
2652
|
+
// state 只在生成链接的那个 daemon 进程内存里,逐个询问在线 daemon。
|
|
2653
|
+
let outcome = null;
|
|
2654
|
+
for (const d of registry.list()) {
|
|
2655
|
+
try {
|
|
2656
|
+
const r = await fetchDaemonIpc(d.ipcPort, '/api/oauth-callback', {
|
|
2657
|
+
method: 'POST',
|
|
2658
|
+
headers: { 'content-type': 'application/json' },
|
|
2659
|
+
body: JSON.stringify({ url: url.toString() }),
|
|
2660
|
+
});
|
|
2661
|
+
const j = await r.json().catch(() => null);
|
|
2662
|
+
if (j?.matched) {
|
|
2663
|
+
outcome = { ok: !!j.ok, message: String(j.message ?? '') };
|
|
2664
|
+
break;
|
|
2665
|
+
}
|
|
2666
|
+
}
|
|
2667
|
+
catch { /* daemon offline mid-iteration — try the next */ }
|
|
2668
|
+
}
|
|
2669
|
+
if (!outcome) {
|
|
2670
|
+
page('授权未完成', '没有找到等待中的授权请求(可能已超时,链接有效期 5 分钟)。请回到 Dashboard 重新点击授权。', false);
|
|
2671
|
+
return;
|
|
2672
|
+
}
|
|
2673
|
+
page(outcome.ok ? '授权完成' : '授权失败', outcome.ok ? '已完成授权,本页可以关闭。回到 Dashboard 即可看到状态更新。' : outcome.message, outcome.ok);
|
|
2674
|
+
return;
|
|
2675
|
+
}
|
|
2617
2676
|
// CLI rotate (HMAC + loopback only) — for `botmux dashboard rotate`.
|
|
2618
2677
|
// Publish the new token only after a durable write succeeds.
|
|
2619
2678
|
if (req.method === 'POST' && url.pathname === '/__cli/rotate') {
|
|
@@ -2626,7 +2685,7 @@ const server = createServer(async (req, res) => {
|
|
|
2626
2685
|
}
|
|
2627
2686
|
catch (e) {
|
|
2628
2687
|
logger.warn(`[dashboard] Failed to persist token to ${TOKEN_PATH}: ${e.message}`);
|
|
2629
|
-
return jsonRes(res, 500,
|
|
2688
|
+
return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
|
|
2630
2689
|
}
|
|
2631
2690
|
}
|
|
2632
2691
|
// CLI get-or-create URL (HMAC + loopback only). Existing links survive
|
|
@@ -2641,7 +2700,7 @@ const server = createServer(async (req, res) => {
|
|
|
2641
2700
|
}
|
|
2642
2701
|
catch (e) {
|
|
2643
2702
|
logger.warn(`[dashboard] Failed to ensure token at ${TOKEN_PATH}: ${e.message}`);
|
|
2644
|
-
return jsonRes(res, 500,
|
|
2703
|
+
return jsonRes(res, 500, describeDashboardTokenError('token_persist_failed', e, TOKEN_PATH));
|
|
2645
2704
|
}
|
|
2646
2705
|
}
|
|
2647
2706
|
// CLI read current URL (HMAC + loopback only) — for start/restart hints and
|
|
@@ -2656,7 +2715,7 @@ const server = createServer(async (req, res) => {
|
|
|
2656
2715
|
}
|
|
2657
2716
|
catch (e) {
|
|
2658
2717
|
logger.warn(`[dashboard] Failed to read token from ${TOKEN_PATH}: ${e.message}`);
|
|
2659
|
-
return jsonRes(res, 500,
|
|
2718
|
+
return jsonRes(res, 500, describeDashboardTokenError('token_unavailable', e, TOKEN_PATH));
|
|
2660
2719
|
}
|
|
2661
2720
|
if (!token)
|
|
2662
2721
|
return jsonRes(res, 404, { error: 'no_active_token' });
|
|
@@ -2723,6 +2782,10 @@ const server = createServer(async (req, res) => {
|
|
|
2723
2782
|
message: 'v2 workflow dashboard APIs are retired; use /api/v3/runs for v3 run visibility',
|
|
2724
2783
|
});
|
|
2725
2784
|
}
|
|
2785
|
+
if (url.pathname.startsWith('/api/feedback/analytics/')) {
|
|
2786
|
+
await handleFeedbackAnalyticsApi(req, res, url, { service: analyticsService() });
|
|
2787
|
+
return;
|
|
2788
|
+
}
|
|
2726
2789
|
if (req.method === 'GET' && url.pathname === '/__dev/reload') {
|
|
2727
2790
|
if (!dashboardDevReloadEnabled())
|
|
2728
2791
|
return jsonRes(res, 404, { error: 'dev_reload_disabled' });
|
|
@@ -3323,6 +3386,26 @@ const server = createServer(async (req, res) => {
|
|
|
3323
3386
|
return jsonRes(res, 401, { ok: false, error: 'unauthorized' });
|
|
3324
3387
|
if (updateInFlight)
|
|
3325
3388
|
return jsonRes(res, 409, { ok: false, error: 'update_in_flight' });
|
|
3389
|
+
// The real restart runs in a detached `botmux restart` child, whose
|
|
3390
|
+
// shutdown-capability throw would only reach the maintenance-restart log
|
|
3391
|
+
// — the UI would then poll a reconnect that never happens and mislabel it
|
|
3392
|
+
// as "restart is slow". Detect that fail-closed boundary synchronously so
|
|
3393
|
+
// we can return a precise, actionable error instead of firing a restart
|
|
3394
|
+
// that is guaranteed to die silently. A read failure is non-authoritative
|
|
3395
|
+
// and falls through to the existing behavior (never fabricate a block).
|
|
3396
|
+
try {
|
|
3397
|
+
const preflight = evaluateRestartShutdownPreflight();
|
|
3398
|
+
if (preflight.bootstrapRequired) {
|
|
3399
|
+
return jsonRes(res, 409, {
|
|
3400
|
+
ok: false,
|
|
3401
|
+
error: 'bootstrap_shutdown_protocol_required',
|
|
3402
|
+
unsafeDaemons: preflight.unsafeDaemonNames,
|
|
3403
|
+
});
|
|
3404
|
+
}
|
|
3405
|
+
}
|
|
3406
|
+
catch (error) {
|
|
3407
|
+
logger.warn(`[dashboard] restart shutdown-capability preflight unavailable: ${error instanceof Error ? error.message : error}`);
|
|
3408
|
+
}
|
|
3326
3409
|
let body = {};
|
|
3327
3410
|
try {
|
|
3328
3411
|
const parsed = await readJsonBody(req);
|
|
@@ -3403,7 +3486,14 @@ const server = createServer(async (req, res) => {
|
|
|
3403
3486
|
if (req.method === 'GET' && url.pathname === '/api/skills') {
|
|
3404
3487
|
return jsonRes(res, 200, dashboardSkillsPayload());
|
|
3405
3488
|
}
|
|
3406
|
-
|
|
3489
|
+
// Batch skill removal. POST /api/skills/remove is the canonical route the
|
|
3490
|
+
// dashboard UI calls: the payload (names[], force) must travel in the body,
|
|
3491
|
+
// and DELETE bodies are dropped by the platform dashboard proxy (it assumes
|
|
3492
|
+
// DELETE carries no body, forwards content-length but never pipes the bytes,
|
|
3493
|
+
// so readJsonBody hangs until the outer gateway returns 504). DELETE
|
|
3494
|
+
// /api/skills stays as an alias for direct/scripted callers.
|
|
3495
|
+
if ((req.method === 'DELETE' && url.pathname === '/api/skills')
|
|
3496
|
+
|| (req.method === 'POST' && url.pathname === '/api/skills/remove')) {
|
|
3407
3497
|
let parsed;
|
|
3408
3498
|
try {
|
|
3409
3499
|
parsed = await readJsonBody(req);
|
|
@@ -3970,7 +4060,25 @@ const server = createServer(async (req, res) => {
|
|
|
3970
4060
|
const owner = aggregator.ownerOf(sid);
|
|
3971
4061
|
if (!owner)
|
|
3972
4062
|
return jsonRes(res, 404, { ok: false, error: 'unknown_session' });
|
|
3973
|
-
|
|
4063
|
+
// Defensive client-side deadline: the daemon side of every op here replies
|
|
4064
|
+
// promptly (close resolves its fence on the worker's flushed ACK; restart/
|
|
4065
|
+
// resume/start return after a fire-and-forget IPC). Close gets a separate
|
|
4066
|
+
// 60s budget because Riff's 23s remote-cancel prepare and 29s worker-kill
|
|
4067
|
+
// backstop are serialized; all other actions stay bounded at 15s.
|
|
4068
|
+
let upstream;
|
|
4069
|
+
try {
|
|
4070
|
+
upstream = await proxyToDaemon(owner, `/api/sessions/${sid}/${op}`, {
|
|
4071
|
+
method: 'POST',
|
|
4072
|
+
signal: AbortSignal.timeout(dashboardSessionActionTimeoutMs(op)),
|
|
4073
|
+
});
|
|
4074
|
+
}
|
|
4075
|
+
catch (err) {
|
|
4076
|
+
const timedOut = err?.name === 'TimeoutError' || err?.name === 'AbortError';
|
|
4077
|
+
return jsonRes(res, timedOut ? 504 : 502, {
|
|
4078
|
+
ok: false,
|
|
4079
|
+
error: timedOut ? 'daemon_timeout' : (err?.message ?? String(err)),
|
|
4080
|
+
});
|
|
4081
|
+
}
|
|
3974
4082
|
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3975
4083
|
res.end(await upstream.text());
|
|
3976
4084
|
return;
|
|
@@ -4635,6 +4743,8 @@ const server = createServer(async (req, res) => {
|
|
|
4635
4743
|
: d.cliPathOverride,
|
|
4636
4744
|
wrapperCli: j.wrapperCli || d.wrapperCli,
|
|
4637
4745
|
model: j.model || d.model,
|
|
4746
|
+
reasoningEffort: j.reasoningEffort || d.reasoningEffort,
|
|
4747
|
+
turnTimeoutMs: typeof j.turnTimeoutMs === 'number' ? j.turnTimeoutMs : d.turnTimeoutMs,
|
|
4638
4748
|
}, j);
|
|
4639
4749
|
}
|
|
4640
4750
|
catch (e) {
|
|
@@ -4804,6 +4914,35 @@ const server = createServer(async (req, res) => {
|
|
|
4804
4914
|
res.end(await upstream.text());
|
|
4805
4915
|
return;
|
|
4806
4916
|
}
|
|
4917
|
+
let mBotFeedback;
|
|
4918
|
+
if (req.method === 'PUT' && (mBotFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback$/))) {
|
|
4919
|
+
const appId = decodeURIComponent(mBotFeedback[1]);
|
|
4920
|
+
const chunks = [];
|
|
4921
|
+
for await (const c of req)
|
|
4922
|
+
chunks.push(c);
|
|
4923
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
4924
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-feedback`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: raw });
|
|
4925
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4926
|
+
res.end(await upstream.text());
|
|
4927
|
+
return;
|
|
4928
|
+
}
|
|
4929
|
+
const mChatFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/chats\/([^/]+)\/feedback$/);
|
|
4930
|
+
if (req.method === 'PUT' && mChatFeedback) {
|
|
4931
|
+
const chunks = [];
|
|
4932
|
+
for await (const c of req)
|
|
4933
|
+
chunks.push(c);
|
|
4934
|
+
const upstream = await proxyToDaemon(decodeURIComponent(mChatFeedback[1]), `/api/chat-feedback/${encodeURIComponent(decodeURIComponent(mChatFeedback[2]))}`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: Buffer.concat(chunks).toString('utf8') || '{}' });
|
|
4935
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4936
|
+
res.end(await upstream.text());
|
|
4937
|
+
return;
|
|
4938
|
+
}
|
|
4939
|
+
const mEffectiveFeedback = url.pathname.match(/^\/api\/bots\/([^/]+)\/feedback\/effective$/);
|
|
4940
|
+
if (req.method === 'GET' && mEffectiveFeedback) {
|
|
4941
|
+
const upstream = await proxyToDaemon(decodeURIComponent(mEffectiveFeedback[1]), `/api/feedback-effective${url.search}`, { method: 'GET' });
|
|
4942
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4943
|
+
res.end(await upstream.text());
|
|
4944
|
+
return;
|
|
4945
|
+
}
|
|
4807
4946
|
// PUT /api/bots/:appId/env — proxy to that bot's daemon. Body
|
|
4808
4947
|
// `{ env: string }` (raw JSON text; '' = clear).
|
|
4809
4948
|
let mBotEnv;
|
|
@@ -5008,9 +5147,37 @@ const server = createServer(async (req, res) => {
|
|
|
5008
5147
|
res.end(await upstream.text());
|
|
5009
5148
|
return;
|
|
5010
5149
|
}
|
|
5150
|
+
// 会话群标签授权(Dashboard 一站式):GET status / POST auth-link,
|
|
5151
|
+
// 均代理到对应 bot 的 daemon(state 必须驻留在生成链接的进程内)。
|
|
5152
|
+
let mBotTagAuth;
|
|
5153
|
+
if (mBotTagAuth = url.pathname.match(/^\/api\/bots\/([^/]+)\/session-group-tag-(status|auth|config)$/)) {
|
|
5154
|
+
const appId = decodeURIComponent(mBotTagAuth[1]);
|
|
5155
|
+
const kind = mBotTagAuth[2];
|
|
5156
|
+
const methodOk = (kind === 'status' && req.method === 'GET')
|
|
5157
|
+
|| (kind === 'auth' && req.method === 'POST')
|
|
5158
|
+
|| (kind === 'config' && req.method === 'PUT');
|
|
5159
|
+
if (methodOk) {
|
|
5160
|
+
let body;
|
|
5161
|
+
if (req.method !== 'GET') {
|
|
5162
|
+
const chunks = [];
|
|
5163
|
+
for await (const c of req)
|
|
5164
|
+
chunks.push(c);
|
|
5165
|
+
body = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
5166
|
+
}
|
|
5167
|
+
const upstream = await proxyToDaemon(appId, `/api/session-group-tag-${kind}`, {
|
|
5168
|
+
method: req.method,
|
|
5169
|
+
headers: { 'content-type': 'application/json' },
|
|
5170
|
+
...(body !== undefined ? { body } : {}),
|
|
5171
|
+
});
|
|
5172
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
5173
|
+
res.end(await upstream.text());
|
|
5174
|
+
return;
|
|
5175
|
+
}
|
|
5176
|
+
}
|
|
5011
5177
|
// PUT /api/bots/:appId/p2p-mode — proxy to that bot's daemon. Body
|
|
5012
|
-
// `{ p2pMode: 'chat' | 'thread' }` ('thread' = per-message DM
|
|
5013
|
-
//
|
|
5178
|
+
// `{ p2pMode: 'chat' | 'thread' | 'group' }` ('thread' = per-message DM
|
|
5179
|
+
// session; 'group' = per-message dedicated session group; anything else
|
|
5180
|
+
// clears back to the flat continuous chat default).
|
|
5014
5181
|
let mBotP2pMode;
|
|
5015
5182
|
if (req.method === 'PUT' && (mBotP2pMode = url.pathname.match(/^\/api\/bots\/([^/]+)\/p2p-mode$/))) {
|
|
5016
5183
|
const appId = decodeURIComponent(mBotP2pMode[1]);
|
|
@@ -5027,6 +5194,25 @@ const server = createServer(async (req, res) => {
|
|
|
5027
5194
|
res.end(await upstream.text());
|
|
5028
5195
|
return;
|
|
5029
5196
|
}
|
|
5197
|
+
// PUT /api/bots/:appId/envelope-injection — proxy to that bot's daemon.
|
|
5198
|
+
// Body `{ envelopeInjection: 'auto'|'off'|'' }` (''/other clears back to
|
|
5199
|
+
// the inline default). #794: hook 注入 per-turn 上下文的 per-bot 开关。
|
|
5200
|
+
let mBotEnvelopeInjection;
|
|
5201
|
+
if (req.method === 'PUT' && (mBotEnvelopeInjection = url.pathname.match(/^\/api\/bots\/([^/]+)\/envelope-injection$/))) {
|
|
5202
|
+
const appId = decodeURIComponent(mBotEnvelopeInjection[1]);
|
|
5203
|
+
const chunks = [];
|
|
5204
|
+
for await (const c of req)
|
|
5205
|
+
chunks.push(c);
|
|
5206
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
5207
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-envelope-injection`, {
|
|
5208
|
+
method: 'PUT',
|
|
5209
|
+
headers: { 'content-type': 'application/json' },
|
|
5210
|
+
body: raw,
|
|
5211
|
+
});
|
|
5212
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
5213
|
+
res.end(await upstream.text());
|
|
5214
|
+
return;
|
|
5215
|
+
}
|
|
5030
5216
|
// PUT /api/bots/:appId/skill-injection — proxy to that bot's daemon. Body
|
|
5031
5217
|
// `{ skillInjection: 'global'|'prompt'|'off'|'' }` (''/other clears back to
|
|
5032
5218
|
// the machine default). Governs how botmux built-in skills reach global-
|
|
@@ -5049,7 +5235,8 @@ const server = createServer(async (req, res) => {
|
|
|
5049
5235
|
}
|
|
5050
5236
|
// PUT /api/bots/:appId/grant-prefs — proxy to that bot's daemon. Body carries
|
|
5051
5237
|
// any subset of `{ restrictGrantCommands?: boolean, autoGrantRequestCards?: boolean,
|
|
5052
|
-
//
|
|
5238
|
+
// p2pOpen?: boolean, messageQuotaDefaultLimit?: number|null,
|
|
5239
|
+
// grantDefaultDurationMs?: number|null }`.
|
|
5053
5240
|
let mBotGrantPrefs;
|
|
5054
5241
|
if (req.method === 'PUT' && (mBotGrantPrefs = url.pathname.match(/^\/api\/bots\/([^/]+)\/grant-prefs$/))) {
|
|
5055
5242
|
const appId = decodeURIComponent(mBotGrantPrefs[1]);
|
|
@@ -5642,6 +5829,9 @@ listenWithProbe({
|
|
|
5642
5829
|
logger.warn(`[dashboard] Failed to persist port to ${PORT_PATH}: ${e.message}`);
|
|
5643
5830
|
}
|
|
5644
5831
|
logger.info(`[dashboard] listening on ${config.dashboard.host}:${port}`);
|
|
5832
|
+
// Reclaim any `.trash-*` skill trees left by an interrupted background unlink
|
|
5833
|
+
// (crash/restart mid-delete). Best-effort and fire-and-forget.
|
|
5834
|
+
sweepStoreTrash();
|
|
5645
5835
|
startPlatformTunnelIfBound();
|
|
5646
5836
|
}).catch((err) => {
|
|
5647
5837
|
logger.error(`[dashboard] could not bind near ${config.dashboard.host}:${config.dashboard.port} after probing — set BOTMUX_DASHBOARD_PORT to a free port. ${err.message}`);
|
|
@@ -5751,8 +5941,14 @@ function startPlatformTunnelIfBound() {
|
|
|
5751
5941
|
if (!binding)
|
|
5752
5942
|
return;
|
|
5753
5943
|
const existingToken = currentDashboardToken();
|
|
5754
|
-
|
|
5944
|
+
// An already-materialized dashboard token is sufficient to start the
|
|
5945
|
+
// tunnel. Avoid re-validating its path via secureHostFilePath(): on Linux
|
|
5946
|
+
// the request-time read is descriptor-pinned, while deployments whose HOME
|
|
5947
|
+
// is a root-owned symlink (common on managed dev hosts) can make the
|
|
5948
|
+
// path-returning helper fail even though the 0600 file is safely readable.
|
|
5949
|
+
// Only the first token creation needs the path+lock helper.
|
|
5755
5950
|
if (!existingToken) {
|
|
5951
|
+
loadOrCreatePersistedToken(TOKEN_PATH);
|
|
5756
5952
|
logger.info('[platform-tunnel] 已初始化 dashboard token');
|
|
5757
5953
|
}
|
|
5758
5954
|
const version = readBotmuxVersion();
|
|
@@ -5910,6 +6106,7 @@ function shutdown() {
|
|
|
5910
6106
|
resourceMonitor.stop();
|
|
5911
6107
|
platformTunnel?.stop();
|
|
5912
6108
|
debugTerminalManager.shutdown();
|
|
6109
|
+
feedbackAnalyticsService?.close();
|
|
5913
6110
|
if (oauthCallbackServer.listening)
|
|
5914
6111
|
oauthCallbackServer.close();
|
|
5915
6112
|
server.close(() => process.exit(gracefulProcessExitCode()));
|