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