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.
Files changed (541) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +25 -1
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/adopt-route.d.ts +58 -0
  5. package/dist/adapters/adopt-route.d.ts.map +1 -1
  6. package/dist/adapters/adopt-route.js +136 -0
  7. package/dist/adapters/adopt-route.js.map +1 -1
  8. package/dist/adapters/backend/capabilities.js +1 -1
  9. package/dist/adapters/backend/capabilities.js.map +1 -1
  10. package/dist/adapters/backend/herdr-backend.d.ts +1 -1
  11. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/herdr-backend.js +2 -1
  13. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  14. package/dist/adapters/backend/riff-backend.d.ts +97 -0
  15. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  16. package/dist/adapters/backend/riff-backend.js +380 -66
  17. package/dist/adapters/backend/riff-backend.js.map +1 -1
  18. package/dist/adapters/backend/sandbox.d.ts +8 -0
  19. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  20. package/dist/adapters/backend/sandbox.js +16 -2
  21. package/dist/adapters/backend/sandbox.js.map +1 -1
  22. package/dist/adapters/backend/tmux-backend.d.ts +12 -13
  23. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  24. package/dist/adapters/backend/tmux-backend.js +113 -53
  25. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  26. package/dist/adapters/backend/tmux-pipe-backend.d.ts +34 -3
  27. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  28. package/dist/adapters/backend/tmux-pipe-backend.js +72 -9
  29. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  30. package/dist/adapters/backend/types.d.ts +7 -0
  31. package/dist/adapters/backend/types.d.ts.map +1 -1
  32. package/dist/adapters/backend/types.js.map +1 -1
  33. package/dist/adapters/backend/zellij-backend.d.ts +2 -3
  34. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  35. package/dist/adapters/backend/zellij-backend.js +6 -13
  36. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  37. package/dist/adapters/backend/zellij-observe-backend.d.ts +2 -1
  38. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  39. package/dist/adapters/backend/zellij-observe-backend.js +6 -3
  40. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  41. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  42. package/dist/adapters/backend/zmx-backend.js +40 -18
  43. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  44. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  45. package/dist/adapters/cli/claude-code.js +12 -1
  46. package/dist/adapters/cli/claude-code.js.map +1 -1
  47. package/dist/adapters/cli/codex.d.ts.map +1 -1
  48. package/dist/adapters/cli/codex.js +3 -2
  49. package/dist/adapters/cli/codex.js.map +1 -1
  50. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  51. package/dist/adapters/cli/cursor.js +13 -1
  52. package/dist/adapters/cli/cursor.js.map +1 -1
  53. package/dist/adapters/cli/dsh.d.ts +4 -0
  54. package/dist/adapters/cli/dsh.d.ts.map +1 -0
  55. package/dist/adapters/cli/dsh.js +100 -0
  56. package/dist/adapters/cli/dsh.js.map +1 -0
  57. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  58. package/dist/adapters/cli/fs-policy.js +5 -0
  59. package/dist/adapters/cli/fs-policy.js.map +1 -1
  60. package/dist/adapters/cli/opencode.d.ts +52 -1
  61. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  62. package/dist/adapters/cli/opencode.js +117 -76
  63. package/dist/adapters/cli/opencode.js.map +1 -1
  64. package/dist/adapters/cli/opencode2.d.ts +4 -0
  65. package/dist/adapters/cli/opencode2.d.ts.map +1 -0
  66. package/dist/adapters/cli/opencode2.js +137 -0
  67. package/dist/adapters/cli/opencode2.js.map +1 -0
  68. package/dist/adapters/cli/pi.d.ts +14 -1
  69. package/dist/adapters/cli/pi.d.ts.map +1 -1
  70. package/dist/adapters/cli/pi.js +21 -1
  71. package/dist/adapters/cli/pi.js.map +1 -1
  72. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  73. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  74. package/dist/adapters/cli/read-isolation.js +5 -2
  75. package/dist/adapters/cli/read-isolation.js.map +1 -1
  76. package/dist/adapters/cli/registry.d.ts +7 -1
  77. package/dist/adapters/cli/registry.d.ts.map +1 -1
  78. package/dist/adapters/cli/registry.js +19 -6
  79. package/dist/adapters/cli/registry.js.map +1 -1
  80. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  81. package/dist/adapters/cli/shared-hints.js +41 -23
  82. package/dist/adapters/cli/shared-hints.js.map +1 -1
  83. package/dist/adapters/cli/types.d.ts +28 -3
  84. package/dist/adapters/cli/types.d.ts.map +1 -1
  85. package/dist/adapters/hook-command.d.ts +8 -0
  86. package/dist/adapters/hook-command.d.ts.map +1 -1
  87. package/dist/adapters/hook-command.js +11 -0
  88. package/dist/adapters/hook-command.js.map +1 -1
  89. package/dist/adapters/hook-installer.d.ts +16 -1
  90. package/dist/adapters/hook-installer.d.ts.map +1 -1
  91. package/dist/adapters/hook-installer.js +232 -2
  92. package/dist/adapters/hook-installer.js.map +1 -1
  93. package/dist/bot-registry.d.ts +138 -8
  94. package/dist/bot-registry.d.ts.map +1 -1
  95. package/dist/bot-registry.js +76 -4
  96. package/dist/bot-registry.js.map +1 -1
  97. package/dist/cli/pm2-start-transaction.d.ts +14 -0
  98. package/dist/cli/pm2-start-transaction.d.ts.map +1 -1
  99. package/dist/cli/pm2-start-transaction.js +25 -9
  100. package/dist/cli/pm2-start-transaction.js.map +1 -1
  101. package/dist/cli/restart-failure-notification.d.ts +54 -0
  102. package/dist/cli/restart-failure-notification.d.ts.map +1 -0
  103. package/dist/cli/restart-failure-notification.js +142 -0
  104. package/dist/cli/restart-failure-notification.js.map +1 -0
  105. package/dist/cli/restart-failure-owner.d.ts +20 -0
  106. package/dist/cli/restart-failure-owner.d.ts.map +1 -0
  107. package/dist/cli/restart-failure-owner.js +27 -0
  108. package/dist/cli/restart-failure-owner.js.map +1 -0
  109. package/dist/cli/restart-shutdown-preflight.d.ts +24 -0
  110. package/dist/cli/restart-shutdown-preflight.d.ts.map +1 -0
  111. package/dist/cli/restart-shutdown-preflight.js +105 -0
  112. package/dist/cli/restart-shutdown-preflight.js.map +1 -0
  113. package/dist/cli/send-dispatch.d.ts +26 -0
  114. package/dist/cli/send-dispatch.d.ts.map +1 -1
  115. package/dist/cli/send-dispatch.js +30 -0
  116. package/dist/cli/send-dispatch.js.map +1 -1
  117. package/dist/cli.d.ts +4 -1
  118. package/dist/cli.d.ts.map +1 -1
  119. package/dist/cli.js +673 -402
  120. package/dist/cli.js.map +1 -1
  121. package/dist/codex-app-runner.js +38 -15
  122. package/dist/codex-app-runner.js.map +1 -1
  123. package/dist/codex-rpc-lifecycle.d.ts +14 -2
  124. package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
  125. package/dist/codex-rpc-lifecycle.js +13 -3
  126. package/dist/codex-rpc-lifecycle.js.map +1 -1
  127. package/dist/core/ask-broker.d.ts +3 -0
  128. package/dist/core/ask-broker.d.ts.map +1 -1
  129. package/dist/core/ask-broker.js +29 -7
  130. package/dist/core/ask-broker.js.map +1 -1
  131. package/dist/core/ask-hook/registry.d.ts.map +1 -1
  132. package/dist/core/ask-hook/registry.js +4 -0
  133. package/dist/core/ask-hook/registry.js.map +1 -1
  134. package/dist/core/ask-types.d.ts +5 -1
  135. package/dist/core/ask-types.d.ts.map +1 -1
  136. package/dist/core/ask-types.js.map +1 -1
  137. package/dist/core/browser-restart.d.ts +112 -0
  138. package/dist/core/browser-restart.d.ts.map +1 -0
  139. package/dist/core/browser-restart.js +233 -0
  140. package/dist/core/browser-restart.js.map +1 -0
  141. package/dist/core/command-discovery.d.ts.map +1 -1
  142. package/dist/core/command-discovery.js +4 -1
  143. package/dist/core/command-discovery.js.map +1 -1
  144. package/dist/core/command-handler.d.ts +19 -11
  145. package/dist/core/command-handler.d.ts.map +1 -1
  146. package/dist/core/command-handler.js +237 -43
  147. package/dist/core/command-handler.js.map +1 -1
  148. package/dist/core/current-turn-provenance.d.ts.map +1 -1
  149. package/dist/core/current-turn-provenance.js +7 -27
  150. package/dist/core/current-turn-provenance.js.map +1 -1
  151. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  152. package/dist/core/dashboard-ipc-server.js +359 -11
  153. package/dist/core/dashboard-ipc-server.js.map +1 -1
  154. package/dist/core/dispatch-registry.d.ts.map +1 -1
  155. package/dist/core/dispatch-registry.js +6 -0
  156. package/dist/core/dispatch-registry.js.map +1 -1
  157. package/dist/core/dispatch-report-binding.d.ts +31 -0
  158. package/dist/core/dispatch-report-binding.d.ts.map +1 -0
  159. package/dist/core/dispatch-report-binding.js +88 -0
  160. package/dist/core/dispatch-report-binding.js.map +1 -0
  161. package/dist/core/doc-comment-prompt.d.ts +2 -0
  162. package/dist/core/doc-comment-prompt.d.ts.map +1 -1
  163. package/dist/core/doc-comment-prompt.js +6 -0
  164. package/dist/core/doc-comment-prompt.js.map +1 -1
  165. package/dist/core/host-overload-alert.d.ts +25 -1
  166. package/dist/core/host-overload-alert.d.ts.map +1 -1
  167. package/dist/core/host-overload-alert.js +69 -8
  168. package/dist/core/host-overload-alert.js.map +1 -1
  169. package/dist/core/local-terminal-opener.js +1 -1
  170. package/dist/core/local-terminal-opener.js.map +1 -1
  171. package/dist/core/managed-origin-capability.d.ts +7 -6
  172. package/dist/core/managed-origin-capability.d.ts.map +1 -1
  173. package/dist/core/managed-origin-capability.js +32 -1
  174. package/dist/core/managed-origin-capability.js.map +1 -1
  175. package/dist/core/passthrough-commands.d.ts.map +1 -1
  176. package/dist/core/passthrough-commands.js +3 -2
  177. package/dist/core/passthrough-commands.js.map +1 -1
  178. package/dist/core/plugins/materializer.d.ts.map +1 -1
  179. package/dist/core/plugins/materializer.js +1 -0
  180. package/dist/core/plugins/materializer.js.map +1 -1
  181. package/dist/core/producer-quiescence.d.ts +70 -0
  182. package/dist/core/producer-quiescence.d.ts.map +1 -0
  183. package/dist/core/producer-quiescence.js +90 -0
  184. package/dist/core/producer-quiescence.js.map +1 -0
  185. package/dist/core/raw-command-write-options.d.ts +10 -0
  186. package/dist/core/raw-command-write-options.d.ts.map +1 -0
  187. package/dist/core/raw-command-write-options.js +23 -0
  188. package/dist/core/raw-command-write-options.js.map +1 -0
  189. package/dist/core/raw-command-writer.d.ts +4 -0
  190. package/dist/core/raw-command-writer.d.ts.map +1 -1
  191. package/dist/core/raw-command-writer.js +15 -6
  192. package/dist/core/raw-command-writer.js.map +1 -1
  193. package/dist/core/reply-target.d.ts +11 -0
  194. package/dist/core/reply-target.d.ts.map +1 -1
  195. package/dist/core/reply-target.js +22 -7
  196. package/dist/core/reply-target.js.map +1 -1
  197. package/dist/core/report-session-relay.d.ts +53 -0
  198. package/dist/core/report-session-relay.d.ts.map +1 -0
  199. package/dist/core/report-session-relay.js +116 -0
  200. package/dist/core/report-session-relay.js.map +1 -0
  201. package/dist/core/session-discovery.d.ts +5 -0
  202. package/dist/core/session-discovery.d.ts.map +1 -1
  203. package/dist/core/session-discovery.js +13 -0
  204. package/dist/core/session-discovery.js.map +1 -1
  205. package/dist/core/session-group-birth.d.ts +7 -0
  206. package/dist/core/session-group-birth.d.ts.map +1 -0
  207. package/dist/core/session-group-birth.js +145 -0
  208. package/dist/core/session-group-birth.js.map +1 -0
  209. package/dist/core/session-manager.d.ts +16 -21
  210. package/dist/core/session-manager.d.ts.map +1 -1
  211. package/dist/core/session-manager.js +140 -21
  212. package/dist/core/session-manager.js.map +1 -1
  213. package/dist/core/skills/frontmatter.d.ts.map +1 -1
  214. package/dist/core/skills/frontmatter.js +6 -1
  215. package/dist/core/skills/frontmatter.js.map +1 -1
  216. package/dist/core/trigger-session.d.ts.map +1 -1
  217. package/dist/core/trigger-session.js +18 -3
  218. package/dist/core/trigger-session.js.map +1 -1
  219. package/dist/core/types.d.ts +18 -0
  220. package/dist/core/types.d.ts.map +1 -1
  221. package/dist/core/types.js.map +1 -1
  222. package/dist/core/worker-pool.d.ts +63 -11
  223. package/dist/core/worker-pool.d.ts.map +1 -1
  224. package/dist/core/worker-pool.js +262 -21
  225. package/dist/core/worker-pool.js.map +1 -1
  226. package/dist/daemon.d.ts +33 -0
  227. package/dist/daemon.d.ts.map +1 -1
  228. package/dist/daemon.js +904 -147
  229. package/dist/daemon.js.map +1 -1
  230. package/dist/dashboard/auth.d.ts +20 -0
  231. package/dist/dashboard/auth.d.ts.map +1 -1
  232. package/dist/dashboard/auth.js +86 -1
  233. package/dist/dashboard/auth.js.map +1 -1
  234. package/dist/dashboard/bot-payload.d.ts +9 -0
  235. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  236. package/dist/dashboard/bot-payload.js +5 -1
  237. package/dist/dashboard/bot-payload.js.map +1 -1
  238. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  239. package/dist/dashboard/federation-spoke-api.js +27 -3
  240. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  241. package/dist/dashboard/feedback-analytics-api.d.ts +6 -0
  242. package/dist/dashboard/feedback-analytics-api.d.ts.map +1 -0
  243. package/dist/dashboard/feedback-analytics-api.js +39 -0
  244. package/dist/dashboard/feedback-analytics-api.js.map +1 -0
  245. package/dist/dashboard/session-action-timeout.d.ts +3 -0
  246. package/dist/dashboard/session-action-timeout.d.ts.map +1 -0
  247. package/dist/dashboard/session-action-timeout.js +12 -0
  248. package/dist/dashboard/session-action-timeout.js.map +1 -0
  249. package/dist/dashboard/vc-consumer-profiles-api.d.ts +9 -3
  250. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  251. package/dist/dashboard/vc-consumer-profiles-api.js +2 -1
  252. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  253. package/dist/dashboard/web/app.d.ts.map +1 -1
  254. package/dist/dashboard/web/app.js +48 -5
  255. package/dist/dashboard/web/app.js.map +1 -1
  256. package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
  257. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  258. package/dist/dashboard/web/bot-defaults-page.js +368 -36
  259. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  260. package/dist/dashboard/web/bot-defaults.d.ts +8 -0
  261. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  262. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  263. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  264. package/dist/dashboard/web/dashboard-routes.js +1 -0
  265. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  266. package/dist/dashboard/web/feedback-page.d.ts +3 -0
  267. package/dist/dashboard/web/feedback-page.d.ts.map +1 -0
  268. package/dist/dashboard/web/feedback-page.js +34 -0
  269. package/dist/dashboard/web/feedback-page.js.map +1 -0
  270. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  271. package/dist/dashboard/web/groups-page.js +7 -2
  272. package/dist/dashboard/web/groups-page.js.map +1 -1
  273. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  274. package/dist/dashboard/web/i18n.js +122 -22
  275. package/dist/dashboard/web/i18n.js.map +1 -1
  276. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  277. package/dist/dashboard/web/skills-page.js +4 -2
  278. package/dist/dashboard/web/skills-page.js.map +1 -1
  279. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
  280. package/dist/dashboard/web/team-federation-page.js +26 -2
  281. package/dist/dashboard/web/team-federation-page.js.map +1 -1
  282. package/dist/dashboard/web/team-federation.d.ts +19 -0
  283. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  284. package/dist/dashboard/web/team-federation.js +3 -0
  285. package/dist/dashboard/web/team-federation.js.map +1 -1
  286. package/dist/dashboard/web/update-action.d.ts +8 -0
  287. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  288. package/dist/dashboard/web/update-action.js +10 -0
  289. package/dist/dashboard/web/update-action.js.map +1 -1
  290. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  291. package/dist/dashboard/web/vc-consumer-profiles-section.js +58 -9
  292. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  293. package/dist/dashboard-web/app.js +1 -1
  294. package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +10 -0
  295. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +1 -0
  296. package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +1 -0
  297. package/dist/dashboard-web/chunks/{chunk-6JTZJRQJ.js → chunk-VMWNR3SV.js} +15 -15
  298. package/dist/dashboard-web/chunks/{chunk-CU4SUKK3.js → chunk-Z7B3E3US.js} +1 -1
  299. package/dist/dashboard-web/chunks/{chunk-5QJB24I2.js → chunk-Z7DO42GJ.js} +1 -1
  300. package/dist/dashboard-web/chunks/connectors-page-CPH6VVFY.js +1 -0
  301. package/dist/dashboard-web/chunks/feedback-page-J2FKQ3LK.js +1 -0
  302. package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +8 -0
  303. package/dist/dashboard-web/chunks/{insights-page-EVGGJI5L.js → insights-page-A2LWTKJD.js} +1 -1
  304. package/dist/dashboard-web/chunks/{monitor-room-HRGR2ENP.js → monitor-room-2YR752E3.js} +1 -1
  305. package/dist/dashboard-web/chunks/monitoring-page-BGYSKZGM.js +2 -0
  306. package/dist/dashboard-web/chunks/office-page-ZZHTEAE4.js +1 -0
  307. package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +1 -0
  308. package/dist/dashboard-web/chunks/roles-page-YUC4YLJG.js +1 -0
  309. package/dist/dashboard-web/chunks/schedules-page-2L2NKTDJ.js +1 -0
  310. package/dist/dashboard-web/chunks/{sessions-page-DXBCDWCS.js → sessions-page-DYZZMKFL.js} +1 -1
  311. package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +2 -0
  312. package/dist/dashboard-web/chunks/{skills-page-2QAVB2SA.js → skills-page-DQPBBI3T.js} +2 -2
  313. package/dist/dashboard-web/chunks/team-federation-page-LQKLDV4K.js +1 -0
  314. package/dist/dashboard-web/chunks/{v3-page-AY35LKCX.js → v3-page-RVKQIMAP.js} +1 -1
  315. package/dist/dashboard-web/chunks/whiteboards-page-S5K55HRZ.js +1 -0
  316. package/dist/dashboard-web/style.css +35 -0
  317. package/dist/dashboard.js +210 -13
  318. package/dist/dashboard.js.map +1 -1
  319. package/dist/desktop/shared/shell-path-probes.d.ts +1 -1
  320. package/dist/desktop/shared/shell-path-probes.js +2 -2
  321. package/dist/desktop/shared/shell-path-probes.js.map +1 -1
  322. package/dist/dsh-runner.d.ts +3 -0
  323. package/dist/dsh-runner.d.ts.map +1 -0
  324. package/dist/dsh-runner.js +673 -0
  325. package/dist/dsh-runner.js.map +1 -0
  326. package/dist/global-config.d.ts +24 -0
  327. package/dist/global-config.d.ts.map +1 -1
  328. package/dist/global-config.js +35 -0
  329. package/dist/global-config.js.map +1 -1
  330. package/dist/i18n/en.d.ts.map +1 -1
  331. package/dist/i18n/en.js +39 -31
  332. package/dist/i18n/en.js.map +1 -1
  333. package/dist/i18n/zh.d.ts.map +1 -1
  334. package/dist/i18n/zh.js +39 -31
  335. package/dist/i18n/zh.js.map +1 -1
  336. package/dist/im/lark/ask-card.d.ts +3 -1
  337. package/dist/im/lark/ask-card.d.ts.map +1 -1
  338. package/dist/im/lark/ask-card.js +61 -5
  339. package/dist/im/lark/ask-card.js.map +1 -1
  340. package/dist/im/lark/card-builder.d.ts.map +1 -1
  341. package/dist/im/lark/card-builder.js +13 -6
  342. package/dist/im/lark/card-builder.js.map +1 -1
  343. package/dist/im/lark/card-handler.d.ts +2 -1
  344. package/dist/im/lark/card-handler.d.ts.map +1 -1
  345. package/dist/im/lark/card-handler.js +145 -5
  346. package/dist/im/lark/card-handler.js.map +1 -1
  347. package/dist/im/lark/event-dispatcher.d.ts +18 -0
  348. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  349. package/dist/im/lark/event-dispatcher.js +41 -28
  350. package/dist/im/lark/event-dispatcher.js.map +1 -1
  351. package/dist/im/lark/md-card.d.ts +18 -0
  352. package/dist/im/lark/md-card.d.ts.map +1 -1
  353. package/dist/im/lark/md-card.js +21 -0
  354. package/dist/im/lark/md-card.js.map +1 -1
  355. package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
  356. package/dist/im/lark/relay-target-routing.js +3 -2
  357. package/dist/im/lark/relay-target-routing.js.map +1 -1
  358. package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
  359. package/dist/im/lark/reply-mode-command.js +19 -8
  360. package/dist/im/lark/reply-mode-command.js.map +1 -1
  361. package/dist/im/lark/skill-feedback-card.d.ts +15 -0
  362. package/dist/im/lark/skill-feedback-card.d.ts.map +1 -0
  363. package/dist/im/lark/skill-feedback-card.js +149 -0
  364. package/dist/im/lark/skill-feedback-card.js.map +1 -0
  365. package/dist/services/bot-config-store.d.ts +10 -1
  366. package/dist/services/bot-config-store.d.ts.map +1 -1
  367. package/dist/services/bot-config-store.js +103 -3
  368. package/dist/services/bot-config-store.js.map +1 -1
  369. package/dist/services/bridge-fallback-gate.d.ts +29 -7
  370. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  371. package/dist/services/bridge-fallback-gate.js +58 -16
  372. package/dist/services/bridge-fallback-gate.js.map +1 -1
  373. package/dist/services/codex-reasoning-effort.d.ts +9 -0
  374. package/dist/services/codex-reasoning-effort.d.ts.map +1 -0
  375. package/dist/services/codex-reasoning-effort.js +23 -0
  376. package/dist/services/codex-reasoning-effort.js.map +1 -0
  377. package/dist/services/codex-service-tier.d.ts +1 -1
  378. package/dist/services/codex-service-tier.d.ts.map +1 -1
  379. package/dist/services/codex-transcript.d.ts +9 -0
  380. package/dist/services/codex-transcript.d.ts.map +1 -1
  381. package/dist/services/codex-transcript.js +13 -6
  382. package/dist/services/codex-transcript.js.map +1 -1
  383. package/dist/services/feed-group-tagger.d.ts +15 -0
  384. package/dist/services/feed-group-tagger.d.ts.map +1 -0
  385. package/dist/services/feed-group-tagger.js +348 -0
  386. package/dist/services/feed-group-tagger.js.map +1 -0
  387. package/dist/services/feedback-analytics.d.ts +82 -0
  388. package/dist/services/feedback-analytics.d.ts.map +1 -0
  389. package/dist/services/feedback-analytics.js +95 -0
  390. package/dist/services/feedback-analytics.js.map +1 -0
  391. package/dist/services/feedback-outbox.d.ts +24 -0
  392. package/dist/services/feedback-outbox.d.ts.map +1 -0
  393. package/dist/services/feedback-outbox.js +12 -0
  394. package/dist/services/feedback-outbox.js.map +1 -0
  395. package/dist/services/feedback-policy-resolver.d.ts +56 -0
  396. package/dist/services/feedback-policy-resolver.d.ts.map +1 -0
  397. package/dist/services/feedback-policy-resolver.js +156 -0
  398. package/dist/services/feedback-policy-resolver.js.map +1 -0
  399. package/dist/services/feedback-policy.d.ts +41 -0
  400. package/dist/services/feedback-policy.d.ts.map +1 -0
  401. package/dist/services/feedback-policy.js +102 -0
  402. package/dist/services/feedback-policy.js.map +1 -0
  403. package/dist/services/feedback-webhook-dispatcher.d.ts +76 -0
  404. package/dist/services/feedback-webhook-dispatcher.d.ts.map +1 -0
  405. package/dist/services/feedback-webhook-dispatcher.js +237 -0
  406. package/dist/services/feedback-webhook-dispatcher.js.map +1 -0
  407. package/dist/services/grant-prefs-store.d.ts +3 -0
  408. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  409. package/dist/services/grant-prefs-store.js +30 -1
  410. package/dist/services/grant-prefs-store.js.map +1 -1
  411. package/dist/services/groups-store.d.ts +14 -0
  412. package/dist/services/groups-store.d.ts.map +1 -1
  413. package/dist/services/groups-store.js +23 -0
  414. package/dist/services/groups-store.js.map +1 -1
  415. package/dist/services/local-cli-opener.d.ts +1 -1
  416. package/dist/services/local-cli-opener.d.ts.map +1 -1
  417. package/dist/services/local-cli-opener.js +2 -0
  418. package/dist/services/local-cli-opener.js.map +1 -1
  419. package/dist/services/peer-cross-ref-store.d.ts +8 -0
  420. package/dist/services/peer-cross-ref-store.d.ts.map +1 -0
  421. package/dist/services/peer-cross-ref-store.js +95 -0
  422. package/dist/services/peer-cross-ref-store.js.map +1 -0
  423. package/dist/services/pi-transcript.d.ts.map +1 -1
  424. package/dist/services/pi-transcript.js +10 -6
  425. package/dist/services/pi-transcript.js.map +1 -1
  426. package/dist/services/prompt-context-store.d.ts +29 -0
  427. package/dist/services/prompt-context-store.d.ts.map +1 -0
  428. package/dist/services/prompt-context-store.js +205 -0
  429. package/dist/services/prompt-context-store.js.map +1 -0
  430. package/dist/services/session-group-avatar.d.ts +6 -0
  431. package/dist/services/session-group-avatar.d.ts.map +1 -0
  432. package/dist/services/session-group-avatar.js +96 -0
  433. package/dist/services/session-group-avatar.js.map +1 -0
  434. package/dist/services/session-group-title.d.ts +47 -0
  435. package/dist/services/session-group-title.d.ts.map +1 -0
  436. package/dist/services/session-group-title.js +226 -0
  437. package/dist/services/session-group-title.js.map +1 -0
  438. package/dist/services/session-groups-store.d.ts +30 -0
  439. package/dist/services/session-groups-store.d.ts.map +1 -0
  440. package/dist/services/session-groups-store.js +132 -0
  441. package/dist/services/session-groups-store.js.map +1 -0
  442. package/dist/services/session-store.d.ts +58 -0
  443. package/dist/services/session-store.d.ts.map +1 -1
  444. package/dist/services/session-store.js +174 -0
  445. package/dist/services/session-store.js.map +1 -1
  446. package/dist/services/skill-feedback-store.d.ts +252 -0
  447. package/dist/services/skill-feedback-store.d.ts.map +1 -0
  448. package/dist/services/skill-feedback-store.js +795 -0
  449. package/dist/services/skill-feedback-store.js.map +1 -0
  450. package/dist/services/skill-registry-store.d.ts +23 -0
  451. package/dist/services/skill-registry-store.d.ts.map +1 -1
  452. package/dist/services/skill-registry-store.js +93 -7
  453. package/dist/services/skill-registry-store.js.map +1 -1
  454. package/dist/services/structured-bridge-clis.d.ts +13 -4
  455. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  456. package/dist/services/structured-bridge-clis.js +13 -3
  457. package/dist/services/structured-bridge-clis.js.map +1 -1
  458. package/dist/services/team-store.d.ts +4 -0
  459. package/dist/services/team-store.d.ts.map +1 -1
  460. package/dist/services/team-store.js +16 -0
  461. package/dist/services/team-store.js.map +1 -1
  462. package/dist/services/traex-transcript.d.ts +32 -4
  463. package/dist/services/traex-transcript.d.ts.map +1 -1
  464. package/dist/services/traex-transcript.js +116 -8
  465. package/dist/services/traex-transcript.js.map +1 -1
  466. package/dist/services/trigger-types.d.ts +1 -1
  467. package/dist/services/trigger-types.d.ts.map +1 -1
  468. package/dist/services/trigger-types.js +2 -2
  469. package/dist/services/trigger-types.js.map +1 -1
  470. package/dist/services/turn-completion-events.d.ts +57 -0
  471. package/dist/services/turn-completion-events.d.ts.map +1 -0
  472. package/dist/services/turn-completion-events.js +179 -0
  473. package/dist/services/turn-completion-events.js.map +1 -0
  474. package/dist/services/vc-meeting-consumer-isolation.d.ts +21 -12
  475. package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -1
  476. package/dist/services/vc-meeting-consumer-isolation.js +25 -19
  477. package/dist/services/vc-meeting-consumer-isolation.js.map +1 -1
  478. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +8 -2
  479. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
  480. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +18 -10
  481. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
  482. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  483. package/dist/setup/bot-config-editor.js +6 -0
  484. package/dist/setup/bot-config-editor.js.map +1 -1
  485. package/dist/setup/cli-availability.d.ts +2 -1
  486. package/dist/setup/cli-availability.d.ts.map +1 -1
  487. package/dist/setup/cli-availability.js +2 -1
  488. package/dist/setup/cli-availability.js.map +1 -1
  489. package/dist/setup/cli-selection.d.ts +8 -0
  490. package/dist/setup/cli-selection.d.ts.map +1 -1
  491. package/dist/setup/cli-selection.js +31 -0
  492. package/dist/setup/cli-selection.js.map +1 -1
  493. package/dist/setup/ensure-fonts.d.ts +5 -0
  494. package/dist/setup/ensure-fonts.d.ts.map +1 -1
  495. package/dist/setup/ensure-fonts.js +26 -1
  496. package/dist/setup/ensure-fonts.js.map +1 -1
  497. package/dist/setup/lark-scopes.json +3 -1
  498. package/dist/setup/open-platform-automation.d.ts +1 -1
  499. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  500. package/dist/setup/open-platform-automation.js +15 -3
  501. package/dist/setup/open-platform-automation.js.map +1 -1
  502. package/dist/skills/definitions.d.ts +1 -1
  503. package/dist/skills/definitions.d.ts.map +1 -1
  504. package/dist/skills/definitions.js +9 -2
  505. package/dist/skills/definitions.js.map +1 -1
  506. package/dist/types.d.ts +11 -4
  507. package/dist/types.d.ts.map +1 -1
  508. package/dist/utils/bot-routing.d.ts +1 -1
  509. package/dist/utils/bot-routing.d.ts.map +1 -1
  510. package/dist/utils/bot-routing.js.map +1 -1
  511. package/dist/utils/user-token.d.ts +38 -0
  512. package/dist/utils/user-token.d.ts.map +1 -1
  513. package/dist/utils/user-token.js +76 -1
  514. package/dist/utils/user-token.js.map +1 -1
  515. package/dist/utils/web-terminal-scroll.d.ts +27 -0
  516. package/dist/utils/web-terminal-scroll.d.ts.map +1 -0
  517. package/dist/utils/web-terminal-scroll.js +60 -0
  518. package/dist/utils/web-terminal-scroll.js.map +1 -0
  519. package/dist/vc-agent/polling-source.d.ts +70 -0
  520. package/dist/vc-agent/polling-source.d.ts.map +1 -1
  521. package/dist/vc-agent/polling-source.js +115 -0
  522. package/dist/vc-agent/polling-source.js.map +1 -1
  523. package/dist/worker.js +469 -86
  524. package/dist/worker.js.map +1 -1
  525. package/dist/workflows/definition.d.ts +22 -22
  526. package/dist/workflows/events/payloads.d.ts +8 -8
  527. package/dist/workflows/events/schema.d.ts +20 -20
  528. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  529. package/package.json +5 -1
  530. package/dist/dashboard-web/chunks/bot-defaults-page-NQJFJ45Z.js +0 -10
  531. package/dist/dashboard-web/chunks/chunk-KEEYQ3WF.js +0 -1
  532. package/dist/dashboard-web/chunks/connectors-page-HADHZXXZ.js +0 -1
  533. package/dist/dashboard-web/chunks/groups-page-5TYF46RS.js +0 -8
  534. package/dist/dashboard-web/chunks/monitoring-page-LBU7TTTW.js +0 -2
  535. package/dist/dashboard-web/chunks/office-page-DF6RRBMN.js +0 -1
  536. package/dist/dashboard-web/chunks/overview-page-ZB6QH2EX.js +0 -1
  537. package/dist/dashboard-web/chunks/roles-page-ZBZGHIIF.js +0 -1
  538. package/dist/dashboard-web/chunks/schedules-page-NQVQC3QY.js +0 -1
  539. package/dist/dashboard-web/chunks/settings-page-E7NN4NVQ.js +0 -2
  540. package/dist/dashboard-web/chunks/team-federation-page-VGWL53AE.js +0 -1
  541. 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