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
@@ -10,6 +10,20 @@ import { removePromptContextDir } from './prompt-context-store.js';
10
10
  let sessions = new Map();
11
11
  let loaded = false;
12
12
  let currentAppId;
13
+ let loadFailure;
14
+ /**
15
+ * The compatibility reader deliberately exposes an empty projection after a
16
+ * read/parse failure. Destructive callers must use the strict API below so an
17
+ * unreadable store cannot be mistaken for "there are no durable sessions".
18
+ */
19
+ export class SessionStoreUnavailableError extends Error {
20
+ loadError;
21
+ name = 'SessionStoreUnavailableError';
22
+ constructor(loadError) {
23
+ super(`session store is unavailable: ${loadError.message}`);
24
+ this.loadError = loadError;
25
+ }
26
+ }
13
27
  // Legacy fields from the removed「处理中」placeholder-card PATCH delivery. They
14
28
  // no longer exist on Session and nothing reads them, but sessions persisted
15
29
  // before the removal still carry them on disk. Strip on write so the file
@@ -20,34 +34,34 @@ export function stripLegacyPendingCardFields(session) {
20
34
  delete session[f];
21
35
  }
22
36
  /** The active row no longer has the lineage/ownership sampled by the caller. */
23
- export class RiffLineageOwnershipError extends Error {
24
- name = 'RiffLineageOwnershipError';
37
+ export class RemoteLineageOwnershipError extends Error {
38
+ name = 'RemoteLineageOwnershipError';
25
39
  }
26
- export class RiffLineageBatchError extends Error {
40
+ export class RemoteLineageBatchError extends Error {
27
41
  stage;
28
42
  sessionIds;
29
- name = 'RiffLineageBatchError';
43
+ name = 'RemoteLineageBatchError';
30
44
  constructor(stage, sessionIds, message) {
31
45
  super(message);
32
46
  this.stage = stage;
33
47
  this.sessionIds = sessionIds;
34
48
  }
35
49
  }
36
- function riffDurableOwner(session) {
50
+ function remoteDurableOwner(session) {
37
51
  return {
38
52
  pid: session.pid ?? null,
39
53
  larkAppId: session.larkAppId ?? null,
40
54
  backendType: session.backendType ?? null,
41
55
  };
42
56
  }
43
- function riffOwnersEqual(left, right) {
57
+ function remoteOwnersEqual(left, right) {
44
58
  return left.pid === right.pid
45
59
  && left.larkAppId === right.larkAppId
46
60
  && left.backendType === right.backendType;
47
61
  }
48
- let testOnlyAfterRiffBatchRename;
49
- export function __testOnly_setAfterRiffBatchRename(hook) {
50
- testOnlyAfterRiffBatchRename = hook;
62
+ let testOnlyAfterRemoteBatchRename;
63
+ export function __testOnly_setAfterRemoteBatchRename(hook) {
64
+ testOnlyAfterRemoteBatchRename = hook;
51
65
  }
52
66
  /**
53
67
  * Initialise session store for a specific bot (multi-daemon mode).
@@ -58,6 +72,7 @@ export function init(appId) {
58
72
  currentAppId = appId;
59
73
  loaded = false;
60
74
  sessions = new Map();
75
+ loadFailure = undefined;
61
76
  }
62
77
  function getFilePath() {
63
78
  const fileName = currentAppId ? `sessions-${currentAppId}.json` : 'sessions.json';
@@ -97,6 +112,13 @@ function repairMissingChatScopes() {
97
112
  }
98
113
  return repaired;
99
114
  }
115
+ function parseSessionsProjectionStrict(raw, fp) {
116
+ const value = JSON.parse(raw);
117
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
118
+ throw new Error(`invalid sessions projection at ${fp}`);
119
+ }
120
+ return value;
121
+ }
100
122
  // Sessions persisted before 2026-04-29 lack `cliId`; consumers must fall back to 'unknown' at the render boundary.
101
123
  function load() {
102
124
  if (loaded)
@@ -106,7 +128,7 @@ function load() {
106
128
  withFileLockSync(fp, () => {
107
129
  if (existsSync(fp)) {
108
130
  try {
109
- const data = JSON.parse(readFileSync(fp, 'utf-8'));
131
+ const data = parseSessionsProjectionStrict(readFileSync(fp, 'utf-8'), fp);
110
132
  sessions = new Map(Object.entries(data));
111
133
  const repaired = repairMissingChatScopes();
112
134
  if (repaired > 0) {
@@ -126,6 +148,7 @@ function load() {
126
148
  }
127
149
  catch (err) {
128
150
  logger.error(`Failed to load sessions: ${err}`);
151
+ loadFailure = err instanceof Error ? err : new Error(String(err));
129
152
  sessions = new Map();
130
153
  }
131
154
  }
@@ -135,7 +158,7 @@ function load() {
135
158
  const legacyFp = join(config.session.dataDir, 'sessions.json');
136
159
  if (existsSync(legacyFp)) {
137
160
  try {
138
- const data = JSON.parse(readFileSync(legacyFp, 'utf-8'));
161
+ const data = parseSessionsProjectionStrict(readFileSync(legacyFp, 'utf-8'), legacyFp);
139
162
  sessions = new Map();
140
163
  for (const [k, v] of Object.entries(data)) {
141
164
  if (v.larkAppId === currentAppId)
@@ -155,6 +178,7 @@ function load() {
155
178
  }
156
179
  catch (err) {
157
180
  logger.error(`Failed to migrate sessions from legacy file: ${err}`);
181
+ loadFailure = err instanceof Error ? err : new Error(String(err));
158
182
  sessions = new Map();
159
183
  }
160
184
  }
@@ -162,6 +186,18 @@ function load() {
162
186
  });
163
187
  loaded = true;
164
188
  }
189
+ /**
190
+ * Mutations must never proceed from the compatibility reader's empty
191
+ * projection after a load failure. In particular, serialising that empty
192
+ * cache would replace the unreadable durable file and destroy the only copy
193
+ * of its rows. Keep the failure sticky until init() explicitly reloads the
194
+ * selected store, matching listSessionsStrict().
195
+ */
196
+ function loadForWrite() {
197
+ load();
198
+ if (loadFailure)
199
+ throw new SessionStoreUnavailableError(loadFailure);
200
+ }
165
201
  function readExistingSessionsFromDisk(fp) {
166
202
  if (!existsSync(fp))
167
203
  return { raw: '', parsed: {} };
@@ -177,11 +213,7 @@ function readSessionsProjectionStrict(fp) {
177
213
  if (!existsSync(fp))
178
214
  return { raw: '', parsed: {} };
179
215
  const raw = readFileSync(fp, 'utf-8');
180
- const value = JSON.parse(raw);
181
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
182
- throw new Error(`invalid sessions projection at ${fp}`);
183
- }
184
- return { raw, parsed: value };
216
+ return { raw, parsed: parseSessionsProjectionStrict(raw, fp) };
185
217
  }
186
218
  function duplicateIds(ids) {
187
219
  const seen = new Set();
@@ -195,15 +227,15 @@ function duplicateIds(ids) {
195
227
  return [...duplicates];
196
228
  }
197
229
  /**
198
- * Sample every active Riff participant from one fresh sessions projection.
230
+ * Sample every active remote participant from one fresh sessions projection.
199
231
  * Fleet shutdown takes this snapshot before fencing any worker.
200
232
  */
201
- export function getActiveRiffShutdownSnapshotsBatch(sessionIds, options = {}) {
233
+ export function getActiveRemoteShutdownSnapshotsBatch(sessionIds, options = {}) {
202
234
  if (sessionIds.length === 0)
203
235
  return [];
204
236
  const duplicates = duplicateIds(sessionIds);
205
237
  if (duplicates.length > 0) {
206
- throw new RiffLineageBatchError('prewrite_ownership', duplicates, `duplicate Riff shutdown session ids: ${duplicates.join(', ')}`);
238
+ throw new RemoteLineageBatchError('prewrite_ownership', duplicates, `duplicate remote shutdown session ids: ${duplicates.join(', ')}`);
207
239
  }
208
240
  ensureDir();
209
241
  const fp = getFilePath();
@@ -215,37 +247,38 @@ export function getActiveRiffShutdownSnapshotsBatch(sessionIds, options = {}) {
215
247
  return !session || session.status !== 'active';
216
248
  });
217
249
  if (invalid.length > 0) {
218
- throw new RiffLineageBatchError('prewrite_ownership', invalid, `cannot snapshot non-active Riff sessions: ${invalid.join(', ')}`);
250
+ throw new RemoteLineageBatchError('prewrite_ownership', invalid, `cannot snapshot non-active remote sessions: ${invalid.join(', ')}`);
219
251
  }
220
252
  return sessionIds.map((sessionId) => {
221
253
  const session = parsed[sessionId];
222
254
  return {
223
255
  sessionId,
224
256
  taskId: session.riffParentTaskId ?? null,
225
- owner: riffDurableOwner(session),
257
+ owner: remoteDurableOwner(session),
226
258
  };
227
259
  });
228
260
  }, { maxWaitMs: options.maxWaitMs });
229
261
  }
230
262
  catch (error) {
231
- if (error instanceof RiffLineageBatchError)
263
+ if (error instanceof RemoteLineageBatchError)
232
264
  throw error;
233
- throw new RiffLineageBatchError('prewrite_io', [...sessionIds], `failed to snapshot active Riff sessions: ${String(error)}`);
265
+ throw new RemoteLineageBatchError('prewrite_io', [...sessionIds], `failed to snapshot active remote sessions: ${String(error)}`);
234
266
  }
235
267
  }
236
268
  /**
237
- * Commit every prepared Riff lineage as one compare-and-set transaction.
269
+ * Commit every prepared remote lineage as one compare-and-set transaction.
238
270
  * The published projection is read back under the same lock before workers
239
271
  * are allowed to exit.
240
272
  */
241
- export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
273
+ export function persistActiveRemoteLineagesExactBatch(updates, options = {}) {
242
274
  if (updates.length === 0)
243
275
  return [];
244
276
  const sessionIds = updates.map(update => update.sessionId);
245
277
  const duplicates = duplicateIds(sessionIds);
246
278
  if (duplicates.length > 0) {
247
- throw new RiffLineageBatchError('prewrite_ownership', duplicates, `duplicate Riff lineage batch session ids: ${duplicates.join(', ')}`);
279
+ throw new RemoteLineageBatchError('prewrite_ownership', duplicates, `duplicate remote lineage batch session ids: ${duplicates.join(', ')}`);
248
280
  }
281
+ loadForWrite();
249
282
  ensureDir();
250
283
  const fp = getFilePath();
251
284
  let published = false;
@@ -260,12 +293,12 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
260
293
  if (!durable
261
294
  || durable.status !== 'active'
262
295
  || !update.expectedCurrentTaskIds.some(candidate => candidate === durableTaskId)
263
- || !riffOwnersEqual(riffDurableOwner(durable), update.owner)) {
296
+ || !remoteOwnersEqual(remoteDurableOwner(durable), update.owner)) {
264
297
  conflicts.push(update.sessionId);
265
298
  }
266
299
  }
267
300
  if (conflicts.length > 0) {
268
- throw new RiffLineageBatchError('prewrite_ownership', conflicts, `Riff lineage batch compare-and-set failed for: ${conflicts.join(', ')}`);
301
+ throw new RemoteLineageBatchError('prewrite_ownership', conflicts, `Remote lineage batch compare-and-set failed for: ${conflicts.join(', ')}`);
269
302
  }
270
303
  for (const update of updates) {
271
304
  const durable = parsed[update.sessionId];
@@ -283,29 +316,29 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
283
316
  renameSync(tmpFp, fp);
284
317
  tmpFp = undefined;
285
318
  published = true;
286
- testOnlyAfterRiffBatchRename?.();
319
+ testOnlyAfterRemoteBatchRename?.();
287
320
  }
288
321
  let verifiedProjection;
289
322
  try {
290
323
  verifiedProjection = readSessionsProjectionStrict(fp).parsed;
291
324
  }
292
325
  catch (error) {
293
- throw new RiffLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to read back Riff lineage batch: ${String(error)}`);
326
+ throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to read back Remote lineage batch: ${String(error)}`);
294
327
  }
295
328
  const ambiguous = updates.filter((update) => {
296
329
  const durable = verifiedProjection[update.sessionId];
297
330
  return !durable
298
331
  || durable.status !== 'active'
299
332
  || (durable.riffParentTaskId ?? null) !== update.targetTaskId
300
- || !riffOwnersEqual(riffDurableOwner(durable), update.owner);
333
+ || !remoteOwnersEqual(remoteDurableOwner(durable), update.owner);
301
334
  }).map(update => update.sessionId);
302
335
  if (ambiguous.length > 0) {
303
- throw new RiffLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_ownership', ambiguous, `Riff lineage batch readback mismatch for: ${ambiguous.join(', ')}`);
336
+ throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_ownership', ambiguous, `Remote lineage batch readback mismatch for: ${ambiguous.join(', ')}`);
304
337
  }
305
338
  const verified = updates.map((update) => ({
306
339
  sessionId: update.sessionId,
307
340
  taskId: update.targetTaskId,
308
- owner: riffDurableOwner(verifiedProjection[update.sessionId]),
341
+ owner: remoteDurableOwner(verifiedProjection[update.sessionId]),
309
342
  }));
310
343
  if (loaded) {
311
344
  for (const update of updates) {
@@ -318,9 +351,9 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
318
351
  }, { maxWaitMs: options.maxWaitMs });
319
352
  }
320
353
  catch (error) {
321
- if (error instanceof RiffLineageBatchError)
354
+ if (error instanceof RemoteLineageBatchError)
322
355
  throw error;
323
- throw new RiffLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to persist Riff lineage batch: ${String(error)}`);
356
+ throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to persist Remote lineage batch: ${String(error)}`);
324
357
  }
