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
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface FeedbackAnalyticsFilters {
|
|
2
|
+
from: string;
|
|
3
|
+
to: string;
|
|
4
|
+
teamId?: string;
|
|
5
|
+
botAppId?: string;
|
|
6
|
+
chatId?: string;
|
|
7
|
+
topicRootId?: string;
|
|
8
|
+
semantic?: string;
|
|
9
|
+
verdictKey?: string;
|
|
10
|
+
reasonKey?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
cliId?: string;
|
|
13
|
+
cliVersion?: string;
|
|
14
|
+
skillName?: string;
|
|
15
|
+
skillVersion?: string;
|
|
16
|
+
workflowId?: string;
|
|
17
|
+
taskId?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FeedbackAnalyticsSummary {
|
|
21
|
+
delivered: number;
|
|
22
|
+
ratedDeliveries: number;
|
|
23
|
+
ratings: number;
|
|
24
|
+
positive: number;
|
|
25
|
+
negative: number;
|
|
26
|
+
progress: number;
|
|
27
|
+
ratingCoverage: number;
|
|
28
|
+
positiveRate: number;
|
|
29
|
+
deliveryFailures: number;
|
|
30
|
+
outboxFailures: number;
|
|
31
|
+
}
|
|
32
|
+
export interface FeedbackDeliveryAnalyticsItem {
|
|
33
|
+
deliveryId: string;
|
|
34
|
+
createdAt: string;
|
|
35
|
+
completedAt?: string;
|
|
36
|
+
status?: string;
|
|
37
|
+
contentHash: string;
|
|
38
|
+
contentRef?: string;
|
|
39
|
+
platform: string;
|
|
40
|
+
platformMessageId: string;
|
|
41
|
+
platformAppId: string;
|
|
42
|
+
botAppId?: string;
|
|
43
|
+
sessionId?: string;
|
|
44
|
+
turnId?: string;
|
|
45
|
+
chatId?: string;
|
|
46
|
+
topicRootId?: string;
|
|
47
|
+
workflowId?: string;
|
|
48
|
+
taskId?: string;
|
|
49
|
+
cliId?: string;
|
|
50
|
+
cliVersion?: string;
|
|
51
|
+
model?: string;
|
|
52
|
+
skillName?: string;
|
|
53
|
+
skillVersion?: string;
|
|
54
|
+
semantic?: string;
|
|
55
|
+
verdictKey?: string;
|
|
56
|
+
reasonKey?: string;
|
|
57
|
+
}
|
|
58
|
+
export declare class FeedbackAnalyticsService {
|
|
59
|
+
private readonly db;
|
|
60
|
+
constructor(dataDir: string);
|
|
61
|
+
close(): void;
|
|
62
|
+
summary(filters: FeedbackAnalyticsFilters): FeedbackAnalyticsSummary;
|
|
63
|
+
trend(filters: FeedbackAnalyticsFilters): Array<{
|
|
64
|
+
bucket: string;
|
|
65
|
+
positive: number;
|
|
66
|
+
negative: number;
|
|
67
|
+
progress: number;
|
|
68
|
+
ratings: number;
|
|
69
|
+
}>;
|
|
70
|
+
reasons(filters: FeedbackAnalyticsFilters): Array<{
|
|
71
|
+
reasonKey: string;
|
|
72
|
+
count: number;
|
|
73
|
+
}>;
|
|
74
|
+
deliveries(filters: FeedbackAnalyticsFilters, page?: {
|
|
75
|
+
limit?: number;
|
|
76
|
+
cursor?: string;
|
|
77
|
+
}): {
|
|
78
|
+
items: FeedbackDeliveryAnalyticsItem[];
|
|
79
|
+
nextCursor?: string;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=feedback-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-analytics.d.ts","sourceRoot":"","sources":["../../src/services/feedback-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
function bounded(filters) {
|
|
4
|
+
const from = Date.parse(filters.from);
|
|
5
|
+
const to = Date.parse(filters.to);
|
|
6
|
+
if (!Number.isFinite(from) || !Number.isFinite(to) || from >= to)
|
|
7
|
+
throw new Error('feedback_analytics_invalid_range');
|
|
8
|
+
if (to - from > 366 * 24 * 60 * 60 * 1000)
|
|
9
|
+
throw new Error('feedback_analytics_range_too_large');
|
|
10
|
+
}
|
|
11
|
+
function deliveryWhere(filters) {
|
|
12
|
+
bounded(filters);
|
|
13
|
+
const clauses = ['d.created_at>=?', 'd.created_at<?'];
|
|
14
|
+
const params = [filters.from, filters.to];
|
|
15
|
+
const columns = [
|
|
16
|
+
['botAppId', 'd.bot_app_id'], ['chatId', 'd.chat_id'], ['topicRootId', 'd.topic_root_id'], ['model', 'd.model'],
|
|
17
|
+
['cliId', 'd.cli_id'], ['cliVersion', 'd.cli_version'], ['skillName', 'd.skill_name'], ['skillVersion', 'd.skill_version'],
|
|
18
|
+
['workflowId', 'd.workflow_id'], ['taskId', 'd.task_id'], ['status', 'd.status'],
|
|
19
|
+
];
|
|
20
|
+
for (const [key, column] of columns)
|
|
21
|
+
if (filters[key]) {
|
|
22
|
+
clauses.push(`${column}=?`);
|
|
23
|
+
params.push(filters[key]);
|
|
24
|
+
}
|
|
25
|
+
if (filters.teamId) {
|
|
26
|
+
clauses.push("json_extract(d.context_json,'$.teamId')=?");
|
|
27
|
+
params.push(filters.teamId);
|
|
28
|
+
}
|
|
29
|
+
return { where: clauses.join(' AND '), params };
|
|
30
|
+
}
|
|
31
|
+
function feedbackWhere(filters) {
|
|
32
|
+
const base = deliveryWhere(filters);
|
|
33
|
+
const clauses = [base.where];
|
|
34
|
+
const params = [...base.params];
|
|
35
|
+
const fields = [['semantic', 'lf.semantic'], ['verdictKey', 'lf.result'], ['reasonKey', 'lf.reason_key']];
|
|
36
|
+
for (const [key, column] of fields)
|
|
37
|
+
if (filters[key]) {
|
|
38
|
+
clauses.push(`${column}=?`);
|
|
39
|
+
params.push(filters[key]);
|
|
40
|
+
}
|
|
41
|
+
return { where: clauses.join(' AND '), params };
|
|
42
|
+
}
|
|
43
|
+
const LATEST = `SELECT f.* FROM feedback_revisions f JOIN (SELECT delivery_id,operator_subject_id,MAX(revision) revision FROM feedback_revisions GROUP BY delivery_id,operator_subject_id) x ON x.delivery_id=f.delivery_id AND x.operator_subject_id=f.operator_subject_id AND x.revision=f.revision`;
|
|
44
|
+
export class FeedbackAnalyticsService {
|
|
45
|
+
db;
|
|
46
|
+
constructor(dataDir) {
|
|
47
|
+
this.db = new DatabaseSync(join(dataDir, 'botmux-feedback.sqlite'), { readOnly: true });
|
|
48
|
+
}
|
|
49
|
+
close() { this.db.close(); }
|
|
50
|
+
summary(filters) {
|
|
51
|
+
const delivery = deliveryWhere(filters);
|
|
52
|
+
const feedback = feedbackWhere(filters);
|
|
53
|
+
const d = this.db.prepare(`SELECT COUNT(*) delivered, SUM(CASE WHEN d.status='failed' THEN 1 ELSE 0 END) delivery_failures FROM deliveries d WHERE ${delivery.where}`).get(...delivery.params);
|
|
54
|
+
const f = this.db.prepare(`SELECT COUNT(*) ratings, COUNT(DISTINCT d.delivery_id) rated_deliveries, SUM(CASE WHEN lf.semantic='positive' THEN 1 ELSE 0 END) positive, SUM(CASE WHEN lf.semantic='negative' THEN 1 ELSE 0 END) negative, SUM(CASE WHEN lf.semantic='progress' THEN 1 ELSE 0 END) progress FROM deliveries d JOIN (${LATEST}) lf ON lf.delivery_id=d.delivery_id WHERE ${feedback.where}`).get(...feedback.params);
|
|
55
|
+
const outbox = this.db.prepare(`SELECT COUNT(*) failures FROM feedback_outbox WHERE status='failed' AND created_at>=? AND created_at<?`).get(filters.from, filters.to);
|
|
56
|
+
const delivered = Number(d.delivered ?? 0);
|
|
57
|
+
const ratings = Number(f.ratings ?? 0);
|
|
58
|
+
const ratedDeliveries = Number(f.rated_deliveries ?? 0);
|
|
59
|
+
const positive = Number(f.positive ?? 0);
|
|
60
|
+
return { delivered, ratedDeliveries, ratings, positive, negative: Number(f.negative ?? 0), progress: Number(f.progress ?? 0), ratingCoverage: delivered ? ratedDeliveries / delivered : 0, positiveRate: ratings ? positive / ratings : 0, deliveryFailures: Number(d.delivery_failures ?? 0), outboxFailures: Number(outbox.failures ?? 0) };
|
|
61
|
+
}
|
|
62
|
+
trend(filters) {
|
|
63
|
+
const sql = feedbackWhere(filters);
|
|
64
|
+
return this.db.prepare(`SELECT substr(d.created_at,1,10) bucket, SUM(lf.semantic='positive') positive, SUM(lf.semantic='negative') negative, SUM(lf.semantic='progress') progress, COUNT(*) ratings FROM deliveries d JOIN (${LATEST}) lf ON lf.delivery_id=d.delivery_id WHERE ${sql.where} GROUP BY bucket ORDER BY bucket`).all(...sql.params)
|
|
65
|
+
.map(row => ({ bucket: row.bucket, positive: Number(row.positive), negative: Number(row.negative), progress: Number(row.progress), ratings: Number(row.ratings) }));
|
|
66
|
+
}
|
|
67
|
+
reasons(filters) {
|
|
68
|
+
const sql = feedbackWhere(filters);
|
|
69
|
+
return this.db.prepare(`SELECT lf.reason_key reason_key,COUNT(*) count FROM deliveries d JOIN (${LATEST}) lf ON lf.delivery_id=d.delivery_id WHERE ${sql.where} AND lf.reason_key IS NOT NULL GROUP BY lf.reason_key ORDER BY count DESC,reason_key`).all(...sql.params)
|
|
70
|
+
.map(row => ({ reasonKey: row.reason_key, count: Number(row.count) }));
|
|
71
|
+
}
|
|
72
|
+
deliveries(filters, page = {}) {
|
|
73
|
+
const sql = feedbackWhere(filters);
|
|
74
|
+
const limit = Math.max(1, Math.min(page.limit ?? 50, 100));
|
|
75
|
+
if (page.cursor) {
|
|
76
|
+
let cursor;
|
|
77
|
+
try {
|
|
78
|
+
cursor = JSON.parse(Buffer.from(page.cursor, 'base64url').toString('utf8'));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error('feedback_analytics_invalid_cursor');
|
|
82
|
+
}
|
|
83
|
+
sql.where += ' AND (d.created_at<? OR (d.created_at=? AND d.delivery_id<?))';
|
|
84
|
+
sql.params.push(cursor.createdAt, cursor.createdAt, cursor.deliveryId);
|
|
85
|
+
}
|
|
86
|
+
const rows = this.db.prepare(`SELECT d.delivery_id,d.created_at,d.completed_at,d.status,r.content_hash,r.content_ref,d.platform,d.platform_message_id,d.platform_app_id,d.bot_app_id,d.session_id,d.turn_id,d.chat_id,d.topic_root_id,d.workflow_id,d.task_id,d.cli_id,d.cli_version,d.model,d.skill_name,d.skill_version,lf.semantic,lf.result,lf.reason_key FROM deliveries d JOIN responses r ON r.response_id=d.response_id LEFT JOIN (${LATEST}) lf ON lf.delivery_id=d.delivery_id WHERE ${sql.where} ORDER BY d.created_at DESC,d.delivery_id DESC LIMIT ?`).all(...sql.params, limit + 1);
|
|
87
|
+
const hasMore = rows.length > limit;
|
|
88
|
+
const selected = rows.slice(0, limit);
|
|
89
|
+
const items = selected.map(row => ({ deliveryId: row.delivery_id, createdAt: row.created_at, ...(row.completed_at ? { completedAt: row.completed_at } : {}), ...(row.status ? { status: row.status } : {}), contentHash: row.content_hash, ...(row.content_ref ? { contentRef: row.content_ref } : {}), platform: row.platform, platformMessageId: row.platform_message_id, platformAppId: row.platform_app_id, ...(row.bot_app_id ? { botAppId: row.bot_app_id } : {}), ...(row.session_id ? { sessionId: row.session_id } : {}), ...(row.turn_id ? { turnId: row.turn_id } : {}), ...(row.chat_id ? { chatId: row.chat_id } : {}), ...(row.topic_root_id ? { topicRootId: row.topic_root_id } : {}), ...(row.workflow_id ? { workflowId: row.workflow_id } : {}), ...(row.task_id ? { taskId: row.task_id } : {}), ...(row.cli_id ? { cliId: row.cli_id } : {}), ...(row.cli_version ? { cliVersion: row.cli_version } : {}), ...(row.model ? { model: row.model } : {}), ...(row.skill_name ? { skillName: row.skill_name } : {}), ...(row.skill_version ? { skillVersion: row.skill_version } : {}), ...(row.semantic ? { semantic: row.semantic } : {}), ...(row.result ? { verdictKey: row.result } : {}), ...(row.reason_key ? { reasonKey: row.reason_key } : {}) }));
|
|
90
|
+
const last = selected.at(-1);
|
|
91
|
+
const nextCursor = hasMore && last ? Buffer.from(JSON.stringify({ createdAt: last.created_at, deliveryId: last.delivery_id })).toString('base64url') : undefined;
|
|
92
|
+
return { items, ...(nextCursor ? { nextCursor } : {}) };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=feedback-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-analytics.js","sourceRoot":"","sources":["../../src/services/feedback-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type FeedbackEventType = 'turn.completed' | 'feedback.revised';
|
|
2
|
+
export interface FeedbackWebhookDestination {
|
|
3
|
+
id: string;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
url: string;
|
|
6
|
+
eventTypes: FeedbackEventType[];
|
|
7
|
+
secretRef: string;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface FeedbackEventEnvelope<T = Record<string, unknown>> {
|
|
11
|
+
eventId: string;
|
|
12
|
+
type: FeedbackEventType;
|
|
13
|
+
version: 1;
|
|
14
|
+
time: string;
|
|
15
|
+
data: T;
|
|
16
|
+
}
|
|
17
|
+
export interface FrozenWebhookDestination {
|
|
18
|
+
id: string;
|
|
19
|
+
url: string;
|
|
20
|
+
secretRef: string;
|
|
21
|
+
timeoutMs: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function effectiveWebhookDestinations(eventType: FeedbackEventType, groups: ReadonlyArray<ReadonlyArray<FeedbackWebhookDestination> | undefined>): FrozenWebhookDestination[];
|
|
24
|
+
//# sourceMappingURL=feedback-outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-outbox.d.ts","sourceRoot":"","sources":["../../src/services/feedback-outbox.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,0BAA0B,CAAC,GAAG,SAAS,CAAC,GAC3E,wBAAwB,EAAE,CAS5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function effectiveWebhookDestinations(eventType, groups) {
|
|
2
|
+
const byId = new Map();
|
|
3
|
+
for (const group of groups) {
|
|
4
|
+
for (const item of group ?? [])
|
|
5
|
+
byId.set(item.id, item);
|
|
6
|
+
}
|
|
7
|
+
return [...byId.values()]
|
|
8
|
+
.filter(item => item.enabled && item.eventTypes.includes(eventType))
|
|
9
|
+
.sort((a, b) => a.id.localeCompare(b.id))
|
|
10
|
+
.map(item => ({ id: item.id, url: item.url, secretRef: item.secretRef, timeoutMs: item.timeoutMs ?? 10_000 }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=feedback-outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-outbox.js","sourceRoot":"","sources":["../../src/services/feedback-outbox.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,4BAA4B,CAC1C,SAA4B,EAC5B,MAA4E;IAE5E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;SACtB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACxC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { BotConfig } from '../bot-registry.js';
|
|
2
|
+
import { type FeedbackPolicy } from './feedback-policy.js';
|
|
3
|
+
export interface FeedbackPolicyLayer {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
audience?: 'requester';
|
|
6
|
+
visibleSemantics?: unknown[];
|
|
7
|
+
buttons?: unknown[];
|
|
8
|
+
negativeFollowup?: {
|
|
9
|
+
reasons?: unknown[];
|
|
10
|
+
comment?: {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
allowReselect?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Validate and defensively copy a persisted policy layer without filling defaults. */
|
|
20
|
+
export declare function normalizeFeedbackPolicyLayer(raw: unknown): FeedbackPolicyLayer;
|
|
21
|
+
export declare function resolveEffectiveFeedbackPolicy(input: {
|
|
22
|
+
team?: FeedbackPolicyLayer;
|
|
23
|
+
bot?: FeedbackPolicyLayer;
|
|
24
|
+
chat?: FeedbackPolicyLayer;
|
|
25
|
+
apiOnly?: boolean;
|
|
26
|
+
}): FeedbackPolicy | undefined;
|
|
27
|
+
/** Resolve local hosted-team, bot, and bot-scoped chat layers at delivery time. */
|
|
28
|
+
export declare function resolveFeedbackTeamId(input: {
|
|
29
|
+
dataDir: string;
|
|
30
|
+
chatId?: string;
|
|
31
|
+
}): string | undefined;
|
|
32
|
+
export declare function resolveFeedbackPolicyForDelivery(input: {
|
|
33
|
+
dataDir: string;
|
|
34
|
+
larkAppId: string;
|
|
35
|
+
chatId?: string;
|
|
36
|
+
bot: Pick<BotConfig, 'apiOnly' | 'feedback' | 'chatFeedbackPolicies'>;
|
|
37
|
+
}): FeedbackPolicy | undefined;
|
|
38
|
+
export interface FeedbackPolicyTrace {
|
|
39
|
+
teamId: string | null;
|
|
40
|
+
layers: {
|
|
41
|
+
team?: FeedbackPolicyLayer;
|
|
42
|
+
bot?: FeedbackPolicyLayer;
|
|
43
|
+
chat?: FeedbackPolicyLayer;
|
|
44
|
+
};
|
|
45
|
+
effective: FeedbackPolicy | null;
|
|
46
|
+
sources: Record<string, 'team' | 'bot' | 'chat'>;
|
|
47
|
+
reason: 'enabled' | 'disabled' | 'api_only' | 'ambiguous_team';
|
|
48
|
+
}
|
|
49
|
+
/** Dashboard-safe explanation of the same delivery-time resolution contract. */
|
|
50
|
+
export declare function traceFeedbackPolicyForDelivery(input: {
|
|
51
|
+
dataDir: string;
|
|
52
|
+
larkAppId: string;
|
|
53
|
+
chatId?: string;
|
|
54
|
+
bot: Pick<BotConfig, 'apiOnly' | 'feedback' | 'chatFeedbackPolicies'>;
|
|
55
|
+
}): FeedbackPolicyTrace;
|
|
56
|
+
//# sourceMappingURL=feedback-policy-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-policy-resolver.d.ts","sourceRoot":"","sources":["../../src/services/feedback-policy-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIpF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE;QACjB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;IACF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAgBD,uFAAuF;AACvF,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CA8C9E;AAmBD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,cAAc,GAAG,SAAS,CAQ7B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAMrG;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,sBAAsB,CAAC,CAAC;CACvE,GAAG,cAAc,GAAG,SAAS,CAa7B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,mBAAmB,CAAC;QAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC;QAAC,IAAI,CAAC,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAC9F,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IACjD,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;CAChE;AAED,gFAAgF;AAChF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,sBAAsB,CAAC,CAAC;CACvE,GAAG,mBAAmB,CAuBtB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { normalizeFeedbackPolicy } from './feedback-policy.js';
|
|
2
|
+
import { getTeam } from './team-store.js';
|
|
3
|
+
import { listTeamGroups } from './team-groups-store.js';
|
|
4
|
+
const TOP_LEVEL = new Set(['enabled', 'audience', 'visibleSemantics', 'buttons', 'negativeFollowup', 'allowReselect']);
|
|
5
|
+
const FOLLOWUP = new Set(['reasons', 'comment']);
|
|
6
|
+
const COMMENT = new Set(['enabled', 'required', 'placeholder', 'maxLength']);
|
|
7
|
+
function record(value, path) {
|
|
8
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
9
|
+
throw new Error(`${path} must be an object`);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function rejectUnknown(value, allowed, path) {
|
|
13
|
+
const unknown = Object.keys(value).find(key => !allowed.has(key));
|
|
14
|
+
if (unknown)
|
|
15
|
+
throw new Error(`${path}.${unknown} is unknown`);
|
|
16
|
+
}
|
|
17
|
+
/** Validate and defensively copy a persisted policy layer without filling defaults. */
|
|
18
|
+
export function normalizeFeedbackPolicyLayer(raw) {
|
|
19
|
+
const input = record(raw, 'feedback');
|
|
20
|
+
rejectUnknown(input, TOP_LEVEL, 'feedback');
|
|
21
|
+
if (input.enabled !== undefined && typeof input.enabled !== 'boolean')
|
|
22
|
+
throw new Error('feedback.enabled must be boolean');
|
|
23
|
+
if (input.audience !== undefined && input.audience !== 'requester')
|
|
24
|
+
throw new Error('feedback.audience must be requester');
|
|
25
|
+
if (input.allowReselect !== undefined && typeof input.allowReselect !== 'boolean')
|
|
26
|
+
throw new Error('feedback.allowReselect must be boolean');
|
|
27
|
+
if (input.visibleSemantics !== undefined && !Array.isArray(input.visibleSemantics))
|
|
28
|
+
throw new Error('feedback.visibleSemantics must be an array');
|
|
29
|
+
if (input.buttons !== undefined && !Array.isArray(input.buttons))
|
|
30
|
+
throw new Error('feedback.buttons must be an array');
|
|
31
|
+
let negativeFollowup;
|
|
32
|
+
if (input.negativeFollowup !== undefined) {
|
|
33
|
+
const followup = record(input.negativeFollowup, 'feedback.negativeFollowup');
|
|
34
|
+
rejectUnknown(followup, FOLLOWUP, 'feedback.negativeFollowup');
|
|
35
|
+
if (followup.reasons !== undefined && !Array.isArray(followup.reasons))
|
|
36
|
+
throw new Error('feedback.negativeFollowup.reasons must be an array');
|
|
37
|
+
let comment;
|
|
38
|
+
if (followup.comment !== undefined) {
|
|
39
|
+
const rawComment = record(followup.comment, 'feedback.negativeFollowup.comment');
|
|
40
|
+
rejectUnknown(rawComment, COMMENT, 'feedback.negativeFollowup.comment');
|
|
41
|
+
if (rawComment.enabled !== undefined && typeof rawComment.enabled !== 'boolean')
|
|
42
|
+
throw new Error('feedback.negativeFollowup.comment.enabled must be boolean');
|
|
43
|
+
if (rawComment.required !== undefined && typeof rawComment.required !== 'boolean')
|
|
44
|
+
throw new Error('feedback.negativeFollowup.comment.required must be boolean');
|
|
45
|
+
if (rawComment.placeholder !== undefined && typeof rawComment.placeholder !== 'string')
|
|
46
|
+
throw new Error('feedback.negativeFollowup.comment.placeholder must be string');
|
|
47
|
+
if (rawComment.maxLength !== undefined && !Number.isInteger(rawComment.maxLength))
|
|
48
|
+
throw new Error('feedback.negativeFollowup.comment.maxLength must be integer');
|
|
49
|
+
comment = structuredClone(rawComment);
|
|
50
|
+
}
|
|
51
|
+
negativeFollowup = {
|
|
52
|
+
...(followup.reasons !== undefined ? { reasons: structuredClone(followup.reasons) } : {}),
|
|
53
|
+
...(comment !== undefined ? { comment } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const layer = {
|
|
57
|
+
...(input.enabled !== undefined ? { enabled: input.enabled } : {}),
|
|
58
|
+
...(input.audience !== undefined ? { audience: input.audience } : {}),
|
|
59
|
+
...(input.visibleSemantics !== undefined ? { visibleSemantics: structuredClone(input.visibleSemantics) } : {}),
|
|
60
|
+
...(input.buttons !== undefined ? { buttons: structuredClone(input.buttons) } : {}),
|
|
61
|
+
...(negativeFollowup !== undefined ? { negativeFollowup } : {}),
|
|
62
|
+
...(input.allowReselect !== undefined ? { allowReselect: input.allowReselect } : {}),
|
|
63
|
+
};
|
|
64
|
+
// Validate supplied atomic values without expanding this persisted layer with
|
|
65
|
+
// defaults. Layers remain partial so a restart cannot turn inherited values
|
|
66
|
+
// into stale bot/chat-owned copies.
|
|
67
|
+
if (layer.visibleSemantics !== undefined || layer.buttons !== undefined || layer.negativeFollowup !== undefined) {
|
|
68
|
+
normalizeFeedbackPolicy({ enabled: true, ...layer });
|
|
69
|
+
}
|
|
70
|
+
return layer;
|
|
71
|
+
}
|
|
72
|
+
function mergeLayer(target, raw) {
|
|
73
|
+
if (!raw)
|
|
74
|
+
return;
|
|
75
|
+
const layer = normalizeFeedbackPolicyLayer(raw);
|
|
76
|
+
for (const field of ['enabled', 'audience', 'visibleSemantics', 'buttons', 'allowReselect']) {
|
|
77
|
+
if (layer[field] !== undefined)
|
|
78
|
+
target[field] = structuredClone(layer[field]);
|
|
79
|
+
}
|
|
80
|
+
if (layer.negativeFollowup) {
|
|
81
|
+
const prior = (target.negativeFollowup ?? {});
|
|
82
|
+
const next = { ...prior };
|
|
83
|
+
if (layer.negativeFollowup.reasons !== undefined)
|
|
84
|
+
next.reasons = structuredClone(layer.negativeFollowup.reasons);
|
|
85
|
+
if (layer.negativeFollowup.comment !== undefined) {
|
|
86
|
+
next.comment = { ...(prior.comment ?? {}), ...structuredClone(layer.negativeFollowup.comment) };
|
|
87
|
+
}
|
|
88
|
+
target.negativeFollowup = next;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function resolveEffectiveFeedbackPolicy(input) {
|
|
92
|
+
if (input.apiOnly)
|
|
93
|
+
return undefined;
|
|
94
|
+
const merged = { enabled: false };
|
|
95
|
+
mergeLayer(merged, input.team);
|
|
96
|
+
mergeLayer(merged, input.bot);
|
|
97
|
+
mergeLayer(merged, input.chat);
|
|
98
|
+
if (merged.enabled !== true)
|
|
99
|
+
return undefined;
|
|
100
|
+
return structuredClone(normalizeFeedbackPolicy(merged));
|
|
101
|
+
}
|
|
102
|
+
/** Resolve local hosted-team, bot, and bot-scoped chat layers at delivery time. */
|
|
103
|
+
export function resolveFeedbackTeamId(input) {
|
|
104
|
+
if (!input.chatId)
|
|
105
|
+
return undefined;
|
|
106
|
+
const teamIds = [...new Set(listTeamGroups(input.dataDir)
|
|
107
|
+
.filter(binding => binding.chatId === input.chatId && !binding.teamId.startsWith('platform:'))
|
|
108
|
+
.map(binding => binding.teamId))];
|
|
109
|
+
return teamIds.length === 1 ? teamIds[0] : undefined;
|
|
110
|
+
}
|
|
111
|
+
export function resolveFeedbackPolicyForDelivery(input) {
|
|
112
|
+
const bindings = input.chatId
|
|
113
|
+
? listTeamGroups(input.dataDir).filter(binding => binding.chatId === input.chatId && !binding.teamId.startsWith('platform:'))
|
|
114
|
+
: [];
|
|
115
|
+
const teamIds = [...new Set(bindings.map(binding => binding.teamId))];
|
|
116
|
+
if (teamIds.length > 1)
|
|
117
|
+
return undefined;
|
|
118
|
+
const team = teamIds.length === 1 ? getTeam(input.dataDir, teamIds[0]) : null;
|
|
119
|
+
return resolveEffectiveFeedbackPolicy({
|
|
120
|
+
team: team?.feedback,
|
|
121
|
+
bot: input.bot.feedback,
|
|
122
|
+
chat: input.chatId ? input.bot.chatFeedbackPolicies?.[input.chatId] : undefined,
|
|
123
|
+
apiOnly: input.bot.apiOnly,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** Dashboard-safe explanation of the same delivery-time resolution contract. */
|
|
127
|
+
export function traceFeedbackPolicyForDelivery(input) {
|
|
128
|
+
const bindings = input.chatId
|
|
129
|
+
? listTeamGroups(input.dataDir).filter(binding => binding.chatId === input.chatId && !binding.teamId.startsWith('platform:'))
|
|
130
|
+
: [];
|
|
131
|
+
const teamIds = [...new Set(bindings.map(binding => binding.teamId))];
|
|
132
|
+
if (teamIds.length > 1)
|
|
133
|
+
return { teamId: null, layers: {}, effective: null, sources: {}, reason: 'ambiguous_team' };
|
|
134
|
+
const teamId = teamIds[0] ?? null;
|
|
135
|
+
const layers = {
|
|
136
|
+
...(teamId && getTeam(input.dataDir, teamId)?.feedback ? { team: normalizeFeedbackPolicyLayer(getTeam(input.dataDir, teamId).feedback) } : {}),
|
|
137
|
+
...(input.bot.feedback ? { bot: normalizeFeedbackPolicyLayer(input.bot.feedback) } : {}),
|
|
138
|
+
...(input.chatId && input.bot.chatFeedbackPolicies?.[input.chatId]
|
|
139
|
+
? { chat: normalizeFeedbackPolicyLayer(input.bot.chatFeedbackPolicies[input.chatId]) } : {}),
|
|
140
|
+
};
|
|
141
|
+
const sources = {};
|
|
142
|
+
for (const [scope, layer] of Object.entries(layers)) {
|
|
143
|
+
for (const key of Object.keys(layer))
|
|
144
|
+
sources[key] = scope;
|
|
145
|
+
if (layer.negativeFollowup) {
|
|
146
|
+
for (const key of Object.keys(layer.negativeFollowup))
|
|
147
|
+
sources[`negativeFollowup.${key}`] = scope;
|
|
148
|
+
if (layer.negativeFollowup.comment)
|
|
149
|
+
for (const key of Object.keys(layer.negativeFollowup.comment))
|
|
150
|
+
sources[`negativeFollowup.comment.${key}`] = scope;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const effective = resolveEffectiveFeedbackPolicy({ ...layers, apiOnly: input.bot.apiOnly }) ?? null;
|
|
154
|
+
return { teamId, layers, effective, sources, reason: input.bot.apiOnly ? 'api_only' : effective ? 'enabled' : 'disabled' };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=feedback-policy-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-policy-resolver.js","sourceRoot":"","sources":["../../src/services/feedback-policy-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type FeedbackSemantic = 'positive' | 'progress' | 'negative';
|
|
2
|
+
export type FeedbackButtonStyle = 'primary' | 'default' | 'danger';
|
|
3
|
+
export interface FeedbackButton {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
semantic: FeedbackSemantic;
|
|
7
|
+
style: FeedbackButtonStyle;
|
|
8
|
+
}
|
|
9
|
+
export interface FeedbackReason {
|
|
10
|
+
key: string;
|
|
11
|
+
label: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FeedbackPolicy {
|
|
14
|
+
enabled: true;
|
|
15
|
+
audience: 'requester';
|
|
16
|
+
visibleSemantics: FeedbackSemantic[];
|
|
17
|
+
buttons: FeedbackButton[];
|
|
18
|
+
negativeFollowup: {
|
|
19
|
+
reasons: FeedbackReason[];
|
|
20
|
+
comment: {
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
required: boolean;
|
|
23
|
+
placeholder: string;
|
|
24
|
+
maxLength: number;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
allowReselect: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface FeedbackPolicyInput {
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
audience?: unknown;
|
|
32
|
+
visibleSemantics?: unknown;
|
|
33
|
+
buttons?: unknown;
|
|
34
|
+
negativeFollowup?: unknown;
|
|
35
|
+
allowReselect?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export declare function normalizeFeedbackPolicy(raw: unknown): FeedbackPolicy;
|
|
38
|
+
export declare function resolveFeedbackPolicy(raw: unknown, bot?: {
|
|
39
|
+
apiOnly?: boolean;
|
|
40
|
+
}): FeedbackPolicy | undefined;
|
|
41
|
+
//# sourceMappingURL=feedback-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-policy.d.ts","sourceRoot":"","sources":["../../src/services/feedback-policy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE9D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,gBAAgB,EAAE;QAChB,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,OAAO,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1F,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAkCD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CA4DpE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,cAAc,GAAG,SAAS,CAG3G"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const SEMANTICS = ['positive', 'progress', 'negative'];
|
|
2
|
+
const DEFAULT_BUTTONS = [
|
|
3
|
+
{ key: 'conclusive_usable', label: '结论可用', semantic: 'positive', style: 'primary' },
|
|
4
|
+
{ key: 'effective_progress', label: '有效推进', semantic: 'progress', style: 'default' },
|
|
5
|
+
{ key: 'incorrect', label: '结论有误', semantic: 'negative', style: 'danger' },
|
|
6
|
+
];
|
|
7
|
+
const KEY = /^[a-z0-9_-]+$/;
|
|
8
|
+
function object(value, path) {
|
|
9
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
10
|
+
throw new Error(`${path} must be an object`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function text(value, path, max) {
|
|
14
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > max)
|
|
15
|
+
throw new Error(`${path} must be 1-${max} characters`);
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function key(value, path) {
|
|
19
|
+
if (typeof value !== 'string' || !KEY.test(value))
|
|
20
|
+
throw new Error(`${path} key must match [a-z0-9_-]+`);
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
function unique(values, path) {
|
|
24
|
+
if (new Set(values).size !== values.length)
|
|
25
|
+
throw new Error(`${path} keys must be unique`);
|
|
26
|
+
}
|
|
27
|
+
function semantic(value, path) {
|
|
28
|
+
if (value !== 'positive' && value !== 'progress' && value !== 'negative')
|
|
29
|
+
throw new Error(`${path}.semantic is invalid`);
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
export function normalizeFeedbackPolicy(raw) {
|
|
33
|
+
const input = object(raw, 'feedback');
|
|
34
|
+
if (input.enabled !== true)
|
|
35
|
+
throw new Error('feedback.enabled must be true');
|
|
36
|
+
if (input.audience !== undefined && input.audience !== 'requester')
|
|
37
|
+
throw new Error('feedback.audience must be requester');
|
|
38
|
+
let visibleSemantics = [...SEMANTICS];
|
|
39
|
+
if (input.visibleSemantics !== undefined) {
|
|
40
|
+
if (!Array.isArray(input.visibleSemantics) || input.visibleSemantics.length < 1 || input.visibleSemantics.length > 3) {
|
|
41
|
+
throw new Error('feedback.visibleSemantics must contain 1-3 semantics');
|
|
42
|
+
}
|
|
43
|
+
visibleSemantics = input.visibleSemantics.map((value, index) => semantic(value, `feedback.visibleSemantics[${index}]`));
|
|
44
|
+
unique(visibleSemantics, 'feedback.visibleSemantics');
|
|
45
|
+
}
|
|
46
|
+
let buttons = DEFAULT_BUTTONS.map(button => ({ ...button }));
|
|
47
|
+
if (input.buttons !== undefined) {
|
|
48
|
+
if (!Array.isArray(input.buttons) || input.buttons.length < 2 || input.buttons.length > 4)
|
|
49
|
+
throw new Error('feedback.buttons must contain 2-4 buttons');
|
|
50
|
+
buttons = input.buttons.map((rawButton, index) => {
|
|
51
|
+
const button = object(rawButton, `feedback.buttons[${index}]`);
|
|
52
|
+
// Compatibility boundary for legacy config and persisted policy snapshots.
|
|
53
|
+
const value = button.semantic ?? button.sentiment;
|
|
54
|
+
const normalizedSemantic = semantic(value, `feedback.buttons[${index}]`);
|
|
55
|
+
const style = button.style ?? (normalizedSemantic === 'positive' ? 'primary' : 'default');
|
|
56
|
+
if (style !== 'primary' && style !== 'default' && style !== 'danger')
|
|
57
|
+
throw new Error(`feedback.buttons[${index}].style is invalid`);
|
|
58
|
+
return { key: key(button.key, `feedback.buttons[${index}]`), label: text(button.label, `feedback.buttons[${index}].label`, 24), semantic: normalizedSemantic, style };
|
|
59
|
+
});
|
|
60
|
+
unique(buttons.map(button => button.key), 'feedback.buttons');
|
|
61
|
+
}
|
|
62
|
+
for (const required of visibleSemantics) {
|
|
63
|
+
if (!buttons.some(button => button.semantic === required))
|
|
64
|
+
throw new Error(`feedback.buttons requires at least one ${required} button`);
|
|
65
|
+
}
|
|
66
|
+
if (buttons.some(button => !visibleSemantics.includes(button.semantic))) {
|
|
67
|
+
throw new Error('feedback.buttons semantic must be included in feedback.visibleSemantics');
|
|
68
|
+
}
|
|
69
|
+
const followup = input.negativeFollowup === undefined ? {} : object(input.negativeFollowup, 'feedback.negativeFollowup');
|
|
70
|
+
let reasons = [];
|
|
71
|
+
if (followup.reasons !== undefined) {
|
|
72
|
+
if (!Array.isArray(followup.reasons) || followup.reasons.length > 6)
|
|
73
|
+
throw new Error('feedback.negativeFollowup.reasons allows 0-6 reasons');
|
|
74
|
+
reasons = followup.reasons.map((rawReason, index) => {
|
|
75
|
+
const reason = object(rawReason, `feedback.negativeFollowup.reasons[${index}]`);
|
|
76
|
+
return { key: key(reason.key, `feedback.negativeFollowup.reasons[${index}]`), label: text(reason.label, `feedback.negativeFollowup.reasons[${index}].label`, 32) };
|
|
77
|
+
});
|
|
78
|
+
unique(reasons.map(reason => reason.key), 'feedback.negativeFollowup.reasons');
|
|
79
|
+
}
|
|
80
|
+
const rawComment = followup.comment === undefined ? {} : object(followup.comment, 'feedback.negativeFollowup.comment');
|
|
81
|
+
const maxLength = rawComment.maxLength ?? 1000;
|
|
82
|
+
if (!Number.isInteger(maxLength) || Number(maxLength) < 1 || Number(maxLength) > 2000)
|
|
83
|
+
throw new Error('feedback.negativeFollowup.comment.maxLength must be 1-2000');
|
|
84
|
+
const placeholder = rawComment.placeholder === undefined ? '可以补充哪里需要改进' : text(rawComment.placeholder, 'feedback.negativeFollowup.comment.placeholder', 100);
|
|
85
|
+
return {
|
|
86
|
+
enabled: true,
|
|
87
|
+
audience: 'requester',
|
|
88
|
+
allowReselect: input.allowReselect === true,
|
|
89
|
+
visibleSemantics,
|
|
90
|
+
buttons,
|
|
91
|
+
negativeFollowup: {
|
|
92
|
+
reasons,
|
|
93
|
+
comment: { enabled: rawComment.enabled !== false, required: rawComment.required === true, placeholder, maxLength: Number(maxLength) },
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function resolveFeedbackPolicy(raw, bot) {
|
|
98
|
+
if (bot?.apiOnly || !raw || typeof raw !== 'object' || Array.isArray(raw) || raw.enabled !== true)
|
|
99
|
+
return undefined;
|
|
100
|
+
return normalizeFeedbackPolicy(raw);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=feedback-policy.js.map
|