botmux 3.10.0 → 3.11.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 (539) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/herdr-backend.d.ts +4 -3
  3. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/herdr-backend.js +11 -8
  5. package/dist/adapters/backend/herdr-backend.js.map +1 -1
  6. package/dist/adapters/backend/pty-backend.d.ts +1 -1
  7. package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/pty-backend.js +4 -1
  9. package/dist/adapters/backend/pty-backend.js.map +1 -1
  10. package/dist/adapters/backend/riff-backend.d.ts +29 -5
  11. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/riff-backend.js +302 -31
  13. package/dist/adapters/backend/riff-backend.js.map +1 -1
  14. package/dist/adapters/backend/sandbox.d.ts +6 -0
  15. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  16. package/dist/adapters/backend/sandbox.js +7 -0
  17. package/dist/adapters/backend/sandbox.js.map +1 -1
  18. package/dist/adapters/backend/tmux-backend.d.ts +1 -1
  19. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  20. package/dist/adapters/backend/tmux-backend.js +4 -1
  21. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  22. package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
  23. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  24. package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
  25. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  26. package/dist/adapters/backend/types.d.ts +37 -3
  27. package/dist/adapters/backend/types.d.ts.map +1 -1
  28. package/dist/adapters/backend/types.js.map +1 -1
  29. package/dist/adapters/backend/zellij-backend.d.ts +3 -3
  30. package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
  31. package/dist/adapters/backend/zellij-backend.js +9 -3
  32. package/dist/adapters/backend/zellij-backend.js.map +1 -1
  33. package/dist/adapters/backend/zellij-observe-backend.d.ts +3 -3
  34. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  35. package/dist/adapters/backend/zellij-observe-backend.js +12 -7
  36. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  37. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  38. package/dist/adapters/cli/codex-app.js +11 -2
  39. package/dist/adapters/cli/codex-app.js.map +1 -1
  40. package/dist/adapters/cli/read-isolation.d.ts +35 -2
  41. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  42. package/dist/adapters/cli/read-isolation.js +88 -7
  43. package/dist/adapters/cli/read-isolation.js.map +1 -1
  44. package/dist/adapters/cli/runner-input.d.ts +15 -14
  45. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  46. package/dist/adapters/cli/runner-input.js +64 -26
  47. package/dist/adapters/cli/runner-input.js.map +1 -1
  48. package/dist/adapters/cli/types.d.ts +20 -5
  49. package/dist/adapters/cli/types.d.ts.map +1 -1
  50. package/dist/bot-registry.d.ts +24 -0
  51. package/dist/bot-registry.d.ts.map +1 -1
  52. package/dist/bot-registry.js +110 -5
  53. package/dist/bot-registry.js.map +1 -1
  54. package/dist/cli/fleet-shutdown.d.ts +47 -0
  55. package/dist/cli/fleet-shutdown.d.ts.map +1 -0
  56. package/dist/cli/fleet-shutdown.js +387 -0
  57. package/dist/cli/fleet-shutdown.js.map +1 -0
  58. package/dist/cli/pm2-descriptor-guard.d.ts +19 -0
  59. package/dist/cli/pm2-descriptor-guard.d.ts.map +1 -0
  60. package/dist/cli/pm2-descriptor-guard.js +122 -0
  61. package/dist/cli/pm2-descriptor-guard.js.map +1 -0
  62. package/dist/cli/pm2-exact-start.d.ts +16 -0
  63. package/dist/cli/pm2-exact-start.d.ts.map +1 -0
  64. package/dist/cli/pm2-exact-start.js +63 -0
  65. package/dist/cli/pm2-exact-start.js.map +1 -0
  66. package/dist/cli/pm2-god-admission.d.ts +8 -0
  67. package/dist/cli/pm2-god-admission.d.ts.map +1 -0
  68. package/dist/cli/pm2-god-admission.js +25 -0
  69. package/dist/cli/pm2-god-admission.js.map +1 -0
  70. package/dist/cli/pm2-jlist.d.ts +13 -0
  71. package/dist/cli/pm2-jlist.d.ts.map +1 -0
  72. package/dist/cli/pm2-jlist.js +108 -0
  73. package/dist/cli/pm2-jlist.js.map +1 -0
  74. package/dist/cli/pm2-preflight.d.ts +10 -0
  75. package/dist/cli/pm2-preflight.d.ts.map +1 -0
  76. package/dist/cli/pm2-preflight.js +23 -0
  77. package/dist/cli/pm2-preflight.js.map +1 -0
  78. package/dist/cli/pm2-shutdown-capability.d.ts +27 -0
  79. package/dist/cli/pm2-shutdown-capability.d.ts.map +1 -0
  80. package/dist/cli/pm2-shutdown-capability.js +161 -0
  81. package/dist/cli/pm2-shutdown-capability.js.map +1 -0
  82. package/dist/cli/pm2-start-transaction.d.ts +55 -0
  83. package/dist/cli/pm2-start-transaction.d.ts.map +1 -0
  84. package/dist/cli/pm2-start-transaction.js +220 -0
  85. package/dist/cli/pm2-start-transaction.js.map +1 -0
  86. package/dist/cli/send-dispatch.d.ts +12 -0
  87. package/dist/cli/send-dispatch.d.ts.map +1 -1
  88. package/dist/cli/send-dispatch.js +31 -4
  89. package/dist/cli/send-dispatch.js.map +1 -1
  90. package/dist/cli/session-list-liveness.d.ts +1 -0
  91. package/dist/cli/session-list-liveness.d.ts.map +1 -1
  92. package/dist/cli/session-list-liveness.js +6 -0
  93. package/dist/cli/session-list-liveness.js.map +1 -1
  94. package/dist/cli/session-picker-layout.d.ts +26 -0
  95. package/dist/cli/session-picker-layout.d.ts.map +1 -0
  96. package/dist/cli/session-picker-layout.js +123 -0
  97. package/dist/cli/session-picker-layout.js.map +1 -0
  98. package/dist/cli/session-picker-viewport.d.ts +49 -0
  99. package/dist/cli/session-picker-viewport.d.ts.map +1 -0
  100. package/dist/cli/session-picker-viewport.js +46 -0
  101. package/dist/cli/session-picker-viewport.js.map +1 -0
  102. package/dist/cli/supervisor-shutdown-client.d.ts +31 -0
  103. package/dist/cli/supervisor-shutdown-client.d.ts.map +1 -0
  104. package/dist/cli/supervisor-shutdown-client.js +146 -0
  105. package/dist/cli/supervisor-shutdown-client.js.map +1 -0
  106. package/dist/cli/terminal-width.d.ts +48 -0
  107. package/dist/cli/terminal-width.d.ts.map +1 -0
  108. package/dist/cli/terminal-width.js +119 -0
  109. package/dist/cli/terminal-width.js.map +1 -0
  110. package/dist/cli/vc-agent.d.ts.map +1 -1
  111. package/dist/cli/vc-agent.js +1 -1
  112. package/dist/cli/vc-agent.js.map +1 -1
  113. package/dist/cli.d.ts.map +1 -1
  114. package/dist/cli.js +2269 -716
  115. package/dist/cli.js.map +1 -1
  116. package/dist/codex-app-runner.js +1630 -125
  117. package/dist/codex-app-runner.js.map +1 -1
  118. package/dist/core/ask-api.d.ts +8 -1
  119. package/dist/core/ask-api.d.ts.map +1 -1
  120. package/dist/core/ask-api.js +18 -0
  121. package/dist/core/ask-api.js.map +1 -1
  122. package/dist/core/ask-broker.d.ts +20 -0
  123. package/dist/core/ask-broker.d.ts.map +1 -1
  124. package/dist/core/ask-broker.js +467 -47
  125. package/dist/core/ask-broker.js.map +1 -1
  126. package/dist/core/ask-persist-store.d.ts +126 -0
  127. package/dist/core/ask-persist-store.d.ts.map +1 -0
  128. package/dist/core/ask-persist-store.js +188 -0
  129. package/dist/core/ask-persist-store.js.map +1 -0
  130. package/dist/core/ask-types.d.ts +80 -0
  131. package/dist/core/ask-types.d.ts.map +1 -1
  132. package/dist/core/ask-types.js +62 -0
  133. package/dist/core/ask-types.js.map +1 -1
  134. package/dist/core/cli-session-id-publisher.d.ts +20 -0
  135. package/dist/core/cli-session-id-publisher.d.ts.map +1 -0
  136. package/dist/core/cli-session-id-publisher.js +21 -0
  137. package/dist/core/cli-session-id-publisher.js.map +1 -0
  138. package/dist/core/command-handler.d.ts.map +1 -1
  139. package/dist/core/command-handler.js +427 -255
  140. package/dist/core/command-handler.js.map +1 -1
  141. package/dist/core/cost-calculator.d.ts +13 -0
  142. package/dist/core/cost-calculator.d.ts.map +1 -1
  143. package/dist/core/cost-calculator.js +385 -26
  144. package/dist/core/cost-calculator.js.map +1 -1
  145. package/dist/core/dashboard-ipc-server.d.ts +9 -0
  146. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  147. package/dist/core/dashboard-ipc-server.js +842 -288
  148. package/dist/core/dashboard-ipc-server.js.map +1 -1
  149. package/dist/core/explicit-session-backing-cleanup.d.ts +49 -0
  150. package/dist/core/explicit-session-backing-cleanup.d.ts.map +1 -0
  151. package/dist/core/explicit-session-backing-cleanup.js +76 -0
  152. package/dist/core/explicit-session-backing-cleanup.js.map +1 -0
  153. package/dist/core/idle-worker-sweeper.d.ts +20 -0
  154. package/dist/core/idle-worker-sweeper.d.ts.map +1 -1
  155. package/dist/core/idle-worker-sweeper.js +18 -0
  156. package/dist/core/idle-worker-sweeper.js.map +1 -1
  157. package/dist/core/inflight-input-tracker.d.ts +10 -0
  158. package/dist/core/inflight-input-tracker.d.ts.map +1 -1
  159. package/dist/core/inflight-input-tracker.js +7 -0
  160. package/dist/core/inflight-input-tracker.js.map +1 -1
  161. package/dist/core/managed-origin-attestation.d.ts +51 -0
  162. package/dist/core/managed-origin-attestation.d.ts.map +1 -0
  163. package/dist/core/managed-origin-attestation.js +208 -0
  164. package/dist/core/managed-origin-attestation.js.map +1 -0
  165. package/dist/core/managed-origin-capability.d.ts +62 -3
  166. package/dist/core/managed-origin-capability.d.ts.map +1 -1
  167. package/dist/core/managed-origin-capability.js +419 -9
  168. package/dist/core/managed-origin-capability.js.map +1 -1
  169. package/dist/core/pending-repo-journal.d.ts +6 -0
  170. package/dist/core/pending-repo-journal.d.ts.map +1 -0
  171. package/dist/core/pending-repo-journal.js +85 -0
  172. package/dist/core/pending-repo-journal.js.map +1 -0
  173. package/dist/core/persistent-backend.d.ts +6 -1
  174. package/dist/core/persistent-backend.d.ts.map +1 -1
  175. package/dist/core/persistent-backend.js +12 -6
  176. package/dist/core/persistent-backend.js.map +1 -1
  177. package/dist/core/process-start-identity.d.ts +3 -0
  178. package/dist/core/process-start-identity.d.ts.map +1 -0
  179. package/dist/core/process-start-identity.js +62 -0
  180. package/dist/core/process-start-identity.js.map +1 -0
  181. package/dist/core/raw-command-writer.d.ts +34 -0
  182. package/dist/core/raw-command-writer.d.ts.map +1 -0
  183. package/dist/core/raw-command-writer.js +48 -0
  184. package/dist/core/raw-command-writer.js.map +1 -0
  185. package/dist/core/reply-target.d.ts +85 -22
  186. package/dist/core/reply-target.d.ts.map +1 -1
  187. package/dist/core/reply-target.js +267 -32
  188. package/dist/core/reply-target.js.map +1 -1
  189. package/dist/core/resource-monitor/runtime.d.ts.map +1 -1
  190. package/dist/core/resource-monitor/runtime.js +4 -1
  191. package/dist/core/resource-monitor/runtime.js.map +1 -1
  192. package/dist/core/restart-report.d.ts +6 -1
  193. package/dist/core/restart-report.d.ts.map +1 -1
  194. package/dist/core/restart-report.js +22 -4
  195. package/dist/core/restart-report.js.map +1 -1
  196. package/dist/core/riff-shutdown-detach.d.ts +164 -0
  197. package/dist/core/riff-shutdown-detach.d.ts.map +1 -0
  198. package/dist/core/riff-shutdown-detach.js +787 -0
  199. package/dist/core/riff-shutdown-detach.js.map +1 -0
  200. package/dist/core/riff-worker-shutdown-readiness.d.ts +17 -0
  201. package/dist/core/riff-worker-shutdown-readiness.d.ts.map +1 -0
  202. package/dist/core/riff-worker-shutdown-readiness.js +21 -0
  203. package/dist/core/riff-worker-shutdown-readiness.js.map +1 -0
  204. package/dist/core/session-manager.d.ts +6 -6
  205. package/dist/core/session-manager.d.ts.map +1 -1
  206. package/dist/core/session-manager.js +1227 -594
  207. package/dist/core/session-manager.js.map +1 -1
  208. package/dist/core/session-marker.d.ts +1 -1
  209. package/dist/core/session-marker.d.ts.map +1 -1
  210. package/dist/core/session-marker.js +2 -2
  211. package/dist/core/session-marker.js.map +1 -1
  212. package/dist/core/session-mutation-guard.d.ts +17 -0
  213. package/dist/core/session-mutation-guard.d.ts.map +1 -0
  214. package/dist/core/session-mutation-guard.js +33 -0
  215. package/dist/core/session-mutation-guard.js.map +1 -0
  216. package/dist/core/shutdown-budgets.d.ts +27 -0
  217. package/dist/core/shutdown-budgets.d.ts.map +1 -0
  218. package/dist/core/shutdown-budgets.js +47 -0
  219. package/dist/core/shutdown-budgets.js.map +1 -0
  220. package/dist/core/supervisor-shutdown-ipc.d.ts +10 -0
  221. package/dist/core/supervisor-shutdown-ipc.d.ts.map +1 -0
  222. package/dist/core/supervisor-shutdown-ipc.js +10 -0
  223. package/dist/core/supervisor-shutdown-ipc.js.map +1 -0
  224. package/dist/core/supervisor-shutdown-protocol.d.ts +16 -0
  225. package/dist/core/supervisor-shutdown-protocol.d.ts.map +1 -0
  226. package/dist/core/supervisor-shutdown-protocol.js +16 -0
  227. package/dist/core/supervisor-shutdown-protocol.js.map +1 -0
  228. package/dist/core/trigger-final-suppression.d.ts +4 -0
  229. package/dist/core/trigger-final-suppression.d.ts.map +1 -1
  230. package/dist/core/trigger-final-suppression.js +6 -11
  231. package/dist/core/trigger-final-suppression.js.map +1 -1
  232. package/dist/core/trigger-session.d.ts +70 -0
  233. package/dist/core/trigger-session.d.ts.map +1 -1
  234. package/dist/core/trigger-session.js +923 -145
  235. package/dist/core/trigger-session.js.map +1 -1
  236. package/dist/core/types.d.ts +94 -1
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +9 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/worker-pool.d.ts +194 -13
  241. package/dist/core/worker-pool.d.ts.map +1 -1
  242. package/dist/core/worker-pool.js +2597 -547
  243. package/dist/core/worker-pool.js.map +1 -1
  244. package/dist/daemon.d.ts +76 -2
  245. package/dist/daemon.d.ts.map +1 -1
  246. package/dist/daemon.js +2255 -773
  247. package/dist/daemon.js.map +1 -1
  248. package/dist/dashboard/bot-payload.d.ts +20 -0
  249. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  250. package/dist/dashboard/bot-payload.js +24 -0
  251. package/dist/dashboard/bot-payload.js.map +1 -1
  252. package/dist/dashboard/feed-groups.d.ts +17 -0
  253. package/dist/dashboard/feed-groups.d.ts.map +1 -0
  254. package/dist/dashboard/feed-groups.js +75 -0
  255. package/dist/dashboard/feed-groups.js.map +1 -0
  256. package/dist/dashboard/session-card-model.d.ts +1 -1
  257. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  258. package/dist/dashboard/session-card-model.js +8 -5
  259. package/dist/dashboard/session-card-model.js.map +1 -1
  260. package/dist/dashboard/web/bot-defaults-page.d.ts +4 -0
  261. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  262. package/dist/dashboard/web/bot-defaults-page.js +139 -46
  263. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  264. package/dist/dashboard/web/bot-defaults.d.ts +4 -0
  265. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  266. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  267. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  268. package/dist/dashboard/web/connectors-page.js +40 -3
  269. package/dist/dashboard/web/connectors-page.js.map +1 -1
  270. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  271. package/dist/dashboard/web/groups-page.js +95 -2
  272. package/dist/dashboard/web/groups-page.js.map +1 -1
  273. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  274. package/dist/dashboard/web/i18n.js +86 -40
  275. package/dist/dashboard/web/i18n.js.map +1 -1
  276. package/dist/dashboard/web/kanban-model.js +1 -1
  277. package/dist/dashboard/web/kanban-model.js.map +1 -1
  278. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  279. package/dist/dashboard/web/overview-page.js +3 -2
  280. package/dist/dashboard/web/overview-page.js.map +1 -1
  281. package/dist/dashboard/web/overview.d.ts +3 -0
  282. package/dist/dashboard/web/overview.d.ts.map +1 -1
  283. package/dist/dashboard/web/overview.js +2 -0
  284. package/dist/dashboard/web/overview.js.map +1 -1
  285. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  286. package/dist/dashboard/web/sessions-kanban.js +2 -0
  287. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  288. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  289. package/dist/dashboard/web/sessions-page.js +103 -2
  290. package/dist/dashboard/web/sessions-page.js.map +1 -1
  291. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  292. package/dist/dashboard/web/sessions.js +3 -2
  293. package/dist/dashboard/web/sessions.js.map +1 -1
  294. package/dist/dashboard/web/ui.d.ts +8 -0
  295. package/dist/dashboard/web/ui.d.ts.map +1 -1
  296. package/dist/dashboard/web/ui.js +15 -0
  297. package/dist/dashboard/web/ui.js.map +1 -1
  298. package/dist/dashboard-web/app.js +1 -1
  299. package/dist/dashboard-web/chunks/bot-defaults-page-GED4FEMS.js +10 -0
  300. package/dist/dashboard-web/chunks/chunk-6J5LS5AU.js +51 -0
  301. package/dist/dashboard-web/chunks/{chunk-ZU3UUKAR.js → chunk-HK7NIBJG.js} +1 -1
  302. package/dist/dashboard-web/chunks/{chunk-3UE7S77S.js → chunk-KRHWZEXU.js} +1 -1
  303. package/dist/dashboard-web/chunks/chunk-VBXJOJFH.js +1 -0
  304. package/dist/dashboard-web/chunks/connectors-page-EELM66G3.js +1 -0
  305. package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +8 -0
  306. package/dist/dashboard-web/chunks/{insights-page-T2ZX2RWL.js → insights-page-54UBPPOC.js} +1 -1
  307. package/dist/dashboard-web/chunks/{monitor-room-YNVBAGR6.js → monitor-room-PORHVKRH.js} +1 -1
  308. package/dist/dashboard-web/chunks/{monitoring-page-LHM55YWN.js → monitoring-page-XGA7AXNL.js} +1 -1
  309. package/dist/dashboard-web/chunks/{office-page-ATXVP7PW.js → office-page-AO3AFG45.js} +1 -1
  310. package/dist/dashboard-web/chunks/overview-page-F5BUTYR6.js +1 -0
  311. package/dist/dashboard-web/chunks/{roles-page-56VWM6CD.js → roles-page-M5GIASJU.js} +1 -1
  312. package/dist/dashboard-web/chunks/{schedules-page-S5K6U4EO.js → schedules-page-O232WQRR.js} +1 -1
  313. package/dist/dashboard-web/chunks/sessions-page-YFRPSTIL.js +6 -0
  314. package/dist/dashboard-web/chunks/{settings-page-QUZDQARR.js → settings-page-OJAZLZQT.js} +1 -1
  315. package/dist/dashboard-web/chunks/{skills-page-IFY7AEND.js → skills-page-EFZQPWV4.js} +1 -1
  316. package/dist/dashboard-web/chunks/{team-federation-page-C7FJQPFZ.js → team-federation-page-ZJVAP7HW.js} +1 -1
  317. package/dist/dashboard-web/chunks/{v3-page-2LMF3WWR.js → v3-page-GYWTRGO2.js} +1 -1
  318. package/dist/dashboard-web/chunks/{whiteboards-page-3XC6QRMY.js → whiteboards-page-MSDAG6P7.js} +1 -1
  319. package/dist/dashboard-web/style.css +255 -0
  320. package/dist/dashboard.js +172 -7
  321. package/dist/dashboard.js.map +1 -1
  322. package/dist/desktop/renderer/app.js +21 -0
  323. package/dist/desktop/renderer/app.js.map +1 -1
  324. package/dist/i18n/en.d.ts.map +1 -1
  325. package/dist/i18n/en.js +35 -9
  326. package/dist/i18n/en.js.map +1 -1
  327. package/dist/i18n/zh.d.ts.map +1 -1
  328. package/dist/i18n/zh.js +35 -9
  329. package/dist/i18n/zh.js.map +1 -1
  330. package/dist/im/lark/ask-card.d.ts +23 -0
  331. package/dist/im/lark/ask-card.d.ts.map +1 -1
  332. package/dist/im/lark/ask-card.js +94 -4
  333. package/dist/im/lark/ask-card.js.map +1 -1
  334. package/dist/im/lark/card-builder.d.ts +6 -1
  335. package/dist/im/lark/card-builder.d.ts.map +1 -1
  336. package/dist/im/lark/card-builder.js +112 -15
  337. package/dist/im/lark/card-builder.js.map +1 -1
  338. package/dist/im/lark/card-handler.d.ts +1 -1
  339. package/dist/im/lark/card-handler.d.ts.map +1 -1
  340. package/dist/im/lark/card-handler.js +496 -310
  341. package/dist/im/lark/card-handler.js.map +1 -1
  342. package/dist/im/lark/client.d.ts +7 -0
  343. package/dist/im/lark/client.d.ts.map +1 -1
  344. package/dist/im/lark/client.js +39 -26
  345. package/dist/im/lark/client.js.map +1 -1
  346. package/dist/im/lark/doc-comment.d.ts +7 -4
  347. package/dist/im/lark/doc-comment.d.ts.map +1 -1
  348. package/dist/im/lark/doc-comment.js +19 -6
  349. package/dist/im/lark/doc-comment.js.map +1 -1
  350. package/dist/im/lark/event-dispatcher.d.ts +16 -0
  351. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  352. package/dist/im/lark/event-dispatcher.js +88 -23
  353. package/dist/im/lark/event-dispatcher.js.map +1 -1
  354. package/dist/im/lark/forward-followup-content.d.ts.map +1 -1
  355. package/dist/im/lark/forward-followup-content.js +9 -1
  356. package/dist/im/lark/forward-followup-content.js.map +1 -1
  357. package/dist/im/lark/grant-command.d.ts.map +1 -1
  358. package/dist/im/lark/grant-command.js +7 -4
  359. package/dist/im/lark/grant-command.js.map +1 -1
  360. package/dist/im/lark/md-card.d.ts +11 -0
  361. package/dist/im/lark/md-card.d.ts.map +1 -1
  362. package/dist/im/lark/md-card.js +46 -0
  363. package/dist/im/lark/md-card.js.map +1 -1
  364. package/dist/im/lark/message-parser.d.ts +23 -2
  365. package/dist/im/lark/message-parser.d.ts.map +1 -1
  366. package/dist/im/lark/message-parser.js +58 -3
  367. package/dist/im/lark/message-parser.js.map +1 -1
  368. package/dist/im/lark/overview-card.d.ts.map +1 -1
  369. package/dist/im/lark/overview-card.js +2 -1
  370. package/dist/im/lark/overview-card.js.map +1 -1
  371. package/dist/services/async-trigger-state.d.ts +6 -1
  372. package/dist/services/async-trigger-state.d.ts.map +1 -1
  373. package/dist/services/async-trigger-state.js +21 -0
  374. package/dist/services/async-trigger-state.js.map +1 -1
  375. package/dist/services/async-trigger-store.d.ts +23 -1
  376. package/dist/services/async-trigger-store.d.ts.map +1 -1
  377. package/dist/services/async-trigger-store.js +96 -13
  378. package/dist/services/async-trigger-store.js.map +1 -1
  379. package/dist/services/bridge-fallback-gate.d.ts +40 -0
  380. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  381. package/dist/services/bridge-fallback-gate.js +124 -24
  382. package/dist/services/bridge-fallback-gate.js.map +1 -1
  383. package/dist/services/codex-app-runner-protocol.d.ts +8 -0
  384. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
  385. package/dist/services/codex-app-runner-protocol.js +9 -2
  386. package/dist/services/codex-app-runner-protocol.js.map +1 -1
  387. package/dist/services/codex-bridge-queue.d.ts +1 -0
  388. package/dist/services/codex-bridge-queue.d.ts.map +1 -1
  389. package/dist/services/codex-bridge-queue.js +1 -0
  390. package/dist/services/codex-bridge-queue.js.map +1 -1
  391. package/dist/services/codex-service-tier.d.ts +2 -0
  392. package/dist/services/codex-service-tier.d.ts.map +1 -1
  393. package/dist/services/codex-service-tier.js +1 -0
  394. package/dist/services/codex-service-tier.js.map +1 -1
  395. package/dist/services/codex-transcript.d.ts +27 -0
  396. package/dist/services/codex-transcript.d.ts.map +1 -1
  397. package/dist/services/codex-transcript.js +340 -2
  398. package/dist/services/codex-transcript.js.map +1 -1
  399. package/dist/services/grant-policy.d.ts +3 -0
  400. package/dist/services/grant-policy.d.ts.map +1 -1
  401. package/dist/services/grant-policy.js +5 -0
  402. package/dist/services/grant-policy.js.map +1 -1
  403. package/dist/services/grant-prefs-store.d.ts +6 -3
  404. package/dist/services/grant-prefs-store.d.ts.map +1 -1
  405. package/dist/services/grant-prefs-store.js +42 -12
  406. package/dist/services/grant-prefs-store.js.map +1 -1
  407. package/dist/services/hook-runner.d.ts +20 -1
  408. package/dist/services/hook-runner.d.ts.map +1 -1
  409. package/dist/services/hook-runner.js +17 -13
  410. package/dist/services/hook-runner.js.map +1 -1
  411. package/dist/services/idempotency-store.d.ts +134 -0
  412. package/dist/services/idempotency-store.d.ts.map +1 -0
  413. package/dist/services/idempotency-store.js +299 -0
  414. package/dist/services/idempotency-store.js.map +1 -0
  415. package/dist/services/jsonl-cursor.d.ts +7 -3
  416. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  417. package/dist/services/jsonl-cursor.js +55 -31
  418. package/dist/services/jsonl-cursor.js.map +1 -1
  419. package/dist/services/open-platform-rename.d.ts.map +1 -1
  420. package/dist/services/open-platform-rename.js +1 -108
  421. package/dist/services/open-platform-rename.js.map +1 -1
  422. package/dist/services/restart-intent-store.d.ts +22 -2
  423. package/dist/services/restart-intent-store.d.ts.map +1 -1
  424. package/dist/services/restart-intent-store.js +160 -18
  425. package/dist/services/restart-intent-store.js.map +1 -1
  426. package/dist/services/sandbox-store.d.ts +22 -0
  427. package/dist/services/sandbox-store.d.ts.map +1 -1
  428. package/dist/services/sandbox-store.js +37 -8
  429. package/dist/services/sandbox-store.js.map +1 -1
  430. package/dist/services/send-policy.d.ts +41 -33
  431. package/dist/services/send-policy.d.ts.map +1 -1
  432. package/dist/services/send-policy.js +39 -40
  433. package/dist/services/send-policy.js.map +1 -1
  434. package/dist/services/session-store.d.ts +66 -0
  435. package/dist/services/session-store.d.ts.map +1 -1
  436. package/dist/services/session-store.js +403 -67
  437. package/dist/services/session-store.js.map +1 -1
  438. package/dist/services/submit-notification.d.ts +3 -0
  439. package/dist/services/submit-notification.d.ts.map +1 -0
  440. package/dist/services/submit-notification.js +15 -0
  441. package/dist/services/submit-notification.js.map +1 -0
  442. package/dist/services/traex-transcript.d.ts +25 -2
  443. package/dist/services/traex-transcript.d.ts.map +1 -1
  444. package/dist/services/traex-transcript.js +133 -1
  445. package/dist/services/traex-transcript.js.map +1 -1
  446. package/dist/services/trigger-types.d.ts +13 -1
  447. package/dist/services/trigger-types.d.ts.map +1 -1
  448. package/dist/services/trigger-types.js +39 -0
  449. package/dist/services/trigger-types.js.map +1 -1
  450. package/dist/services/voice/index.d.ts +3 -2
  451. package/dist/services/voice/index.d.ts.map +1 -1
  452. package/dist/services/voice/index.js +5 -5
  453. package/dist/services/voice/index.js.map +1 -1
  454. package/dist/services/voice/openai.d.ts +2 -1
  455. package/dist/services/voice/openai.d.ts.map +1 -1
  456. package/dist/services/voice/openai.js +2 -1
  457. package/dist/services/voice/openai.js.map +1 -1
  458. package/dist/services/voice/sami.d.ts +5 -2
  459. package/dist/services/voice/sami.d.ts.map +1 -1
  460. package/dist/services/voice/sami.js +19 -4
  461. package/dist/services/voice/sami.js.map +1 -1
  462. package/dist/setup/bots-store.d.ts.map +1 -1
  463. package/dist/setup/bots-store.js +10 -4
  464. package/dist/setup/bots-store.js.map +1 -1
  465. package/dist/setup/lark-scopes.json +2 -0
  466. package/dist/setup/open-platform-automation.d.ts +9 -1
  467. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  468. package/dist/setup/open-platform-automation.js +44 -15
  469. package/dist/setup/open-platform-automation.js.map +1 -1
  470. package/dist/setup/open-platform-visibility.d.ts +42 -0
  471. package/dist/setup/open-platform-visibility.d.ts.map +1 -0
  472. package/dist/setup/open-platform-visibility.js +133 -0
  473. package/dist/setup/open-platform-visibility.js.map +1 -0
  474. package/dist/setup/verify-permissions.d.ts.map +1 -1
  475. package/dist/setup/verify-permissions.js +6 -0
  476. package/dist/setup/verify-permissions.js.map +1 -1
  477. package/dist/skills/definitions.js +2 -2
  478. package/dist/types.d.ts +290 -13
  479. package/dist/types.d.ts.map +1 -1
  480. package/dist/utils/bot-routing.d.ts +1 -0
  481. package/dist/utils/bot-routing.d.ts.map +1 -1
  482. package/dist/utils/bot-routing.js +1 -1
  483. package/dist/utils/bot-routing.js.map +1 -1
  484. package/dist/utils/child-env.d.ts +1 -1
  485. package/dist/utils/child-env.d.ts.map +1 -1
  486. package/dist/utils/child-env.js +9 -0
  487. package/dist/utils/child-env.js.map +1 -1
  488. package/dist/utils/codex-app-control.d.ts +438 -0
  489. package/dist/utils/codex-app-control.d.ts.map +1 -0
  490. package/dist/utils/codex-app-control.js +2336 -0
  491. package/dist/utils/codex-app-control.js.map +1 -0
  492. package/dist/utils/codex-app-dispatch-ledger.d.ts +78 -0
  493. package/dist/utils/codex-app-dispatch-ledger.d.ts.map +1 -0
  494. package/dist/utils/codex-app-dispatch-ledger.js +149 -0
  495. package/dist/utils/codex-app-dispatch-ledger.js.map +1 -0
  496. package/dist/utils/codex-app-turn-dispatch.d.ts +77 -0
  497. package/dist/utils/codex-app-turn-dispatch.d.ts.map +1 -0
  498. package/dist/utils/codex-app-turn-dispatch.js +141 -0
  499. package/dist/utils/codex-app-turn-dispatch.js.map +1 -0
  500. package/dist/utils/codex-app-turn-liveness.d.ts +125 -0
  501. package/dist/utils/codex-app-turn-liveness.d.ts.map +1 -0
  502. package/dist/utils/codex-app-turn-liveness.js +301 -0
  503. package/dist/utils/codex-app-turn-liveness.js.map +1 -0
  504. package/dist/utils/idle-detector.d.ts +12 -0
  505. package/dist/utils/idle-detector.d.ts.map +1 -1
  506. package/dist/utils/idle-detector.js +19 -0
  507. package/dist/utils/idle-detector.js.map +1 -1
  508. package/dist/utils/input-gate.d.ts +87 -0
  509. package/dist/utils/input-gate.d.ts.map +1 -1
  510. package/dist/utils/input-gate.js +86 -0
  511. package/dist/utils/input-gate.js.map +1 -1
  512. package/dist/utils/lark-upload.d.ts.map +1 -1
  513. package/dist/utils/lark-upload.js +52 -1
  514. package/dist/utils/lark-upload.js.map +1 -1
  515. package/dist/utils/pending-input-queue.d.ts +15 -0
  516. package/dist/utils/pending-input-queue.d.ts.map +1 -1
  517. package/dist/utils/pending-input-queue.js +5 -1
  518. package/dist/utils/pending-input-queue.js.map +1 -1
  519. package/dist/utils/user-token.d.ts.map +1 -1
  520. package/dist/utils/user-token.js +53 -2
  521. package/dist/utils/user-token.js.map +1 -1
  522. package/dist/worker-ipc-preload.d.ts +12 -0
  523. package/dist/worker-ipc-preload.d.ts.map +1 -0
  524. package/dist/worker-ipc-preload.js +44 -0
  525. package/dist/worker-ipc-preload.js.map +1 -0
  526. package/dist/worker.js +2604 -325
  527. package/dist/worker.js.map +1 -1
  528. package/dist/workflows/v3/session-relay-client.d.ts +1 -0
  529. package/dist/workflows/v3/session-relay-client.d.ts.map +1 -1
  530. package/dist/workflows/v3/session-relay-client.js +12 -3
  531. package/dist/workflows/v3/session-relay-client.js.map +1 -1
  532. package/package.json +1 -1
  533. package/dist/dashboard-web/chunks/bot-defaults-page-LTVOUDIS.js +0 -10
  534. package/dist/dashboard-web/chunks/chunk-DCS35UMD.js +0 -1
  535. package/dist/dashboard-web/chunks/chunk-MFQPCVHY.js +0 -51
  536. package/dist/dashboard-web/chunks/connectors-page-5KWDIMKC.js +0 -1
  537. package/dist/dashboard-web/chunks/groups-page-FHOKYXMW.js +0 -8
  538. package/dist/dashboard-web/chunks/overview-page-QYI3KBDD.js +0 -1
  539. package/dist/dashboard-web/chunks/sessions-page-WBP4N7D2.js +0 -6
