botmux 3.13.0 → 3.14.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 +4 -3
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +12 -9
- package/dist/adapters/backend/tmux-pipe-backend.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/dsh.d.ts +4 -0
- package/dist/adapters/cli/dsh.d.ts.map +1 -0
- package/dist/adapters/cli/dsh.js +96 -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/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 +13 -0
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +24 -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 +116 -8
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +52 -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 +665 -399
- 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-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 +317 -10
- 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/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 +241 -13
- 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 +900 -137
- 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 +5 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +4 -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 +4 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +273 -36
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +6 -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 +114 -22
- package/dist/dashboard/web/i18n.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-4RENHE7J.js +10 -0
- package/dist/dashboard-web/chunks/chunk-2WQDS65D.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-CU4SUKK3.js → chunk-6O7KXFD2.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-6JTZJRQJ.js → chunk-Q2MT4VWH.js} +15 -15
- package/dist/dashboard-web/chunks/{chunk-5QJB24I2.js → chunk-U3ZFSO7E.js} +1 -1
- package/dist/dashboard-web/chunks/connectors-page-2KZO5KSJ.js +1 -0
- package/dist/dashboard-web/chunks/feedback-page-CLVTOLLO.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-HLASRTSY.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-EVGGJI5L.js → insights-page-4RPU2CRU.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-HRGR2ENP.js → monitor-room-OTKQ2CXK.js} +1 -1
- package/dist/dashboard-web/chunks/monitoring-page-IJPUB6JT.js +2 -0
- package/dist/dashboard-web/chunks/office-page-QSR3J44Y.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-6OK63V4V.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-6NWJMOB5.js +1 -0
- package/dist/dashboard-web/chunks/schedules-page-6I3LNXD4.js +1 -0
- package/dist/dashboard-web/chunks/{sessions-page-DXBCDWCS.js → sessions-page-B2TXGJDO.js} +1 -1
- package/dist/dashboard-web/chunks/settings-page-6KJADSC6.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-2QAVB2SA.js → skills-page-M2Q6L5CB.js} +1 -1
- package/dist/dashboard-web/chunks/team-federation-page-7I7FDE3B.js +1 -0
- package/dist/dashboard-web/chunks/{v3-page-AY35LKCX.js → v3-page-HQXRL65L.js} +1 -1
- package/dist/dashboard-web/chunks/whiteboards-page-LQKC4TAZ.js +1 -0
- package/dist/dashboard-web/style.css +35 -0
- package/dist/dashboard.js +199 -12
- 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 +666 -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 +25 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +25 -6
- 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 +36 -9
- 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 +14 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +15 -0
- 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/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/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 +10 -4
- package/dist/types.d.ts.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 +237 -76
- 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 +1 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current-turn-provenance.d.ts","sourceRoot":"","sources":["../../src/core/current-turn-provenance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"current-turn-provenance.d.ts","sourceRoot":"","sources":["../../src/core/current-turn-provenance.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AA+BD,MAAM,WAAW,mCAAmC;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,mCAAmC,GAC3C,qBAAqB,GAAG,IAAI,CAsE9B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from 'node:path';
|
|
1
|
+
import { readSessionRowCopiesAcrossStores } from '../services/session-store.js';
|
|
3
2
|
import { findAuthenticatedAncestorSessionContext } from './session-marker.js';
|
|
4
3
|
export class CurrentTurnProvenanceError extends Error {
|
|
5
4
|
constructor(message) {
|
|
@@ -11,36 +10,17 @@ function nonEmpty(value) {
|
|
|
11
10
|
return typeof value === 'string' && value.trim().length > 0;
|
|
12
11
|
}
|
|
13
12
|
function readPersistedSession(dataDir, sessionId) {
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
// The scan itself lives in session-store (fail-closed on an unlistable data
|
|
14
|
+
// dir, corrupt individual files skipped so an unrelated bot's bad file can
|
|
15
|
+
// neither block nor impersonate a valid record). The exactly-once policy —
|
|
16
|
+
// a duplicated row must not be used to infer the caller — stays here.
|
|
17
|
+
let matches;
|
|
16
18
|
try {
|
|
17
|
-
|
|
18
|
-
|| (name.startsWith('sessions-') && name.endsWith('.json'))));
|
|
19
|
+
matches = readSessionRowCopiesAcrossStores(sessionId, dataDir);
|
|
19
20
|
}
|
|
20
21
|
catch (err) {
|
|
21
22
|
throw new CurrentTurnProvenanceError(`无法读取 botmux session store:${err instanceof Error ? err.message : String(err)}`);
|
|
22
23
|
}
|
|
23
|
-
for (const file of files) {
|
|
24
|
-
let parsed;
|
|
25
|
-
try {
|
|
26
|
-
parsed = JSON.parse(readFileSync(join(dataDir, file), 'utf-8'));
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
// A corrupt unrelated bot file must not make a valid caller look like a
|
|
30
|
-
// different principal. The target session still has to resolve exactly
|
|
31
|
-
// once from a readable record below.
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
35
|
-
continue;
|
|
36
|
-
const keyed = parsed[sessionId];
|
|
37
|
-
if (!keyed || typeof keyed !== 'object' || Array.isArray(keyed))
|
|
38
|
-
continue;
|
|
39
|
-
const session = keyed;
|
|
40
|
-
if (session.sessionId !== sessionId)
|
|
41
|
-
continue;
|
|
42
|
-
matches.push(session);
|
|
43
|
-
}
|
|
44
24
|
if (matches.length === 0) {
|
|
45
25
|
throw new CurrentTurnProvenanceError(`未找到当前进程所属 session ${sessionId}`);
|
|
46
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"current-turn-provenance.js","sourceRoot":"","sources":["../../src/core/current-turn-provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"current-turn-provenance.js","sourceRoot":"","sources":["../../src/core/current-turn-provenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAe,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,14 @@ import { logger } from '../utils/logger.js';
|
|
|
7
7
|
import { cliAuthBind, verifyHmac } from '../dashboard/auth.js';
|
|
8
8
|
import { WORKFLOW_DAEMON_IPC_ROUTE_PREFIX } from '../workflows/v3/daemon-ipc-auth.js';
|
|
9
9
|
import { V3_SESSION_RUN_MUTATION_ROUTE_PREFIX } from '../workflows/v3/session-relay.js';
|
|
10
|
+
import { REPORT_SESSION_RELAY_ROUTE } from './report-session-relay.js';
|
|
11
|
+
import { DISPATCH_REPORT_REGISTER_ROUTE } from './dispatch-report-binding.js';
|
|
10
12
|
import { listenWithProbe } from '../utils/listen-with-probe.js';
|
|
11
13
|
import { dashboardSecretPath } from './dashboard-secret.js';
|
|
12
14
|
import { MANAGED_ORIGIN_ATTEST_ROUTE, MANAGED_ORIGIN_PROOF_DOMAIN, MANAGED_ORIGIN_PROOF_TTL_MS, writeManagedOriginAttestationProof, } from './managed-origin-attestation.js';
|
|
13
15
|
import * as sessionStore from '../services/session-store.js';
|
|
14
16
|
import { cliSupportsNativeUsage } from '../services/transcript-resolver.js';
|
|
17
|
+
import { codexModelSupportsReasoningEffort, isCodexReasoningCliId, isCodexReasoningEffort, } from '../services/codex-reasoning-effort.js';
|
|
15
18
|
import * as asyncTriggerStore from '../services/async-trigger-store.js';
|
|
16
19
|
import { resolveAsyncTriggerState, decideAsyncOwnership } from '../services/async-trigger-state.js';
|
|
17
20
|
import * as scheduleStore from '../services/schedule-store.js';
|
|
@@ -26,6 +29,7 @@ import { ensureBackendAvailable } from '../services/backend-availability.js';
|
|
|
26
29
|
import * as persistentBackend from './persistent-backend.js';
|
|
27
30
|
import * as cardPrefsStore from '../services/card-prefs-store.js';
|
|
28
31
|
import * as substituteModeStore from '../services/substitute-mode-store.js';
|
|
32
|
+
import { claimPromptContext } from '../services/prompt-context-store.js';
|
|
29
33
|
import { createCliAdapterSync } from '../adapters/cli/registry.js';
|
|
30
34
|
import { normalizeCliRuntimeConfig } from '../adapters/cli/runtime.js';
|
|
31
35
|
import { evaluateReadIsolationGate } from '../adapters/cli/read-isolation.js';
|
|
@@ -61,7 +65,8 @@ import { getDeploymentIdentity } from '../services/deployment-identity.js';
|
|
|
61
65
|
import { getBotUnionId } from '../services/bot-union-ids-store.js';
|
|
62
66
|
import * as grantPrefsStore from '../services/grant-prefs-store.js';
|
|
63
67
|
import { applyExactChatGrantRequest } from '../services/exact-chat-grant.js';
|
|
64
|
-
import { findConfigField, applyConfigField, coerceConfigValue } from '../services/bot-config-store.js';
|
|
68
|
+
import { findConfigField, applyConfigField, coerceConfigValue, setChatFeedbackPolicy } from '../services/bot-config-store.js';
|
|
69
|
+
import { traceFeedbackPolicyForDelivery } from '../services/feedback-policy-resolver.js';
|
|
65
70
|
import { globalBuiltinSkillInjectionDefault, resolveSkillInjectionSupport } from '../skills/injection-mode.js';
|
|
66
71
|
import { summaryRangeFromBotConfig, updateDashboardSummaryRange } from '../services/summary-range-store.js';
|
|
67
72
|
import { config } from '../config.js';
|
|
@@ -124,6 +129,8 @@ export function setSupervisorShutdownHandler(registration) {
|
|
|
124
129
|
}
|
|
125
130
|
import { composeRowFromActive, composeRowFromClosed, composeRowFromPersistedActive, feishuChatLink, setBotName as setRowsBotName, getBotName, } from './dashboard-rows.js';
|
|
126
131
|
import { getBotBrand, getBot, getBotOpenId, loadBotConfigs, readBotSkillPolicy, getBotTuiSlashAllow } from '../bot-registry.js';
|
|
132
|
+
import { generateAuthUrl, tryHandleCallbackUrl, getFeedGroupAuthStatus, FEED_GROUP_OAUTH_SCOPES } from '../utils/user-token.js';
|
|
133
|
+
import { normalizeBrand } from '../im/lark/lark-hosts.js';
|
|
127
134
|
import { normalizeKanbanColumn, normalizeKanbanPosition, normalizeSessionTitle } from './session-board.js';
|
|
128
135
|
import { validateSlashInjection } from './slash-inject.js';
|
|
129
136
|
import { validateRoleLibraryPath } from './role-library.js';
|
|
@@ -136,6 +143,7 @@ import { sessionAnchorId, larkTransportEnabled } from './types.js';
|
|
|
136
143
|
import { isRiffBackendSession } from './persistent-backend.js';
|
|
137
144
|
import { attachSkillPolicy, detachSkillPolicy } from './skills/im-command.js';
|
|
138
145
|
import { readSkillRegistry } from '../services/skill-registry-store.js';
|
|
146
|
+
import { isSessionGroup } from '../services/session-groups-store.js';
|
|
139
147
|
import { commitDeviceIsolationActivation, DEVICE_ISOLATION_COMMIT_PATH, DEVICE_ISOLATION_PREPARE_PATH, DEVICE_ISOLATION_RELEASE_PATH, logDeviceIsolationActivationError, prepareDeviceIsolationActivation, releaseDeviceIsolationActivation, } from './device-isolation-daemon.js';
|
|
140
148
|
// Daemon process start (module load ≈ daemon boot). Used by the SSE snapshot
|
|
141
149
|
// replay to bound the "recently closed" set to sessions that flipped
|
|
@@ -530,10 +538,22 @@ function routeHasNarrowUntrustedAuth(method, pathname) {
|
|
|
530
538
|
// 证明「我是这个会话当前这一轮的 CLI」,选不了别的会话。
|
|
531
539
|
if (method === 'POST' && /^\/api\/sessions\/[^/]+\/(?:slash|cd|close|chat-rename)$/.test(pathname))
|
|
532
540
|
return true;
|
|
541
|
+
// UserPromptSubmit hook 的 envelope claim:沙箱内 hook 读不到 host secret,
|
|
542
|
+
// 走 body 里的 per-turn capability;handler 内 sessionCliIpcAuth 绑定到 URL 的
|
|
543
|
+
// sessionId + 按 managedTurnOrigin.turnId 权威取(同 /close 姿势)。
|
|
544
|
+
if (method === 'POST' && /^\/api\/sessions\/[^/]+\/prompt-ctx\/claim$/.test(pathname))
|
|
545
|
+
return true;
|
|
533
546
|
if (method === 'POST' && pathname === '/api/hooks/emit')
|
|
534
547
|
return true;
|
|
535
548
|
if (method === 'POST' && pathname === '/api/attention')
|
|
536
549
|
return true;
|
|
550
|
+
// A sandboxed report cannot read the host HMAC secret. This narrow route
|
|
551
|
+
// validates the current session's rotating capability, binds the dispatch
|
|
552
|
+
// root server-side, then lets the trusted daemon relay to the orchestrator.
|
|
553
|
+
if (method === 'POST' && pathname === REPORT_SESSION_RELAY_ROUTE)
|
|
554
|
+
return true;
|
|
555
|
+
if (method === 'POST' && pathname === DISPATCH_REPORT_REGISTER_ROUTE)
|
|
556
|
+
return true;
|
|
537
557
|
// macOS read-isolated `botmux send` presents a rotating worker capability;
|
|
538
558
|
// the handler writes the authoritative tuple into a host-owned read-only
|
|
539
559
|
// proof sidecar, so loopback response spoofing cannot confer authority.
|
|
@@ -889,6 +909,44 @@ ipcRoute('POST', '/api/sessions/:sessionId/close', async (req, res, params) => {
|
|
|
889
909
|
jsonRes(res, r.ok ? 200 : 502, r);
|
|
890
910
|
});
|
|
891
911
|
});
|
|
912
|
+
/**
|
|
913
|
+
* Host-side atomic claim/pop for the UserPromptSubmit hook(#794 方向 B)。
|
|
914
|
+
*
|
|
915
|
+
* 沙箱内的 `botmux user-prompt-hook` 不能在 read-only 的 `prompt-ctx/<sid>` 里
|
|
916
|
+
* unlink(HIGH-2),同正文多轮也不能靠 FIFO 猜(HIGH-1:某轮漏 claim 会串轮到
|
|
917
|
+
* 后续轮)。hook 把 (session 凭据 + fingerprint) 提交到这里,宿主按
|
|
918
|
+
* **managedTurnOrigin.turnId 权威 turn 绑定**精确取该轮的 envelope,先删再返回。
|
|
919
|
+
* 漏 claim 只孤儿化自己那条,不污染后续轮;上一轮的 stale sidecar 永远不会被返回。
|
|
920
|
+
*
|
|
921
|
+
* 鉴权与 /close、/slash 同构:trusted-host HMAC,或本会话 rotating per-turn
|
|
922
|
+
* capability(沙箱内读 host secret 失败时的回退)。任何未命中/失败 → 404/403,
|
|
923
|
+
* hook 端空输出 exit 0(fail-open:reminder 丢失 < 卡住 prompt)。
|
|
924
|
+
*/
|
|
925
|
+
ipcRoute('POST', '/api/sessions/:sessionId/prompt-ctx/claim', async (req, res, params) => {
|
|
926
|
+
const body = await readJsonBody(req).catch(() => ({}));
|
|
927
|
+
const ds = findActiveBySessionId(params.sessionId);
|
|
928
|
+
// claim 只读 daemon 自有本轮非凭证上下文(reminder/whiteboard),receiver 会话
|
|
929
|
+
// 也允许(allowReceiver: true);close/slash/cd 等 managed action 仍默认拒绝。
|
|
930
|
+
const auth = sessionCliIpcAuth(req, ds, params.sessionId, body, { allowReceiver: true });
|
|
931
|
+
if (!auth.ok)
|
|
932
|
+
return jsonRes(res, 403, { ok: false, error: auth.error });
|
|
933
|
+
const fingerprint = typeof body?.fingerprint === 'string' ? body.fingerprint : '';
|
|
934
|
+
if (!/^[a-f0-9]{64}$/.test(fingerprint)) {
|
|
935
|
+
return jsonRes(res, 400, { ok: false, error: 'invalid_fingerprint' });
|
|
936
|
+
}
|
|
937
|
+
// 权威 turnId:daemon 当前这轮的 turnId(worker 发布的 managed_turn_origin)。
|
|
938
|
+
// hook 不需要、也不应自己提供 turnId——daemon 只认自己的权威值,避免 FIFO 串轮。
|
|
939
|
+
const turnId = ds?.managedTurnOrigin?.turnId;
|
|
940
|
+
if (!turnId)
|
|
941
|
+
return jsonRes(res, 404, { ok: false, error: 'no_active_turn' });
|
|
942
|
+
const prefix = typeof body?.prefix === 'string' && body.prefix.length > 0
|
|
943
|
+
? body.prefix.slice(0, 64)
|
|
944
|
+
: undefined;
|
|
945
|
+
const envelope = claimPromptContext(params.sessionId, turnId, fingerprint, prefix);
|
|
946
|
+
if (!envelope)
|
|
947
|
+
return jsonRes(res, 404, { ok: false, error: 'not_found' });
|
|
948
|
+
jsonRes(res, 200, { ok: true, envelope });
|
|
949
|
+
});
|
|
892
950
|
// `botmux list` zombie pruning is maintenance, not explicit abandon. Serialize
|
|
893
951
|
// against inbound admission and refuse if any backend-neutral durable owner
|
|
894
952
|
// became unsettled after the CLI took its liveness snapshot.
|
|
@@ -1023,6 +1081,25 @@ ipcRoute('POST', '/api/sessions/:sessionId/suspend', async (_req, res, params) =
|
|
|
1023
1081
|
// already reached, so report idempotent success without a live kill.
|
|
1024
1082
|
return jsonRes(res, 200, { ok: true, sessionId: params.sessionId, suspended: false, reason: 'no_live_worker' });
|
|
1025
1083
|
}
|
|
1084
|
+
// Producing a reply — killing the worker now would drop this turn. Queue
|
|
1085
|
+
// instead; worker-pool's runPendingSuspendIfSettled cashes it in on the
|
|
1086
|
+
// idle/limited edge. Ordering matters: the idempotent no-worker branch above
|
|
1087
|
+
// must win, so "worker was already gone" never reports as deferred.
|
|
1088
|
+
//
|
|
1089
|
+
// The suspendability check is part of the queueing condition, not a new guard
|
|
1090
|
+
// ahead of it: a non-suspendable (pty) backend must keep falling through to
|
|
1091
|
+
// suspendWorker's existing 409 rather than get a `deferred` that could only
|
|
1092
|
+
// fail silently at fulfillment time.
|
|
1093
|
+
if ((ds.lastScreenStatus === 'working' || ds.lastScreenStatus === 'analyzing')
|
|
1094
|
+
&& isSuspendableBackendType(ds.initConfig?.backendType)) {
|
|
1095
|
+
ds.pendingSuspendReason = 'manual_suspend';
|
|
1096
|
+
// Bind the claim to the generation that is producing right now: it must not
|
|
1097
|
+
// outlive that worker (see clearPendingSuspendClaim).
|
|
1098
|
+
ds.pendingSuspendGeneration = ds.workerGeneration;
|
|
1099
|
+
return jsonRes(res, 200, {
|
|
1100
|
+
ok: true, sessionId: params.sessionId, suspended: false, reason: 'deferred',
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1026
1103
|
if (!suspendWorker(ds, 'manual_suspend')) {
|
|
1027
1104
|
// Live worker but a non-suspendable (pty) backend: killing it would drop the
|
|
1028
1105
|
// in-memory conversation with no persistent pane to resume from lazily.
|
|
@@ -1125,7 +1202,7 @@ ipcRoute('POST', '/api/host-overload/sweep', async (req, res) => {
|
|
|
1125
1202
|
* capability 只证明「我是这个会话当前这一轮的 CLI」——绑定 URL sessionId,
|
|
1126
1203
|
* 拿到别的 sessionId 也伪造不了它的 capability。会话不存在时对未签名调用方
|
|
1127
1204
|
* 同样回 origin_unproven,不提供「哪些 sessionId 活跃」的探针。 */
|
|
1128
|
-
function sessionCliIpcAuth(req, ds, sessionId, body) {
|
|
1205
|
+
function sessionCliIpcAuth(req, ds, sessionId, body, opts = {}) {
|
|
1129
1206
|
const claimedAttempt = typeof body?.originDispatchAttempt === 'number'
|
|
1130
1207
|
&& Number.isSafeInteger(body.originDispatchAttempt)
|
|
1131
1208
|
&& body.originDispatchAttempt > 0
|
|
@@ -1135,7 +1212,9 @@ function sessionCliIpcAuth(req, ds, sessionId, body) {
|
|
|
1135
1212
|
trustedHost: isTrustedHostIpcRequest(req),
|
|
1136
1213
|
sessionExists: !!ds,
|
|
1137
1214
|
receiverSession: !!ds?.session.vcMeetingReceiver,
|
|
1138
|
-
|
|
1215
|
+
// close/slash/cd 是 managed action,默认拒绝 receiver;claim 只读 daemon 自有
|
|
1216
|
+
// 本轮非凭证上下文(reminder/whiteboard),读自己本轮 reminder 非提权,单独放开。
|
|
1217
|
+
allowReceiver: opts.allowReceiver === true,
|
|
1139
1218
|
sessionId,
|
|
1140
1219
|
liveOrigin: ds?.managedTurnOrigin,
|
|
1141
1220
|
claimedCapability: typeof body?.originCapability === 'string' ? body.originCapability : undefined,
|
|
@@ -2679,7 +2758,17 @@ ipcRoute('GET', '/api/groups', async (_req, res) => {
|
|
|
2679
2758
|
const observedBotNames = observedBotsStore
|
|
2680
2759
|
.listObservedBots(config.session.dataDir, cachedLarkAppId, c.chatId)
|
|
2681
2760
|
.map(b => b.name);
|
|
2682
|
-
return {
|
|
2761
|
+
return {
|
|
2762
|
+
...c,
|
|
2763
|
+
oncallChat: oncall ?? null,
|
|
2764
|
+
firstSeenAt: seenMap.get(c.chatId) ?? null,
|
|
2765
|
+
hasRole,
|
|
2766
|
+
hasMessageListener,
|
|
2767
|
+
observedBotNames,
|
|
2768
|
+
// 会话群分型(p2pMode=group 自动创建):dashboard 群面板据此把它们
|
|
2769
|
+
// 收进独立折叠区,避免淹没需要人工管理的常驻群。
|
|
2770
|
+
...(isSessionGroup(c.chatId) ? { sessionGroup: true } : {}),
|
|
2771
|
+
};
|
|
2683
2772
|
});
|
|
2684
2773
|
jsonRes(res, 200, { chats: enriched });
|
|
2685
2774
|
}
|
|
@@ -3369,10 +3458,17 @@ ipcRoute('GET', '/api/bot-default-oncall', async (_req, res) => {
|
|
|
3369
3458
|
const grantPrefs = grantPrefsStore.getBotGrantPrefs(cachedLarkAppId);
|
|
3370
3459
|
let p2pMode = 'chat';
|
|
3371
3460
|
try {
|
|
3372
|
-
|
|
3373
|
-
|
|
3461
|
+
const configured = getBot(cachedLarkAppId).config.p2pMode;
|
|
3462
|
+
if (configured === 'thread' || configured === 'group')
|
|
3463
|
+
p2pMode = configured;
|
|
3374
3464
|
}
|
|
3375
3465
|
catch { /* default chat */ }
|
|
3466
|
+
let envelopeInjection = 'off';
|
|
3467
|
+
try {
|
|
3468
|
+
if (getBot(cachedLarkAppId).config.envelopeInjection === 'auto')
|
|
3469
|
+
envelopeInjection = 'auto';
|
|
3470
|
+
}
|
|
3471
|
+
catch { /* default off */ }
|
|
3376
3472
|
let skillInjection = null;
|
|
3377
3473
|
// How this bot's CLI delivers botmux skills, so the dashboard can render the
|
|
3378
3474
|
// control correctly: 'dynamic' = per-session --plugin-dir (claude-family, not
|
|
@@ -3392,6 +3488,7 @@ ipcRoute('GET', '/api/bot-default-oncall', async (_req, res) => {
|
|
|
3392
3488
|
let cliPathOverride = null;
|
|
3393
3489
|
let wrapperCli = null;
|
|
3394
3490
|
let model = null;
|
|
3491
|
+
let reasoningEffort = null;
|
|
3395
3492
|
let agentSelectionKey = '';
|
|
3396
3493
|
try {
|
|
3397
3494
|
const cfg = getBot(cachedLarkAppId).config;
|
|
@@ -3406,6 +3503,7 @@ ipcRoute('GET', '/api/bot-default-oncall', async (_req, res) => {
|
|
|
3406
3503
|
: null;
|
|
3407
3504
|
wrapperCli = typeof cfg.wrapperCli === 'string' && cfg.wrapperCli.trim() ? cfg.wrapperCli : null;
|
|
3408
3505
|
model = typeof cfg.model === 'string' && cfg.model.trim() ? cfg.model : null;
|
|
3506
|
+
reasoningEffort = cfg.reasoningEffort ?? null;
|
|
3409
3507
|
agentSelectionKey = selectionKeyForBot(cliId, wrapperCli ?? undefined);
|
|
3410
3508
|
}
|
|
3411
3509
|
catch { /* no registered bot */ }
|
|
@@ -3493,6 +3591,7 @@ ipcRoute('GET', '/api/bot-default-oncall', async (_req, res) => {
|
|
|
3493
3591
|
cliPathOverride,
|
|
3494
3592
|
wrapperCli,
|
|
3495
3593
|
model,
|
|
3594
|
+
reasoningEffort,
|
|
3496
3595
|
agentSelectionKey,
|
|
3497
3596
|
defaultOncall: defaultOncall ?? { enabled: false, workingDir: '', since: 0 },
|
|
3498
3597
|
defaultWorkingDir,
|
|
@@ -3524,12 +3623,20 @@ ipcRoute('GET', '/api/bot-default-oncall', async (_req, res) => {
|
|
|
3524
3623
|
regularGroupReplyMode: cardPrefs.regularGroupReplyMode,
|
|
3525
3624
|
regularGroupMentionMode: cardPrefs.regularGroupMentionMode,
|
|
3526
3625
|
substituteMode: substituteModeStore.getBotSubstituteMode(cachedLarkAppId) ?? null,
|
|
3626
|
+
feedback: (() => { try {
|
|
3627
|
+
return getBot(cachedLarkAppId).config.feedback ?? null;
|
|
3628
|
+
}
|
|
3629
|
+
catch {
|
|
3630
|
+
return null;
|
|
3631
|
+
} })(),
|
|
3527
3632
|
docSubscribeDefaultMode: cardPrefs.docSubscribeDefaultMode,
|
|
3528
3633
|
restrictGrantCommands: grantPrefs.restrictGrantCommands,
|
|
3529
3634
|
autoGrantRequestCards: grantPrefs.autoGrantRequestCards,
|
|
3635
|
+
p2pOpen: grantPrefs.p2pOpen,
|
|
3530
3636
|
messageQuotaDefaultLimit: grantPrefs.messageQuotaDefaultLimit,
|
|
3531
3637
|
grantDefaultDurationMs: grantPrefs.grantDefaultDurationMs,
|
|
3532
3638
|
p2pMode,
|
|
3639
|
+
envelopeInjection,
|
|
3533
3640
|
skillInjection,
|
|
3534
3641
|
skillInjectionSupport,
|
|
3535
3642
|
// Resolved machine-wide default → the dashboard shows it as the pre-selected
|
|
@@ -3698,6 +3805,7 @@ ipcRoute('PUT', '/api/bot-summary-trigger', async (req, res) => {
|
|
|
3698
3805
|
// Per-bot 授权偏好。Body 任意子集:
|
|
3699
3806
|
// • restrictGrantCommands: boolean — 限制被授权人只能纯对话
|
|
3700
3807
|
// • autoGrantRequestCards: boolean — 未授权 @ 被挡住时是否发 grant 申请卡
|
|
3808
|
+
// • p2pOpen: boolean — 私聊对话全开(talk-only;管理权仍只认 allowedUsers)
|
|
3701
3809
|
// • messageQuotaDefaultLimit: number|null — 卡片/Oncall 额度覆盖(null = 卡片内置 3 条、Oncall 不限)
|
|
3702
3810
|
// • grantDefaultDurationMs: number|null — 新授权默认有限时长(null = 产品默认 1 小时)
|
|
3703
3811
|
ipcRoute('PUT', '/api/bot-grant-prefs', async (req, res) => {
|
|
@@ -3720,6 +3828,8 @@ ipcRoute('PUT', '/api/bot-grant-prefs', async (req, res) => {
|
|
|
3720
3828
|
patch.restrictGrantCommands = body.restrictGrantCommands;
|
|
3721
3829
|
if (typeof body.autoGrantRequestCards === 'boolean')
|
|
3722
3830
|
patch.autoGrantRequestCards = body.autoGrantRequestCards;
|
|
3831
|
+
if (typeof body.p2pOpen === 'boolean')
|
|
3832
|
+
patch.p2pOpen = body.p2pOpen;
|
|
3723
3833
|
// null(含 JSON null)= 恢复内置额度策略;number = 设定覆盖值(store 内校验 1–1000)。
|
|
3724
3834
|
if (body.messageQuotaDefaultLimit === null)
|
|
3725
3835
|
patch.messageQuotaDefaultLimit = null;
|
|
@@ -3876,7 +3986,13 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
3876
3986
|
return jsonRes(res, 400, { ok: false, error: 'invalid_cli', message: err?.message ?? String(err) });
|
|
3877
3987
|
}
|
|
3878
3988
|
const model = typeof body.model === 'string' ? body.model.trim() : '';
|
|
3989
|
+
const reasoningEffortFieldPresent = Object.prototype.hasOwnProperty.call(body, 'reasoningEffort');
|
|
3990
|
+
const reasoningEffort = isCodexReasoningEffort(body.reasoningEffort) ? body.reasoningEffort : null;
|
|
3991
|
+
if (body.reasoningEffort !== undefined && body.reasoningEffort !== '' && reasoningEffort === null) {
|
|
3992
|
+
return jsonRes(res, 400, { ok: false, error: 'invalid_reasoning_effort' });
|
|
3993
|
+
}
|
|
3879
3994
|
const currentBotConfig = getBot(larkAppId).config;
|
|
3995
|
+
const supportsReasoningEffort = isCodexReasoningCliId(selected.cliId);
|
|
3880
3996
|
const runtimeFieldPresent = Object.prototype.hasOwnProperty.call(body, 'cliRuntime');
|
|
3881
3997
|
const currentSelectionKey = selectionKeyForBot(currentBotConfig.cliId, currentBotConfig.wrapperCli);
|
|
3882
3998
|
const selectionChanged = key !== currentSelectionKey;
|
|
@@ -3971,6 +4087,12 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
3971
4087
|
// is the other way a bot could end up configured-but-unenforceable.)
|
|
3972
4088
|
let readIsolationCleared = false;
|
|
3973
4089
|
const r = await rmwBotEntry(larkAppId, (entry) => {
|
|
4090
|
+
const nextReasoningEffort = supportsReasoningEffort
|
|
4091
|
+
? (reasoningEffortFieldPresent ? reasoningEffort ?? undefined : entry.reasoningEffort)
|
|
4092
|
+
: undefined;
|
|
4093
|
+
if (nextReasoningEffort && !codexModelSupportsReasoningEffort(model || undefined, nextReasoningEffort)) {
|
|
4094
|
+
return { write: false, result: { error: 'reasoning_effort_not_supported_by_model' } };
|
|
4095
|
+
}
|
|
3974
4096
|
entry.cliId = selected.cliId;
|
|
3975
4097
|
if (selected.wrapperCli)
|
|
3976
4098
|
entry.wrapperCli = selected.wrapperCli;
|
|
@@ -3994,6 +4116,14 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
3994
4116
|
entry.model = model;
|
|
3995
4117
|
else
|
|
3996
4118
|
delete entry.model;
|
|
4119
|
+
if (!supportsReasoningEffort)
|
|
4120
|
+
delete entry.reasoningEffort;
|
|
4121
|
+
else if (reasoningEffortFieldPresent) {
|
|
4122
|
+
if (reasoningEffort)
|
|
4123
|
+
entry.reasoningEffort = reasoningEffort;
|
|
4124
|
+
else
|
|
4125
|
+
delete entry.reasoningEffort;
|
|
4126
|
+
}
|
|
3997
4127
|
if (entry.readIsolation === true &&
|
|
3998
4128
|
!readIsolationEnforceableFor({ cliId: selected.cliId, cliPathOverride: effectivePath, wrapperCli: selected.wrapperCli })) {
|
|
3999
4129
|
delete entry.readIsolation;
|
|
@@ -4009,10 +4139,17 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
4009
4139
|
// 任务)。手动的 pty/tmux/herdr/zellij override 不受影响(它们不会是 riff)。
|
|
4010
4140
|
delete entry.backendType;
|
|
4011
4141
|
}
|
|
4012
|
-
return { write: true, result:
|
|
4142
|
+
return { write: true, result: { nextReasoningEffort } };
|
|
4013
4143
|
});
|
|
4014
4144
|
if (!r.ok)
|
|
4015
4145
|
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4146
|
+
if (r.result.error) {
|
|
4147
|
+
return jsonRes(res, 400, {
|
|
4148
|
+
ok: false,
|
|
4149
|
+
error: r.result.error,
|
|
4150
|
+
message: `模型 ${model || '(Codex 默认模型)'} 不支持当前思考强度`,
|
|
4151
|
+
});
|
|
4152
|
+
}
|
|
4016
4153
|
const bot = getBot(larkAppId);
|
|
4017
4154
|
bot.config.cliId = selected.cliId;
|
|
4018
4155
|
bot.config.cliRuntime = nextRuntime;
|
|
@@ -4022,6 +4159,10 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
4022
4159
|
else
|
|
4023
4160
|
bot.config.wrapperCli = undefined;
|
|
4024
4161
|
bot.config.model = model || undefined;
|
|
4162
|
+
if (!supportsReasoningEffort)
|
|
4163
|
+
bot.config.reasoningEffort = undefined;
|
|
4164
|
+
else
|
|
4165
|
+
bot.config.reasoningEffort = r.result.nextReasoningEffort ?? undefined;
|
|
4025
4166
|
if (readIsolationCleared)
|
|
4026
4167
|
bot.config.readIsolation = false;
|
|
4027
4168
|
if (selected.cliId === 'riff') {
|
|
@@ -4041,6 +4182,7 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
4041
4182
|
cliPathOverride: nextRuntime ? null : nextLegacyPath ?? null,
|
|
4042
4183
|
wrapperCli: selected.wrapperCli ?? null,
|
|
4043
4184
|
model: model || null,
|
|
4185
|
+
reasoningEffort: supportsReasoningEffort ? bot.config.reasoningEffort ?? null : null,
|
|
4044
4186
|
selectionKey,
|
|
4045
4187
|
closedMismatchedSessions,
|
|
4046
4188
|
// Report the (possibly auto-cleared) read-isolation state + whether the new
|
|
@@ -4056,9 +4198,100 @@ ipcRoute('PUT', '/api/bot-agent', async (req, res) => {
|
|
|
4056
4198
|
});
|
|
4057
4199
|
});
|
|
4058
4200
|
});
|
|
4059
|
-
//
|
|
4201
|
+
// ─── 会话群标签授权(feed-group OAuth,Dashboard 一站式流程)────────────────
|
|
4202
|
+
// POST /api/oauth-callback {url} — dashboard 的 /oauth/callback 接收页把回调
|
|
4203
|
+
// URL 广播给各 daemon;state 在本进程 pendingLogins 里的那个完成 code→token
|
|
4204
|
+
// 交换,其它 daemon 返回 matched:false 让 dashboard 继续尝试下一个。
|
|
4205
|
+
ipcRoute('POST', '/api/oauth-callback', async (req, res) => {
|
|
4206
|
+
let body;
|
|
4207
|
+
try {
|
|
4208
|
+
body = await readJsonBody(req);
|
|
4209
|
+
}
|
|
4210
|
+
catch {
|
|
4211
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4212
|
+
}
|
|
4213
|
+
if (typeof body.url !== 'string' || !body.url.trim()) {
|
|
4214
|
+
return jsonRes(res, 400, { ok: false, error: 'url_required' });
|
|
4215
|
+
}
|
|
4216
|
+
const result = await tryHandleCallbackUrl(body.url.trim());
|
|
4217
|
+
if (!result)
|
|
4218
|
+
return jsonRes(res, 200, { ok: false, matched: false, message: 'not a callback url' });
|
|
4219
|
+
jsonRes(res, 200, { ok: result.ok, matched: result.matched, message: result.message });
|
|
4220
|
+
});
|
|
4221
|
+
// POST /api/session-group-tag-auth — 生成带 feed-group scope 的授权链接。
|
|
4222
|
+
// state 存本 daemon 进程内存,回调必须经由上面的 /api/oauth-callback 回到
|
|
4223
|
+
// 同一进程完成,故链接生成与回调处理都放 IPC 侧。
|
|
4224
|
+
ipcRoute('POST', '/api/session-group-tag-auth', async (_req, res) => {
|
|
4225
|
+
if (!cachedLarkAppId)
|
|
4226
|
+
return jsonRes(res, 503, { error: 'larkAppId_not_set' });
|
|
4227
|
+
try {
|
|
4228
|
+
const cfg = getBot(cachedLarkAppId).config;
|
|
4229
|
+
const { authUrl } = generateAuthUrl(cfg.larkAppId, cfg.larkAppSecret, normalizeBrand(cfg.brand), FEED_GROUP_OAUTH_SCOPES);
|
|
4230
|
+
jsonRes(res, 200, { ok: true, authUrl });
|
|
4231
|
+
}
|
|
4232
|
+
catch (e) {
|
|
4233
|
+
jsonRes(res, 500, { ok: false, error: e?.message ?? String(e) });
|
|
4234
|
+
}
|
|
4235
|
+
});
|
|
4236
|
+
// GET /api/session-group-tag-status — 标签授权状态(Dashboard 徽标)。
|
|
4237
|
+
ipcRoute('GET', '/api/session-group-tag-status', async (_req, res) => {
|
|
4238
|
+
if (!cachedLarkAppId)
|
|
4239
|
+
return jsonRes(res, 503, { error: 'larkAppId_not_set' });
|
|
4240
|
+
try {
|
|
4241
|
+
const cfg = getBot(cachedLarkAppId).config;
|
|
4242
|
+
const status = getFeedGroupAuthStatus(cfg.larkAppId, normalizeBrand(cfg.brand));
|
|
4243
|
+
jsonRes(res, 200, { ok: true, ...status, tagMode: cfg.sessionGroup?.tag?.mode ?? 'feed-group' });
|
|
4244
|
+
}
|
|
4245
|
+
catch (e) {
|
|
4246
|
+
jsonRes(res, 500, { ok: false, error: e?.message ?? String(e) });
|
|
4247
|
+
}
|
|
4248
|
+
});
|
|
4249
|
+
// PUT /api/session-group-tag-config — 会话群标签模式(Dashboard tag mode
|
|
4250
|
+
// selector,PR review:授权行必须与实际 tagMode 一致)。Body `{ mode }`:
|
|
4251
|
+
// 'feed-group'(默认,个人侧边栏分组,需一次 OAuth,任何租户可用)|
|
|
4252
|
+
// 'chat-tag'(应用租户身份,无需用户授权,但部分租户权限目录无该 scope)|
|
|
4253
|
+
// 'off'。写 bots.json 的 sessionGroup.tag.mode 并热更内存注册表,与
|
|
4254
|
+
// /botconfig 同一持久化通道。
|
|
4255
|
+
ipcRoute('PUT', '/api/session-group-tag-config', async (req, res) => {
|
|
4256
|
+
if (!cachedLarkAppId)
|
|
4257
|
+
return jsonRes(res, 503, { error: 'larkAppId_not_set' });
|
|
4258
|
+
let body;
|
|
4259
|
+
try {
|
|
4260
|
+
body = await readJsonBody(req);
|
|
4261
|
+
}
|
|
4262
|
+
catch {
|
|
4263
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4264
|
+
}
|
|
4265
|
+
const mode = body.mode === 'chat-tag' || body.mode === 'feed-group' || body.mode === 'off'
|
|
4266
|
+
? body.mode : undefined;
|
|
4267
|
+
if (!mode)
|
|
4268
|
+
return jsonRes(res, 400, { ok: false, error: 'invalid_mode' });
|
|
4269
|
+
try {
|
|
4270
|
+
const bot = getBot(cachedLarkAppId);
|
|
4271
|
+
const r = await rmwBotEntry(cachedLarkAppId, (entry) => {
|
|
4272
|
+
if (!entry.sessionGroup || typeof entry.sessionGroup !== 'object')
|
|
4273
|
+
entry.sessionGroup = {};
|
|
4274
|
+
if (!entry.sessionGroup.tag || typeof entry.sessionGroup.tag !== 'object')
|
|
4275
|
+
entry.sessionGroup.tag = {};
|
|
4276
|
+
entry.sessionGroup.tag.mode = mode;
|
|
4277
|
+
return { write: true, result: mode };
|
|
4278
|
+
});
|
|
4279
|
+
if (!r.ok)
|
|
4280
|
+
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4281
|
+
bot.config.sessionGroup = {
|
|
4282
|
+
...(bot.config.sessionGroup ?? {}),
|
|
4283
|
+
tag: { ...(bot.config.sessionGroup?.tag ?? {}), mode },
|
|
4284
|
+
};
|
|
4285
|
+
jsonRes(res, 200, { ok: true, tagMode: mode });
|
|
4286
|
+
}
|
|
4287
|
+
catch (e) {
|
|
4288
|
+
jsonRes(res, 500, { ok: false, error: e?.message ?? String(e) });
|
|
4289
|
+
}
|
|
4290
|
+
});
|
|
4291
|
+
// Per-bot 私聊单聊模式 p2pMode。Body `{ p2pMode: 'chat' | 'thread' | 'group' }`:
|
|
4060
4292
|
// • 'chat'(默认) → 私聊走扁平连续 chat-scope 会话
|
|
4061
4293
|
// • 'thread' → 显式回到每条 DM 独立 thread-scope 会话
|
|
4294
|
+
// • 'group' → 每条顶层 DM 自动建专属会话群并把会话落进去
|
|
4062
4295
|
// 走 applyConfigField(与 /botconfig 同一写盘 + 热更新路径),保证一致。
|
|
4063
4296
|
ipcRoute('PUT', '/api/bot-p2p-mode', async (req, res) => {
|
|
4064
4297
|
if (!cachedLarkAppId)
|
|
@@ -4073,13 +4306,37 @@ ipcRoute('PUT', '/api/bot-p2p-mode', async (req, res) => {
|
|
|
4073
4306
|
const spec = findConfigField('p2pMode');
|
|
4074
4307
|
if (!spec)
|
|
4075
4308
|
return jsonRes(res, 500, { ok: false, error: 'spec_missing' });
|
|
4076
|
-
// 只有 'thread' 有意义;其它(含 'chat',新默认)一律清回默认,bots.json 保持干净。
|
|
4077
|
-
const value = body.p2pMode === 'thread' ? 'thread' : null;
|
|
4309
|
+
// 只有 'thread' / 'group' 有意义;其它(含 'chat',新默认)一律清回默认,bots.json 保持干净。
|
|
4310
|
+
const value = body.p2pMode === 'thread' ? 'thread' : body.p2pMode === 'group' ? 'group' : null;
|
|
4078
4311
|
const r = await applyConfigField(cachedLarkAppId, spec, value);
|
|
4079
4312
|
if (!r.ok)
|
|
4080
4313
|
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4081
4314
|
jsonRes(res, 200, { ok: true, p2pMode: value ?? 'chat' });
|
|
4082
4315
|
});
|
|
4316
|
+
// Per-bot 每轮上下文注入方式 envelopeInjection(#794)。Body `{ envelopeInjection: 'auto'|'off'|'' }`:
|
|
4317
|
+
// • 'auto' → 支持的 CLI(claude-code)把 reminder/whiteboard 经 UserPromptSubmit
|
|
4318
|
+
// hook 注入为 system-reminder,user turn 只留消息本身;不支持的自动回退内联
|
|
4319
|
+
// • 'off'/其它 → 内联 envelope(历史行为,默认)
|
|
4320
|
+
// 走 applyConfigField(与 /botconfig 同一写盘 + 热更新路径),下一个 follow-up turn 生效。
|
|
4321
|
+
ipcRoute('PUT', '/api/bot-envelope-injection', async (req, res) => {
|
|
4322
|
+
if (!cachedLarkAppId)
|
|
4323
|
+
return jsonRes(res, 503, { error: 'larkAppId_not_set' });
|
|
4324
|
+
let body;
|
|
4325
|
+
try {
|
|
4326
|
+
body = await readJsonBody(req);
|
|
4327
|
+
}
|
|
4328
|
+
catch {
|
|
4329
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4330
|
+
}
|
|
4331
|
+
const spec = findConfigField('envelopeInjection');
|
|
4332
|
+
if (!spec)
|
|
4333
|
+
return jsonRes(res, 500, { ok: false, error: 'spec_missing' });
|
|
4334
|
+
const value = body.envelopeInjection === 'auto' ? 'auto' : null;
|
|
4335
|
+
const r = await applyConfigField(cachedLarkAppId, spec, value);
|
|
4336
|
+
if (!r.ok)
|
|
4337
|
+
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4338
|
+
jsonRes(res, 200, { ok: true, envelopeInjection: value ?? 'off' });
|
|
4339
|
+
});
|
|
4083
4340
|
// Per-bot 内置技能注入模式 skillInjection。Body `{ skillInjection: 'global'|'prompt'|'off'|'' }`:
|
|
4084
4341
|
// • 'global'|'prompt'|'off' → 显式覆盖本 bot
|
|
4085
4342
|
// • ''/其它 → 清回机器级默认(config.json skills.builtinInjection)
|
|
@@ -4236,6 +4493,56 @@ ipcRoute('PUT', '/api/bot-launch-shell', async (req, res) => {
|
|
|
4236
4493
|
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4237
4494
|
jsonRes(res, 200, { ok: true, launchShell: value ?? '' });
|
|
4238
4495
|
});
|
|
4496
|
+
ipcRoute('PUT', '/api/bot-feedback', async (req, res) => {
|
|
4497
|
+
if (!cachedLarkAppId)
|
|
4498
|
+
return jsonRes(res, 503, { error: 'larkAppId_not_set' });
|
|
4499
|
+
let body;
|
|
4500
|
+
try {
|
|
4501
|
+
body = await readJsonBody(req);
|
|
4502
|
+
}
|
|
4503
|
+
catch {
|
|
4504
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4505
|
+
}
|
|
4506
|
+
const spec = findConfigField('feedback');
|
|
4507
|
+
if (!spec)
|
|
4508
|
+
return jsonRes(res, 500, { ok: false, error: 'spec_missing' });
|
|
4509
|
+
const raw = typeof body.feedback === 'string' ? body.feedback : '';
|
|
4510
|
+
let value = null;
|
|
4511
|
+
if (raw.trim()) {
|
|
4512
|
+
const coerced = coerceConfigValue(spec, raw);
|
|
4513
|
+
if (!coerced.ok)
|
|
4514
|
+
return jsonRes(res, 400, { ok: false, error: coerced.reason });
|
|
4515
|
+
value = coerced.value;
|
|
4516
|
+
}
|
|
4517
|
+
const r = await applyConfigField(cachedLarkAppId, spec, value);
|
|
4518
|
+
if (!r.ok)
|
|
4519
|
+
return jsonRes(res, 400, { ok: false, error: r.reason });
|
|
4520
|
+
jsonRes(res, 200, { ok: true, feedback: value });
|
|
4521
|
+
});
|
|
4522
|
+
ipcRoute('PUT', '/api/chat-feedback/:chatId', async (req, res, params) => {
|
|
4523
|
+
if (!cachedLarkAppId)
|
|
4524
|
+
return jsonRes(res, 503, { ok: false, error: 'larkAppId_not_set' });
|
|
4525
|
+
let body;
|
|
4526
|
+
try {
|
|
4527
|
+
body = await readJsonBody(req);
|
|
4528
|
+
}
|
|
4529
|
+
catch {
|
|
4530
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4531
|
+
}
|
|
4532
|
+
const feedback = body.feedback === null || body.feedback === undefined ? null : body.feedback;
|
|
4533
|
+
const result = await setChatFeedbackPolicy(cachedLarkAppId, decodeURIComponent(params.chatId), feedback);
|
|
4534
|
+
if (!result.ok)
|
|
4535
|
+
return jsonRes(res, result.reason === 'bot_not_registered' ? 404 : 400, { ok: false, error: result.reason });
|
|
4536
|
+
jsonRes(res, 200, { ok: true, feedback });
|
|
4537
|
+
});
|
|
4538
|
+
ipcRoute('GET', '/api/feedback-effective', async (req, res) => {
|
|
4539
|
+
if (!cachedLarkAppId)
|
|
4540
|
+
return jsonRes(res, 503, { ok: false, error: 'larkAppId_not_set' });
|
|
4541
|
+
const chatId = new URL(req.url ?? '/', 'http://localhost').searchParams.get('chatId') || undefined;
|
|
4542
|
+
jsonRes(res, 200, { ok: true, trace: traceFeedbackPolicyForDelivery({
|
|
4543
|
+
dataDir: config.session.dataDir, larkAppId: cachedLarkAppId, chatId, bot: getBot(cachedLarkAppId).config,
|
|
4544
|
+
}) });
|
|
4545
|
+
});
|
|
4239
4546
|
// Per-bot 环境变量 env。Body `{ env: string }`(原始 JSON 文本,如
|
|
4240
4547
|
// `{"ANTHROPIC_BASE_URL":"…","ANTHROPIC_AUTH_TOKEN":"…"}` 让本 bot 走 GLM/第三方
|
|
4241
4548
|
// 服务商):空白 → 清除;否则按 json kind 解析 + sanitizePerBotEnv 过滤后落盘。
|