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,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async AI title for session groups (p2pMode='group', naming.mode='ai-summary').
|
|
3
|
+
*
|
|
4
|
+
* Two-phase naming: the group is created instantly with a truncated
|
|
5
|
+
* placeholder name; this module then runs ONE headless single-turn call
|
|
6
|
+
* through the bot's own CLI to produce a short title and renames the chat
|
|
7
|
+
* when it lands. Fire-and-forget — every failure path simply keeps the
|
|
8
|
+
* placeholder, never blocks or breaks the conversation.
|
|
9
|
+
*
|
|
10
|
+
* The one-shot command is a small per-cliId argv template (print/exec modes
|
|
11
|
+
* of the CLIs botmux already drives). CLIs without a known print mode
|
|
12
|
+
* degrade to the placeholder silently.
|
|
13
|
+
*/
|
|
14
|
+
import { execFile } from 'node:child_process';
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { getBot } from '../bot-registry.js';
|
|
17
|
+
import { redactChildEnv } from '../utils/child-env.js';
|
|
18
|
+
import { sanitizePerBotEnv } from '../core/per-bot-env.js';
|
|
19
|
+
import { buildWrappedLaunch, wrapperLaunchEnv } from '../setup/cli-selection.js';
|
|
20
|
+
import { renameChat } from './groups-store.js';
|
|
21
|
+
import { getSessionGroup, markSessionGroupTitled, touchSessionGroup } from './session-groups-store.js';
|
|
22
|
+
import * as sessionStore from './session-store.js';
|
|
23
|
+
import { updateSessionTitle } from '../core/session-title.js';
|
|
24
|
+
import { localeForBot } from '../i18n/index.js';
|
|
25
|
+
import { logger } from '../utils/logger.js';
|
|
26
|
+
// Generous: one-shot CLIs pay cold-start + API latency (codex regularly
|
|
27
|
+
// exceeds 15s); the rename is async so a slow title costs nothing visible.
|
|
28
|
+
const TITLE_TIMEOUT_MS = 45_000;
|
|
29
|
+
const DEFAULT_MAX_LEN = 12;
|
|
30
|
+
/** Per-cliId one-shot print-mode argv template. `argv[0]` is replaced by
|
|
31
|
+
* `cliPathOverride` when configured. Prompt is appended as the last arg. */
|
|
32
|
+
const ONE_SHOT_ARGV = {
|
|
33
|
+
'claude-code': ['claude', '-p'],
|
|
34
|
+
codex: ['codex', 'exec', '--skip-git-repo-check'],
|
|
35
|
+
// TRAE CLI is a codex fork — same exec surface and bare-answer stdout.
|
|
36
|
+
traex: ['traex', 'exec', '--skip-git-repo-check'],
|
|
37
|
+
opencode: ['opencode', 'run'],
|
|
38
|
+
gemini: ['gemini', '-p'],
|
|
39
|
+
};
|
|
40
|
+
/** One in-flight title job per chat — birth and the heal-on-activity path
|
|
41
|
+
* (handleThreadReply) can otherwise race duplicate CLI calls. */
|
|
42
|
+
const inFlightTitles = new Set();
|
|
43
|
+
/**
|
|
44
|
+
* Child env for the one-shot title call — the SAME security boundary as every
|
|
45
|
+
* other CLI child the daemon spawns (PR review P2): `redactChildEnv` strips
|
|
46
|
+
* daemon-only secrets (LARK_APP_SECRET, GITHUB_TOKEN, tmux client vars, Claude
|
|
47
|
+
* session markers) and `sanitizePerBotEnv(cfg.env)` layers the bot's own
|
|
48
|
+
* provider environment (base URL / auth token) on top so multi-provider bots
|
|
49
|
+
* title through their own account instead of the daemon's. Exported for the
|
|
50
|
+
* env-boundary regression tests.
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* Resolve the one-shot launch with the SAME launcher semantics as the formal
|
|
54
|
+
* CLI spawn path (PR review): `wrapperCli` goes through buildWrappedLaunch —
|
|
55
|
+
* the shared builder that knows the gateway specifics (ttadk needs
|
|
56
|
+
* `-m <model> --skip-check` or it opens an interactive model selector /
|
|
57
|
+
* preflight and a non-TTY execFile hangs to timeout; aiden strips args it
|
|
58
|
+
* rejects; cjadk rewrites codex config args) — plus wrapperLaunchEnv for the
|
|
59
|
+
* wrapper's non-interactive env knobs (CJADK_INTERACTIVE=0). Without a
|
|
60
|
+
* wrapper, `cliPathOverride` (registerBot enforces it as an exact shadow of
|
|
61
|
+
* cliRuntime.executable, so runtime configs are covered transitively)
|
|
62
|
+
* replaces the template bin; otherwise the template runs verbatim. Exported
|
|
63
|
+
* for tests.
|
|
64
|
+
*/
|
|
65
|
+
export function resolveOneShotCommand(cfg, template) {
|
|
66
|
+
const wrapper = cfg.wrapperCli?.trim();
|
|
67
|
+
if (wrapper) {
|
|
68
|
+
const { bin, args } = buildWrappedLaunch(wrapper, template.slice(1), b => b, { ttadkModel: cfg.model });
|
|
69
|
+
return { argv: [bin, ...args], env: wrapperLaunchEnv(wrapper) };
|
|
70
|
+
}
|
|
71
|
+
const override = cfg.cliPathOverride?.trim();
|
|
72
|
+
if (override)
|
|
73
|
+
return { argv: [override, ...template.slice(1)] };
|
|
74
|
+
return { argv: [...template] };
|
|
75
|
+
}
|
|
76
|
+
export function buildOneShotEnv(botEnv) {
|
|
77
|
+
const env = {
|
|
78
|
+
...redactChildEnv(process.env),
|
|
79
|
+
...sanitizePerBotEnv(botEnv),
|
|
80
|
+
};
|
|
81
|
+
// Never let the one-shot inherit a botmux session identity (redundant with
|
|
82
|
+
// the marker scrub above, kept as an explicit invariant).
|
|
83
|
+
delete env.BOTMUX_SESSION_ID;
|
|
84
|
+
return env;
|
|
85
|
+
}
|
|
86
|
+
export function buildTitlePrompt(text, maxLen, locale) {
|
|
87
|
+
const excerpt = text.replace(/\s+/g, ' ').trim().slice(0, 500);
|
|
88
|
+
if (locale === 'en') {
|
|
89
|
+
return `Summarize the following request as a conversation title of at most ${maxLen} characters. Output ONLY the title itself — no quotes, no trailing period, no explanation:\n\n${excerpt}`;
|
|
90
|
+
}
|
|
91
|
+
return `用不超过${maxLen}个字总结下面这条请求,作为会话标题。只输出标题本身,不要引号、句号或任何解释:\n\n${excerpt}`;
|
|
92
|
+
}
|
|
93
|
+
/** Strip decoration from a candidate title line. */
|
|
94
|
+
function cleanTitleLine(raw) {
|
|
95
|
+
return raw
|
|
96
|
+
.replace(/^["'“”‘’`#*\s]+/, '')
|
|
97
|
+
// Trailing quotes/backticks and sentence punctuation interleave (e.g.
|
|
98
|
+
// `标题"。`) — strip them as one class so the order can't matter.
|
|
99
|
+
.replace(/["'“”‘’`。.!!??\s]+$/, '')
|
|
100
|
+
.trim();
|
|
101
|
+
}
|
|
102
|
+
/** Extract a plausible title from one-shot CLI stdout: last non-empty line
|
|
103
|
+
* (codex/opencode prepend progress logs; claude/gemini print the bare
|
|
104
|
+
* answer), stripped of quotes/markdown and length-capped. Two passes: a
|
|
105
|
+
* strict pass drops known log-line shapes; if that filters EVERYTHING (an
|
|
106
|
+
* output shape we didn't predict), a lenient pass takes the last line that
|
|
107
|
+
* still looks like prose — never let over-filtering blank a real answer. */
|
|
108
|
+
export function sanitizeTitleOutput(stdout, maxLen) {
|
|
109
|
+
const all = stdout.split('\n').map(l => l.trim()).filter(Boolean);
|
|
110
|
+
// Obvious non-answers in ANY pass: dividers, bare numbers, hook chatter,
|
|
111
|
+
// lines with no letter/digit at all.
|
|
112
|
+
const junk = (l) => !/[\p{L}\p{N}]/u.test(l) || /^[-=—_\s]+$/.test(l) || /^\d[\d,.\s]*$/.test(l) || /^hook:/i.test(l);
|
|
113
|
+
const strict = all
|
|
114
|
+
// codex exec progress lines look like "[2026-08-05T…] tokens used: 123" —
|
|
115
|
+
// drop bracketed/log-ish lines so the answer line survives as the last one.
|
|
116
|
+
.filter(l => !junk(l) && !/^\[.*\]/.test(l) && !/^(tokens used|thinking|codex$|user$)/i.test(l));
|
|
117
|
+
// Lenient fallback: keep anything prose-like, including bracket-prefixed
|
|
118
|
+
// lines the strict pass dropped (unpredicted "[ts] answer" shapes).
|
|
119
|
+
const lenient = all.filter(l => !junk(l));
|
|
120
|
+
const raw = strict.length ? strict[strict.length - 1]
|
|
121
|
+
// The lenient pick may still carry a bracketed log prefix — strip it so a
|
|
122
|
+
// "[ts] answer" line yields the answer, not the timestamp.
|
|
123
|
+
: lenient.length ? lenient[lenient.length - 1].replace(/^\[[^\]]*\]\s*/, '') : '';
|
|
124
|
+
const cleaned = cleanTitleLine(raw);
|
|
125
|
+
if (!cleaned)
|
|
126
|
+
return null;
|
|
127
|
+
// Hard cap: maxLen is advisory to the model; enforce a generous ceiling so
|
|
128
|
+
// a slightly-long but good title still beats the placeholder.
|
|
129
|
+
const capped = Array.from(cleaned).slice(0, Math.max(maxLen * 2, 16)).join('');
|
|
130
|
+
return capped || null;
|
|
131
|
+
}
|
|
132
|
+
/** Fire-and-forget: generate an AI title for a freshly-born session group and
|
|
133
|
+
* rename the chat (+ session record) when it lands. */
|
|
134
|
+
export function scheduleSessionGroupTitle(opts) {
|
|
135
|
+
const { larkAppId, chatId, userText } = opts;
|
|
136
|
+
if (inFlightTitles.has(chatId))
|
|
137
|
+
return;
|
|
138
|
+
inFlightTitles.add(chatId);
|
|
139
|
+
void (async () => {
|
|
140
|
+
try {
|
|
141
|
+
const cfg = getBot(larkAppId).config;
|
|
142
|
+
const sg = cfg.sessionGroup ?? {};
|
|
143
|
+
if ((sg.naming?.mode ?? 'ai-summary') !== 'ai-summary')
|
|
144
|
+
return;
|
|
145
|
+
if (!userText.trim())
|
|
146
|
+
return;
|
|
147
|
+
const maxLen = sg.naming?.maxLen && sg.naming.maxLen > 0 ? sg.naming.maxLen : DEFAULT_MAX_LEN;
|
|
148
|
+
const template = ONE_SHOT_ARGV[cfg.cliId];
|
|
149
|
+
if (!template) {
|
|
150
|
+
logger.info(`[session-group] no one-shot template for cliId=${cfg.cliId}; keeping placeholder title`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const { argv, env: wrapperEnv } = resolveOneShotCommand(cfg, template);
|
|
154
|
+
const prompt = buildTitlePrompt(userText, maxLen, localeForBot(larkAppId));
|
|
155
|
+
const runOnce = () => new Promise((resolve, reject) => {
|
|
156
|
+
const env = { ...buildOneShotEnv(cfg.env), ...wrapperEnv };
|
|
157
|
+
const child = execFile(argv[0], [...argv.slice(1), prompt], {
|
|
158
|
+
timeout: TITLE_TIMEOUT_MS,
|
|
159
|
+
maxBuffer: 1024 * 1024,
|
|
160
|
+
cwd: tmpdir(),
|
|
161
|
+
env,
|
|
162
|
+
}, (err, out, errOut) => {
|
|
163
|
+
if (err && !out) {
|
|
164
|
+
// Surface stderr — execFile's bare "Command failed: …" hides the
|
|
165
|
+
// actual CLI error (API failures, auth, rate limits).
|
|
166
|
+
const detail = String(errOut ?? '').trim().split('\n').slice(-2).join(' ').slice(0, 200);
|
|
167
|
+
return reject(new Error(`${err.message.split('\n')[0]}${detail ? ` | stderr: ${detail}` : ''}`));
|
|
168
|
+
}
|
|
169
|
+
resolve(String(out ?? ''));
|
|
170
|
+
});
|
|
171
|
+
// CRITICAL: close stdin. codex-family CLIs (codex/traex) treat a piped
|
|
172
|
+
// stdin as "additional input" and BLOCK reading it until EOF — with
|
|
173
|
+
// execFile's default open pipe they hang to the timeout and get killed
|
|
174
|
+
// ("Reading additional input from stdin..."). A TTY stdin (manual
|
|
175
|
+
// testing) skips that path, which is why this only bites under the
|
|
176
|
+
// daemon. Closing stdin is a no-op for CLIs that never read it.
|
|
177
|
+
child.stdin?.end();
|
|
178
|
+
});
|
|
179
|
+
// One-shot CLI calls fail transiently (API hiccups, cold start races) —
|
|
180
|
+
// a single spaced retry recovers most of them without delaying much.
|
|
181
|
+
let stdout;
|
|
182
|
+
try {
|
|
183
|
+
stdout = await runOnce();
|
|
184
|
+
}
|
|
185
|
+
catch (firstErr) {
|
|
186
|
+
logger.info(`[session-group] AI title attempt 1 failed for chat=${chatId.substring(0, 12)} (retrying): ${firstErr}`);
|
|
187
|
+
await new Promise(r => setTimeout(r, 3000));
|
|
188
|
+
stdout = await runOnce();
|
|
189
|
+
}
|
|
190
|
+
const title = sanitizeTitleOutput(stdout, maxLen);
|
|
191
|
+
if (!title) {
|
|
192
|
+
// Log the raw head — an unpredicted output shape is invisible otherwise.
|
|
193
|
+
const rawHead = stdout.replace(/\s+/g, ' ').trim().slice(0, 200);
|
|
194
|
+
logger.info(`[session-group] AI title empty for chat=${chatId.substring(0, 12)}; keeping placeholder (raw: "${rawHead}")`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const prefix = sg.namePrefix ?? '';
|
|
198
|
+
const finalName = `${prefix}${title}`;
|
|
199
|
+
// Reuse the shared renameChat wrapper (membership precheck + error
|
|
200
|
+
// classification) instead of a bespoke chat.update call.
|
|
201
|
+
const r = await renameChat(larkAppId, chatId, finalName);
|
|
202
|
+
if (!r.ok) {
|
|
203
|
+
logger.warn(`[session-group] rename chat=${chatId.substring(0, 12)} failed: ${r.error}${r.detail ? ` (${r.detail})` : ''}`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
markSessionGroupTitled(chatId);
|
|
207
|
+
// Best-effort: keep the botmux session title in sync so `botmux list` /
|
|
208
|
+
// dashboard show the same name as the chat (same path as /rename).
|
|
209
|
+
const entry = getSessionGroup(chatId);
|
|
210
|
+
if (entry?.lastSessionId) {
|
|
211
|
+
const session = sessionStore.getSession(entry.lastSessionId);
|
|
212
|
+
if (session)
|
|
213
|
+
updateSessionTitle(session, title, 'system');
|
|
214
|
+
touchSessionGroup(chatId);
|
|
215
|
+
}
|
|
216
|
+
logger.info(`[session-group] titled chat=${chatId.substring(0, 12)} "${finalName}"`);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
logger.info(`[session-group] AI title failed for chat=${chatId.substring(0, 12)} (placeholder kept): ${err}`);
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
inFlightTitles.delete(chatId);
|
|
223
|
+
}
|
|
224
|
+
})();
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=session-group-title.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-group-title.js","sourceRoot":"","sources":["../../src/services/session-group-title.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface SessionGroupEntry {
|
|
2
|
+
/** The DM user this group was born for (open_id in the bot's app scope). */
|
|
3
|
+
ownerOpenId: string;
|
|
4
|
+
/** Most recent session anchored in this group; same-group resume target. */
|
|
5
|
+
lastSessionId: string;
|
|
6
|
+
/** Epoch ms the group was created. */
|
|
7
|
+
createdAt: number;
|
|
8
|
+
/** Epoch ms of the last observed activity (birth, resume, new session). */
|
|
9
|
+
lastActiveAt: number;
|
|
10
|
+
/** True once the async AI title has been applied to the chat name. */
|
|
11
|
+
titled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function initSessionGroups(appId: string): void;
|
|
14
|
+
/** Register a freshly-born session group (or overwrite after a re-birth). */
|
|
15
|
+
export declare function registerSessionGroup(chatId: string, entry: Omit<SessionGroupEntry, 'createdAt' | 'lastActiveAt'> & {
|
|
16
|
+
createdAt?: number;
|
|
17
|
+
}): void;
|
|
18
|
+
/** Typing check — the ONLY sanctioned way to tell a session group apart. */
|
|
19
|
+
export declare function isSessionGroup(chatId: string): boolean;
|
|
20
|
+
export declare function getSessionGroup(chatId: string): SessionGroupEntry | undefined;
|
|
21
|
+
/** Point the registry at the session currently living in this group. */
|
|
22
|
+
export declare function touchSessionGroup(chatId: string, lastSessionId?: string): void;
|
|
23
|
+
/** Mark the async AI title as applied (idempotent). */
|
|
24
|
+
export declare function markSessionGroupTitled(chatId: string): void;
|
|
25
|
+
/** Remove a registry entry (group disbanded / bot removed / gc). */
|
|
26
|
+
export declare function removeSessionGroup(chatId: string): void;
|
|
27
|
+
export declare function listSessionGroups(): Array<{
|
|
28
|
+
chatId: string;
|
|
29
|
+
} & SessionGroupEntry>;
|
|
30
|
+
//# sourceMappingURL=session-groups-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-groups-store.d.ts","sourceRoot":"","sources":["../../src/services/session-groups-store.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;AAyCD,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,cAAc,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWhJ;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAItD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAI7E;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAO9E;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM3D;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAAC,CAIjF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-group registry — the authoritative "is this chat a session group?"
|
|
3
|
+
* lookup for p2pMode='group'.
|
|
4
|
+
*
|
|
5
|
+
* A session group is a disposable 1-user+1-bot chat auto-created to host ONE
|
|
6
|
+
* DM-born conversation (see docs: p2pMode=group). It is deliberately typed
|
|
7
|
+
* apart from workspace groups: per-chat features (oncall UI, /reply-mode,
|
|
8
|
+
* dashboard group management) consult this registry to exclude or specialize
|
|
9
|
+
* session groups WITHOUT string-matching on chat names.
|
|
10
|
+
*
|
|
11
|
+
* Registry answers three questions:
|
|
12
|
+
* 1. isSessionGroup(chatId) — typing / feature gating
|
|
13
|
+
* 2. lastSessionId for a chatId — same-group resume: a new message in a
|
|
14
|
+
* session group whose session was /close'd resumes that session instead
|
|
15
|
+
* of spawning a fresh one (的话题内续聊同款体验).
|
|
16
|
+
* 3. ownerOpenId — the DM user the group was born for.
|
|
17
|
+
*
|
|
18
|
+
* File layout mirrors session-store / chat-first-seen-store: one file per bot
|
|
19
|
+
* at `${config.session.dataDir}/session-groups-${appId}.json`, written
|
|
20
|
+
* atomically via tmp + rename. One daemon process serves one bot, so the
|
|
21
|
+
* per-appId singleton pattern applies.
|
|
22
|
+
*/
|
|
23
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync } from 'node:fs';
|
|
24
|
+
import { join, dirname } from 'node:path';
|
|
25
|
+
import { config } from '../config.js';
|
|
26
|
+
import { logger } from '../utils/logger.js';
|
|
27
|
+
let entries = new Map();
|
|
28
|
+
let loaded = false;
|
|
29
|
+
let currentAppId;
|
|
30
|
+
export function initSessionGroups(appId) {
|
|
31
|
+
currentAppId = appId;
|
|
32
|
+
loaded = false;
|
|
33
|
+
entries = new Map();
|
|
34
|
+
}
|
|
35
|
+
function getFilePath() {
|
|
36
|
+
if (!currentAppId)
|
|
37
|
+
throw new Error('session-groups-store not initialised (call initSessionGroups(appId) first)');
|
|
38
|
+
return join(config.session.dataDir, `session-groups-${currentAppId}.json`);
|
|
39
|
+
}
|
|
40
|
+
function ensureDir() {
|
|
41
|
+
const dir = dirname(getFilePath());
|
|
42
|
+
if (!existsSync(dir))
|
|
43
|
+
mkdirSync(dir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
function load() {
|
|
46
|
+
if (loaded)
|
|
47
|
+
return;
|
|
48
|
+
ensureDir();
|
|
49
|
+
const fp = getFilePath();
|
|
50
|
+
if (existsSync(fp)) {
|
|
51
|
+
try {
|
|
52
|
+
const data = JSON.parse(readFileSync(fp, 'utf-8'));
|
|
53
|
+
entries = new Map(Object.entries(data).filter(([, v]) => v && typeof v.ownerOpenId === 'string' && typeof v.lastSessionId === 'string'));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
logger.error(`[session-groups] failed to load ${fp}: ${err}`);
|
|
57
|
+
entries = new Map();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
loaded = true;
|
|
61
|
+
}
|
|
62
|
+
function persist() {
|
|
63
|
+
ensureDir();
|
|
64
|
+
const fp = getFilePath();
|
|
65
|
+
const tmp = `${fp}.tmp`;
|
|
66
|
+
try {
|
|
67
|
+
writeFileSync(tmp, JSON.stringify(Object.fromEntries(entries), null, 2), 'utf-8');
|
|
68
|
+
renameSync(tmp, fp);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
logger.error(`[session-groups] failed to persist ${fp}: ${err}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Register a freshly-born session group (or overwrite after a re-birth). */
|
|
75
|
+
export function registerSessionGroup(chatId, entry) {
|
|
76
|
+
load();
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
entries.set(chatId, {
|
|
79
|
+
ownerOpenId: entry.ownerOpenId,
|
|
80
|
+
lastSessionId: entry.lastSessionId,
|
|
81
|
+
createdAt: entry.createdAt ?? now,
|
|
82
|
+
lastActiveAt: now,
|
|
83
|
+
titled: entry.titled,
|
|
84
|
+
});
|
|
85
|
+
persist();
|
|
86
|
+
}
|
|
87
|
+
/** Typing check — the ONLY sanctioned way to tell a session group apart. */
|
|
88
|
+
export function isSessionGroup(chatId) {
|
|
89
|
+
if (!currentAppId)
|
|
90
|
+
return false;
|
|
91
|
+
load();
|
|
92
|
+
return entries.has(chatId);
|
|
93
|
+
}
|
|
94
|
+
export function getSessionGroup(chatId) {
|
|
95
|
+
if (!currentAppId)
|
|
96
|
+
return undefined;
|
|
97
|
+
load();
|
|
98
|
+
return entries.get(chatId);
|
|
99
|
+
}
|
|
100
|
+
/** Point the registry at the session currently living in this group. */
|
|
101
|
+
export function touchSessionGroup(chatId, lastSessionId) {
|
|
102
|
+
load();
|
|
103
|
+
const cur = entries.get(chatId);
|
|
104
|
+
if (!cur)
|
|
105
|
+
return;
|
|
106
|
+
if (lastSessionId)
|
|
107
|
+
cur.lastSessionId = lastSessionId;
|
|
108
|
+
cur.lastActiveAt = Date.now();
|
|
109
|
+
persist();
|
|
110
|
+
}
|
|
111
|
+
/** Mark the async AI title as applied (idempotent). */
|
|
112
|
+
export function markSessionGroupTitled(chatId) {
|
|
113
|
+
load();
|
|
114
|
+
const cur = entries.get(chatId);
|
|
115
|
+
if (!cur || cur.titled)
|
|
116
|
+
return;
|
|
117
|
+
cur.titled = true;
|
|
118
|
+
persist();
|
|
119
|
+
}
|
|
120
|
+
/** Remove a registry entry (group disbanded / bot removed / gc). */
|
|
121
|
+
export function removeSessionGroup(chatId) {
|
|
122
|
+
load();
|
|
123
|
+
if (entries.delete(chatId))
|
|
124
|
+
persist();
|
|
125
|
+
}
|
|
126
|
+
export function listSessionGroups() {
|
|
127
|
+
if (!currentAppId)
|
|
128
|
+
return [];
|
|
129
|
+
load();
|
|
130
|
+
return Array.from(entries.entries()).map(([chatId, v]) => ({ chatId, ...v }));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=session-groups-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-groups-store.js","sourceRoot":"","sources":["../../src/services/session-groups-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -131,4 +131,62 @@ export declare function countActiveSessionsOnDisk(dataDir?: string): number;
|
|
|
131
131
|
* resumable via their own session-closed cards.
|
|
132
132
|
*/
|
|
133
133
|
export declare function collectBotmuxSessionIdentities(dataDir?: string): Set<string>;
|
|
134
|
+
/**
|
|
135
|
+
* Read-only snapshot of every session row across the legacy `sessions.json`
|
|
136
|
+
* and all per-bot `sessions-<appId>.json` files. Per-bot rows win duplicate
|
|
137
|
+
* sessionIds and get `larkAppId` stamped from their filename so a later
|
|
138
|
+
* offline mutation resolves the owning file. Deliberately lock-free: atomic
|
|
139
|
+
* tmp+rename publication keeps each file self-consistent, and snapshot
|
|
140
|
+
* composition must stay a pure reader (an older CLI opportunistically migrated
|
|
141
|
+
* legacy rows here, which made even `botmux list` a whole-file writer able to
|
|
142
|
+
* race a daemon save).
|
|
143
|
+
*/
|
|
144
|
+
export declare function loadAllSessionsSnapshot(options?: {
|
|
145
|
+
dataDir?: string;
|
|
146
|
+
/** Per-bot fallback when the data dir cannot be enumerated (the CLI file
|
|
147
|
+
* sandbox exposes sessions-<self>.json but NOT a listing of data/). */
|
|
148
|
+
fallbackAppId?: string;
|
|
149
|
+
}): Map<string, Session>;
|
|
150
|
+
/**
|
|
151
|
+
* Unlocked point-read of one row straight from disk, bypassing this process's
|
|
152
|
+
* in-memory cache: the owning per-bot file first, then the legacy
|
|
153
|
+
* `sessions.json`. Atomic tmp+rename publication keeps each file
|
|
154
|
+
* self-consistent, so this never blocks on (or throws from) the store lock —
|
|
155
|
+
* safe on hot paths that only need a freshness hint.
|
|
156
|
+
*/
|
|
157
|
+
export declare function readSessionRowFromDisk(sessionId: string, larkAppId?: string, dataDir?: string): Session | undefined;
|
|
158
|
+
/**
|
|
159
|
+
* Fail-closed identity scan: every file's copy of one session row across the
|
|
160
|
+
* legacy and all per-bot files — one entry per file that holds the id. An
|
|
161
|
+
* unlistable data dir THROWS: a caller proving "this row resolves exactly
|
|
162
|
+
* once" must not mistake an unreadable store for an empty one. A corrupt
|
|
163
|
+
* individual file is skipped: an unrelated bot's bad file must neither block
|
|
164
|
+
* nor impersonate a valid record; the target row still has to resolve from a
|
|
165
|
+
* readable file.
|
|
166
|
+
*/
|
|
167
|
+
export declare function readSessionRowCopiesAcrossStores(sessionId: string, dataDir?: string): Session[];
|
|
168
|
+
/**
|
|
169
|
+
* Locked offline mutation of one exact row in its owning file (per-bot when
|
|
170
|
+
* the caller-observed row carries `larkAppId`, legacy `sessions.json`
|
|
171
|
+
* otherwise). Re-reads the row under the SAME lock the owning daemon uses for
|
|
172
|
+
* every save and hands the FRESH copy to `mutate` — never publishing the
|
|
173
|
+
* caller's possibly-stale snapshot — then republishes with the daemon's own
|
|
174
|
+
* tmp+rename / mismatched-key cleanup / legacy-field strip.
|
|
175
|
+
*
|
|
176
|
+
* `abortIf` is evaluated under the lock at entry and re-evaluated immediately
|
|
177
|
+
* before publication; returning true abandons the mutation with `undefined`
|
|
178
|
+
* (callers pass a daemon-liveness probe so an owning daemon that appears
|
|
179
|
+
* mid-flight stays authoritative and the file is left untouched).
|
|
180
|
+
*
|
|
181
|
+
* Returns the fresh row — mutated when `mutate` returned true, otherwise
|
|
182
|
+
* unmodified (so `() => false` is a locked fresh read) — or undefined when
|
|
183
|
+
* the row is absent or `abortIf` aborted.
|
|
184
|
+
*/
|
|
185
|
+
export declare function mutateSessionRowOffline(target: {
|
|
186
|
+
sessionId: string;
|
|
187
|
+
larkAppId?: string;
|
|
188
|
+
}, mutate: (current: Session) => boolean, options?: {
|
|
189
|
+
dataDir?: string;
|
|
190
|
+
abortIf?: () => boolean;
|
|
191
|
+
}): Session | undefined;
|
|
134
192
|
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/services/session-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/services/session-store.ts"],"names":[],"mappings":"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"}
|