@@ -0,0 +1,49 @@
1
+ import type { BackendType } from '../adapters/backend/types.js';
2
+ import type { RiffBackendConfig } from '../adapters/backend/riff-backend.js';
3
+ import { cancelRiffTaskById } from '../adapters/backend/riff-backend.js';
4
+ import { killPersistentSession, probePersistentSession } from './persistent-backend.js';
5
+ export type ExplicitSessionBackingCleanupResult = {
6
+ ok: true;
7
+ kind: 'skipped_adopted' | 'no_backing';
8
+ } | {
9
+ ok: true;
10
+ kind: 'destroyed_persistent';
11
+ backendType: 'tmux' | 'herdr' | 'zellij' | 'zmx';
12
+ name: string;
13
+ } | {
14
+ ok: true;
15
+ kind: 'cancelled_riff';
16
+ taskId: string;
17
+ } | {
18
+ ok: false;
19
+ kind: 'persistent_destroy_failed' | 'riff_config_missing' | 'riff_cancel_failed';
20
+ backendType: BackendType;
21
+ taskId?: string;
22
+ error?: string;
23
+ };
24
+ export interface ExplicitSessionBackingCleanupInput {
25
+ sessionId: string;
26
+ backendType?: BackendType;
27
+ riffParentTaskId?: string;
28
+ /** Adopted panes/agents are user-owned. Explicit Botmux close only detaches
29
+ * its logical row and must never destroy the observed backing resource. */
30
+ adopted?: boolean;
31
+ /** Current authoritative config for the row's bot. Required only when the
32
+ * row is frozen to Riff and still carries a remote task id. */
33
+ riffConfig?: RiffBackendConfig;
34
+ }
35
+ export interface ExplicitSessionBackingCleanupDeps {
36
+ cancelRiffTask?: typeof cancelRiffTaskById;
37
+ killPersistent?: typeof killPersistentSession;
38
+ probePersistent?: typeof probePersistentSession;
39
+ }
40
+ /**
41
+ * Destroy the Botmux-owned backing resource before an offline/worker-less
42
+ * explicit close is published.
43
+ *
44
+ * This helper never mutates the session record. In particular, callers may
45
+ * erase `riffParentTaskId` only after `kind === 'cancelled_riff'`; a failed or
46
+ * unconfigurable cancellation therefore retains the durable retry handle.
47
+ */
48
+ export declare function cleanupExplicitSessionBacking(input: ExplicitSessionBackingCleanupInput, deps?: ExplicitSessionBackingCleanupDeps): Promise<ExplicitSessionBackingCleanupResult>;
49
+ //# sourceMappingURL=explicit-session-backing-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-session-backing-cleanup.d.ts","sourceRoot":"","sources":["../../src/core/explicit-session-backing-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAEL,qBAAqB,EAErB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,mCAAmC,GAC3C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,2BAA2B,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;IACjF,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,MAAM,WAAW,kCAAkC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;+EAC2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;mEAC+D;IAC/D,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,iCAAiC;IAChD,cAAc,CAAC,EAAE,OAAO,kBAAkB,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,qBAAqB,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,sBAAsB,CAAC;CACjD;AAED;;;;;;;GAOG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kCAAkC,EACzC,IAAI,GAAE,iCAAsC,GAC3C,OAAO,CAAC,mCAAmC,CAAC,CA6D9C"}
@@ -0,0 +1,76 @@
1
+ import { cancelRiffTaskById } from '../adapters/backend/riff-backend.js';
2
+ import { isSuspendableBackendType, killPersistentSession, persistentSessionName, probePersistentSession, } from './persistent-backend.js';
3
+ /**
4
+ * Destroy the Botmux-owned backing resource before an offline/worker-less
5
+ * explicit close is published.
6
+ *
7
+ * This helper never mutates the session record. In particular, callers may
8
+ * erase `riffParentTaskId` only after `kind === 'cancelled_riff'`; a failed or
9
+ * unconfigurable cancellation therefore retains the durable retry handle.
10
+ */
11
+ export async function cleanupExplicitSessionBacking(input, deps = {}) {
12
+ if (input.adopted)
13
+ return { ok: true, kind: 'skipped_adopted' };
14
+ if (input.backendType === 'riff') {
15
+ const taskId = input.riffParentTaskId;
16
+ if (!taskId)
17
+ return { ok: true, kind: 'no_backing' };
18
+ if (!input.riffConfig?.baseUrl) {
19
+ return { ok: false, kind: 'riff_config_missing', backendType: 'riff', taskId };
20
+ }
21
+ const cancel = deps.cancelRiffTask ?? cancelRiffTaskById;
22
+ try {
23
+ const cancelled = await cancel(input.riffConfig, taskId);
24
+ return cancelled
25
+ ? { ok: true, kind: 'cancelled_riff', taskId }
26
+ : { ok: false, kind: 'riff_cancel_failed', backendType: 'riff', taskId };
27
+ }
28
+ catch (err) {
29
+ return {
30
+ ok: false,
31
+ kind: 'riff_cancel_failed',
32
+ backendType: 'riff',
33
+ taskId,
34
+ error: err instanceof Error ? err.message : String(err),
35
+ };
36
+ }
37
+ }
38
+ if (!isSuspendableBackendType(input.backendType)) {
39
+ // Explicit pty and legacy unstamped rows have no deterministic persistent
40
+ // backing session to destroy. Never guess that an unstamped row was tmux.
41
+ return { ok: true, kind: 'no_backing' };
42
+ }
43
+ const name = persistentSessionName(input.backendType, input.sessionId);
44
+ const kill = deps.killPersistent ?? killPersistentSession;
45
+ const probe = deps.probePersistent ?? probePersistentSession;
46
+ try {
47
+ // ZMX destruction is identity-verified and refuses a name-only kill. Keep
48
+ // the established two-argument contract for the other backends.
49
+ if (input.backendType === 'zmx')
50
+ kill(input.backendType, name, input.sessionId);
51
+ else
52
+ kill(input.backendType, name);
53
+ // Backend kill helpers are intentionally idempotent and historically
54
+ // swallow command errors. Offline explicit abandon needs a stronger
55
+ // contract: only publish closed after a post-kill probe confirms absence.
56
+ const after = probe(input.backendType, name);
57
+ if (after !== 'missing') {
58
+ return {
59
+ ok: false,
60
+ kind: 'persistent_destroy_failed',
61
+ backendType: input.backendType,
62
+ error: after === 'exists' ? 'backing_session_still_exists' : 'backing_session_state_unknown',
63
+ };
64
+ }
65
+ return { ok: true, kind: 'destroyed_persistent', backendType: input.backendType, name };
66
+ }
67
+ catch (err) {
68
+ return {
69
+ ok: false,
70
+ kind: 'persistent_destroy_failed',
71
+ backendType: input.backendType,
72
+ error: err instanceof Error ? err.message : String(err),
73
+ };
74
+ }
75
+ }
76
+ //# sourceMappingURL=explicit-session-backing-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-session-backing-cleanup.js","sourceRoot":"","sources":["../../src/core/explicit-session-backing-cleanup.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import type { DaemonSession } from './types.js';
8
8
  * ('botDefaults.maxLiveWorkers*' i18n) — keep them in sync.