325
358
  finally {
326
359
  if (tmpFp) {
@@ -332,6 +365,8 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
332
365
  }
333
366
  }
334
367
  function save() {
368
+ if (loadFailure)
369
+ throw new SessionStoreUnavailableError(loadFailure);
335
370
  ensureDir();
336
371
  const fp = getFilePath();
337
372
  withFileLockSync(fp, () => {
@@ -354,7 +389,7 @@ function save() {
354
389
  });
355
390
  }
356
391
  export function createSession(chatId, rootMessageId, title, chatType, scope) {
357
- load();
392
+ loadForWrite();
358
393
  const session = {
359
394
  sessionId: randomUUID(),
360
395
  chatId,
@@ -457,8 +492,270 @@ export function cleanupSessionBridgeSendMarkers(sessionId) {
457
492
  }
458
493
  cleanupSessionBridgeSendMarkersNow(sessionId);
459
494
  }
495
+ export function isValidMojoCloseJournal(value) {
496
+ if (!value || typeof value !== 'object' || Array.isArray(value))
497
+ return false;
498
+ const journal = value;
499
+ if (journal.phase !== 'preparing'
500
+ && journal.phase !== 'prepared'
501
+ && journal.phase !== 'uncertain')
502
+ return false;
503
+ if (typeof journal.requestId !== 'string' || !journal.requestId.trim())
504
+ return false;
505
+ if (typeof journal.updatedAt !== 'string' || !journal.updatedAt.trim())
506
+ return false;
507
+ if (journal.recovery !== undefined
508
+ && journal.recovery !== 'retryable'
509
+ && journal.recovery !== 'uncertain'
510
+ && journal.recovery !== 'irreversible')
511
+ return false;
512
+ if (journal.admission !== undefined
513
+ && journal.admission !== 'restorable'
514
+ && journal.admission !== 'fenced')
515
+ return false;
516
+ if (journal.commitOnly !== undefined && typeof journal.commitOnly !== 'boolean')
517
+ return false;
518
+ if (journal.localResidual !== undefined
519
+ && journal.localResidual !== 'local_subtree_unprovable_on_platform'
520
+ && journal.localResidual !== 'local_subtree_boundary_unproven')
521
+ return false;
522
+ // A retryable verdict never proves an irreversible teardown, so it must not
523
+ // arrive wearing the marker that suppresses further cancellation.
524
+ if (journal.recovery === 'retryable' && journal.commitOnly === true)
525
+ return false;
526
+ // An irreversible verdict is only ever legal as a commit-only `prepared` row:
527
+ // the remote side is gone, so nothing may cancel or abort it again.
528
+ if (journal.recovery === 'irreversible'
529
+ && (journal.phase !== 'prepared' || journal.commitOnly !== true))
530
+ return false;
531
+ if (journal.commitOnly === true && journal.phase !== 'prepared')
532
+ return false;
533
+ return journal.taskId === undefined
534
+ || (typeof journal.taskId === 'string' && !!journal.taskId.trim());
535
+ }
536
+ function mutateMojoCloseJournal(sessionId, mutate) {
537
+ loadForWrite();
538
+ const session = sessions.get(sessionId);
539
+ if (!session || session.status !== 'active') {
540
+ throw new Error(`cannot mutate Mojo close journal for non-active session ${sessionId}`);
541
+ }
542
+ if (session.backendType !== 'mojo') {
543
+ throw new Error(`cannot mutate Mojo close journal for non-Mojo session ${sessionId}`);
544
+ }
545
+ const priorJournal = session.mojoCloseJournal
546
+ ? { ...session.mojoCloseJournal }
547
+ : undefined;
548
+ const priorTaskId = session.riffParentTaskId;
549
+ if (session.mojoCloseJournal && !isValidMojoCloseJournal(session.mojoCloseJournal)) {
550
+ throw new Error(`cannot mutate malformed Mojo close journal for ${sessionId}`);
551
+ }
552
+ mutate(session);
553
+ try {
554
+ save();
555
+ }
556
+ catch (error) {
557
+ session.mojoCloseJournal = priorJournal;
558
+ session.riffParentTaskId = priorTaskId;
559
+ throw error;
560
+ }
561
+ return session;
562
+ }
563
+ /** Persist the admission fence before any authoritative Mojo cancel begins. */
564
+ export function beginMojoCloseJournal(sessionId, requestId, expectedTaskId) {
565
+ return mutateMojoCloseJournal(sessionId, (session) => {
566
+ if (session.riffParentTaskId !== expectedTaskId) {
567
+ throw new Error(`Mojo close lineage changed before prepare for ${sessionId}`);
568
+ }
569
+ const existing = session.mojoCloseJournal;
570
+ if (existing) {
571
+ if (existing.commitOnly) {
572
+ // The remote teardown already completed irreversibly; only the local
573
+ // commit may be retried. Starting a second cancel here is exactly the
574
+ // double teardown this journal exists to prevent.
575
+ throw new Error(`cannot re-cancel commit-only Mojo close journal for ${sessionId}`);
576
+ }
577
+ if (existing.phase !== 'preparing' && existing.phase !== 'uncertain') {
578
+ throw new Error(`cannot restart ${existing.phase} Mojo close journal for ${sessionId}`);
579
+ }
580
+ if (existing.taskId !== expectedTaskId) {
581
+ throw new Error(`Mojo close journal lineage changed before retry for ${sessionId}`);
582
+ }
583
+ if (existing.requestId !== requestId) {
584
+ if (existing.phase !== 'uncertain' && existing.recovery !== 'retryable') {
585
+ throw new Error(`another Mojo close journal already owns ${sessionId}`);
586
+ }
587
+ // Two journal shapes accept a fresh attempt under a NEW requestId:
588
+ // * `retryable` — the failed prepare durably recorded that retrying
589
+ // the cancel is legitimate. Refusing every fresh requestId here is
590
+ // what made `retryable` dead-code and the row a permanent brick
591
+ // (P1-1/P1-2).
592
+ // * `uncertain` — an explicit close IS the manual reconciliation the
593
+ // fence demanded. Only a live worker's prepare/commit reaches this
594
+ // takeover (ownerless uncertain rows DRAIN instead — see
595
+ // prepareMojoExplicitClose), and re-running the cancel is the
596
+ // fail-safe direction: the frozen identity pins the tenant, and an
597
+ // already-terminal remote session is classified as gone, not as a
598
+ // second teardown. Without the takeover the live-worker case had no
599
+ // exit at all (P0-new).
600
+ // commitOnly / `prepared` journals were rejected above and stay
601
+ // non-restartable: those record an IRREVERSIBLE teardown. The row is
602
+ // rebuilt from scratch so the stale recovery/admission verdict cannot
603
+ // survive into the new attempt; lineage equality was asserted above, so
604
+ // the retry still addresses the same remote session.
605
+ session.mojoCloseJournal = {
606
+ phase: 'preparing',
607
+ requestId,
608
+ ...(expectedTaskId ? { taskId: expectedTaskId } : {}),
609
+ updatedAt: new Date().toISOString(),
610
+ };
611
+ }
612
+ return;
613
+ }
614
+ session.mojoCloseJournal = {
615
+ phase: 'preparing',
616
+ requestId,
617
+ ...(expectedTaskId ? { taskId: expectedTaskId } : {}),
618
+ updatedAt: new Date().toISOString(),
619
+ };
620
+ });
621
+ }
622
+ /** Publish irreversible remote-cancel proof before the local close commit. */
623
+ export function markMojoClosePrepared(sessionId, requestId, taskId, localResidual) {
624
+ return mutateMojoCloseJournal(sessionId, (session) => {
625
+ const existing = session.mojoCloseJournal;
626
+ if (existing && existing.requestId !== requestId) {
627
+ throw new Error(`stale Mojo close prepare for ${sessionId}`);
628
+ }
629
+ if (existing?.phase === 'uncertain') {
630
+ throw new Error(`cannot promote uncertain Mojo close journal for ${sessionId}`);
631
+ }
632
+ if (existing?.taskId && taskId && existing.taskId !== taskId) {
633
+ throw new Error(`Mojo close proof changed journal lineage for ${sessionId}`);
634
+ }
635
+ const provenTaskId = taskId ?? existing?.taskId;
636
+ if (provenTaskId && session.riffParentTaskId
637
+ && session.riffParentTaskId !== provenTaskId) {
638
+ throw new Error(`Mojo close result lineage changed for ${sessionId}`);
639
+ }
640
+ if (provenTaskId)
641
+ session.riffParentTaskId = provenTaskId;
642
+ // The residual is part of the PROOF being published: a replay of this
643
+ // prepared journal (runtime commit retry, or a daemon restart) must publish
644
+ // the same residual close it describes. A repeat prepare without one keeps
645
+ // the recorded residual — the evidence grade of the original close does not
646
+ // improve by being replayed.
647
+ const provenResidual = localResidual ?? existing?.localResidual;
648
+ session.mojoCloseJournal = {
649
+ phase: 'prepared',
650
+ requestId,
651
+ ...(provenTaskId ? { taskId: provenTaskId } : {}),
652
+ ...(provenResidual ? { localResidual: provenResidual } : {}),
653
+ updatedAt: new Date().toISOString(),
654
+ };
655
+ });
656
+ }
657
+ /**
658
+ * Finish a failed prepare after worker admission restore. If restore was not
659
+ * proven, keep a durable uncertain fence; either way retain a newly discovered
660
+ * pre-init lineage for later reconciliation.
661
+ */
662
+ export function finishMojoCloseAbort(sessionId, requestId, options) {
663
+ return mutateMojoCloseJournal(sessionId, (session) => {
664
+ const existing = session.mojoCloseJournal;
665
+ if (!existing || existing.requestId !== requestId) {
666
+ throw new Error(`stale Mojo close abort for ${sessionId}`);
667
+ }
668
+ if (existing.commitOnly || existing.recovery === 'irreversible') {
669
+ // Checked BEFORE the generic prepared guard so the refusal names the reason:
670
+ // rolling this back would re-open write admission on a lineage whose remote
671
+ // side is already gone, leaving a session that looks writable and can never
672
+ // continue.
673
+ throw new Error(`cannot abort irreversible Mojo close journal for ${sessionId}`);
674
+ }
675
+ if (existing.phase === 'prepared') {
676
+ throw new Error(`cannot abort prepared Mojo close proof for ${sessionId}`);
677
+ }
678
+ if (existing.taskId && options.taskId && existing.taskId !== options.taskId) {
679
+ throw new Error(`Mojo close abort changed journal lineage for ${sessionId}`);
680
+ }
681
+ const retainedTaskId = options.taskId ?? existing.taskId;
682
+ if (retainedTaskId && session.riffParentTaskId
683
+ && session.riffParentTaskId !== retainedTaskId) {
684
+ throw new Error(`Mojo close abort lineage changed for ${sessionId}`);
685
+ }
686
+ if (retainedTaskId)
687
+ session.riffParentTaskId = retainedTaskId;
688
+ if (options.admissionRestored) {
689
+ session.mojoCloseJournal = undefined;
690
+ return;
691
+ }
692
+ session.mojoCloseJournal = {
693
+ phase: 'uncertain',
694
+ requestId,
695
+ ...(retainedTaskId ? { taskId: retainedTaskId } : {}),
696
+ recovery: 'uncertain',
697
+ admission: 'fenced',
698
+ updatedAt: new Date().toISOString(),
699
+ };
700
+ });
701
+ }
702
+ /**
703
+ * Persist a FAILED prepare that must NOT be rolled back, with its exact verdict.
704
+ *
705
+ * Such a prepare previously left the journal at `preparing` carrying the
706
+ * PRE-prepare task id: a restart could not tell "reconcile me" apart from "only
707
+ * the local commit is left", the lineage the worker actually reported was
708
+ * dropped, and nothing recorded that write admission was never re-opened.
709
+ *
710
+ * `irreversible` is stored as a commit-only `prepared` row on purpose - every
711
+ * existing recovery path (restore, retry, abort) then treats it as
712
+ * un-cancellable and finishes only the local close.
713
+ */
714
+ export function markMojoCloseUnresolved(sessionId, requestId, options) {
715
+ return mutateMojoCloseJournal(sessionId, (session) => {
716
+ const existing = session.mojoCloseJournal;
717
+ if (existing && existing.requestId !== requestId) {
718
+ throw new Error(`stale Mojo close verdict for ${sessionId}`);
719
+ }
720
+ if (existing?.commitOnly && options.recovery !== 'irreversible') {
721
+ // Never downgrade a recorded irreversible teardown into something a later
722
+ // caller may cancel or abort again.
723
+ throw new Error(`cannot downgrade commit-only Mojo close journal for ${sessionId}`);
724
+ }
725
+ if (existing?.taskId && options.taskId && existing.taskId !== options.taskId) {
726
+ throw new Error(`Mojo close verdict changed journal lineage for ${sessionId}`);
727
+ }
728
+ const exactTaskId = options.taskId ?? existing?.taskId;
729
+ if (exactTaskId && session.riffParentTaskId
730
+ && session.riffParentTaskId !== exactTaskId) {
731
+ throw new Error(`Mojo close verdict lineage changed for ${sessionId}`);
732
+ }
733
+ // The worker may have learned the lineage only DURING the prepare (the
734
+ // pre-init window), so persist that exact id: a retry or a manual
735
+ // reconciliation must address the real remote session, not the stale guess.
736
+ if (exactTaskId)
737
+ session.riffParentTaskId = exactTaskId;
738
+ const irreversible = options.recovery === 'irreversible';
739
+ // A still-retryable close keeps its `preparing` intent: a retry SHOULD re-run
740
+ // the cancel. Promoting it to `uncertain` would demand manual reconciliation
741
+ // for a failure the retry can clear on its own -- while `admission: 'fenced'`
742
+ // independently keeps writes out.
743
+ const phase = irreversible
744
+ ? 'prepared'
745
+ : options.recovery === 'retryable' ? 'preparing' : 'uncertain';
746
+ session.mojoCloseJournal = {
747
+ phase,
748
+ requestId,
749
+ ...(exactTaskId ? { taskId: exactTaskId } : {}),
750
+ recovery: options.recovery,
751
+ admission: options.admission,
752
+ ...(irreversible ? { commitOnly: true } : {}),
753
+ updatedAt: new Date().toISOString(),
754
+ };
755
+ });
756
+ }
460
757
  export function closeSession(sessionId, opts = {}) {
461
- load();
758
+ loadForWrite();
462
759
  const session = sessions.get(sessionId);
463
760
  if (session) {
464
761
  const priorStatus = session.status;
@@ -466,10 +763,42 @@ export function closeSession(sessionId, opts = {}) {
466
763
  const priorRiffParentTaskId = session.riffParentTaskId;
467
764
  const priorDashboardAttachments = session.dashboardAttachments;
468
765
  const priorQueuedAttachments = session.queuedAttachments;
766
+ const priorPreviewTarget = session.previewTarget;
767
+ const priorQuarantinedLineage = session.mojoQuarantinedLineage;
768
+ const priorQuarantineNoticePending = session.mojoQuarantineNoticePending;
769
+ const priorLocalResidual = session.mojoLocalResidual;
770
+ const priorMojoCloseJournal = session.mojoCloseJournal
771
+ ? { ...session.mojoCloseJournal }
772
+ : undefined;
469
773
  session.status = 'closed';
470
774
  session.closedAt = new Date().toISOString();
471
775
  session.dashboardAttachments = undefined;
472
776
  session.queuedAttachments = undefined;
777
+ // `previewTarget` is a live loopback (host, port) the session's agent
778
+ // registered with `botmux preview <port>` for its CURRENT worker
779
+ // generation — routing state, not a durable property of the conversation.
780
+ // A closed session owns no port any more, and the OS is free to hand that
781
+ // number to an unrelated local server; the preview proxy dials a target by
782
+ // host/port alone, so a retained value would let a later reader (resume,
783
+ // an offline row copy, a dashboard snapshot) proxy the user into someone
784
+ // else's service. Drop it in the same atomic save as status='closed'.
785
+ // Cleanup only: registration and proxying are untouched, and a resumed
786
+ // session simply re-runs `botmux preview <port>`.
787
+ session.previewTarget = undefined;
788
+ session.mojoCloseJournal = undefined;
789
+ // Survives close on purpose — the containment handle is still in the durable
790
+ // store, so the row must keep reporting the residual until the handle clears.
791
+ if (opts.parkLocalResidual)
792
+ session.mojoLocalResidual = opts.parkLocalResidual;
793
+ if (opts.parkMojoLineage) {
794
+ // Keep both ids when a different one was already parked: each is the only
795
+ // handle left for manual cleanup of its remote session.
796
+ const already = session.mojoQuarantinedLineage;
797
+ session.mojoQuarantinedLineage = already && already !== opts.parkMojoLineage
798
+ ? `${already},${opts.parkMojoLineage}`
799
+ : opts.parkMojoLineage;
800
+ session.mojoQuarantineNoticePending = true;
801
+ }
473
802
  // Riff cancellation has already completed before this durable transition.
474
803
  // Clear its retry handle in the same atomic save as status='closed'.
475
804
  if (opts.clearRiffParentTaskId)
@@ -483,6 +812,14 @@ export function closeSession(sessionId, opts = {}) {
483
812
  session.riffParentTaskId = priorRiffParentTaskId;
484
813
  session.dashboardAttachments = priorDashboardAttachments;
485
814
  session.queuedAttachments = priorQueuedAttachments;
815
+ session.previewTarget = priorPreviewTarget;
816
+ // Without these two the row keeps a parked lineage after a FAILED close, so
817
+ // the next turn treats a still-live remote session as quarantined and starts
818
+ // a new one — i.e. the "close failed, retry unchanged" guarantee is broken.
819
+ session.mojoQuarantinedLineage = priorQuarantinedLineage;
820
+ session.mojoQuarantineNoticePending = priorQuarantineNoticePending;
821
+ session.mojoLocalResidual = priorLocalResidual;
822
+ session.mojoCloseJournal = priorMojoCloseJournal;
486
823
  throw err;
487
824
  }
488
825
  if (session.larkAppId && priorDashboardAttachments?.length) {
@@ -512,9 +849,13 @@ export function closeSession(sessionId, opts = {}) {
512
849
  * since 2026-07, but older closed rows can still contain prepared input. A
513
850
  * generic resume is an explicit new lifecycle and must never revive that
514
851
  * abandoned FIFO.
852
+ *
853
+ * `previewTarget` is cleared here for the same reason: closeSession() now drops
854
+ * it, but rows closed by an older build still carry one on disk, and resume
855
+ * starts a new worker generation that has not registered any port.
515
856
  */
516
857
  export function reactivateClosedSession(sessionId) {
517
- load();
858
+ loadForWrite();
518
859
  const session = sessions.get(sessionId);
519
860
  if (!session)
520
861
  return { ok: false, error: 'not_found' };
@@ -539,6 +880,8 @@ export function reactivateClosedSession(sessionId) {
539
880
  queuedActivationTail: session.queuedActivationTail,
540
881
  queuedActivationTailNextOrder: session.queuedActivationTailNextOrder,
541
882
  pendingRepoSetup: session.pendingRepoSetup,
883
+ previewTarget: session.previewTarget,
884
+ mojoCloseJournal: session.mojoCloseJournal,
542
885
  };
543
886
  session.status = 'active';
544
887
  session.closedAt = undefined;
@@ -558,6 +901,8 @@ export function reactivateClosedSession(sessionId) {
558
901
  session.queuedActivationTail = undefined;
559
902
  session.queuedActivationTailNextOrder = undefined;
560
903
  session.pendingRepoSetup = undefined;
904
+ session.previewTarget = undefined;
905
+ session.mojoCloseJournal = undefined;
561
906
  try {
562
907
  save();
563
908
  }
@@ -568,7 +913,7 @@ export function reactivateClosedSession(sessionId) {
568
913
  return { ok: true, session };
569
914
  }
570
915
  export function updateSessionPid(sessionId, pid) {
571
- load();
916
+ loadForWrite();
572
917
  const session = sessions.get(sessionId);
573
918
  if (session) {
574
919
  session.pid = pid ?? undefined;
@@ -576,33 +921,33 @@ export function updateSessionPid(sessionId, pid) {
576
921
  }
577
922
  }
578
923
  export function updateSession(session) {
579
- load();
924
+ loadForWrite();
580
925
  sessions.set(session.sessionId, session);
581
926
  save();
582
927
  }
583
928
  /**
584
- * Persist one exact Riff follow-up lineage for an active durable owner.
929
+ * Persist one exact remote follow-up lineage for an active durable owner.
585
930
  * The process cache changes only after the atomic file replacement succeeds.
586
931
  */
587
- export function persistActiveRiffLineageExact(sessionId, taskId, options = {}) {
588
- load();
932
+ export function persistActiveRemoteLineageExact(sessionId, taskId, options = {}) {
933
+ loadForWrite();
589
934
  ensureDir();
590
935
  const fp = getFilePath();
591
936
  return withFileLockSync(fp, () => {
592
937
  const { raw, parsed } = readExistingSessionsFromDisk(fp);
593
938
  const durable = parsed[sessionId];
594
939
  if (!durable || durable.status !== 'active') {
595
- throw new RiffLineageOwnershipError(`cannot persist Riff lineage for non-active session ${sessionId}`);
940
+ throw new RemoteLineageOwnershipError(`cannot persist remote lineage for non-active session ${sessionId}`);
596
941
  }
597
942
  const durableTaskId = durable.riffParentTaskId ?? null;
598
943
  const expected = options.expectedCurrentTaskIds;
599
944
  if (expected && !expected.some(candidate => candidate === durableTaskId)) {
600
- throw new RiffLineageOwnershipError(`Riff lineage compare-and-set failed for ${sessionId} `
945
+ throw new RemoteLineageOwnershipError(`Remote lineage compare-and-set failed for ${sessionId} `
601
946
  + `(current=${durableTaskId ?? 'none'}, expected=${expected.map(id => id ?? 'none').join('|')})`);
602
947
  }
603
- if (options.expectedOwner && !riffOwnersEqual(riffDurableOwner(durable), options.expectedOwner)) {
604
- throw new RiffLineageOwnershipError(`Riff owner compare-and-set failed for ${sessionId} `
605
- + `(current=${JSON.stringify(riffDurableOwner(durable))}, `
948
+ if (options.expectedOwner && !remoteOwnersEqual(remoteDurableOwner(durable), options.expectedOwner)) {
949
+ throw new RemoteLineageOwnershipError(`Remote owner compare-and-set failed for ${sessionId} `
950
+ + `(current=${JSON.stringify(remoteDurableOwner(durable))}, `
606
951
  + `expected=${JSON.stringify(options.expectedOwner)})`);
607
952
  }
608
953
  const next = {
@@ -630,6 +975,19 @@ export function listSessions() {
630
975
  load();
631
976
  return [...sessions.values()];
632
977
  }
978
+ /**
979
+ * Return the current projection only when its backing file was loaded safely.
980
+ * Use this for decisions that delete, retire, or reconfigure resources: the
981
+ * legacy empty-on-error behaviour of listSessions() is unsafe at those gates.
982
+ * A failed load remains unhealthy until init() explicitly selects/reloads a
983
+ * store, avoiding a silent mid-transaction recovery against a different view.
984
+ */
985
+ export function listSessionsStrict() {
986
+ load();
987
+ if (loadFailure)
988
+ throw new SessionStoreUnavailableError(loadFailure);
989
+ return [...sessions.values()];
990
+ }
633
991
  /**
634
992
  * Cross-file lookup: find every active session attached to a thread, across
635
993
  * all bots. Used when a not-yet-initialized bot is mentioned in a thread that