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,673 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* dsh-runner: botmux runner for deepseek-harness (dsh).
|
|
4
|
+
*
|
|
5
|
+
* botmux spawns this with node (see adapters/cli/dsh.ts). It bridges two
|
|
6
|
+
* protocols:
|
|
7
|
+
*
|
|
8
|
+
* botmux side (stdin/stdout):
|
|
9
|
+
* - input frames: `::botmux-dsh:<base64(JSON)>\n` one per user message
|
|
10
|
+
* - output: display lines + OSC control frames
|
|
11
|
+
* (`\x1b]777;botmux:<kind>:<base64>\x07`, see
|
|
12
|
+
* adapters/cli/runner-control-channel.ts)
|
|
13
|
+
*
|
|
14
|
+
* dsh side (child `dsh-jsonrpc-agent` process, newline-delimited JSON-RPC):
|
|
15
|
+
* - requests: initialize / session/prompt / shutdown
|
|
16
|
+
* - notifications: session.event (full event stream), session.status,
|
|
17
|
+
* subagent.started, subagent.finished
|
|
18
|
+
*
|
|
19
|
+
* One runner process owns one dsh session (a fixed sessionId reused across
|
|
20
|
+
* prompts, so the connection stays multi-turn). Turn completion is driven by
|
|
21
|
+
* `session.status: idle`. The agent's final text is accumulated from
|
|
22
|
+
* assistant/message events and delivered to botmux as a `final` control
|
|
23
|
+
* frame; tool calls render as progress lines.
|
|
24
|
+
*
|
|
25
|
+
* The SDK protocol has no cancel: a wedged turn is reaped by the turn
|
|
26
|
+
* watchdog, which kills the child and exits so botmux restarts the runner
|
|
27
|
+
* (the in-memory session is lost; sessions persist on disk under
|
|
28
|
+
* DSH_SESSION_ROOT but cross-process resume is not wired up yet).
|
|
29
|
+
*/
|
|
30
|
+
import { spawn } from 'node:child_process';
|
|
31
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
32
|
+
import { homedir } from 'node:os';
|
|
33
|
+
import { join, resolve } from 'node:path';
|
|
34
|
+
import { randomUUID } from 'node:crypto';
|
|
35
|
+
import { RunnerControlWriter } from './adapters/cli/runner-control-channel.js';
|
|
36
|
+
const DSH_MARKER = '::botmux-dsh:';
|
|
37
|
+
const DEFAULT_TURN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
38
|
+
// Node's setTimeout delay is a 32-bit signed int of ms; a larger value wraps to
|
|
39
|
+
// ~1ms and warns. Upstream config/IPC/UI already clamp to this bound, but the
|
|
40
|
+
// runner re-validates its own argv so a hand-crafted invocation can't arm an
|
|
41
|
+
// overflowing (effectively ~1ms) turn timeout. Mirrors MAX_TURN_TIMEOUT_MS.
|
|
42
|
+
const MAX_TURN_TIMEOUT_MS = 2_147_483_647;
|
|
43
|
+
const HANDSHAKE_TIMEOUT_MS = 30_000;
|
|
44
|
+
const PROMPT_ACK_TIMEOUT_MS = 30_000;
|
|
45
|
+
const SHUTDOWN_GRACE_MS = 2_000;
|
|
46
|
+
const DEFAULT_MODEL = 'deepseek-v4-flash';
|
|
47
|
+
const DEFAULT_MAX_TOKENS = 49152;
|
|
48
|
+
/**
|
|
49
|
+
* Vendored default composition, pinned to the dsh protocol version this
|
|
50
|
+
* runner speaks. Mirrors the wheel's runtime/cordis.yml; bump together with
|
|
51
|
+
* the dsh release. Written once per boot so the runtime always gets an
|
|
52
|
+
* explicit config (it refuses to start without one).
|
|
53
|
+
*/
|
|
54
|
+
const VENDORED_CONFIG = `# Vendored by botmux dsh-runner. Source: deepseek-harness python/sdk-runtime cordis.yml.
|
|
55
|
+
- id: sdk-jsonrpc-server
|
|
56
|
+
name: '@deepseek-ai/dsh-sdk-jsonrpc-server'
|
|
57
|
+
- id: agent-core
|
|
58
|
+
name: '@deepseek-ai/dsh-agent-spine-demo'
|
|
59
|
+
config:
|
|
60
|
+
workspaceContext:
|
|
61
|
+
maxBytes: 65536
|
|
62
|
+
- id: llm-deepseek
|
|
63
|
+
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
64
|
+
- id: sessions
|
|
65
|
+
name: '@deepseek-ai/dsh-session-persistence-jsonl'
|
|
66
|
+
config:
|
|
67
|
+
root: !!js process.env.DSH_SESSION_ROOT ?? './.sessions'
|
|
68
|
+
- id: session-checkpoints
|
|
69
|
+
name: '@deepseek-ai/dsh-session-checkpoint-policy'
|
|
70
|
+
- id: subprocess
|
|
71
|
+
name: '@deepseek-ai/dsh-subprocess-local'
|
|
72
|
+
- id: bash
|
|
73
|
+
name: '@deepseek-ai/dsh-bash-local'
|
|
74
|
+
config:
|
|
75
|
+
cwd: !!js process.env.DSH_CWD ?? process.cwd()
|
|
76
|
+
- id: fs-local
|
|
77
|
+
name: '@deepseek-ai/dsh-fs-local'
|
|
78
|
+
config:
|
|
79
|
+
cwd: !!js process.env.DSH_CWD ?? process.cwd()
|
|
80
|
+
`;
|
|
81
|
+
const output = new RunnerControlWriter();
|
|
82
|
+
function parseArgs(argv) {
|
|
83
|
+
const out = { sessionId: '', dshBin: '', turnTimeoutMs: DEFAULT_TURN_TIMEOUT_MS };
|
|
84
|
+
for (let i = 0; i < argv.length; i++) {
|
|
85
|
+
const key = argv[i];
|
|
86
|
+
const val = argv[i + 1];
|
|
87
|
+
if (key === '--session-id' && val !== undefined) {
|
|
88
|
+
out.sessionId = val;
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
else if (key === '--dsh-bin' && val !== undefined) {
|
|
92
|
+
out.dshBin = val;
|
|
93
|
+
i++;
|
|
94
|
+
}
|
|
95
|
+
else if (key === '--cwd' && val !== undefined) {
|
|
96
|
+
out.cwd = val;
|
|
97
|
+
i++;
|
|
98
|
+
}
|
|
99
|
+
else if (key === '--bot-name' && val !== undefined) {
|
|
100
|
+
out.botName = val;
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
else if (key === '--bot-open-id' && val !== undefined) {
|
|
104
|
+
out.botOpenId = val;
|
|
105
|
+
i++;
|
|
106
|
+
}
|
|
107
|
+
else if (key === '--locale' && val !== undefined) {
|
|
108
|
+
out.locale = val;
|
|
109
|
+
i++;
|
|
110
|
+
}
|
|
111
|
+
else if (key === '--model' && val !== undefined) {
|
|
112
|
+
out.model = val;
|
|
113
|
+
i++;
|
|
114
|
+
}
|
|
115
|
+
else if (key === '--turn-timeout-ms' && val !== undefined) {
|
|
116
|
+
const n = Number(val);
|
|
117
|
+
// Accept only a positive integer within the arm-able bound; anything else
|
|
118
|
+
// (≤0, non-integer, over-bound) is ignored → falls back to the default.
|
|
119
|
+
if (Number.isInteger(n) && n > 0 && n <= MAX_TURN_TIMEOUT_MS)
|
|
120
|
+
out.turnTimeoutMs = n;
|
|
121
|
+
i++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!out.sessionId)
|
|
125
|
+
throw new Error('--session-id is required');
|
|
126
|
+
if (!out.dshBin)
|
|
127
|
+
throw new Error('--dsh-bin is required');
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
function errorMessage(err) {
|
|
131
|
+
if (err instanceof Error)
|
|
132
|
+
return err.message;
|
|
133
|
+
return String(err);
|
|
134
|
+
}
|
|
135
|
+
function truncate(text, max) {
|
|
136
|
+
return text.length > max ? `${text.slice(0, max)}…` : text;
|
|
137
|
+
}
|
|
138
|
+
function isRecord(value) {
|
|
139
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
140
|
+
}
|
|
141
|
+
/** Keep the wire checks aligned with the official dsh SDK client. A successful
|
|
142
|
+
* JSON-RPC envelope with a malformed result is still a protocol failure. */
|
|
143
|
+
function parseInitializeResult(result) {
|
|
144
|
+
if (!isRecord(result)
|
|
145
|
+
|| !isRecord(result.serverInfo)
|
|
146
|
+
|| typeof result.serverInfo.name !== 'string'
|
|
147
|
+
|| typeof result.serverInfo.version !== 'string') {
|
|
148
|
+
throw new Error(`dsh protocol error: initialize returned no server identity: ${JSON.stringify(result)}`);
|
|
149
|
+
}
|
|
150
|
+
return { serverInfo: { name: result.serverInfo.name, version: result.serverInfo.version } };
|
|
151
|
+
}
|
|
152
|
+
function parsePromptMessageId(result) {
|
|
153
|
+
if (!isRecord(result) || typeof result.messageId !== 'string') {
|
|
154
|
+
throw new Error(`dsh protocol error: session/prompt returned no message id: ${JSON.stringify(result)}`);
|
|
155
|
+
}
|
|
156
|
+
return result.messageId;
|
|
157
|
+
}
|
|
158
|
+
function emitMarker(kind, payload) {
|
|
159
|
+
output.marker(kind, payload);
|
|
160
|
+
}
|
|
161
|
+
function writeLine(text = '') {
|
|
162
|
+
output.line(text);
|
|
163
|
+
}
|
|
164
|
+
function prompt() {
|
|
165
|
+
output.display('› ');
|
|
166
|
+
}
|
|
167
|
+
/** Resolve the dsh config: an explicit DSH_CORDIS_CONFIG wins, otherwise the
|
|
168
|
+
* vendored composition is materialized under ~/.botmux/dsh. */
|
|
169
|
+
function resolveConfigPath() {
|
|
170
|
+
const fromEnv = process.env.DSH_CORDIS_CONFIG?.trim();
|
|
171
|
+
if (fromEnv) {
|
|
172
|
+
if (!existsSync(fromEnv)) {
|
|
173
|
+
throw new Error(`DSH_CORDIS_CONFIG does not exist: ${fromEnv}`);
|
|
174
|
+
}
|
|
175
|
+
return fromEnv;
|
|
176
|
+
}
|
|
177
|
+
const dir = join(homedir(), '.botmux', 'dsh');
|
|
178
|
+
mkdirSync(dir, { recursive: true });
|
|
179
|
+
const path = join(dir, 'cordis.yml');
|
|
180
|
+
writeFileSync(path, VENDORED_CONFIG, 'utf8');
|
|
181
|
+
return path;
|
|
182
|
+
}
|
|
183
|
+
/** Map dsh's per-model-call usage onto botmux's four-bucket final usage.
|
|
184
|
+
* dsh reports cacheWriteTokens where botmux says cacheCreateTokens. The
|
|
185
|
+
* worker drops the whole usage unless every bucket is a non-negative
|
|
186
|
+
* integer, so missing buckets default to 0. */
|
|
187
|
+
function normalizeUsage(raw) {
|
|
188
|
+
if (!raw || typeof raw !== 'object')
|
|
189
|
+
return undefined;
|
|
190
|
+
const r = raw;
|
|
191
|
+
const num = (v) => typeof v === 'number' && Number.isInteger(v) && v >= 0 ? v : undefined;
|
|
192
|
+
const inputTokens = num(r.inputTokens);
|
|
193
|
+
const outputTokens = num(r.outputTokens);
|
|
194
|
+
if (inputTokens === undefined || outputTokens === undefined)
|
|
195
|
+
return undefined;
|
|
196
|
+
return {
|
|
197
|
+
inputTokens,
|
|
198
|
+
outputTokens,
|
|
199
|
+
cacheReadTokens: num(r.cacheReadTokens) ?? 0,
|
|
200
|
+
cacheCreateTokens: num(r.cacheWriteTokens) ?? 0,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** Accumulate per-step usage into a turn total (dsh meters each model call,
|
|
204
|
+
* not the whole turn). */
|
|
205
|
+
function addUsage(a, b) {
|
|
206
|
+
return {
|
|
207
|
+
inputTokens: a.inputTokens + b.inputTokens,
|
|
208
|
+
outputTokens: a.outputTokens + b.outputTokens,
|
|
209
|
+
cacheReadTokens: a.cacheReadTokens + b.cacheReadTokens,
|
|
210
|
+
cacheCreateTokens: a.cacheCreateTokens + b.cacheCreateTokens,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/** Minimal JSON-RPC client over the dsh runtime's stdio transport. */
|
|
214
|
+
class DshJsonRpcClient {
|
|
215
|
+
dshBin;
|
|
216
|
+
configPath;
|
|
217
|
+
env;
|
|
218
|
+
cwd;
|
|
219
|
+
child;
|
|
220
|
+
nextId = 1;
|
|
221
|
+
pending = new Map();
|
|
222
|
+
stdoutBuffer = '';
|
|
223
|
+
exited = false;
|
|
224
|
+
onNotification;
|
|
225
|
+
onExit;
|
|
226
|
+
constructor(dshBin, configPath, env, cwd) {
|
|
227
|
+
this.dshBin = dshBin;
|
|
228
|
+
this.configPath = configPath;
|
|
229
|
+
this.env = env;
|
|
230
|
+
this.cwd = cwd;
|
|
231
|
+
}
|
|
232
|
+
start() {
|
|
233
|
+
this.child = spawn(this.dshBin, [this.configPath], {
|
|
234
|
+
env: this.env,
|
|
235
|
+
cwd: this.cwd,
|
|
236
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
237
|
+
});
|
|
238
|
+
this.child.stdout.setEncoding('utf8');
|
|
239
|
+
this.child.stdout.on('data', chunk => this.handleStdout(String(chunk)));
|
|
240
|
+
this.child.stderr.setEncoding('utf8');
|
|
241
|
+
this.child.stderr.on('data', chunk => output.error(`[dsh] ${String(chunk)}`));
|
|
242
|
+
this.child.on('error', err => this.failAll(err));
|
|
243
|
+
this.child.on('exit', (code, signal) => {
|
|
244
|
+
this.exited = true;
|
|
245
|
+
this.failAll(new Error(`dsh process exited (code=${code}, signal=${signal})`));
|
|
246
|
+
this.onExit?.(code, signal);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
request(method, params, timeoutMs) {
|
|
250
|
+
if (!this.child || this.exited) {
|
|
251
|
+
return Promise.reject(new Error('dsh child is not running'));
|
|
252
|
+
}
|
|
253
|
+
const id = this.nextId++;
|
|
254
|
+
const payload = JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\n';
|
|
255
|
+
return new Promise((resolve, reject) => {
|
|
256
|
+
const timer = setTimeout(() => {
|
|
257
|
+
this.pending.delete(id);
|
|
258
|
+
reject(new Error(`dsh request '${method}' timed out after ${timeoutMs}ms`));
|
|
259
|
+
}, timeoutMs);
|
|
260
|
+
this.pending.set(id, {
|
|
261
|
+
resolve: result => resolve(result),
|
|
262
|
+
reject,
|
|
263
|
+
timer,
|
|
264
|
+
});
|
|
265
|
+
this.child.stdin.write(payload);
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
kill() {
|
|
269
|
+
try {
|
|
270
|
+
this.child?.kill('SIGTERM');
|
|
271
|
+
}
|
|
272
|
+
catch { /* already gone */ }
|
|
273
|
+
}
|
|
274
|
+
/** Best-effort shutdown: ask nicely, then kill after the grace period. */
|
|
275
|
+
async shutdown() {
|
|
276
|
+
if (!this.child || this.exited)
|
|
277
|
+
return;
|
|
278
|
+
try {
|
|
279
|
+
await this.request('shutdown', {}, SHUTDOWN_GRACE_MS);
|
|
280
|
+
}
|
|
281
|
+
catch { /* runtime may exit on its own; SIGTERM below is the backstop */ }
|
|
282
|
+
this.kill();
|
|
283
|
+
}
|
|
284
|
+
handleStdout(chunk) {
|
|
285
|
+
this.stdoutBuffer += chunk;
|
|
286
|
+
for (;;) {
|
|
287
|
+
const idx = this.stdoutBuffer.indexOf('\n');
|
|
288
|
+
if (idx < 0)
|
|
289
|
+
break;
|
|
290
|
+
const line = this.stdoutBuffer.slice(0, idx).trim();
|
|
291
|
+
this.stdoutBuffer = this.stdoutBuffer.slice(idx + 1);
|
|
292
|
+
if (!line)
|
|
293
|
+
continue;
|
|
294
|
+
let msg;
|
|
295
|
+
try {
|
|
296
|
+
msg = JSON.parse(line);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
output.error(`[dsh] non-JSON stdout line: ${truncate(line, 200)}`);
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
if (msg.id !== undefined && (msg.result !== undefined || msg.error !== undefined)) {
|
|
303
|
+
const entry = this.pending.get(msg.id);
|
|
304
|
+
if (!entry)
|
|
305
|
+
continue;
|
|
306
|
+
this.pending.delete(msg.id);
|
|
307
|
+
clearTimeout(entry.timer);
|
|
308
|
+
if (msg.error) {
|
|
309
|
+
entry.reject(new Error(`dsh error: ${msg.error.message ?? JSON.stringify(msg.error)}`));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
entry.resolve(msg.result);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else if (msg.method) {
|
|
316
|
+
this.onNotification?.(msg.method, msg.params);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
failAll(err) {
|
|
321
|
+
for (const entry of this.pending.values()) {
|
|
322
|
+
clearTimeout(entry.timer);
|
|
323
|
+
entry.reject(err);
|
|
324
|
+
}
|
|
325
|
+
this.pending.clear();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// ---------------------------------------------------------------------------
|
|
329
|
+
// Runner state
|
|
330
|
+
// ---------------------------------------------------------------------------
|
|
331
|
+
let args;
|
|
332
|
+
try {
|
|
333
|
+
args = parseArgs(process.argv.slice(2));
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
output.error(`${errorMessage(err)}\n`);
|
|
337
|
+
process.exit(2);
|
|
338
|
+
}
|
|
339
|
+
const cwd = args.cwd ? resolve(args.cwd) : process.cwd();
|
|
340
|
+
// One runner process owns one dsh session. The id is random per runner: the
|
|
341
|
+
// dsh SDK server has no create-or-resume, and its persistence layer rejects
|
|
342
|
+
// creating a session whose id already has a log on disk. Cross-restart resume
|
|
343
|
+
// therefore stays a limitation (a restarted runner starts a fresh session).
|
|
344
|
+
const dshSessionId = `session-${randomUUID()}`;
|
|
345
|
+
let client;
|
|
346
|
+
let activeTurn;
|
|
347
|
+
let shuttingDown = false;
|
|
348
|
+
let firstTurn = true;
|
|
349
|
+
const queue = [];
|
|
350
|
+
let inputBuffer = '';
|
|
351
|
+
let processing = false;
|
|
352
|
+
function buildPreamble() {
|
|
353
|
+
const name = args.botName?.trim() || 'bot';
|
|
354
|
+
const locale = args.locale?.trim() || 'zh';
|
|
355
|
+
return [
|
|
356
|
+
'<botmux_identity>',
|
|
357
|
+
`你是飞书群机器人「${name}」,通过 deepseek-harness 运行。`,
|
|
358
|
+
'- 你的最终回复文本会被自动捕获并发送到群里,不要执行 botmux send 或任何发消息命令。',
|
|
359
|
+
`- 工作目录:${cwd}。语言:${locale}。`,
|
|
360
|
+
'</botmux_identity>',
|
|
361
|
+
'',
|
|
362
|
+
].join('\n');
|
|
363
|
+
}
|
|
364
|
+
/** Whether a session event is the durable enqueue receipt for `messageId`
|
|
365
|
+
* (same correlation as the official SDK client's isInboxReceipt). */
|
|
366
|
+
function isInboxReceipt(event, messageId) {
|
|
367
|
+
if (!event || typeof event !== 'object')
|
|
368
|
+
return false;
|
|
369
|
+
const ev = event;
|
|
370
|
+
if (ev.type !== 'agent/inbox/spliced' || !ev.data || !Array.isArray(ev.data.inserted))
|
|
371
|
+
return false;
|
|
372
|
+
return ev.data.inserted.some(m => m && typeof m === 'object' && m.id === messageId);
|
|
373
|
+
}
|
|
374
|
+
/** Claim the turn's receipt boundary: once messageId is known, scan buffered
|
|
375
|
+
* notifications for its agent/inbox/spliced and replay only what follows.
|
|
376
|
+
* Notifications before the receipt belong to a previous turn and are dropped. */
|
|
377
|
+
function tryClaimReceipt(turn) {
|
|
378
|
+
if (turn.receiptReceived || !turn.messageId)
|
|
379
|
+
return;
|
|
380
|
+
const idx = turn.pending.findIndex(item => item.method === 'session.event' && isInboxReceipt(item.params.event, turn.messageId));
|
|
381
|
+
if (idx < 0)
|
|
382
|
+
return;
|
|
383
|
+
turn.receiptReceived = true;
|
|
384
|
+
const queued = turn.pending.splice(idx + 1);
|
|
385
|
+
turn.pending.length = 0;
|
|
386
|
+
for (const item of queued)
|
|
387
|
+
processTurnNotification(turn, item.method, item.params);
|
|
388
|
+
}
|
|
389
|
+
function handleSessionEvent(turn, event) {
|
|
390
|
+
if (!event || typeof event !== 'object')
|
|
391
|
+
return;
|
|
392
|
+
const ev = event;
|
|
393
|
+
switch (ev.type) {
|
|
394
|
+
case 'tool/call': {
|
|
395
|
+
const name = String(ev.data?.name ?? 'tool');
|
|
396
|
+
const callId = String(ev.data?.callId ?? '');
|
|
397
|
+
if (callId)
|
|
398
|
+
turn.toolNames.set(callId, name);
|
|
399
|
+
const argsText = typeof ev.data?.arguments === 'string' ? ev.data.arguments : '';
|
|
400
|
+
writeLine(`🔧 ${name} ${truncate(argsText, 200)}`);
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
case 'tool/result': {
|
|
404
|
+
const message = ev.data?.message;
|
|
405
|
+
const callId = String(message?.source?.callId ?? '');
|
|
406
|
+
const name = turn.toolNames.get(callId) ?? 'tool';
|
|
407
|
+
const isError = Array.isArray(message?.content) && message.content.some(c => c?.isError === true);
|
|
408
|
+
writeLine(`${isError ? '✗' : '✓'} ${name}`);
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
case 'turn/end': {
|
|
412
|
+
const reason = ev.data?.reason;
|
|
413
|
+
if (reason?.kind === 'error') {
|
|
414
|
+
turn.turnError = reason.error?.message || `turn failed (${reason.kind})`;
|
|
415
|
+
}
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
case 'assistant/message': {
|
|
419
|
+
const message = ev.data?.message;
|
|
420
|
+
const blocks = message?.content;
|
|
421
|
+
if (Array.isArray(blocks)) {
|
|
422
|
+
// dsh emits one assistant/message per step. The turn's final response
|
|
423
|
+
// is the LAST assistant message's text (same semantics as the SDK's
|
|
424
|
+
// finalResponse): replace, don't append, so intermediate step chatter
|
|
425
|
+
// never leaks into the reply. Multiple text blocks in one message
|
|
426
|
+
// concatenate with no separator (official SDK behavior).
|
|
427
|
+
const parts = blocks
|
|
428
|
+
.filter((b) => b?.type === 'text' && typeof b.text === 'string')
|
|
429
|
+
.map(b => b.text);
|
|
430
|
+
turn.textBuffer = parts.join('');
|
|
431
|
+
}
|
|
432
|
+
// usage is per model call; accumulate across steps for a turn total.
|
|
433
|
+
const usage = normalizeUsage(ev.data?.usage);
|
|
434
|
+
if (usage)
|
|
435
|
+
turn.usage = turn.usage ? addUsage(turn.usage, usage) : usage;
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
default:
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
function processTurnNotification(turn, method, p) {
|
|
443
|
+
if (method === 'session.event') {
|
|
444
|
+
handleSessionEvent(turn, p.event);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
if (method === 'session.status' && p.status === 'idle' && activeTurn === turn) {
|
|
448
|
+
activeTurn = undefined;
|
|
449
|
+
clearTimeout(turn.timer);
|
|
450
|
+
lastTurnText = turn.textBuffer;
|
|
451
|
+
lastTurnUsage = turn.usage;
|
|
452
|
+
lastTurnError = turn.turnError;
|
|
453
|
+
turn.resolve();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function handleNotification(method, params) {
|
|
457
|
+
if (!params || typeof params !== 'object')
|
|
458
|
+
return;
|
|
459
|
+
const p = params;
|
|
460
|
+
if (method === 'session.event' || method === 'session.status') {
|
|
461
|
+
if (p.sessionId !== dshSessionId)
|
|
462
|
+
return;
|
|
463
|
+
const turn = activeTurn;
|
|
464
|
+
if (!turn)
|
|
465
|
+
return;
|
|
466
|
+
// Buffer until the spliced receipt for our messageId: stale notifications
|
|
467
|
+
// from a previous turn (notably a late idle) must not settle this one.
|
|
468
|
+
if (!turn.receiptReceived) {
|
|
469
|
+
turn.pending.push({ method, params: p });
|
|
470
|
+
tryClaimReceipt(turn);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
processTurnNotification(turn, method, p);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
switch (method) {
|
|
477
|
+
case 'subagent.started':
|
|
478
|
+
writeLine('↳ 子任务开始');
|
|
479
|
+
break;
|
|
480
|
+
case 'subagent.finished':
|
|
481
|
+
writeLine(`↳ 子任务${p.status === 'ok' ? '完成' : '失败'}`);
|
|
482
|
+
break;
|
|
483
|
+
default:
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// The idle handler clears activeTurn; stash the completed turn's payload here
|
|
488
|
+
// so runTurn can build the final marker after the promise resolves.
|
|
489
|
+
let lastTurnText = '';
|
|
490
|
+
let lastTurnUsage;
|
|
491
|
+
let lastTurnError;
|
|
492
|
+
async function runTurn(content) {
|
|
493
|
+
const startedAtMs = Date.now();
|
|
494
|
+
writeLine();
|
|
495
|
+
writeLine('[user]');
|
|
496
|
+
writeLine(content);
|
|
497
|
+
writeLine();
|
|
498
|
+
writeLine('[dsh] thinking...');
|
|
499
|
+
const promptContent = firstTurn ? `${buildPreamble()}${content}` : content;
|
|
500
|
+
const turnPromise = new Promise((resolve, reject) => {
|
|
501
|
+
const timer = setTimeout(() => {
|
|
502
|
+
if (activeTurn?.timer === timer)
|
|
503
|
+
activeTurn = undefined;
|
|
504
|
+
reject(new Error(`dsh turn timed out after ${args.turnTimeoutMs}ms`));
|
|
505
|
+
}, args.turnTimeoutMs);
|
|
506
|
+
activeTurn = {
|
|
507
|
+
resolve,
|
|
508
|
+
reject,
|
|
509
|
+
startedAtMs,
|
|
510
|
+
textBuffer: '',
|
|
511
|
+
toolNames: new Map(),
|
|
512
|
+
pending: [],
|
|
513
|
+
receiptReceived: false,
|
|
514
|
+
timer,
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
try {
|
|
518
|
+
const ack = await client.request('session/prompt', {
|
|
519
|
+
sessionId: dshSessionId,
|
|
520
|
+
contentBlocks: [{ type: 'text', text: promptContent }],
|
|
521
|
+
}, PROMPT_ACK_TIMEOUT_MS);
|
|
522
|
+
const messageId = parsePromptMessageId(ack);
|
|
523
|
+
// The ACK's messageId correlates this turn's events: notifications may
|
|
524
|
+
// already be buffered (they can precede the response), and a late idle
|
|
525
|
+
// from the previous turn must not settle this one.
|
|
526
|
+
if (activeTurn) {
|
|
527
|
+
activeTurn.messageId = messageId;
|
|
528
|
+
tryClaimReceipt(activeTurn);
|
|
529
|
+
}
|
|
530
|
+
// Commit firstTurn only after the prompt was accepted: a rejected first
|
|
531
|
+
// prompt must keep the identity preamble for the retry (double-send guard).
|
|
532
|
+
firstTurn = false;
|
|
533
|
+
}
|
|
534
|
+
catch (err) {
|
|
535
|
+
if (activeTurn) {
|
|
536
|
+
clearTimeout(activeTurn.timer);
|
|
537
|
+
activeTurn = undefined;
|
|
538
|
+
}
|
|
539
|
+
throw err;
|
|
540
|
+
}
|
|
541
|
+
await turnPromise;
|
|
542
|
+
const completedAtMs = Date.now();
|
|
543
|
+
const finalText = lastTurnText
|
|
544
|
+
|| (lastTurnError ? `dsh 执行出错:${lastTurnError}` : '');
|
|
545
|
+
const finalUsage = lastTurnUsage;
|
|
546
|
+
emitMarker('final', {
|
|
547
|
+
content: finalText,
|
|
548
|
+
...(finalUsage ? { usage: finalUsage } : {}),
|
|
549
|
+
startedAtMs,
|
|
550
|
+
completedAtMs,
|
|
551
|
+
});
|
|
552
|
+
if (!finalText.trim())
|
|
553
|
+
writeLine('[dsh] completed without text output.');
|
|
554
|
+
}
|
|
555
|
+
function isFatalRunnerError(err) {
|
|
556
|
+
const msg = errorMessage(err);
|
|
557
|
+
return msg.includes('timed out')
|
|
558
|
+
|| msg.includes('exited')
|
|
559
|
+
|| msg.includes('not running');
|
|
560
|
+
}
|
|
561
|
+
async function drainQueue() {
|
|
562
|
+
if (processing)
|
|
563
|
+
return;
|
|
564
|
+
processing = true;
|
|
565
|
+
try {
|
|
566
|
+
while (queue.length > 0) {
|
|
567
|
+
const next = queue.shift();
|
|
568
|
+
try {
|
|
569
|
+
await runTurn(next);
|
|
570
|
+
}
|
|
571
|
+
catch (err) {
|
|
572
|
+
const now = Date.now();
|
|
573
|
+
const message = `dsh runner error: ${errorMessage(err)}`;
|
|
574
|
+
writeLine(message);
|
|
575
|
+
emitMarker('final', { content: message, startedAtMs: now, completedAtMs: now });
|
|
576
|
+
if (isFatalRunnerError(err)) {
|
|
577
|
+
// The child is wedged or gone: recycle the runner so botmux starts a
|
|
578
|
+
// fresh one (and a fresh dsh session) for the next turn.
|
|
579
|
+
client.kill();
|
|
580
|
+
setTimeout(() => process.exit(1), 100);
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
prompt();
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
finally {
|
|
588
|
+
processing = false;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
function enqueueLine(line) {
|
|
592
|
+
const trimmed = line.trim();
|
|
593
|
+
if (!trimmed)
|
|
594
|
+
return;
|
|
595
|
+
if (!trimmed.startsWith(DSH_MARKER)) {
|
|
596
|
+
writeLine('[dsh] ignoring non-frame input');
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
const encoded = trimmed.slice(DSH_MARKER.length);
|
|
600
|
+
try {
|
|
601
|
+
const decoded = JSON.parse(Buffer.from(encoded, 'base64').toString('utf8'));
|
|
602
|
+
if (decoded?.type === 'message' && typeof decoded.content === 'string') {
|
|
603
|
+
queue.push(decoded.content);
|
|
604
|
+
void drainQueue();
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
catch (err) {
|
|
608
|
+
writeLine(`[dsh] bad botmux input: ${errorMessage(err)}`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
function handleInput(data) {
|
|
612
|
+
const text = data.toString('utf8');
|
|
613
|
+
for (const ch of text) {
|
|
614
|
+
if (ch === '\u0003') {
|
|
615
|
+
process.exit(130);
|
|
616
|
+
}
|
|
617
|
+
else if (ch === '\r' || ch === '\n') {
|
|
618
|
+
const line = inputBuffer;
|
|
619
|
+
inputBuffer = '';
|
|
620
|
+
enqueueLine(line);
|
|
621
|
+
}
|
|
622
|
+
else if (ch === '\u007f' || ch === '\b') {
|
|
623
|
+
inputBuffer = inputBuffer.slice(0, -1);
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
inputBuffer += ch;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
async function main() {
|
|
631
|
+
const configPath = resolveConfigPath();
|
|
632
|
+
const sessionRoot = join(homedir(), '.botmux', 'dsh', 'sessions', args.sessionId);
|
|
633
|
+
mkdirSync(sessionRoot, { recursive: true });
|
|
634
|
+
client = new DshJsonRpcClient(args.dshBin, configPath, {
|
|
635
|
+
...process.env,
|
|
636
|
+
DSH_SESSION_ROOT: sessionRoot,
|
|
637
|
+
DSH_CWD: cwd,
|
|
638
|
+
}, cwd);
|
|
639
|
+
client.onNotification = handleNotification;
|
|
640
|
+
client.onExit = (code, signal) => {
|
|
641
|
+
if (shuttingDown)
|
|
642
|
+
return;
|
|
643
|
+
const message = `dsh process exited unexpectedly (code=${code}, signal=${signal})`;
|
|
644
|
+
writeLine(message);
|
|
645
|
+
if (activeTurn) {
|
|
646
|
+
const turn = activeTurn;
|
|
647
|
+
activeTurn = undefined;
|
|
648
|
+
clearTimeout(turn.timer);
|
|
649
|
+
turn.reject(new Error(message));
|
|
650
|
+
}
|
|
651
|
+
setTimeout(() => process.exit(1), 100);
|
|
652
|
+
};
|
|
653
|
+
client.start();
|
|
654
|
+
const model = args.model?.trim() || DEFAULT_MODEL;
|
|
655
|
+
const initializeResult = await client.request('initialize', { cwd, provider: 'deepseek-official', model, maxTokens: DEFAULT_MAX_TOKENS }, HANDSHAKE_TIMEOUT_MS);
|
|
656
|
+
const { serverInfo } = parseInitializeResult(initializeResult);
|
|
657
|
+
writeLine(`dsh connected (${serverInfo.name} ${serverInfo.version}).`);
|
|
658
|
+
if (process.stdin.isTTY)
|
|
659
|
+
process.stdin.setRawMode(true);
|
|
660
|
+
process.stdin.resume();
|
|
661
|
+
process.stdin.on('data', handleInput);
|
|
662
|
+
process.stdin.on('end', () => {
|
|
663
|
+
shuttingDown = true;
|
|
664
|
+
void client.shutdown().finally(() => process.exit(0));
|
|
665
|
+
});
|
|
666
|
+
prompt();
|
|
667
|
+
}
|
|
668
|
+
process.on('SIGTERM', () => process.exit(0));
|
|
669
|
+
main().catch(err => {
|
|
670
|
+
output.error(`dsh runner failed: ${errorMessage(err)}\n`);
|
|
671
|
+
process.exit(1);
|
|
672
|
+
});
|
|
673
|
+
//# sourceMappingURL=dsh-runner.js.map
|