botmux 3.15.0 → 3.16.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 (780) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/backend/destroy-result.d.ts +159 -0
  5. package/dist/adapters/backend/destroy-result.d.ts.map +1 -0
  6. package/dist/adapters/backend/destroy-result.js +223 -0
  7. package/dist/adapters/backend/destroy-result.js.map +1 -0
  8. package/dist/adapters/backend/herdr-backend.d.ts +4 -0
  9. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  10. package/dist/adapters/backend/herdr-backend.js +23 -1
  11. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  12. package/dist/adapters/backend/mojo-backend.d.ts +577 -0
  13. package/dist/adapters/backend/mojo-backend.d.ts.map +1 -0
  14. package/dist/adapters/backend/mojo-backend.js +2471 -0
  15. package/dist/adapters/backend/mojo-backend.js.map +1 -0
  16. package/dist/adapters/backend/mojo-budgets.d.ts +21 -0
  17. package/dist/adapters/backend/mojo-budgets.d.ts.map +1 -0
  18. package/dist/adapters/backend/mojo-budgets.js +22 -0
  19. package/dist/adapters/backend/mojo-budgets.js.map +1 -0
  20. package/dist/adapters/backend/mojo-isolated-workspace.d.ts +69 -0
  21. package/dist/adapters/backend/mojo-isolated-workspace.d.ts.map +1 -0
  22. package/dist/adapters/backend/mojo-isolated-workspace.js +213 -0
  23. package/dist/adapters/backend/mojo-isolated-workspace.js.map +1 -0
  24. package/dist/adapters/backend/mojo-process-tree.d.ts +292 -0
  25. package/dist/adapters/backend/mojo-process-tree.d.ts.map +1 -0
  26. package/dist/adapters/backend/mojo-process-tree.js +486 -0
  27. package/dist/adapters/backend/mojo-process-tree.js.map +1 -0
  28. package/dist/adapters/backend/mojo-types.d.ts +542 -0
  29. package/dist/adapters/backend/mojo-types.d.ts.map +1 -0
  30. package/dist/adapters/backend/mojo-types.js +682 -0
  31. package/dist/adapters/backend/mojo-types.js.map +1 -0
  32. package/dist/adapters/backend/reproduce-command.js +3 -3
  33. package/dist/adapters/backend/reproduce-command.js.map +1 -1
  34. package/dist/adapters/backend/riff-backend.js +1 -1
  35. package/dist/adapters/backend/riff-backend.js.map +1 -1
  36. package/dist/adapters/backend/sandbox.d.ts +44 -7
  37. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  38. package/dist/adapters/backend/sandbox.js +30 -7
  39. package/dist/adapters/backend/sandbox.js.map +1 -1
  40. package/dist/adapters/backend/session-backend-selector.d.ts +14 -1
  41. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  42. package/dist/adapters/backend/session-backend-selector.js +82 -10
  43. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  44. package/dist/adapters/backend/types.d.ts +101 -6
  45. package/dist/adapters/backend/types.d.ts.map +1 -1
  46. package/dist/adapters/backend/types.js.map +1 -1
  47. package/dist/adapters/backend/zmx-backend.d.ts +11 -0
  48. package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
  49. package/dist/adapters/backend/zmx-backend.js +16 -1
  50. package/dist/adapters/backend/zmx-backend.js.map +1 -1
  51. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  52. package/dist/adapters/cli/codex-app.js +2 -2
  53. package/dist/adapters/cli/codex-app.js.map +1 -1
  54. package/dist/adapters/cli/codex.d.ts.map +1 -1
  55. package/dist/adapters/cli/codex.js +7 -0
  56. package/dist/adapters/cli/codex.js.map +1 -1
  57. package/dist/adapters/cli/copilot.d.ts +3 -1
  58. package/dist/adapters/cli/copilot.d.ts.map +1 -1
  59. package/dist/adapters/cli/copilot.js +23 -5
  60. package/dist/adapters/cli/copilot.js.map +1 -1
  61. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  62. package/dist/adapters/cli/cursor.js +13 -3
  63. package/dist/adapters/cli/cursor.js.map +1 -1
  64. package/dist/adapters/cli/grok.d.ts.map +1 -1
  65. package/dist/adapters/cli/grok.js +24 -5
  66. package/dist/adapters/cli/grok.js.map +1 -1
  67. package/dist/adapters/cli/kimi.d.ts.map +1 -1
  68. package/dist/adapters/cli/kimi.js +19 -1
  69. package/dist/adapters/cli/kimi.js.map +1 -1
  70. package/dist/adapters/cli/mojo.d.ts +28 -0
  71. package/dist/adapters/cli/mojo.d.ts.map +1 -0
  72. package/dist/adapters/cli/mojo.js +58 -0
  73. package/dist/adapters/cli/mojo.js.map +1 -0
  74. package/dist/adapters/cli/pi.d.ts +6 -4
  75. package/dist/adapters/cli/pi.d.ts.map +1 -1
  76. package/dist/adapters/cli/pi.js +6 -4
  77. package/dist/adapters/cli/pi.js.map +1 -1
  78. package/dist/adapters/cli/read-isolation.d.ts +251 -1
  79. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  80. package/dist/adapters/cli/read-isolation.js +254 -1
  81. package/dist/adapters/cli/read-isolation.js.map +1 -1
  82. package/dist/adapters/cli/registry.d.ts +13 -1
  83. package/dist/adapters/cli/registry.d.ts.map +1 -1
  84. package/dist/adapters/cli/registry.js +19 -1
  85. package/dist/adapters/cli/registry.js.map +1 -1
  86. package/dist/adapters/cli/runner-input.d.ts +3 -3
  87. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  88. package/dist/adapters/cli/runner-input.js +4 -3
  89. package/dist/adapters/cli/runner-input.js.map +1 -1
  90. package/dist/adapters/cli/shared-hints.d.ts +3 -1
  91. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  92. package/dist/adapters/cli/shared-hints.js +22 -6
  93. package/dist/adapters/cli/shared-hints.js.map +1 -1
  94. package/dist/adapters/cli/types.d.ts +29 -4
  95. package/dist/adapters/cli/types.d.ts.map +1 -1
  96. package/dist/bot-registry.d.ts +20 -0
  97. package/dist/bot-registry.d.ts.map +1 -1
  98. package/dist/bot-registry.js +30 -4
  99. package/dist/bot-registry.js.map +1 -1
  100. package/dist/cli/arg-utils.d.ts +5 -0
  101. package/dist/cli/arg-utils.d.ts.map +1 -1
  102. package/dist/cli/arg-utils.js +7 -0
  103. package/dist/cli/arg-utils.js.map +1 -1
  104. package/dist/cli/bots-list-output.d.ts +130 -2
  105. package/dist/cli/bots-list-output.d.ts.map +1 -1
  106. package/dist/cli/bots-list-output.js +173 -27
  107. package/dist/cli/bots-list-output.js.map +1 -1
  108. package/dist/cli/daemon-lifecycle-env.d.ts +10 -3
  109. package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
  110. package/dist/cli/daemon-lifecycle-env.js +38 -11
  111. package/dist/cli/daemon-lifecycle-env.js.map +1 -1
  112. package/dist/cli/dashboard-command.d.ts +15 -0
  113. package/dist/cli/dashboard-command.d.ts.map +1 -1
  114. package/dist/cli/dashboard-command.js +22 -0
  115. package/dist/cli/dashboard-command.js.map +1 -1
  116. package/dist/cli/log-tail.d.ts +54 -0
  117. package/dist/cli/log-tail.d.ts.map +1 -0
  118. package/dist/cli/log-tail.js +167 -0
  119. package/dist/cli/log-tail.js.map +1 -0
  120. package/dist/cli/pm2-env.d.ts +16 -0
  121. package/dist/cli/pm2-env.d.ts.map +1 -0
  122. package/dist/cli/pm2-env.js +63 -0
  123. package/dist/cli/pm2-env.js.map +1 -0
  124. package/dist/cli/pm2-fleet-lock.d.ts +26 -0
  125. package/dist/cli/pm2-fleet-lock.d.ts.map +1 -0
  126. package/dist/cli/pm2-fleet-lock.js +50 -0
  127. package/dist/cli/pm2-fleet-lock.js.map +1 -0
  128. package/dist/cli/pm2-god-retirement.d.ts +59 -0
  129. package/dist/cli/pm2-god-retirement.d.ts.map +1 -0
  130. package/dist/cli/pm2-god-retirement.js +95 -0
  131. package/dist/cli/pm2-god-retirement.js.map +1 -0
  132. package/dist/cli/session-list-wake.d.ts +41 -0
  133. package/dist/cli/session-list-wake.d.ts.map +1 -0
  134. package/dist/cli/session-list-wake.js +102 -0
  135. package/dist/cli/session-list-wake.js.map +1 -0
  136. package/dist/cli/workflow.d.ts.map +1 -1
  137. package/dist/cli/workflow.js +26 -0
  138. package/dist/cli/workflow.js.map +1 -1
  139. package/dist/cli.d.ts.map +1 -1
  140. package/dist/cli.js +933 -115
  141. package/dist/cli.js.map +1 -1
  142. package/dist/codex-app-runner.js +261 -49
  143. package/dist/codex-app-runner.js.map +1 -1
  144. package/dist/core/cli-runtime-update.d.ts +8 -0
  145. package/dist/core/cli-runtime-update.d.ts.map +1 -1
  146. package/dist/core/cli-runtime-update.js +127 -8
  147. package/dist/core/cli-runtime-update.js.map +1 -1
  148. package/dist/core/close-residual.d.ts +64 -0
  149. package/dist/core/close-residual.d.ts.map +1 -0
  150. package/dist/core/close-residual.js +93 -0
  151. package/dist/core/close-residual.js.map +1 -0
  152. package/dist/core/closed-session-card.d.ts.map +1 -1
  153. package/dist/core/closed-session-card.js +11 -3
  154. package/dist/core/closed-session-card.js.map +1 -1
  155. package/dist/core/command-handler.d.ts.map +1 -1
  156. package/dist/core/command-handler.js +129 -27
  157. package/dist/core/command-handler.js.map +1 -1
  158. package/dist/core/cost-calculator.d.ts +3 -1
  159. package/dist/core/cost-calculator.d.ts.map +1 -1
  160. package/dist/core/cost-calculator.js +230 -1
  161. package/dist/core/cost-calculator.js.map +1 -1
  162. package/dist/core/daemon-background-close.d.ts +19 -0
  163. package/dist/core/daemon-background-close.d.ts.map +1 -0
  164. package/dist/core/daemon-background-close.js +39 -0
  165. package/dist/core/daemon-background-close.js.map +1 -0
  166. package/dist/core/dashboard-command/overview.d.ts +4 -0
  167. package/dist/core/dashboard-command/overview.d.ts.map +1 -1
  168. package/dist/core/dashboard-command/overview.js +8 -1
  169. package/dist/core/dashboard-command/overview.js.map +1 -1
  170. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  171. package/dist/core/dashboard-ipc-server.js +373 -41
  172. package/dist/core/dashboard-ipc-server.js.map +1 -1
  173. package/dist/core/dashboard-rows.d.ts +4 -0
  174. package/dist/core/dashboard-rows.d.ts.map +1 -1
  175. package/dist/core/dashboard-rows.js +3 -0
  176. package/dist/core/dashboard-rows.js.map +1 -1
  177. package/dist/core/dashboard-url.d.ts +37 -0
  178. package/dist/core/dashboard-url.d.ts.map +1 -1
  179. package/dist/core/dashboard-url.js +71 -0
  180. package/dist/core/dashboard-url.js.map +1 -1
  181. package/dist/core/deferred-schedule-settlement.d.ts +15 -1
  182. package/dist/core/deferred-schedule-settlement.d.ts.map +1 -1
  183. package/dist/core/deferred-schedule-settlement.js +4 -1
  184. package/dist/core/deferred-schedule-settlement.js.map +1 -1
  185. package/dist/core/device-isolation-daemon.d.ts +91 -1
  186. package/dist/core/device-isolation-daemon.d.ts.map +1 -1
  187. package/dist/core/device-isolation-daemon.js +346 -2
  188. package/dist/core/device-isolation-daemon.js.map +1 -1
  189. package/dist/core/local-terminal-opener.d.ts.map +1 -1
  190. package/dist/core/local-terminal-opener.js +5 -1
  191. package/dist/core/local-terminal-opener.js.map +1 -1
  192. package/dist/core/loopback-target.d.ts +14 -0
  193. package/dist/core/loopback-target.d.ts.map +1 -0
  194. package/dist/core/loopback-target.js +20 -0
  195. package/dist/core/loopback-target.js.map +1 -0
  196. package/dist/core/maintenance.d.ts.map +1 -1
  197. package/dist/core/maintenance.js +16 -2
  198. package/dist/core/maintenance.js.map +1 -1
  199. package/dist/core/mojo-containment-command.d.ts +20 -0
  200. package/dist/core/mojo-containment-command.d.ts.map +1 -0
  201. package/dist/core/mojo-containment-command.js +266 -0
  202. package/dist/core/mojo-containment-command.js.map +1 -0
  203. package/dist/core/mojo-containment.d.ts +575 -0
  204. package/dist/core/mojo-containment.d.ts.map +1 -0
  205. package/dist/core/mojo-containment.js +1158 -0
  206. package/dist/core/mojo-containment.js.map +1 -0
  207. package/dist/core/mojo-launcher-env-quarantine.d.ts +30 -0
  208. package/dist/core/mojo-launcher-env-quarantine.d.ts.map +1 -0
  209. package/dist/core/mojo-launcher-env-quarantine.js +175 -0
  210. package/dist/core/mojo-launcher-env-quarantine.js.map +1 -0
  211. package/dist/core/mojo-session-identity.d.ts +3 -0
  212. package/dist/core/mojo-session-identity.d.ts.map +1 -0
  213. package/dist/core/mojo-session-identity.js +126 -0
  214. package/dist/core/mojo-session-identity.js.map +1 -0
  215. package/dist/core/persistent-backend.d.ts +32 -8
  216. package/dist/core/persistent-backend.d.ts.map +1 -1
  217. package/dist/core/persistent-backend.js +55 -17
  218. package/dist/core/persistent-backend.js.map +1 -1
  219. package/dist/core/plugins/mcp/gateway.d.ts +14 -1
  220. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  221. package/dist/core/plugins/mcp/gateway.js +70 -3
  222. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  223. package/dist/core/plugins/mcp/host.d.ts +2 -0
  224. package/dist/core/plugins/mcp/host.d.ts.map +1 -1
  225. package/dist/core/plugins/mcp/host.js +2 -0
  226. package/dist/core/plugins/mcp/host.js.map +1 -1
  227. package/dist/core/plugins/pm2.d.ts.map +1 -1
  228. package/dist/core/plugins/pm2.js +16 -3
  229. package/dist/core/plugins/pm2.js.map +1 -1
  230. package/dist/core/plugins/service-manager.d.ts +9 -0
  231. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  232. package/dist/core/plugins/service-manager.js +33 -16
  233. package/dist/core/plugins/service-manager.js.map +1 -1
  234. package/dist/core/preview-port-owner.d.ts +109 -0
  235. package/dist/core/preview-port-owner.d.ts.map +1 -0
  236. package/dist/core/preview-port-owner.js +320 -0
  237. package/dist/core/preview-port-owner.js.map +1 -0
  238. package/dist/core/remote-cli-ids.d.ts +5 -0
  239. package/dist/core/remote-cli-ids.d.ts.map +1 -0
  240. package/dist/core/remote-cli-ids.js +24 -0
  241. package/dist/core/remote-cli-ids.js.map +1 -0
  242. package/dist/core/{riff-shutdown-detach.d.ts → remote-shutdown-detach.d.ts} +40 -39
  243. package/dist/core/remote-shutdown-detach.d.ts.map +1 -0
  244. package/dist/core/{riff-shutdown-detach.js → remote-shutdown-detach.js} +85 -83
  245. package/dist/core/remote-shutdown-detach.js.map +1 -0
  246. package/dist/core/{riff-worker-shutdown-readiness.d.ts → remote-worker-shutdown-readiness.d.ts} +5 -4
  247. package/dist/core/remote-worker-shutdown-readiness.d.ts.map +1 -0
  248. package/dist/core/{riff-worker-shutdown-readiness.js → remote-worker-shutdown-readiness.js} +4 -3
  249. package/dist/core/remote-worker-shutdown-readiness.js.map +1 -0
  250. package/dist/core/reply-target.d.ts +16 -1
  251. package/dist/core/reply-target.d.ts.map +1 -1
  252. package/dist/core/reply-target.js +61 -0
  253. package/dist/core/reply-target.js.map +1 -1
  254. package/dist/core/session-group-birth.d.ts +26 -0
  255. package/dist/core/session-group-birth.d.ts.map +1 -1
  256. package/dist/core/session-group-birth.js +81 -4
  257. package/dist/core/session-group-birth.js.map +1 -1
  258. package/dist/core/session-manager.d.ts +15 -2
  259. package/dist/core/session-manager.d.ts.map +1 -1
  260. package/dist/core/session-manager.js +259 -5
  261. package/dist/core/session-manager.js.map +1 -1
  262. package/dist/core/session-model.d.ts +46 -0
  263. package/dist/core/session-model.d.ts.map +1 -0
  264. package/dist/core/session-model.js +42 -0
  265. package/dist/core/session-model.js.map +1 -0
  266. package/dist/core/session-owner-reminder.d.ts +63 -0
  267. package/dist/core/session-owner-reminder.d.ts.map +1 -0
  268. package/dist/core/session-owner-reminder.js +196 -0
  269. package/dist/core/session-owner-reminder.js.map +1 -0
  270. package/dist/core/session-preview-registry.d.ts +53 -0
  271. package/dist/core/session-preview-registry.d.ts.map +1 -0
  272. package/dist/core/session-preview-registry.js +82 -0
  273. package/dist/core/session-preview-registry.js.map +1 -0
  274. package/dist/core/session-preview.d.ts +114 -0
  275. package/dist/core/session-preview.d.ts.map +1 -0
  276. package/dist/core/session-preview.js +184 -0
  277. package/dist/core/session-preview.js.map +1 -0
  278. package/dist/core/session-rename.d.ts.map +1 -1
  279. package/dist/core/session-rename.js +5 -3
  280. package/dist/core/session-rename.js.map +1 -1
  281. package/dist/core/session-wake-deadline.d.ts +5 -0
  282. package/dist/core/session-wake-deadline.d.ts.map +1 -0
  283. package/dist/core/session-wake-deadline.js +13 -0
  284. package/dist/core/session-wake-deadline.js.map +1 -0
  285. package/dist/core/shutdown-budgets.d.ts +7 -6
  286. package/dist/core/shutdown-budgets.d.ts.map +1 -1
  287. package/dist/core/shutdown-budgets.js +11 -10
  288. package/dist/core/shutdown-budgets.js.map +1 -1
  289. package/dist/core/terminal-control-grant.d.ts +74 -0
  290. package/dist/core/terminal-control-grant.d.ts.map +1 -0
  291. package/dist/core/terminal-control-grant.js +183 -0
  292. package/dist/core/terminal-control-grant.js.map +1 -0
  293. package/dist/core/terminal-proxy.d.ts.map +1 -1
  294. package/dist/core/terminal-proxy.js +4 -5
  295. package/dist/core/terminal-proxy.js.map +1 -1
  296. package/dist/core/terminal-write-auth.d.ts +4 -11
  297. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  298. package/dist/core/terminal-write-auth.js +19 -16
  299. package/dist/core/terminal-write-auth.js.map +1 -1
  300. package/dist/core/trigger-session.d.ts.map +1 -1
  301. package/dist/core/trigger-session.js +36 -29
  302. package/dist/core/trigger-session.js.map +1 -1
  303. package/dist/core/types.d.ts +88 -10
  304. package/dist/core/types.d.ts.map +1 -1
  305. package/dist/core/types.js +9 -7
  306. package/dist/core/types.js.map +1 -1
  307. package/dist/core/workbench-link.d.ts +81 -0
  308. package/dist/core/workbench-link.d.ts.map +1 -0
  309. package/dist/core/workbench-link.js +109 -0
  310. package/dist/core/workbench-link.js.map +1 -0
  311. package/dist/core/worker-pool.d.ts +312 -11
  312. package/dist/core/worker-pool.d.ts.map +1 -1
  313. package/dist/core/worker-pool.js +2494 -209
  314. package/dist/core/worker-pool.js.map +1 -1
  315. package/dist/daemon.d.ts +6 -0
  316. package/dist/daemon.d.ts.map +1 -1
  317. package/dist/daemon.js +443 -106
  318. package/dist/daemon.js.map +1 -1
  319. package/dist/dashboard/aggregator.d.ts +33 -3
  320. package/dist/dashboard/aggregator.d.ts.map +1 -1
  321. package/dist/dashboard/aggregator.js +93 -17
  322. package/dist/dashboard/aggregator.js.map +1 -1
  323. package/dist/dashboard/auth-session-connections.d.ts +59 -0
  324. package/dist/dashboard/auth-session-connections.d.ts.map +1 -0
  325. package/dist/dashboard/auth-session-connections.js +109 -0
  326. package/dist/dashboard/auth-session-connections.js.map +1 -0
  327. package/dist/dashboard/auth.d.ts +99 -1
  328. package/dist/dashboard/auth.d.ts.map +1 -1
  329. package/dist/dashboard/auth.js +176 -64
  330. package/dist/dashboard/auth.js.map +1 -1
  331. package/dist/dashboard/bot-payload.d.ts +1 -0
  332. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  333. package/dist/dashboard/bot-payload.js +3 -0
  334. package/dist/dashboard/bot-payload.js.map +1 -1
  335. package/dist/dashboard/control-audit.d.ts +112 -0
  336. package/dist/dashboard/control-audit.d.ts.map +1 -0
  337. package/dist/dashboard/control-audit.js +195 -0
  338. package/dist/dashboard/control-audit.js.map +1 -0
  339. package/dist/dashboard/control-csrf.d.ts +123 -0
  340. package/dist/dashboard/control-csrf.d.ts.map +1 -0
  341. package/dist/dashboard/control-csrf.js +392 -0
  342. package/dist/dashboard/control-csrf.js.map +1 -0
  343. package/dist/dashboard/daemon-reconcile.d.ts +26 -0
  344. package/dist/dashboard/daemon-reconcile.d.ts.map +1 -0
  345. package/dist/dashboard/daemon-reconcile.js +46 -0
  346. package/dist/dashboard/daemon-reconcile.js.map +1 -0
  347. package/dist/dashboard/debug-terminal.d.ts.map +1 -1
  348. package/dist/dashboard/debug-terminal.js +18 -4
  349. package/dist/dashboard/debug-terminal.js.map +1 -1
  350. package/dist/dashboard/events-sse.d.ts +60 -0
  351. package/dist/dashboard/events-sse.d.ts.map +1 -0
  352. package/dist/dashboard/events-sse.js +63 -0
  353. package/dist/dashboard/events-sse.js.map +1 -0
  354. package/dist/dashboard/h5-auth.d.ts +256 -0
  355. package/dist/dashboard/h5-auth.d.ts.map +1 -0
  356. package/dist/dashboard/h5-auth.js +825 -0
  357. package/dist/dashboard/h5-auth.js.map +1 -0
  358. package/dist/dashboard/managed-spawn.d.ts +36 -0
  359. package/dist/dashboard/managed-spawn.d.ts.map +1 -0
  360. package/dist/dashboard/managed-spawn.js +169 -0
  361. package/dist/dashboard/managed-spawn.js.map +1 -0
  362. package/dist/dashboard/preview-content-capability.d.ts +41 -0
  363. package/dist/dashboard/preview-content-capability.d.ts.map +1 -0
  364. package/dist/dashboard/preview-content-capability.js +127 -0
  365. package/dist/dashboard/preview-content-capability.js.map +1 -0
  366. package/dist/dashboard/preview-contract.d.ts +85 -0
  367. package/dist/dashboard/preview-contract.d.ts.map +1 -0
  368. package/dist/dashboard/preview-contract.js +198 -0
  369. package/dist/dashboard/preview-contract.js.map +1 -0
  370. package/dist/dashboard/preview-guard-page.d.ts +52 -0
  371. package/dist/dashboard/preview-guard-page.d.ts.map +1 -0
  372. package/dist/dashboard/preview-guard-page.js +162 -0
  373. package/dist/dashboard/preview-guard-page.js.map +1 -0
  374. package/dist/dashboard/preview-interaction.d.ts +57 -0
  375. package/dist/dashboard/preview-interaction.d.ts.map +1 -0
  376. package/dist/dashboard/preview-interaction.js +198 -0
  377. package/dist/dashboard/preview-interaction.js.map +1 -0
  378. package/dist/dashboard/preview-proxy.d.ts +113 -0
  379. package/dist/dashboard/preview-proxy.d.ts.map +1 -0
  380. package/dist/dashboard/preview-proxy.js +543 -0
  381. package/dist/dashboard/preview-proxy.js.map +1 -0
  382. package/dist/dashboard/public-redact.d.ts +23 -0
  383. package/dist/dashboard/public-redact.d.ts.map +1 -1
  384. package/dist/dashboard/public-redact.js +90 -21
  385. package/dist/dashboard/public-redact.js.map +1 -1
  386. package/dist/dashboard/request-identity.d.ts +77 -0
  387. package/dist/dashboard/request-identity.d.ts.map +1 -0
  388. package/dist/dashboard/request-identity.js +72 -0
  389. package/dist/dashboard/request-identity.js.map +1 -0
  390. package/dist/dashboard/session-cleanup.d.ts +5 -0
  391. package/dist/dashboard/session-cleanup.d.ts.map +1 -1
  392. package/dist/dashboard/session-cleanup.js +4 -0
  393. package/dist/dashboard/session-cleanup.js.map +1 -1
  394. package/dist/dashboard/settings-write-applier.d.ts +5 -1
  395. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  396. package/dist/dashboard/settings-write-applier.js +14 -0
  397. package/dist/dashboard/settings-write-applier.js.map +1 -1
  398. package/dist/dashboard/standing-link.d.ts +76 -0
  399. package/dist/dashboard/standing-link.d.ts.map +1 -0
  400. package/dist/dashboard/standing-link.js +111 -0
  401. package/dist/dashboard/standing-link.js.map +1 -0
  402. package/dist/dashboard/terminal-control.d.ts +105 -0
  403. package/dist/dashboard/terminal-control.d.ts.map +1 -0
  404. package/dist/dashboard/terminal-control.js +296 -0
  405. package/dist/dashboard/terminal-control.js.map +1 -0
  406. package/dist/dashboard/terminal-front-proxy.d.ts +55 -0
  407. package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -0
  408. package/dist/dashboard/terminal-front-proxy.js +397 -0
  409. package/dist/dashboard/terminal-front-proxy.js.map +1 -0
  410. package/dist/dashboard/terminal-view-capability.d.ts +97 -0
  411. package/dist/dashboard/terminal-view-capability.d.ts.map +1 -0
  412. package/dist/dashboard/terminal-view-capability.js +145 -0
  413. package/dist/dashboard/terminal-view-capability.js.map +1 -0
  414. package/dist/dashboard/web/agent-workbench-api.d.ts +59 -0
  415. package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -0
  416. package/dist/dashboard/web/agent-workbench-api.js +227 -0
  417. package/dist/dashboard/web/agent-workbench-api.js.map +1 -0
  418. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts +59 -0
  419. package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts.map +1 -0
  420. package/dist/dashboard/web/agent-workbench-appearance-menu.js +195 -0
  421. package/dist/dashboard/web/agent-workbench-appearance-menu.js.map +1 -0
  422. package/dist/dashboard/web/agent-workbench-appearance.d.ts +222 -0
  423. package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -0
  424. package/dist/dashboard/web/agent-workbench-appearance.js +499 -0
  425. package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -0
  426. package/dist/dashboard/web/agent-workbench-capabilities.d.ts +13 -0
  427. package/dist/dashboard/web/agent-workbench-capabilities.d.ts.map +1 -0
  428. package/dist/dashboard/web/agent-workbench-capabilities.js +24 -0
  429. package/dist/dashboard/web/agent-workbench-capabilities.js.map +1 -0
  430. package/dist/dashboard/web/agent-workbench-chat.d.ts +90 -0
  431. package/dist/dashboard/web/agent-workbench-chat.d.ts.map +1 -0
  432. package/dist/dashboard/web/agent-workbench-chat.js +168 -0
  433. package/dist/dashboard/web/agent-workbench-chat.js.map +1 -0
  434. package/dist/dashboard/web/agent-workbench-dock-page.d.ts +3 -0
  435. package/dist/dashboard/web/agent-workbench-dock-page.d.ts.map +1 -0
  436. package/dist/dashboard/web/agent-workbench-dock-page.js +23 -0
  437. package/dist/dashboard/web/agent-workbench-dock-page.js.map +1 -0
  438. package/dist/dashboard/web/agent-workbench-dock-view.d.ts +22 -0
  439. package/dist/dashboard/web/agent-workbench-dock-view.d.ts.map +1 -0
  440. package/dist/dashboard/web/agent-workbench-dock-view.js +76 -0
  441. package/dist/dashboard/web/agent-workbench-dock-view.js.map +1 -0
  442. package/dist/dashboard/web/agent-workbench-model.d.ts +196 -0
  443. package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -0
  444. package/dist/dashboard/web/agent-workbench-model.js +529 -0
  445. package/dist/dashboard/web/agent-workbench-model.js.map +1 -0
  446. package/dist/dashboard/web/agent-workbench-page.d.ts +3 -0
  447. package/dist/dashboard/web/agent-workbench-page.d.ts.map +1 -0
  448. package/dist/dashboard/web/agent-workbench-page.js +27 -0
  449. package/dist/dashboard/web/agent-workbench-page.js.map +1 -0
  450. package/dist/dashboard/web/agent-workbench-panes.d.ts +49 -0
  451. package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -0
  452. package/dist/dashboard/web/agent-workbench-panes.js +468 -0
  453. package/dist/dashboard/web/agent-workbench-panes.js.map +1 -0
  454. package/dist/dashboard/web/agent-workbench-session-list.d.ts +42 -0
  455. package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -0
  456. package/dist/dashboard/web/agent-workbench-session-list.js +353 -0
  457. package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -0
  458. package/dist/dashboard/web/agent-workbench-storage.d.ts +49 -0
  459. package/dist/dashboard/web/agent-workbench-storage.d.ts.map +1 -0
  460. package/dist/dashboard/web/agent-workbench-storage.js +197 -0
  461. package/dist/dashboard/web/agent-workbench-storage.js.map +1 -0
  462. package/dist/dashboard/web/agent-workbench-touch.d.ts +46 -0
  463. package/dist/dashboard/web/agent-workbench-touch.d.ts.map +1 -0
  464. package/dist/dashboard/web/agent-workbench-touch.js +96 -0
  465. package/dist/dashboard/web/agent-workbench-touch.js.map +1 -0
  466. package/dist/dashboard/web/agent-workbench-view.d.ts +34 -0
  467. package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -0
  468. package/dist/dashboard/web/agent-workbench-view.js +439 -0
  469. package/dist/dashboard/web/agent-workbench-view.js.map +1 -0
  470. package/dist/dashboard/web/app.d.ts.map +1 -1
  471. package/dist/dashboard/web/app.js +63 -2
  472. package/dist/dashboard/web/app.js.map +1 -1
  473. package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
  474. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  475. package/dist/dashboard/web/bot-defaults-page.js +267 -36
  476. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  477. package/dist/dashboard/web/bot-defaults.d.ts +6 -0
  478. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  479. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  480. package/dist/dashboard/web/control-csrf.d.ts +4 -0
  481. package/dist/dashboard/web/control-csrf.d.ts.map +1 -0
  482. package/dist/dashboard/web/control-csrf.js +26 -0
  483. package/dist/dashboard/web/control-csrf.js.map +1 -0
  484. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  485. package/dist/dashboard/web/dashboard-routes.js +2 -0
  486. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  487. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  488. package/dist/dashboard/web/groups-page.js +11 -2
  489. package/dist/dashboard/web/groups-page.js.map +1 -1
  490. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  491. package/dist/dashboard/web/i18n.js +132 -6
  492. package/dist/dashboard/web/i18n.js.map +1 -1
  493. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  494. package/dist/dashboard/web/overview-page.js +3 -2
  495. package/dist/dashboard/web/overview-page.js.map +1 -1
  496. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  497. package/dist/dashboard/web/sessions-page.js +41 -1
  498. package/dist/dashboard/web/sessions-page.js.map +1 -1
  499. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  500. package/dist/dashboard/web/sessions.js +5 -1
  501. package/dist/dashboard/web/sessions.js.map +1 -1
  502. package/dist/dashboard/web/settings-page.d.ts +3 -0
  503. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  504. package/dist/dashboard/web/settings-page.js +56 -10
  505. package/dist/dashboard/web/settings-page.js.map +1 -1
  506. package/dist/dashboard/web/store.d.ts +27 -2
  507. package/dist/dashboard/web/store.d.ts.map +1 -1
  508. package/dist/dashboard/web/store.js +43 -4
  509. package/dist/dashboard/web/store.js.map +1 -1
  510. package/dist/dashboard/web/ui.d.ts +3 -0
  511. package/dist/dashboard/web/ui.d.ts.map +1 -1
  512. package/dist/dashboard/web/ui.js +11 -0
  513. package/dist/dashboard/web/ui.js.map +1 -1
  514. package/dist/dashboard/web/update-action.d.ts +12 -0
  515. package/dist/dashboard/web/update-action.d.ts.map +1 -1
  516. package/dist/dashboard/web/update-action.js +11 -0
  517. package/dist/dashboard/web/update-action.js.map +1 -1
  518. package/dist/dashboard/workbench-doctor.d.ts +114 -0
  519. package/dist/dashboard/workbench-doctor.d.ts.map +1 -0
  520. package/dist/dashboard/workbench-doctor.js +620 -0
  521. package/dist/dashboard/workbench-doctor.js.map +1 -0
  522. package/dist/dashboard/workbench-ticket.d.ts +165 -0
  523. package/dist/dashboard/workbench-ticket.d.ts.map +1 -0
  524. package/dist/dashboard/workbench-ticket.js +495 -0
  525. package/dist/dashboard/workbench-ticket.js.map +1 -0
  526. package/dist/dashboard-web/app.js +1 -1
  527. package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +1 -0
  528. package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +1 -0
  529. package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +10 -0
  530. package/dist/dashboard-web/chunks/chunk-22WIADUT.js +2 -0
  531. package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +1 -0
  532. package/dist/dashboard-web/chunks/{chunk-Z7B3E3US.js → chunk-2W6SCN3M.js} +1 -1
  533. package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +1 -0
  534. package/dist/dashboard-web/chunks/{chunk-VMWNR3SV.js → chunk-F6KNPF4R.js} +11 -9
  535. package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +1 -0
  536. package/dist/dashboard-web/chunks/chunk-G5ZS2YUS.js +1 -0
  537. package/dist/dashboard-web/chunks/chunk-KTQ7B6ZR.js +1 -0
  538. package/dist/dashboard-web/chunks/{chunk-Z7DO42GJ.js → chunk-NACP7BMR.js} +1 -1
  539. package/dist/dashboard-web/chunks/{connectors-page-CPH6VVFY.js → connectors-page-VOISXXII.js} +1 -1
  540. package/dist/dashboard-web/chunks/{feedback-page-J2FKQ3LK.js → feedback-page-RN6HRZMS.js} +1 -1
  541. package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +8 -0
  542. package/dist/dashboard-web/chunks/{insights-page-A2LWTKJD.js → insights-page-HJFDYR5N.js} +3 -3
  543. package/dist/dashboard-web/chunks/{monitor-room-2YR752E3.js → monitor-room-V7PCP47V.js} +1 -1
  544. package/dist/dashboard-web/chunks/{monitoring-page-BGYSKZGM.js → monitoring-page-NKEKVQAP.js} +1 -1
  545. package/dist/dashboard-web/chunks/{office-page-ZZHTEAE4.js → office-page-GVJF73XW.js} +1 -1
  546. package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +1 -0
  547. package/dist/dashboard-web/chunks/{plugin-page-VEGTCEAS.js → plugin-page-J3OF5IY4.js} +1 -1
  548. package/dist/dashboard-web/chunks/{roles-page-YUC4YLJG.js → roles-page-WQIRSOLZ.js} +1 -1
  549. package/dist/dashboard-web/chunks/{schedules-page-2L2NKTDJ.js → schedules-page-J2DEY2X6.js} +1 -1
  550. package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +8 -0
  551. package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +2 -0
  552. package/dist/dashboard-web/chunks/{skills-page-DQPBBI3T.js → skills-page-HGIFR3IU.js} +1 -1
  553. package/dist/dashboard-web/chunks/{team-federation-page-LQKLDV4K.js → team-federation-page-MR5ZPL4B.js} +1 -1
  554. package/dist/dashboard-web/chunks/{v3-page-RVKQIMAP.js → v3-page-GBR5JWPE.js} +2 -2
  555. package/dist/dashboard-web/chunks/{whiteboards-page-S5K55HRZ.js → whiteboards-page-QAZM4BN3.js} +1 -1
  556. package/dist/dashboard-web/index.html +8 -1
  557. package/dist/dashboard-web/style.css +2006 -10
  558. package/dist/dashboard.js +1006 -263
  559. package/dist/dashboard.js.map +1 -1
  560. package/dist/global-config.d.ts +30 -0
  561. package/dist/global-config.d.ts.map +1 -1
  562. package/dist/global-config.js +33 -0
  563. package/dist/global-config.js.map +1 -1
  564. package/dist/i18n/en.d.ts.map +1 -1
  565. package/dist/i18n/en.js +31 -1
  566. package/dist/i18n/en.js.map +1 -1
  567. package/dist/i18n/zh.d.ts.map +1 -1
  568. package/dist/i18n/zh.js +28 -1
  569. package/dist/i18n/zh.js.map +1 -1
  570. package/dist/im/lark/card-builder.d.ts +1 -1
  571. package/dist/im/lark/card-builder.d.ts.map +1 -1
  572. package/dist/im/lark/card-builder.js +22 -6
  573. package/dist/im/lark/card-builder.js.map +1 -1
  574. package/dist/im/lark/card-handler.d.ts.map +1 -1
  575. package/dist/im/lark/card-handler.js +118 -24
  576. package/dist/im/lark/card-handler.js.map +1 -1
  577. package/dist/im/lark/client.d.ts +15 -0
  578. package/dist/im/lark/client.d.ts.map +1 -1
  579. package/dist/im/lark/client.js +30 -0
  580. package/dist/im/lark/client.js.map +1 -1
  581. package/dist/im/lark/event-dispatcher.d.ts +48 -0
  582. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  583. package/dist/im/lark/event-dispatcher.js +133 -22
  584. package/dist/im/lark/event-dispatcher.js.map +1 -1
  585. package/dist/im/lark/identity-cache.d.ts +14 -6
  586. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  587. package/dist/im/lark/identity-cache.js +69 -26
  588. package/dist/im/lark/identity-cache.js.map +1 -1
  589. package/dist/im/lark/lark-hosts.d.ts +13 -0
  590. package/dist/im/lark/lark-hosts.d.ts.map +1 -1
  591. package/dist/im/lark/lark-hosts.js +16 -0
  592. package/dist/im/lark/lark-hosts.js.map +1 -1
  593. package/dist/im/lark/overview-card.d.ts +22 -0
  594. package/dist/im/lark/overview-card.d.ts.map +1 -1
  595. package/dist/im/lark/overview-card.js +53 -3
  596. package/dist/im/lark/overview-card.js.map +1 -1
  597. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  598. package/dist/im/lark/sessions-card.js +26 -3
  599. package/dist/im/lark/sessions-card.js.map +1 -1
  600. package/dist/im/lark/workflow-slash-command.d.ts +6 -0
  601. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
  602. package/dist/im/lark/workflow-slash-command.js +7 -0
  603. package/dist/im/lark/workflow-slash-command.js.map +1 -1
  604. package/dist/index-daemon.js +27 -4
  605. package/dist/index-daemon.js.map +1 -1
  606. package/dist/index-dashboard.d.ts +3 -0
  607. package/dist/index-dashboard.d.ts.map +1 -0
  608. package/dist/index-dashboard.js +94 -0
  609. package/dist/index-dashboard.js.map +1 -0
  610. package/dist/platform/team-agents-client.d.ts +199 -0
  611. package/dist/platform/team-agents-client.d.ts.map +1 -0
  612. package/dist/platform/team-agents-client.js +263 -0
  613. package/dist/platform/team-agents-client.js.map +1 -0
  614. package/dist/platform/tunnel-client.d.ts +6 -0
  615. package/dist/platform/tunnel-client.d.ts.map +1 -1
  616. package/dist/platform/tunnel-client.js.map +1 -1
  617. package/dist/services/async-trigger-state.d.ts +7 -3
  618. package/dist/services/async-trigger-state.d.ts.map +1 -1
  619. package/dist/services/async-trigger-state.js +28 -0
  620. package/dist/services/async-trigger-state.js.map +1 -1
  621. package/dist/services/async-trigger-store.d.ts +13 -4
  622. package/dist/services/async-trigger-store.d.ts.map +1 -1
  623. package/dist/services/async-trigger-store.js +55 -8
  624. package/dist/services/async-trigger-store.js.map +1 -1
  625. package/dist/services/bot-config-store.d.ts +1 -11
  626. package/dist/services/bot-config-store.d.ts.map +1 -1
  627. package/dist/services/bot-config-store.js +27 -3
  628. package/dist/services/bot-config-store.js.map +1 -1
  629. package/dist/services/bot-profile-store.d.ts +17 -2
  630. package/dist/services/bot-profile-store.d.ts.map +1 -1
  631. package/dist/services/bot-profile-store.js +93 -12
  632. package/dist/services/bot-profile-store.js.map +1 -1
  633. package/dist/services/bridge-turn-queue.d.ts +10 -1
  634. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  635. package/dist/services/bridge-turn-queue.js +29 -9
  636. package/dist/services/bridge-turn-queue.js.map +1 -1
  637. package/dist/services/claude-transcript.d.ts +19 -0
  638. package/dist/services/claude-transcript.d.ts.map +1 -1
  639. package/dist/services/claude-transcript.js +57 -5
  640. package/dist/services/claude-transcript.js.map +1 -1
  641. package/dist/services/codex-app-threads.d.ts +2 -0
  642. package/dist/services/codex-app-threads.d.ts.map +1 -1
  643. package/dist/services/codex-app-threads.js +1 -1
  644. package/dist/services/codex-app-threads.js.map +1 -1
  645. package/dist/services/codex-reasoning-effort.d.ts +8 -0
  646. package/dist/services/codex-reasoning-effort.d.ts.map +1 -1
  647. package/dist/services/codex-reasoning-effort.js +24 -0
  648. package/dist/services/codex-reasoning-effort.js.map +1 -1
  649. package/dist/services/cursor-resume-policy.d.ts.map +1 -1
  650. package/dist/services/cursor-resume-policy.js +15 -3
  651. package/dist/services/cursor-resume-policy.js.map +1 -1
  652. package/dist/services/open-platform-rename.d.ts.map +1 -1
  653. package/dist/services/open-platform-rename.js +3 -2
  654. package/dist/services/open-platform-rename.js.map +1 -1
  655. package/dist/services/ordinary-turn-recovery.d.ts +76 -0
  656. package/dist/services/ordinary-turn-recovery.d.ts.map +1 -0
  657. package/dist/services/ordinary-turn-recovery.js +349 -0
  658. package/dist/services/ordinary-turn-recovery.js.map +1 -0
  659. package/dist/services/resume-fresh-policy.d.ts +17 -0
  660. package/dist/services/resume-fresh-policy.d.ts.map +1 -0
  661. package/dist/services/resume-fresh-policy.js +24 -0
  662. package/dist/services/resume-fresh-policy.js.map +1 -0
  663. package/dist/services/session-group-title.d.ts +1 -0
  664. package/dist/services/session-group-title.d.ts.map +1 -1
  665. package/dist/services/session-group-title.js +16 -1
  666. package/dist/services/session-group-title.js.map +1 -1
  667. package/dist/services/session-groups-store.d.ts +30 -0
  668. package/dist/services/session-groups-store.d.ts.map +1 -1
  669. package/dist/services/session-groups-store.js +26 -4
  670. package/dist/services/session-groups-store.js.map +1 -1
  671. package/dist/services/session-owner-notification.d.ts +9 -0
  672. package/dist/services/session-owner-notification.d.ts.map +1 -0
  673. package/dist/services/session-owner-notification.js +10 -0
  674. package/dist/services/session-owner-notification.js.map +1 -0
  675. package/dist/services/session-owner-reminder-config-store.d.ts +9 -0
  676. package/dist/services/session-owner-reminder-config-store.d.ts.map +1 -0
  677. package/dist/services/session-owner-reminder-config-store.js +24 -0
  678. package/dist/services/session-owner-reminder-config-store.js.map +1 -0
  679. package/dist/services/session-owner-reminder-store.d.ts +5 -0
  680. package/dist/services/session-owner-reminder-store.d.ts.map +1 -0
  681. package/dist/services/session-owner-reminder-store.js +54 -0
  682. package/dist/services/session-owner-reminder-store.js.map +1 -0
  683. package/dist/services/session-store.d.ts +98 -21
  684. package/dist/services/session-store.d.ts.map +1 -1
  685. package/dist/services/session-store.js +406 -48
  686. package/dist/services/session-store.js.map +1 -1
  687. package/dist/services/structured-bridge-clis.d.ts +9 -5
  688. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  689. package/dist/services/structured-bridge-clis.js +9 -4
  690. package/dist/services/structured-bridge-clis.js.map +1 -1
  691. package/dist/services/transcript-resolver.d.ts +1 -1
  692. package/dist/services/transcript-resolver.d.ts.map +1 -1
  693. package/dist/services/transcript-resolver.js +6 -1
  694. package/dist/services/transcript-resolver.js.map +1 -1
  695. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  696. package/dist/setup/bot-config-editor.js +7 -2
  697. package/dist/setup/bot-config-editor.js.map +1 -1
  698. package/dist/setup/ensure-herdr-integrations.d.ts +13 -0
  699. package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -1
  700. package/dist/setup/ensure-herdr-integrations.js +21 -3
  701. package/dist/setup/ensure-herdr-integrations.js.map +1 -1
  702. package/dist/setup/open-platform-automation.d.ts +1 -0
  703. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  704. package/dist/setup/open-platform-automation.js +107 -7
  705. package/dist/setup/open-platform-automation.js.map +1 -1
  706. package/dist/skills/definitions.d.ts +17 -0
  707. package/dist/skills/definitions.d.ts.map +1 -1
  708. package/dist/skills/definitions.js +78 -8
  709. package/dist/skills/definitions.js.map +1 -1
  710. package/dist/skills/injection-mode.d.ts +24 -3
  711. package/dist/skills/injection-mode.d.ts.map +1 -1
  712. package/dist/skills/injection-mode.js +64 -15
  713. package/dist/skills/injection-mode.js.map +1 -1
  714. package/dist/skills/installer.d.ts +18 -0
  715. package/dist/skills/installer.d.ts.map +1 -1
  716. package/dist/skills/installer.js +45 -1
  717. package/dist/skills/installer.js.map +1 -1
  718. package/dist/types.d.ts +221 -10
  719. package/dist/types.d.ts.map +1 -1
  720. package/dist/utils/child-env.d.ts +92 -2
  721. package/dist/utils/child-env.d.ts.map +1 -1
  722. package/dist/utils/child-env.js +195 -1
  723. package/dist/utils/child-env.js.map +1 -1
  724. package/dist/utils/cli-usage-limit.d.ts +25 -14
  725. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  726. package/dist/utils/cli-usage-limit.js +25 -15
  727. package/dist/utils/cli-usage-limit.js.map +1 -1
  728. package/dist/utils/daemon-rejection-guard.d.ts +35 -0
  729. package/dist/utils/daemon-rejection-guard.d.ts.map +1 -0
  730. package/dist/utils/daemon-rejection-guard.js +101 -0
  731. package/dist/utils/daemon-rejection-guard.js.map +1 -0
  732. package/dist/utils/dashboard-env.d.ts +53 -0
  733. package/dist/utils/dashboard-env.d.ts.map +1 -0
  734. package/dist/utils/dashboard-env.js +116 -0
  735. package/dist/utils/dashboard-env.js.map +1 -0
  736. package/dist/utils/global-install.d.ts.map +1 -1
  737. package/dist/utils/global-install.js +61 -5
  738. package/dist/utils/global-install.js.map +1 -1
  739. package/dist/utils/install-diagnostics.d.ts +14 -7
  740. package/dist/utils/install-diagnostics.d.ts.map +1 -1
  741. package/dist/utils/install-diagnostics.js +20 -11
  742. package/dist/utils/install-diagnostics.js.map +1 -1
  743. package/dist/utils/local-dev-update.d.ts +132 -0
  744. package/dist/utils/local-dev-update.d.ts.map +1 -0
  745. package/dist/utils/local-dev-update.js +176 -0
  746. package/dist/utils/local-dev-update.js.map +1 -0
  747. package/dist/utils/pending-input-queue.d.ts +12 -1
  748. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  749. package/dist/utils/pending-input-queue.js.map +1 -1
  750. package/dist/worker.js +1284 -225
  751. package/dist/worker.js.map +1 -1
  752. package/dist/workflows/definition.d.ts +68 -68
  753. package/dist/workflows/events/payloads.d.ts +14 -14
  754. package/dist/workflows/events/schema.d.ts +312 -312
  755. package/dist/workflows/migration/v2-run-archive-schema.d.ts +40 -40
  756. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  757. package/dist/workflows/v3/cli-run.js +7 -0
  758. package/dist/workflows/v3/cli-run.js.map +1 -1
  759. package/dist/workflows/v3/goal-cli.d.ts +3 -0
  760. package/dist/workflows/v3/goal-cli.d.ts.map +1 -1
  761. package/dist/workflows/v3/goal-cli.js +11 -0
  762. package/dist/workflows/v3/goal-cli.js.map +1 -1
  763. package/dist/workflows/v3/run-envelope.d.ts +144 -144
  764. package/package.json +3 -2
  765. package/dist/cli/pm2-god-admission.d.ts +0 -8
  766. package/dist/cli/pm2-god-admission.d.ts.map +0 -1
  767. package/dist/cli/pm2-god-admission.js +0 -25
  768. package/dist/cli/pm2-god-admission.js.map +0 -1
  769. package/dist/core/riff-shutdown-detach.d.ts.map +0 -1
  770. package/dist/core/riff-shutdown-detach.js.map +0 -1
  771. package/dist/core/riff-worker-shutdown-readiness.d.ts.map +0 -1
  772. package/dist/core/riff-worker-shutdown-readiness.js.map +0 -1
  773. package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +0 -10
  774. package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +0 -1
  775. package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +0 -1
  776. package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +0 -1
  777. package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +0 -8
  778. package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +0 -1
  779. package/dist/dashboard-web/chunks/sessions-page-DYZZMKFL.js +0 -8
  780. package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +0 -2
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The model botmux passes to the CLI for a given session's next spawn.
3
+ *
4
+ * Unlike `cliId` / `cliRuntime` / `wrapperCli` — which are frozen onto the
5
+ * session at creation so a live conversation never has its runtime swapped
6
+ * underneath it — the model is resolved from the LIVE bot config on every
7
+ * spawn, resume included. Rationale: the model configured in the dashboard is
8
+ * an explicit human choice, and it used to be silently outranked forever by
9
+ * whatever default the session happened to inherit when it was created (the old
10
+ * `session.model` freeze), so a long-running session could never be moved off
11
+ * its original model.
12
+ *
13
+ * Precedence:
14
+ * 1. `spawnModelOverride` — an explicit per-trigger choice (trigger API
15
+ * `options.model`), in-memory only, see DaemonSession.
16
+ * 2. the live bot config, **only when the session's frozen `cliId` still
17
+ * matches the bot's** — a session pinned to another CLI (a bot that
18
+ * switched CLI later, or a Codex App thread takeover that forces
19
+ * `codex-app`) must not be handed a model string meant for a different
20
+ * CLI.
21
+ * 3. the model this session was last launched with (`session.model`, stamped
22
+ * by sessionAgentConfig on every spawn), as a last resort for exactly that
23
+ * mismatch case: it is the value that CLI actually ran with. Never
24
+ * consulted while the live config applies, which is what makes a dashboard
25
+ * edit effective on old sessions.
26
+ *
27
+ * `undefined` → botmux passes no model flag and the CLI resolves its own
28
+ * default (for `claude --resume`, that means the model recorded in the
29
+ * transcript).
30
+ */
31
+ export function resolveSessionLaunchModel(ds, botCfg) {
32
+ if (ds.spawnModelOverride)
33
+ return ds.spawnModelOverride;
34
+ // No live config to consult (deregistered bot / display surfaces that tolerate
35
+ // a missing registry entry) → the session's own record is the best we have.
36
+ if (!botCfg)
37
+ return ds.session.model;
38
+ const sessionCliId = ds.session.cliId;
39
+ const cliMatchesBot = !sessionCliId || !botCfg.cliId || sessionCliId === botCfg.cliId;
40
+ return cliMatchesBot ? botCfg.model : ds.session.model;
41
+ }
42
+ //# sourceMappingURL=session-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-model.js","sourceRoot":"","sources":["../../src/core/session-model.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,yBAAyB,CACvC,EAAsB,EACtB,MAA6B;IAE7B,IAAI,EAAE,CAAC,kBAAkB;QAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC;IACxD,+EAA+E;IAC/E,4EAA4E;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,YAAY,KAAK,MAAM,CAAC,KAAK,CAAC;IACtF,OAAO,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AACzD,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { DaemonSession } from './types.js';
2
+ export declare const SESSION_OWNER_REMINDER_STATES: readonly ["idle", "dormant", "pending_repo", "tui_prompt", "agent_attention", "limited"];
3
+ export type SessionOwnerReminderState = typeof SESSION_OWNER_REMINDER_STATES[number];
4
+ export interface SessionOwnerReminderConfig {
5
+ enabled: boolean;
6
+ intervalMinutes: number;
7
+ text: string;
8
+ states: SessionOwnerReminderState[];
9
+ }
10
+ export interface SessionOwnerReminderRecord {
11
+ sessionId: string;
12
+ stateFingerprint: string;
13
+ actionableSince: number;
14
+ lastObservedActivityAt: number;
15
+ lastRemindedAt?: number;
16
+ retryAfterAt?: number;
17
+ }
18
+ export type SessionOwnerReminderRecords = Record<string, SessionOwnerReminderRecord>;
19
+ export declare const DEFAULT_SESSION_OWNER_REMINDER: SessionOwnerReminderConfig;
20
+ /** Strict normalizer shared by config loading and write validation. */
21
+ export declare function normalizeSessionOwnerReminderConfig(raw: unknown): SessionOwnerReminderConfig | undefined;
22
+ export declare function deriveSessionOwnerReminderStates(ds: DaemonSession): SessionOwnerReminderState[];
23
+ /**
24
+ * Observation fingerprint used both to detect a state transition (reset the
25
+ * quiet period) and to seed the per-cycle delivery UUID. It must capture not
26
+ * only WHICH runtime signals are present but also their INSTANCE identity for
27
+ * the signals that get replaced in place while the label stays constant:
28
+ *
29
+ * - `agent_attention` → a fresh `{kind, reason, at}` is written on every new
30
+ * attention raise, so key on `agentAttention.at`.
31
+ * - `tui_prompt` → an old TUI prompt card is cleared and a new
32
+ * `tuiPromptCardId` set between scans, so key on that id.
33
+ *
34
+ * Without the instance component, the old signal being resolved and a brand-new
35
+ * same-category signal appearing (e.g. a second, unrelated attention request)
36
+ * would inherit the previous signal's elapsed quiet time and could @ the owner
37
+ * almost immediately — undercutting the "give N minutes to handle THIS" promise.
38
+ *
39
+ * The remaining states (idle / dormant / pending_repo / limited) have no
40
+ * distinct replaceable instance, so their label alone is a faithful key.
41
+ *
42
+ * INVARIANT: for a fixed instance the fingerprint is stable across scans, so a
43
+ * within-cycle failed-send retry recomputes the SAME fingerprint → the same
44
+ * delivery UUID → the existing Lark dedupe window still suppresses duplicates.
45
+ * A new instance changes the fingerprint, which resets the record and thereby
46
+ * starts a fresh cycle whose eventual UUID is legitimately different.
47
+ */
48
+ export declare function sessionOwnerReminderObservationFingerprint(ds: DaemonSession, states: SessionOwnerReminderState[]): string;
49
+ export interface SessionOwnerReminderControllerDeps {
50
+ load(): SessionOwnerReminderRecords;
51
+ save(records: SessionOwnerReminderRecords): void;
52
+ send(ds: DaemonSession, text: string, uuid: string): Promise<void>;
53
+ canSend(ds: DaemonSession): boolean;
54
+ onError?(ds: DaemonSession, error: unknown): void;
55
+ }
56
+ export declare function sessionOwnerReminderDeliveryUuid(sessionId: string, stateFingerprint: string, dueBase: number): string;
57
+ /** Durable, deterministic scan engine. Scheduling and Lark IO are injected. */
58
+ export declare class SessionOwnerReminderController {
59
+ private readonly deps;
60
+ constructor(deps: SessionOwnerReminderControllerDeps);
61
+ scan(sessions: Iterable<DaemonSession>, config: SessionOwnerReminderConfig, now?: number): Promise<void>;
62
+ }
63
+ //# sourceMappingURL=session-owner-reminder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-owner-reminder.d.ts","sourceRoot":"","sources":["../../src/core/session-owner-reminder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,6BAA6B,0FAOhC,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AAErF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAErF,eAAO,MAAM,8BAA8B,EAAE,0BAK5C,CAAC;AAYF,uEAAuE;AACvE,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,OAAO,GACX,0BAA0B,GAAG,SAAS,CAoBxC;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,aAAa,GAAG,yBAAyB,EAAE,CAY/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,0CAA0C,CACxD,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,yBAAyB,EAAE,GAClC,MAAM,CAQR;AAED,MAAM,WAAW,kCAAkC;IACjD,IAAI,IAAI,2BAA2B,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC;IACpC,OAAO,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACnD;AAMD,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,+EAA+E;AAC/E,qBAAa,8BAA8B;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,kCAAkC;IAE/D,IAAI,CACR,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EACjC,MAAM,EAAE,0BAA0B,EAClC,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,IAAI,CAAC;CA2EjB"}
@@ -0,0 +1,196 @@
1
+ import { createHash } from 'node:crypto';
2
+ export const SESSION_OWNER_REMINDER_STATES = [
3
+ 'idle',
4
+ 'dormant',
5
+ 'pending_repo',
6
+ 'tui_prompt',
7
+ 'agent_attention',
8
+ 'limited',
9
+ ];
10
+ export const DEFAULT_SESSION_OWNER_REMINDER = {
11
+ enabled: false,
12
+ intervalMinutes: 30,
13
+ text: '该会话已等待处理,请继续跟进。',
14
+ states: [...SESSION_OWNER_REMINDER_STATES],
15
+ };
16
+ const MIN_INTERVAL_MINUTES = 1;
17
+ const MAX_INTERVAL_MINUTES = 10_080;
18
+ const MAX_TEXT_CHARS = 500;
19
+ const FAILURE_RETRY_MAX_MS = 5 * 60_000;
20
+ function isState(value) {
21
+ return typeof value === 'string'
22
+ && SESSION_OWNER_REMINDER_STATES.includes(value);
23
+ }
24
+ /** Strict normalizer shared by config loading and write validation. */
25
+ export function normalizeSessionOwnerReminderConfig(raw) {
26
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
27
+ return undefined;
28
+ const value = raw;
29
+ if (typeof value.enabled !== 'boolean')
30
+ return undefined;
31
+ if (!Number.isInteger(value.intervalMinutes)
32
+ || value.intervalMinutes < MIN_INTERVAL_MINUTES
33
+ || value.intervalMinutes > MAX_INTERVAL_MINUTES)
34
+ return undefined;
35
+ if (typeof value.text !== 'string')
36
+ return undefined;
37
+ const text = value.text.trim();
38
+ if (!text || Array.from(text).length > MAX_TEXT_CHARS || /<\s*at\b/i.test(text))
39
+ return undefined;
40
+ if (!Array.isArray(value.states))
41
+ return undefined;
42
+ const states = [...new Set(value.states.filter(isState))];
43
+ if (states.length !== value.states.length)
44
+ return undefined;
45
+ if (value.enabled && states.length === 0)
46
+ return undefined;
47
+ return {
48
+ enabled: value.enabled,
49
+ intervalMinutes: value.intervalMinutes,
50
+ text,
51
+ states,
52
+ };
53
+ }
54
+ export function deriveSessionOwnerReminderStates(ds) {
55
+ const states = [];
56
+ const workerAlive = !!ds.worker && !ds.worker.killed;
57
+ if (workerAlive && ds.lastScreenStatus === 'idle')
58
+ states.push('idle');
59
+ // A pre-spawn repository picker is its own actionable state, not a released
60
+ // CLI. Likewise stale screen status belongs to the old worker lifetime.
61
+ if (!workerAlive && !ds.pendingRepo)
62
+ states.push('dormant');
63
+ if (ds.pendingRepo)
64
+ states.push('pending_repo');
65
+ if (ds.tuiPromptCardId)
66
+ states.push('tui_prompt');
67
+ if (ds.agentAttention)
68
+ states.push('agent_attention');
69
+ if (workerAlive && ds.lastScreenStatus === 'limited')
70
+ states.push('limited');
71
+ return states;
72
+ }
73
+ /**
74
+ * Observation fingerprint used both to detect a state transition (reset the
75
+ * quiet period) and to seed the per-cycle delivery UUID. It must capture not
76
+ * only WHICH runtime signals are present but also their INSTANCE identity for
77
+ * the signals that get replaced in place while the label stays constant:
78
+ *
79
+ * - `agent_attention` → a fresh `{kind, reason, at}` is written on every new
80
+ * attention raise, so key on `agentAttention.at`.
81
+ * - `tui_prompt` → an old TUI prompt card is cleared and a new
82
+ * `tuiPromptCardId` set between scans, so key on that id.
83
+ *
84
+ * Without the instance component, the old signal being resolved and a brand-new
85
+ * same-category signal appearing (e.g. a second, unrelated attention request)
86
+ * would inherit the previous signal's elapsed quiet time and could @ the owner
87
+ * almost immediately — undercutting the "give N minutes to handle THIS" promise.
88
+ *
89
+ * The remaining states (idle / dormant / pending_repo / limited) have no
90
+ * distinct replaceable instance, so their label alone is a faithful key.
91
+ *
92
+ * INVARIANT: for a fixed instance the fingerprint is stable across scans, so a
93
+ * within-cycle failed-send retry recomputes the SAME fingerprint → the same
94
+ * delivery UUID → the existing Lark dedupe window still suppresses duplicates.
95
+ * A new instance changes the fingerprint, which resets the record and thereby
96
+ * starts a fresh cycle whose eventual UUID is legitimately different.
97
+ */
98
+ export function sessionOwnerReminderObservationFingerprint(ds, states) {
99
+ return states
100
+ .map(state => {
101
+ if (state === 'agent_attention')
102
+ return `agent_attention:${ds.agentAttention?.at ?? ''}`;
103
+ if (state === 'tui_prompt')
104
+ return `tui_prompt:${ds.tuiPromptCardId ?? ''}`;
105
+ return state;
106
+ })
107
+ .join(',');
108
+ }
109
+ function recordsSnapshot(value) {
110
+ return JSON.stringify(value);
111
+ }
112
+ export function sessionOwnerReminderDeliveryUuid(sessionId, stateFingerprint, dueBase) {
113
+ const digest = createHash('sha256')
114
+ .update(`${sessionId}\0${stateFingerprint}\0${dueBase}`, 'utf8')
115
+ .digest('hex')
116
+ .slice(0, 32);
117
+ return `owner-reminder-${digest}`;
118
+ }
119
+ /** Durable, deterministic scan engine. Scheduling and Lark IO are injected. */
120
+ export class SessionOwnerReminderController {
121
+ deps;
122
+ constructor(deps) {
123
+ this.deps = deps;
124
+ }
125
+ async scan(sessions, config, now = Date.now()) {
126
+ const current = this.deps.load();
127
+ const before = recordsSnapshot(current);
128
+ if (!config.enabled || config.states.length === 0) {
129
+ if (Object.keys(current).length > 0)
130
+ this.deps.save({});
131
+ return;
132
+ }
133
+ const configured = new Set(config.states);
134
+ const seen = new Set();
135
+ const intervalMs = config.intervalMinutes * 60_000;
136
+ for (const ds of sessions) {
137
+ const sessionId = ds.session.sessionId;
138
+ if (ds.session.status !== 'active'
139
+ || ds.session.queued === true
140
+ || (ds.scope ?? ds.session.scope) !== 'thread'
141
+ || !ds.session.ownerOpenId
142
+ || !this.deps.canSend(ds)) {
143
+ delete current[sessionId];
144
+ continue;
145
+ }
146
+ const projectedStates = deriveSessionOwnerReminderStates(ds);
147
+ const matched = projectedStates.filter(state => configured.has(state));
148
+ if (matched.length === 0) {
149
+ delete current[sessionId];
150
+ continue;
151
+ }
152
+ seen.add(sessionId);
153
+ // Eligibility follows the configured subset, but timer resets follow the
154
+ // complete runtime state. An unselected attention signal still represents
155
+ // a state transition and starts a fresh quiet period. The fingerprint also
156
+ // captures instance identity (attention.at / tuiPromptCardId) so a NEW
157
+ // same-category signal replacing a resolved one resets the timer instead
158
+ // of inheriting the old quiet period — see the fingerprint helper above.
159
+ const stateFingerprint = sessionOwnerReminderObservationFingerprint(ds, projectedStates);
160
+ const activityAt = Number.isFinite(ds.lastMessageAt) ? ds.lastMessageAt : 0;
161
+ let record = current[sessionId];
162
+ if (!record
163
+ || record.stateFingerprint !== stateFingerprint
164
+ || activityAt > record.lastObservedActivityAt) {
165
+ record = current[sessionId] = {
166
+ sessionId,
167
+ stateFingerprint,
168
+ actionableSince: Math.max(now, activityAt),
169
+ lastObservedActivityAt: activityAt,
170
+ };
171
+ continue;
172
+ }
173
+ const dueBase = record.lastRemindedAt ?? record.actionableSince;
174
+ if (now - dueBase < intervalMs)
175
+ continue;
176
+ if (record.retryAfterAt !== undefined && now < record.retryAfterAt)
177
+ continue;
178
+ try {
179
+ await this.deps.send(ds, config.text, sessionOwnerReminderDeliveryUuid(sessionId, stateFingerprint, dueBase));
180
+ record.lastRemindedAt = now;
181
+ record.retryAfterAt = undefined;
182
+ }
183
+ catch (error) {
184
+ record.retryAfterAt = now + Math.max(60_000, Math.min(intervalMs, FAILURE_RETRY_MAX_MS));
185
+ this.deps.onError?.(ds, error);
186
+ }
187
+ }
188
+ for (const sessionId of Object.keys(current)) {
189
+ if (!seen.has(sessionId))
190
+ delete current[sessionId];
191
+ }
192
+ if (recordsSnapshot(current) !== before)
193
+ this.deps.save(current);
194
+ }
195
+ }
196
+ //# sourceMappingURL=session-owner-reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-owner-reminder.js","sourceRoot":"","sources":["../../src/core/session-owner-reminder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * P1-13:previewTarget 的生命周期收口。
3
+ *
4
+ * previewTarget 是**当代 worker 的路由状态**,不是会话的持久属性:它指向那一代
5
+ * CLI 在本机 loopback 上拉起来的 Web 服务。worker 一换代(refork / 切 CLI / adopt /
6
+ * 崩溃退出 / suspend),或者会话被关闭,那个进程就没了,端口号随时可能被别的本机
7
+ * 进程抢走 —— 留着它等于把一条已登录用户可达的同源代理路由,交给一个我们不再认识
8
+ * 的进程。
9
+ *
10
+ * 所以每个「权威换代边界」都必须做两件事,缺一不可:
11
+ * 1. **原子地**把 previewTarget 从内存与磁盘上同时抹掉(并进调用方自己的那次
12
+ * `updateSession`,失败可回滚,不留下「内存清了磁盘没清」的中间态);
13
+ * 2. 向 Dashboard 广播 `preview: null`,否则浏览器侧的会话卡片会继续显示预览入口,
14
+ * SSE/WS 也没有信号去断开既有的预览长连接。
15
+ *
16
+ * 这里只提供这两个动作的最小原语,好让每个边界按自己的事务形状组合:
17
+ * - `takeSessionPreviewTarget` —— 只摘字段(调用方随后自己 save,可回滚);
18
+ * - `publishSessionPreviewCleared` —— 只广播;
19
+ * - `clearSessionPreviewTarget` —— 自带 save + 广播,给没有自带事务的边界用。
20
+ */
21
+ import type { Session } from '../types.js';
22
+ /**
23
+ * 摘掉内存里的 previewTarget,返回被摘掉的旧值(本来就没有则返回 undefined)。
24
+ * 不落盘、不广播:调用方要把它并进自己的原子 `updateSession`,并在 save 失败时用
25
+ * 返回值回滚。
26
+ *
27
+ * P1-3:`expectedRegisteredAt` 是可选的 revision 门槛——「作废我判定失效的那一次注册」,
28
+ * 而不是「清空此刻的值」。判定失效与清理落地之间隔着一次跨进程往返,这中间会话完全
29
+ * 可以合法地重注册一个新目标;无条件清空会把它一并抹掉,agent 刚拿到的
30
+ * 「✓ Web 预览已注册」立刻变成空。`registeredAt` 是 ISO 串,天然就是这次注册的
31
+ * revision。不传时保持原来的无条件语义(换代 / 关闭 / suspend 这些权威边界本来就
32
+ * 该清掉「当前那个」,无论它是哪一次注册)。
33
+ */
34
+ export declare function takeSessionPreviewTarget(session: Session, expectedRegisteredAt?: string): Session['previewTarget'];
35
+ /**
36
+ * 广播「这个会话已经没有预览目标了」。走 `previewTarget: null` 而不是省略字段——
37
+ * preview-contract 的投影把它翻译成浏览器可见的 `preview: null`,浏览器 store 据此
38
+ * 丢弃旧描述符;省略字段则会被当成「本次 patch 不涉及预览」而保留旧值。
39
+ */
40
+ export declare function publishSessionPreviewCleared(sessionId: string): void;
41
+ /**
42
+ * 清 + 落盘 + 广播。返回是否真的清掉了东西(没有目标时不产生任何事件与写盘)。
43
+ *
44
+ * 落盘失败**不**回滚内存:此刻内存里的会话已经不再持有那个目标(这正是我们要的
45
+ * fail-closed 方向),而下一次成功的 save 会让磁盘收敛。广播照发,Dashboard 立刻
46
+ * 停止把用户导向一个已经不属于本会话的端口。
47
+ *
48
+ * P1-3:`expectedRegisteredAt` 见 `takeSessionPreviewTarget`。revision 不匹配时整条
49
+ * 是 no-op(不写盘、不广播、返回 false),幂等语义不变——「本来就没有」与「已经不是
50
+ * 那一个了」对调用方是同一件事:这次清理没有需要做的事。
51
+ */
52
+ export declare function clearSessionPreviewTarget(session: Session, why: string, expectedRegisteredAt?: string): boolean;
53
+ //# sourceMappingURL=session-preview-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-preview-registry.d.ts","sourceRoot":"","sources":["../../src/core/session-preview-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAaT"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * P1-13:previewTarget 的生命周期收口。
3
+ *
4
+ * previewTarget 是**当代 worker 的路由状态**,不是会话的持久属性:它指向那一代
5
+ * CLI 在本机 loopback 上拉起来的 Web 服务。worker 一换代(refork / 切 CLI / adopt /
6
+ * 崩溃退出 / suspend),或者会话被关闭,那个进程就没了,端口号随时可能被别的本机
7
+ * 进程抢走 —— 留着它等于把一条已登录用户可达的同源代理路由,交给一个我们不再认识
8
+ * 的进程。
9
+ *
10
+ * 所以每个「权威换代边界」都必须做两件事,缺一不可:
11
+ * 1. **原子地**把 previewTarget 从内存与磁盘上同时抹掉(并进调用方自己的那次
12
+ * `updateSession`,失败可回滚,不留下「内存清了磁盘没清」的中间态);
13
+ * 2. 向 Dashboard 广播 `preview: null`,否则浏览器侧的会话卡片会继续显示预览入口,
14
+ * SSE/WS 也没有信号去断开既有的预览长连接。
15
+ *
16
+ * 这里只提供这两个动作的最小原语,好让每个边界按自己的事务形状组合:
17
+ * - `takeSessionPreviewTarget` —— 只摘字段(调用方随后自己 save,可回滚);
18
+ * - `publishSessionPreviewCleared` —— 只广播;
19
+ * - `clearSessionPreviewTarget` —— 自带 save + 广播,给没有自带事务的边界用。
20
+ */
21
+ import { dashboardEventBus } from './dashboard-events.js';
22
+ import * as sessionStore from '../services/session-store.js';
23
+ import { logger } from '../utils/logger.js';
24
+ /**
25
+ * 摘掉内存里的 previewTarget,返回被摘掉的旧值(本来就没有则返回 undefined)。
26
+ * 不落盘、不广播:调用方要把它并进自己的原子 `updateSession`,并在 save 失败时用
27
+ * 返回值回滚。
28
+ *
29
+ * P1-3:`expectedRegisteredAt` 是可选的 revision 门槛——「作废我判定失效的那一次注册」,
30
+ * 而不是「清空此刻的值」。判定失效与清理落地之间隔着一次跨进程往返,这中间会话完全
31
+ * 可以合法地重注册一个新目标;无条件清空会把它一并抹掉,agent 刚拿到的
32
+ * 「✓ Web 预览已注册」立刻变成空。`registeredAt` 是 ISO 串,天然就是这次注册的
33
+ * revision。不传时保持原来的无条件语义(换代 / 关闭 / suspend 这些权威边界本来就
34
+ * 该清掉「当前那个」,无论它是哪一次注册)。
35
+ */
36
+ export function takeSessionPreviewTarget(session, expectedRegisteredAt) {
37
+ const previous = session.previewTarget;
38
+ if (previous === undefined)
39
+ return undefined;
40
+ if (expectedRegisteredAt !== undefined && previous.registeredAt !== expectedRegisteredAt) {
41
+ return undefined;
42
+ }
43
+ session.previewTarget = undefined;
44
+ return previous;
45
+ }
46
+ /**
47
+ * 广播「这个会话已经没有预览目标了」。走 `previewTarget: null` 而不是省略字段——
48
+ * preview-contract 的投影把它翻译成浏览器可见的 `preview: null`,浏览器 store 据此
49
+ * 丢弃旧描述符;省略字段则会被当成「本次 patch 不涉及预览」而保留旧值。
50
+ */
51
+ export function publishSessionPreviewCleared(sessionId) {
52
+ dashboardEventBus.publish({
53
+ type: 'session.update',
54
+ body: { sessionId, patch: { previewTarget: null } },
55
+ });
56
+ }
57
+ /**
58
+ * 清 + 落盘 + 广播。返回是否真的清掉了东西(没有目标时不产生任何事件与写盘)。
59
+ *
60
+ * 落盘失败**不**回滚内存:此刻内存里的会话已经不再持有那个目标(这正是我们要的
61
+ * fail-closed 方向),而下一次成功的 save 会让磁盘收敛。广播照发,Dashboard 立刻
62
+ * 停止把用户导向一个已经不属于本会话的端口。
63
+ *
64
+ * P1-3:`expectedRegisteredAt` 见 `takeSessionPreviewTarget`。revision 不匹配时整条
65
+ * 是 no-op(不写盘、不广播、返回 false),幂等语义不变——「本来就没有」与「已经不是
66
+ * 那一个了」对调用方是同一件事:这次清理没有需要做的事。
67
+ */
68
+ export function clearSessionPreviewTarget(session, why, expectedRegisteredAt) {
69
+ if (takeSessionPreviewTarget(session, expectedRegisteredAt) === undefined)
70
+ return false;
71
+ try {
72
+ sessionStore.updateSession(session);
73
+ }
74
+ catch (err) {
75
+ logger.error(`[${session.sessionId.substring(0, 8)}] Could not persist preview-target cleanup (${why}): `
76
+ + `${err instanceof Error ? err.message : String(err)}`);
77
+ }
78
+ publishSessionPreviewCleared(session.sessionId);
79
+ logger.debug(`[${session.sessionId.substring(0, 8)}] Dropped preview target (${why})`);
80
+ return true;
81
+ }
82
+ //# sourceMappingURL=session-preview-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-preview-registry.js","sourceRoot":"","sources":["../../src/core/session-preview-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAgB,EAChB,oBAA6B;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,oBAAoB,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,KAAK,oBAAoB,EAAE,CAAC;QACzF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,SAAiB;IAC5D,iBAAiB,CAAC,OAAO,CAAC;QACxB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;KACpD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAgB,EAChB,GAAW,EACX,oBAA6B;IAE7B,IAAI,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxF,IAAI,CAAC;QACH,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CACV,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,+CAA+C,GAAG,KAAK;cAC1F,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxD,CAAC;IACJ,CAAC;IACD,4BAA4B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { type LiteralLoopbackHost } from './loopback-target.js';
2
+ import { type PreviewPortOwnerFailure, type PreviewPortOwnerProof } from './preview-port-owner.js';
3
+ export declare const PREVIEW_ROUTE_PREFIX = "/preview";
4
+ /**
5
+ * Reserved path segment that introduces the sandboxed content stream:
6
+ * `/preview/<sessionId>/__botmux_preview_content/<capability>/…`.
7
+ *
8
+ * It is a path segment rather than a query flag on purpose. The preview
9
+ * document is served into an opaque-origin sandbox, so its own relative
10
+ * subresources and WebSockets carry no dashboard cookie; a capability that
11
+ * lives in the path is inherited by every relative URL the app resolves,
12
+ * while a query flag would be dropped by the first `./app.js`.
13
+ */
14
+ export declare const PREVIEW_CONTENT_SEGMENT = "__botmux_preview_content";
15
+ export declare const PREVIEW_PROBE_TIMEOUT_MS = 750;
16
+ /** DNS names are deliberately excluded: resolving even `localhost` would add a
17
+ * rebinding/configuration surface to an SSRF boundary. */
18
+ export type PreviewLoopbackHost = LiteralLoopbackHost;
19
+ export interface SessionPreviewTarget {
20
+ host: PreviewLoopbackHost;
21
+ port: number;
22
+ registeredAt: string;
23
+ /**
24
+ * P1-12:注册那一刻「谁在持有这个端口」的证明。没有它就只有一次 TCP connect 的
25
+ * 事实,代理无法分辨自己连的是本会话的 dev server 还是端口号被回收后顶上来的
26
+ * 任意本机进程,所以它是必填字段——老版本写下的、缺证明的 target 在这里直接归零
27
+ * (fail closed,会话重新 `botmux preview <port>` 即可)。
28
+ */
29
+ owner: PreviewPortOwnerProof;
30
+ /**
31
+ * P1-13:注册时的 worker 代次。worker 换代(refork / 切 CLI / adopt / exit)会
32
+ * 原子清掉 target,这个字段是「万一漏清」时的第二道判据,也是注册路由 probe
33
+ * await 之后做 CAS 复核的锚点。
34
+ */
35
+ workerGeneration: number;
36
+ }
37
+ export interface SessionPreviewDescriptor {
38
+ path: string;
39
+ registeredAt: string;
40
+ }
41
+ export declare function isPreviewPort(value: unknown): value is number;
42
+ export declare function isPreviewLoopbackHost(value: unknown): value is PreviewLoopbackHost;
43
+ /** Re-validate persisted/SSE data at every trust boundary. Invalid legacy or
44
+ * attacker-shaped objects collapse to undefined and are never dialled. */
45
+ export declare function safeSessionPreviewTarget(value: unknown): SessionPreviewTarget | undefined;
46
+ /**
47
+ * P1-1:一次注册的指纹。空串表示「这个会话此刻没有合法的预览目标」。
48
+ *
49
+ * host:port 不足以当身份:端口被回收后重注册、worker 换代后在同一端口重注册,都会
50
+ * 产生同一个 host:port,但那是另一次注册、另一个进程。registeredAt(ISO 串,天然可
51
+ * 当 revision)、workerGeneration、以及 owner 三元证明合起来才唯一确定「哪一次」。
52
+ */
53
+ export declare function sessionPreviewFingerprint(previewTarget: unknown): string;
54
+ /** P1-1:两个 target 是不是同一次注册(见 `sessionPreviewFingerprint`)。 */
55
+ export declare function sameSessionPreviewTarget(a: SessionPreviewTarget, b: SessionPreviewTarget): boolean;
56
+ /**
57
+ * P1-12:目标是否仍由注册时那个进程持有。probe 之后与**每次代理落地之前**都要过
58
+ * 这一关;`changed`/`unverifiable` 一律按失效处理(返回 false),调用方负责清 target
59
+ * 并广播 `preview: null`。
60
+ */
61
+ export declare function sessionPreviewTargetStillOwned(target: SessionPreviewTarget, opts?: {
62
+ procRoot?: string;
63
+ }): boolean;
64
+ /**
65
+ * Riff 矩阵:哪些会话后端的 Web 服务在 daemon 的 loopback 上**根本不可能**出现。
66
+ *
67
+ * riff 是远端 sandbox——CLI 与它启动的 dev server 都跑在远程主机上,daemon 这一侧
68
+ * 的 127.0.0.1 上永远没有对应监听。此时必须明确回 `preview_unsupported`,而不是
69
+ * 让它落进 `preview_unreachable` 冒充「偶发故障」让用户反复重试;前端据此隐藏入口。
70
+ * pty / tmux / zellij / herdr / zmx 都是本机后端,行为不变。
71
+ */
72
+ export declare function previewBackendSupported(backendType: unknown): boolean;
73
+ export declare function sessionPreviewPath(sessionId: string): string;
74
+ /** Base path of the sandboxed content stream. Every relative URL the framed
75
+ * app resolves stays under it, which is how the capability survives without
76
+ * cookies or query strings. */
77
+ export declare function sessionPreviewContentPath(sessionId: string, capability: string): string;
78
+ export declare function sessionPreviewDescriptor(sessionId: string, value: unknown): SessionPreviewDescriptor | undefined;
79
+ export type SessionPreviewProbeError = 'invalid_port'
80
+ /** 没有任何 loopback 地址上有人监听这个端口。 */
81
+ | 'preview_unreachable'
82
+ /** 有人在监听,但拿不到「属于本会话」的持有证明 → fail closed。 */
83
+ | 'preview_owner_unverified';
84
+ export type SessionPreviewProbeResult = {
85
+ ok: true;
86
+ target: SessionPreviewTarget;
87
+ } | {
88
+ ok: false;
89
+ error: SessionPreviewProbeError;
90
+ reason?: PreviewPortOwnerFailure;
91
+ };
92
+ /**
93
+ * Validate that a caller-selected port is reachable through a literal loopback
94
+ * address AND held by a process inside this session's lineage. With no
95
+ * requested host, IPv4 is preferred and IPv6 is a fallback so
96
+ * `botmux preview <port>` works for either bind family.
97
+ *
98
+ * P1-12:可达性与归属是两件事,两件都必须成立才产出 target——connect 通过只说明
99
+ * 「此刻这个号码上有人」,`resolvePreviewPortOwner` 才回答「那个人是不是本会话的
100
+ * 进程」。归属拿不到时宁可没有预览,也不给出一条指向不明进程的代理路由。
101
+ */
102
+ export declare function probeSessionPreviewTarget(input: {
103
+ port: number;
104
+ host?: PreviewLoopbackHost;
105
+ timeoutMs?: number;
106
+ now?: () => Date;
107
+ /** 会话血缘的根 pid(worker fork pid / CLI pid / adopt CLI pid)。 */
108
+ ownerPids: Array<number | undefined>;
109
+ /** 注册时的 worker 代次,随 target 落盘供后续 CAS 与换代清理比对。 */
110
+ workerGeneration: number;
111
+ /** 测试注入的假 procfs 根;生产恒为 '/proc'。 */
112
+ procRoot?: string;
113
+ }): Promise<SessionPreviewProbeResult>;
114
+ //# sourceMappingURL=session-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-preview.d.ts","sourceRoot":"","sources":["../../src/core/session-preview.ts"],"names":[],"mappings":"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"}