9
9
  */
10
10
  export declare const DEFAULT_MAX_LIVE_WORKERS = 30;
11
+ export declare const IDLE_WORKER_SWEEP_MUTATION_ACQUIRE_TIMEOUT_MS = 1000;
11
12
  export interface IdleWorkerSweepOptions {
12
13
  /**
13
14
  * Explicit per-bot cap for THIS bot (one daemon = one bot, so the whole
@@ -16,6 +17,11 @@ export interface IdleWorkerSweepOptions {
16
17
  * never suspend).
17
18
  */
18
19
  maxLiveWorkers?: number;
20
+ /**
21
+ * Bound how long a detached sweep may wait for already-admitted turns.
22
+ * A wedged admission must not hold the bot-wide mutation gate forever.
23
+ */
24
+ mutationAcquireTimeoutMs?: number;
19
25
  }
20
26
  export interface IdleWorkerSweepResult {
21
27
  sessionId: string;
@@ -36,4 +42,18 @@ export interface IdleWorkerSweepResult {
36
42
  * session is busy, none are suspended this round and the next sweep retries.
37
43
  */
38
44
  export declare function sweepIdleWorkers(activeSessions: Map<string, DaemonSession>, opts?: IdleWorkerSweepOptions): IdleWorkerSweepResult[];
45
+ /**
46
+ * Run a cap sweep only after every already-admitted inbound turn has either
47
+ * durably accepted its input or finished. A worker spawn can put the bot over
48
+ * cap while another handler is paused in sender/reaction setup, before that
49
+ * handler has changed its screen status or dispatch ledger. A synchronous
50
+ * sweep could otherwise mistake that handler's worker for idle, suspend it,
51
+ * and make the subsequent send fail before acceptance.
52
+ *
53
+ * Spawn/idle callbacks commonly run inside an admission, so the mutation gate
54
+ * upgrades the current lease when possible. Otherwise acquisition is bounded:
55
+ * a wedged admission skips this sweep instead of freezing every later turn for
56
+ * the bot. The next idle/spawn callback retries.
57
+ */
58
+ export declare function sweepIdleWorkersAfterTurnDrain(larkAppId: string, activeSessions: Map<string, DaemonSession>, opts?: IdleWorkerSweepOptions): Promise<IdleWorkerSweepResult[]>;
39
59
  //# sourceMappingURL=idle-worker-sweeper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"idle-worker-sweeper.d.ts","sourceRoot":"","sources":["../../src/core/idle-worker-sweeper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,IAAI,GAAE,sBAA2B,GAChC,qBAAqB,EAAE,CA+BzB"}
1
+ {"version":3,"file":"idle-worker-sweeper.d.ts","sourceRoot":"","sources":["../../src/core/idle-worker-sweeper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,6CAA6C,OAAQ,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,IAAI,GAAE,sBAA2B,GAChC,qBAAqB,EAAE,CA+BzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAMlC"}
@@ -1,5 +1,6 @@
1
1
  import { suspendWorker } from './worker-pool.js';
2
2
  import { isSuspendableBackendType } from './persistent-backend.js';
3
+ import { tryWithBotTurnMutation } from './bot-turn-mutation-gate.js';
3
4
  /**
4
5
  * Default per-bot live-session cap applied when a bot has no explicit
5
6
  * `maxLiveWorkers` configured. Keeps memory bounded out of the box: beyond this
@@ -9,6 +10,7 @@ import { isSuspendableBackendType } from './persistent-backend.js';
9
10
  * ('botDefaults.maxLiveWorkers*' i18n) — keep them in sync.
10
11
  */
11
12
  export const DEFAULT_MAX_LIVE_WORKERS = 30;
13
+ export const IDLE_WORKER_SWEEP_MUTATION_ACQUIRE_TIMEOUT_MS = 1_000;
12
14
  function liveWorkers(activeSessions) {
13
15
  return [...activeSessions.values()].filter(ds => !!ds.worker && !ds.worker.killed);
14
16
  }
@@ -60,4 +62,20 @@ export function sweepIdleWorkers(activeSessions, opts = {}) {
60
62
  }
61
63
  return suspended;
62
64
  }
65
+ /**
66
+ * Run a cap sweep only after every already-admitted inbound turn has either
67
+ * durably accepted its input or finished. A worker spawn can put the bot over
68
+ * cap while another handler is paused in sender/reaction setup, before that
69
+ * handler has changed its screen status or dispatch ledger. A synchronous
70
+ * sweep could otherwise mistake that handler's worker for idle, suspend it,
71
+ * and make the subsequent send fail before acceptance.
72
+ *
73
+ * Spawn/idle callbacks commonly run inside an admission, so the mutation gate
74
+ * upgrades the current lease when possible. Otherwise acquisition is bounded:
75
+ * a wedged admission skips this sweep instead of freezing every later turn for
76
+ * the bot. The next idle/spawn callback retries.
77
+ */
78
+ export function sweepIdleWorkersAfterTurnDrain(larkAppId, activeSessions, opts = {}) {
79
+ return tryWithBotTurnMutation(larkAppId, opts.mutationAcquireTimeoutMs ?? IDLE_WORKER_SWEEP_MUTATION_ACQUIRE_TIMEOUT_MS, () => sweepIdleWorkers(activeSessions, opts)).then(result => result.acquired ? result.value : []);
80
+ }
63
81
  //# sourceMappingURL=idle-worker-sweeper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"idle-worker-sweeper.js","sourceRoot":"","sources":["../../src/core/idle-worker-sweeper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAiB3C,SAAS,WAAW,CAAC,cAA0C;IAC7D,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAA0C,EAC1C,OAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAC;IAC5D,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC,CAAE,uCAAuC;IACjE,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,OAAO;QACxB,+DAA+D;QAC/D,8EAA8E;QAC9E,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,4EAA4E;QAC5E,sDAAsD;SACrD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;SACxD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnE,qEAAqE;QACrE,sEAAsE;SACrE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,KAAK,MAAM,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,SAAS,IAAI,GAAG;YAAE,MAAM;QAC5B,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC;YAAE,SAAS;QACpD,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC/E,SAAS,EAAE,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"idle-worker-sweeper.js","sourceRoot":"","sources":["../../src/core/idle-worker-sweeper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,MAAM,CAAC,MAAM,6CAA6C,GAAG,KAAK,CAAC;AAsBnE,SAAS,WAAW,CAAC,cAA0C;IAC7D,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAA0C,EAC1C,OAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAC;IAC5D,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC,CAAE,uCAAuC;IACjE,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,OAAO;QACxB,+DAA+D;QAC/D,8EAA8E;QAC9E,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,4EAA4E;QAC5E,sDAAsD;SACrD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;SACxD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnE,qEAAqE;QACrE,sEAAsE;SACrE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,KAAK,MAAM,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,SAAS,IAAI,GAAG;YAAE,MAAM;QAC5B,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC;YAAE,SAAS;QACpD,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC/E,SAAS,EAAE,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,8BAA8B,CAC5C,SAAiB,EACjB,cAA0C,EAC1C,OAA+B,EAAE;IAEjC,OAAO,sBAAsB,CAC3B,SAAS,EACT,IAAI,CAAC,wBAAwB,IAAI,6CAA6C,EAC9E,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAC7C,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxD,CAAC"}
@@ -24,15 +24,25 @@ export type InflightItem = {
24
24
  content: string;
25
25
  logicalContent?: string;
26
26
  turnId?: string;
27
+ replyTurnId?: string;
27
28
  dispatchAttempt?: number;
29
+ codexAppDispatchId?: string;
30
+ queuedActivationToken?: string;
28
31
  vcMeetingImTurnOrigin?: VcMeetingImTurnOrigin;
29
32
  codexAppInput?: CodexAppTurnInput;
33
+ /** At-most-once turn (idempotency lease): must NEVER be carried over to a
34
+ * respawned CLI (codex #776 round-7 finding #1). See PendingCliInput.noReplay. */
35
+ noReplay?: boolean;
30
36
  };
31
37
  export declare class InflightInputTracker {
32
38
  private unacked;
33
39
  private carryOver;
34
40
  /** An input just went onto the CLI's PTY. */
35
41
  onWrite(item: InflightItem): void;
42
+ /** Remove one exact item after a definitive local write failure before the
43
+ * caller re-queues it. Covers both the live in-flight set and a synchronous
44
+ * backend-exit handoff that may already have moved it to carryOver. */
45
+ forget(item: InflightItem): void;
36
46
  /** Retire one exact write whose transport outcome is ambiguous and must not
37
47
  * be replayed automatically. Other type-ahead items remain tracked. */
38
48
  retire(item: InflightItem): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-input-tracker.d.ts","sourceRoot":"","sources":["../../src/core/inflight-input-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,CAAC;AAEF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAAsB;IAEvC,6CAA6C;IAC7C,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIjC;2EACuE;IACvE,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAOnC;;2DAEuD;IACvD,cAAc,IAAI,IAAI;IAItB;;;iDAG6C;IAC7C,SAAS,CAAC,WAAW,GAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAoB,GAAG,MAAM;IAO5E;;;gCAG4B;IAC5B,aAAa,IAAI,YAAY,EAAE;CAIhC"}
1
+ {"version":3,"file":"inflight-input-tracker.d.ts","sourceRoot":"","sources":["../../src/core/inflight-input-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC;uFACmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAAsB;IAEvC,6CAA6C;IAC7C,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIjC;;2EAEuE;IACvE,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKhC;2EACuE;IACvE,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAOnC;;2DAEuD;IACvD,cAAc,IAAI,IAAI;IAItB;;;iDAG6C;IAC7C,SAAS,CAAC,WAAW,GAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAoB,GAAG,MAAM;IAO5E;;;gCAG4B;IAC5B,aAAa,IAAI,YAAY,EAAE;CAIhC"}
@@ -26,6 +26,13 @@ export class InflightInputTracker {
26
26
  onWrite(item) {
27
27
  this.unacked.push(item);
28
28
  }
29
+ /** Remove one exact item after a definitive local write failure before the
30
+ * caller re-queues it. Covers both the live in-flight set and a synchronous
31
+ * backend-exit handoff that may already have moved it to carryOver. */
32
+ forget(item) {
33
+ this.unacked = this.unacked.filter(candidate => candidate !== item);
34
+ this.carryOver = this.carryOver.filter(candidate => candidate !== item);
35
+ }
29
36
  /** Retire one exact write whose transport outcome is ambiguous and must not
30
37
  * be replayed automatically. Other type-ahead items remain tracked. */
31
38
  retire(item) {
@@ -1 +1 @@
1
- {"version":3,"file":"inflight-input-tracker.js","sourceRoot":"","sources":["../../src/core/inflight-input-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,MAAM,OAAO,oBAAoB;IACvB,OAAO,GAAmB,EAAE,CAAC;IAC7B,SAAS,GAAmB,EAAE,CAAC;IAEvC,6CAA6C;IAC7C,OAAO,CAAC,IAAkB;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;2EACuE;IACvE,MAAM,CAAC,IAAkB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;2DAEuD;IACvD,cAAc;QACZ,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;iDAG6C;IAC7C,SAAS,CAAC,cAA+C,GAAG,EAAE,CAAC,IAAI;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;;gCAG4B;IAC5B,aAAa;QACX,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"inflight-input-tracker.js","sourceRoot":"","sources":["../../src/core/inflight-input-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAmBH,MAAM,OAAO,oBAAoB;IACvB,OAAO,GAAmB,EAAE,CAAC;IAC7B,SAAS,GAAmB,EAAE,CAAC;IAEvC,6CAA6C;IAC7C,OAAO,CAAC,IAAkB;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;2EAEuE;IACvE,MAAM,CAAC,IAAkB;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;2EACuE;IACvE,MAAM,CAAC,IAAkB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;2DAEuD;IACvD,cAAc;QACZ,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;iDAG6C;IAC7C,SAAS,CAAC,cAA+C,GAAG,EAAE,CAAC,IAAI;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED;;;gCAG4B;IAC5B,aAAa;QACX,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ export declare const MANAGED_ORIGIN_ATTEST_ROUTE = "/api/session-origin/attest";
2
+ export declare const MANAGED_ORIGIN_PROOF_DOMAIN = "botmux.managed-origin-attestation.v1";
3
+ export declare const MANAGED_ORIGIN_PROOF_TTL_MS = 5000;
4
+ export interface ManagedOriginAttestationContext {
5
+ sessionId: string;
6
+ channelId: string;
7
+ capability: string;
8
+ dataDir: string;
9
+ /** Routing hints only; the daemon derives identity from its live registry. */
10
+ larkAppId?: string;
11
+ ipcPortFallback?: number;
12
+ }
13
+ export interface ManagedOriginAttestation {
14
+ sessionId: string;
15
+ turnId: string;
16
+ dispatchAttempt?: number;
17
+ requiresCodexAppLedger: boolean;
18
+ }
19
+ export interface ManagedOriginAttestationProof extends ManagedOriginAttestation {
20
+ domain: typeof MANAGED_ORIGIN_PROOF_DOMAIN;
21
+ version: 1;
22
+ nonce: string;
23
+ channelId: string;
24
+ issuedAtMs: number;
25
+ }
26
+ export declare class ManagedOriginAttestationError extends Error {
27
+ constructor(message: string, options?: ErrorOptions);
28
+ }
29
+ /** Daemon-side proof creation. The nonce is strict and the destination is
30
+ * derived only from the authenticated session + daemon data root. O_EXCL and
31
+ * O_NOFOLLOW make a pre-existing leaf fail closed rather than follow it. */
32
+ export declare function writeManagedOriginAttestationProof(input: {
33
+ dataDir: string;
34
+ proof: ManagedOriginAttestationProof;
35
+ }): string;
36
+ /**
37
+ * Exchange a rotating capability for a host-file proof of the daemon's exact
38
+ * live tuple. HTTP is transport only: a stale child can bind a released port
39
+ * and forge a response, but Seatbelt prevents it from creating the random
40
+ * nonce proof in the host-owned read-only directory.
41
+ */
42
+ export declare function attestManagedOrigin(input: {
43
+ context: ManagedOriginAttestationContext;
44
+ resolveIpcPort?: (larkAppId: string | undefined) => number | undefined;
45
+ fetchImpl?: typeof fetch;
46
+ timeoutMs?: number;
47
+ nonce?: string;
48
+ now?: () => number;
49
+ wait?: (delayMs: number) => Promise<void>;
50
+ }): Promise<ManagedOriginAttestation>;
51
+ //# sourceMappingURL=managed-origin-attestation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-origin-attestation.d.ts","sourceRoot":"","sources":["../../src/core/managed-origin-attestation.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,2BAA2B,+BAA+B,CAAC;AACxE,eAAO,MAAM,2BAA2B,yCAAyC,CAAC;AAClF,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAGjD,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC7E,MAAM,EAAE,OAAO,2BAA2B,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED;;4EAE4E;AAC5E,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,6BAA6B,CAAC;CACtC,GAAG,MAAM,CAkDT;AAqED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,+BAA+B,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA4EpC"}
@@ -0,0 +1,208 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { closeSync, constants as fsConstants, fstatSync, openSync, readSync, unlinkSync, writeSync, } from 'node:fs';
3
+ import { ensureManagedOriginAttestationDirectory, managedOriginAttestationProofPath, } from './managed-origin-capability.js';
4
+ export const MANAGED_ORIGIN_ATTEST_ROUTE = '/api/session-origin/attest';
5
+ export const MANAGED_ORIGIN_PROOF_DOMAIN = 'botmux.managed-origin-attestation.v1';
6
+ export const MANAGED_ORIGIN_PROOF_TTL_MS = 5_000;
7
+ const MAX_PROOF_BYTES = 8 * 1024;
8
+ export class ManagedOriginAttestationError extends Error {
9
+ constructor(message, options) {
10
+ super(message, options);
11
+ this.name = 'ManagedOriginAttestationError';
12
+ }
13
+ }
14
+ /** Daemon-side proof creation. The nonce is strict and the destination is
15
+ * derived only from the authenticated session + daemon data root. O_EXCL and
16
+ * O_NOFOLLOW make a pre-existing leaf fail closed rather than follow it. */
17
+ export function writeManagedOriginAttestationProof(input) {
18
+ const dir = ensureManagedOriginAttestationDirectory(input.dataDir, input.proof.sessionId, input.proof.channelId);
19
+ const path = managedOriginAttestationProofPath(input.dataDir, input.proof.sessionId, input.proof.channelId, input.proof.nonce);
20
+ let fd;
21
+ let created = false;
22
+ try {
23
+ fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL
24
+ | (fsConstants.O_NOFOLLOW ?? 0), 0o600);
25
+ created = true;
26
+ const stat = fstatSync(fd);
27
+ const expectedUid = process.getuid?.();
28
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1
29
+ || (stat.mode & 0o777) !== 0o600
30
+ || (expectedUid !== undefined && stat.uid !== expectedUid)) {
31
+ throw new Error(`unsafe managed origin proof file under ${dir}`);
32
+ }
33
+ const body = Buffer.from(JSON.stringify(input.proof), 'utf8');
34
+ if (body.length === 0 || body.length > MAX_PROOF_BYTES) {
35
+ throw new Error('managed origin proof exceeds size limit');
36
+ }
37
+ let offset = 0;
38
+ while (offset < body.length) {
39
+ const written = writeSync(fd, body, offset, body.length - offset, null);
40
+ if (written <= 0)
41
+ throw new Error('managed origin proof write made no progress');
42
+ offset += written;
43
+ }
44
+ return path;
45
+ }
46
+ catch (err) {
47
+ if (created) {
48
+ try {
49
+ unlinkSync(path);
50
+ }
51
+ catch { /* best effort */ }
52
+ }
53
+ throw err;
54
+ }
55
+ finally {
56
+ if (fd !== undefined) {
57
+ try {
58
+ closeSync(fd);
59
+ }
60
+ catch { /* best effort */ }
61
+ }
62
+ }
63
+ }
64
+ function readManagedOriginAttestationProof(path) {
65
+ let fd;
66
+ try {
67
+ fd = openSync(path, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0) | fsConstants.O_NONBLOCK);
68
+ const stat = fstatSync(fd);
69
+ const expectedUid = process.getuid?.();
70
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1
71
+ || (stat.mode & 0o777) !== 0o600
72
+ || (expectedUid !== undefined && stat.uid !== expectedUid)
73
+ || stat.size <= 0 || stat.size > MAX_PROOF_BYTES) {
74
+ return undefined;
75
+ }
76
+ const body = Buffer.alloc(stat.size);
77
+ let offset = 0;
78
+ while (offset < body.length) {
79
+ const read = readSync(fd, body, offset, body.length - offset, null);
80
+ if (read <= 0)
81
+ return undefined;
82
+ offset += read;
83
+ }
84
+ return JSON.parse(body.toString('utf8'));
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ finally {
90
+ if (fd !== undefined) {
91
+ try {
92
+ closeSync(fd);
93
+ }
94
+ catch { /* best effort */ }
95
+ }
96
+ }
97
+ }
98
+ function validateProof(input) {
99
+ if (!input.value || typeof input.value !== 'object' || Array.isArray(input.value))
100
+ return undefined;
101
+ const proof = input.value;
102
+ if (proof.domain !== MANAGED_ORIGIN_PROOF_DOMAIN || proof.version !== 1
103
+ || proof.nonce !== input.nonce
104
+ || proof.sessionId !== input.context.sessionId
105
+ || proof.channelId !== input.context.channelId
106
+ || typeof proof.turnId !== 'string' || proof.turnId.length === 0 || proof.turnId.length > 256
107
+ || typeof proof.issuedAtMs !== 'number' || !Number.isFinite(proof.issuedAtMs)
108
+ || proof.issuedAtMs > input.nowMs + 1_000
109
+ || input.nowMs - proof.issuedAtMs > MANAGED_ORIGIN_PROOF_TTL_MS
110
+ || typeof proof.requiresCodexAppLedger !== 'boolean') {
111
+ return undefined;
112
+ }
113
+ const dispatchAttempt = proof.dispatchAttempt === undefined
114
+ ? undefined
115
+ : typeof proof.dispatchAttempt === 'number'
116
+ && Number.isSafeInteger(proof.dispatchAttempt)
117
+ && proof.dispatchAttempt > 0
118
+ ? proof.dispatchAttempt
119
+ : null;
120
+ if (dispatchAttempt === null)
121
+ return undefined;
122
+ return {
123
+ sessionId: input.context.sessionId,
124
+ turnId: proof.turnId,
125
+ ...(dispatchAttempt !== undefined ? { dispatchAttempt } : {}),
126
+ requiresCodexAppLedger: proof.requiresCodexAppLedger,
127
+ };
128
+ }
129
+ /**
130
+ * Exchange a rotating capability for a host-file proof of the daemon's exact
131
+ * live tuple. HTTP is transport only: a stale child can bind a released port
132
+ * and forge a response, but Seatbelt prevents it from creating the random
133
+ * nonce proof in the host-owned read-only directory.
134
+ */
135
+ export async function attestManagedOrigin(input) {
136
+ const discovered = input.resolveIpcPort?.(input.context.larkAppId);
137
+ // The capability leaf is host-written and read-only in Seatbelt. Daemon
138
+ // discovery descriptors remain ordinary filesystem data that the confined
139
+ // child may poison, so they are only a compatibility fallback when an older
140
+ // capability lacks the owning port.
141
+ const port = input.context.ipcPortFallback ?? discovered;
142
+ if (!Number.isSafeInteger(port) || !port || port <= 0) {
143
+ throw new ManagedOriginAttestationError('找不到目标 daemon 端口;无法验证当前 worker 的 managed origin');
144
+ }
145
+ const nonce = input.nonce ?? randomBytes(32).toString('hex');
146
+ if (!/^[a-f0-9]{64}$/.test(nonce)) {
147
+ throw new ManagedOriginAttestationError('managed origin challenge nonce 无效');
148
+ }
149
+ const proofPath = managedOriginAttestationProofPath(input.context.dataDir, input.context.sessionId, input.context.channelId, nonce);
150
+ const timeoutMs = input.timeoutMs ?? 3_000;
151
+ const now = input.now ?? Date.now;
152
+ const wait = input.wait ?? (delayMs => new Promise(resolve => setTimeout(resolve, delayMs)));
153
+ const deadline = now() + timeoutMs;
154
+ const controller = new AbortController();
155
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
156
+ timer.unref?.();
157
+ let response;
158
+ try {
159
+ response = await (input.fetchImpl ?? fetch)(`http://127.0.0.1:${port}${MANAGED_ORIGIN_ATTEST_ROUTE}`, {
160
+ method: 'POST',
161
+ headers: { 'content-type': 'application/json' },
162
+ body: JSON.stringify({
163
+ sessionId: input.context.sessionId,
164
+ channelId: input.context.channelId,
165
+ originCapability: input.context.capability,
166
+ nonce,
167
+ }),
168
+ signal: controller.signal,
169
+ });
170
+ }
171
+ catch (err) {
172
+ throw new ManagedOriginAttestationError(controller.signal.aborted
173
+ ? 'daemon managed-origin 验证超时'
174
+ : `无法连接 owning daemon 验证 managed origin: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
175
+ }
176
+ finally {
177
+ clearTimeout(timer);
178
+ }
179
+ if (!response.ok) {
180
+ try {
181
+ await response.body?.cancel();
182
+ }
183
+ catch { /* transport body is untrusted */ }
184
+ throw new ManagedOriginAttestationError(`daemon 拒绝 managed origin: HTTP ${response.status}`);
185
+ }
186
+ // Ignore the response body completely. Only a valid protected proof is
187
+ // authority, and a fake loopback listener cannot write one.
188
+ try {
189
+ await response.body?.cancel();
190
+ }
191
+ catch { /* authority never comes from HTTP */ }
192
+ for (;;) {
193
+ const nowMs = now();
194
+ const proof = validateProof({
195
+ value: readManagedOriginAttestationProof(proofPath),
196
+ context: input.context,
197
+ nonce,
198
+ nowMs,
199
+ });
200
+ if (proof)
201
+ return proof;
202
+ if (nowMs >= deadline) {
203
+ throw new ManagedOriginAttestationError('daemon 未生成有效的 managed-origin host proof');
204
+ }
205
+ await wait(Math.min(20, Math.max(1, deadline - nowMs)));
206
+ }
207
+ }
208
+ //# sourceMappingURL=managed-origin-attestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-origin-attestation.js","sourceRoot":"","sources":["../../src/core/managed-origin-attestation.ts"],"names":[],"mappings":"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"}