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,141 @@
1
+ /**
2
+ * Worker-owned attribution for Codex App's serial runner queue.
3
+ *
4
+ * The runner can echo a stable clientUserMessageId, but it must never choose
5
+ * the daemon delivery attempt. A worker may also finish writing turn N+1
6
+ * before turn N's final transaction arrives, so the mutable "current turn"
7
+ * globals are not an attribution boundary. Reserve one immutable entry per
8
+ * control-line write and settle final transactions strictly from the head.
9
+ */
10
+ export class CodexAppTurnDispatchQueue {
11
+ queue = [];
12
+ nextHandle = 1;
13
+ reserve(turnId, dispatchAttempt, dispatchId, recovered = false, replyTurnId, codexAppSteerable) {
14
+ if (!turnId)
15
+ throw new Error('Codex App dispatch turn id must be non-empty');
16
+ const reservation = {
17
+ handle: this.nextHandle++,
18
+ ...(dispatchId ? { dispatchId } : {}),
19
+ turnId,
20
+ ...(replyTurnId ? { replyTurnId } : {}),
21
+ ...(dispatchAttempt !== undefined ? { dispatchAttempt } : {}),
22
+ ...(recovered ? { recovered: true } : {}),
23
+ ...(codexAppSteerable ? { codexAppSteerable: true } : {}),
24
+ };
25
+ this.queue.push(reservation);
26
+ return { ...reservation };
27
+ }
28
+ /**
29
+ * A replacement worker cannot recover the old in-memory queue. It may
30
+ * recover exactly the daemon-frozen active identity supplied in `init`, and
31
+ * only while no locally submitted entry exists. A runner marker still has
32
+ * to assert equality before this entry can settle.
33
+ */
34
+ recoverWarmReattach(turnId, dispatchAttempt, dispatchId, replyTurnId) {
35
+ if (!turnId || this.queue.length > 0)
36
+ return undefined;
37
+ return this.reserve(turnId, dispatchAttempt, dispatchId, true, replyTurnId);
38
+ }
39
+ restore(entries) {
40
+ if (this.queue.length > 0)
41
+ throw new Error('Codex App dispatch queue is already populated');
42
+ for (const entry of entries) {
43
+ this.reserve(entry.turnId, entry.dispatchAttempt, entry.dispatchId, true, entry.replyTurnId, entry.codexAppSteerable);
44
+ }
45
+ }
46
+ recoveredPrefix() {
47
+ const prefix = [];
48
+ for (const entry of this.queue) {
49
+ if (!entry.recovered)
50
+ break;
51
+ prefix.push({ ...entry });
52
+ }
53
+ return prefix;
54
+ }
55
+ /** Remove the exact write that threw or reported submitted=false. */
56
+ cancelExact(handle) {
57
+ const index = this.queue.findIndex(entry => entry.handle === handle);
58
+ if (index < 0)
59
+ return false;
60
+ this.queue.splice(index, 1);
61
+ return true;
62
+ }
63
+ markRecovered(handle) {
64
+ const entry = this.queue.find(candidate => candidate.handle === handle);
65
+ if (!entry)
66
+ return false;
67
+ entry.recovered = true;
68
+ return true;
69
+ }
70
+ findExact(turnId, dispatchAttempt) {
71
+ const entry = this.queue.find(candidate => candidate.turnId === turnId
72
+ && candidate.dispatchAttempt === dispatchAttempt);
73
+ return entry ? { ...entry } : undefined;
74
+ }
75
+ /**
76
+ * Validate and consume one complete final transaction. The head remains in
77
+ * place on every rejection, so a stale/mismatched marker cannot steal the
78
+ * next turn or advance the FIFO.
79
+ */
80
+ settleFinal(payload, consume = true) {
81
+ const head = this.queue[0];
82
+ if (!head)
83
+ return { ok: false, reason: 'no_pending_turn' };
84
+ const markerTurnId = typeof payload.turnId === 'string' && payload.turnId.length > 0
85
+ ? payload.turnId
86
+ : undefined;
87
+ if (markerTurnId && markerTurnId !== head.turnId) {
88
+ return {
89
+ ok: false,
90
+ reason: 'turn_mismatch',
91
+ markerTurnId,
92
+ expectedTurnId: head.turnId,
93
+ };
94
+ }
95
+ // Attempt identity is worker-owned. A runner may redundantly assert it,
96
+ // but an assertion of any other value (including a malformed one) is a
97
+ // rejection and can never select another queue entry.
98
+ if (payload.dispatchAttempt !== undefined
99
+ && payload.dispatchAttempt !== head.dispatchAttempt) {
100
+ return {
101
+ ok: false,
102
+ reason: 'dispatch_attempt_mismatch',
103
+ markerDispatchAttempt: payload.dispatchAttempt,
104
+ ...(head.dispatchAttempt !== undefined
105
+ ? { expectedDispatchAttempt: head.dispatchAttempt }
106
+ : {}),
107
+ };
108
+ }
109
+ const nativeTurnId = typeof payload.nativeTurnId === 'string' && payload.nativeTurnId.length > 0
110
+ ? payload.nativeTurnId
111
+ : undefined;
112
+ if (consume)
113
+ this.queue.shift();
114
+ return {
115
+ ok: true,
116
+ handle: head.handle,
117
+ ...(head.dispatchId ? { dispatchId: head.dispatchId } : {}),
118
+ turnId: head.turnId,
119
+ ...(head.replyTurnId ? { replyTurnId: head.replyTurnId } : {}),
120
+ ...(head.dispatchAttempt !== undefined
121
+ ? { dispatchAttempt: head.dispatchAttempt }
122
+ : {}),
123
+ ...(nativeTurnId ? { nativeTurnId } : {}),
124
+ ...(head.codexAppSteerable ? { codexAppSteerable: true } : {}),
125
+ remaining: this.queue.length - (consume ? 0 : 1),
126
+ };
127
+ }
128
+ commitExactHead(handle) {
129
+ if (this.queue[0]?.handle !== handle)
130
+ return false;
131
+ this.queue.shift();
132
+ return true;
133
+ }
134
+ size() {
135
+ return this.queue.length;
136
+ }
137
+ clear() {
138
+ this.queue.length = 0;
139
+ }
140
+ }
141
+ //# sourceMappingURL=codex-app-turn-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-turn-dispatch.js","sourceRoot":"","sources":["../../src/utils/codex-app-turn-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import type { BackendType } from '../adapters/backend/types.js';
2
+ /**
3
+ * Codex App turn liveness, driven by the app-server runner's explicit turn
4
+ * activity markers. This deliberately reports "no observable progress"
5
+ * rather than failure: a long-running tool may recover and emit activity
6
+ * later, at which point the stalled projection clears without replaying work.
7
+ */
8
+ export declare const CODEX_APP_NO_PROGRESS_TIMEOUT_MS = 90000;
9
+ /**
10
+ * Decide whether an existing persistent pane needs a synthetic observation.
11
+ * This deliberately does not depend on pipe mode: Zellij reattaches through
12
+ * its own PTY (`isPipeMode=false`) but preserves the same running CLI.
13
+ */
14
+ export declare function shouldBeginCodexAppReattachObservation(input: {
15
+ cliId?: string;
16
+ backendType: BackendType;
17
+ isReattach: boolean;
18
+ }): boolean;
19
+ export interface CodexAppLivenessPoll {
20
+ active: boolean;
21
+ stalled: boolean;
22
+ /** True only on the working -> stalled edge. */
23
+ newlyStalled: boolean;
24
+ /** True at most once for one submitted turn, even if it later recovers. */
25
+ shouldNotify: boolean;
26
+ turnId?: string;
27
+ }
28
+ export interface CodexAppActivityApplyResult {
29
+ accepted: boolean;
30
+ phase?: 'submitted' | 'progress' | 'completed';
31
+ /** A previously rejected inter-turn prompt became authoritative. */
32
+ shouldReplayPrompt?: boolean;
33
+ }
34
+ export interface CodexAppStateApplyResult {
35
+ accepted: boolean;
36
+ busy?: boolean;
37
+ tracksTurn?: boolean;
38
+ /** Signed idle arrived after the tracker's explicit queue drained. */
39
+ shouldPublishReady?: boolean;
40
+ atMs?: number;
41
+ }
42
+ /**
43
+ * Signed runner state is the Codex App ready authority. Terminal prompt bytes
44
+ * remain useful as a recovery hint, but PTY/tmux/Herdr/Zellij delivery can be
45
+ * delayed or lost and must never publish idle ahead of the signed final queue.
46
+ */
47
+ export declare class CodexAppReadyAuthority {
48
+ private signedIdle;
49
+ private latePromptRecoveryArmed;
50
+ reset(): void;
51
+ beginWork(): void;
52
+ /** Returns true only for an authenticated runner's idle boundary. */
53
+ noteSignedState(busy: boolean): boolean;
54
+ canPublishPromptReady(): boolean;
55
+ /** Arm only after the worker cancels the exact local submit slot. */
56
+ armLatePromptRecovery(): void;
57
+ /**
58
+ * Consume one late terminal prompt after the cancelled slot left no tracked
59
+ * work. New work, authenticated activity/state, or reset clears the arm.
60
+ */
61
+ consumeLatePromptRecovery(trackerEmpty: boolean): boolean;
62
+ }
63
+ /** Apply a state payload from an already authenticated runner connection. */
64
+ export declare function applyTrustedCodexAppStateMarker(tracker: CodexAppTurnLiveness, authority: CodexAppReadyAuthority, payload: unknown, receivedAtMs?: number): CodexAppStateApplyResult;
65
+ export declare class CodexAppTurnLiveness {
66
+ private readonly timeoutMs;
67
+ private readonly turns;
68
+ private nextHandle;
69
+ private promptDeferred;
70
+ constructor(timeoutMs?: number);
71
+ /**
72
+ * Queue one Botmux input immediately before its control line is submitted.
73
+ * Codex App's runner is serial, so only the head turn owns activity/stall
74
+ * state; queued turns get a fresh clock when the head completes.
75
+ */
76
+ begin(turnId?: string, nowMs?: number): number;
77
+ /** Observe an authenticated runner whose in-memory turn state survived reattach. */
78
+ beginReattachObservation(nowMs?: number): number | undefined;
79
+ /** Drop only the synthetic reconnect slot when signed state identifies work
80
+ * as a native Goal continuation rather than a Botmux-owned turn. */
81
+ discardReattachObservation(): void;
82
+ /**
83
+ * Record runner/app-server activity. Activity after a stall makes the turn
84
+ * working again, but the same turn will not notify the user a second time.
85
+ */
86
+ noteActivity(nowMs?: number): void;
87
+ /**
88
+ * A signed submitted record can be the first event after worker reattach.
89
+ * Recover an explicit slot when no local flush state survived the restart.
90
+ */
91
+ noteSubmitted(nowMs?: number): void;
92
+ /** Complete only the runner's current turn and activate the next queued one. */
93
+ completeCurrent(nowMs?: number): boolean;
94
+ /** Remove the exact control-line submission that failed, preserving peers. */
95
+ cancelExact(handle: number, nowMs?: number): {
96
+ cancelled: boolean;
97
+ shouldReplayPrompt: boolean;
98
+ };
99
+ /** Backwards-compatible shorthand for callers that only need replay state. */
100
+ cancel(handle: number, nowMs?: number): boolean;
101
+ /**
102
+ * A prompt is authoritative only for the synthetic reattach observation.
103
+ * Returns whether no explicit/queued turn remains, so the worker can reject
104
+ * a transient inter-turn prompt instead of publishing prompt_ready / idle.
105
+ */
106
+ notePrompt(nowMs?: number): boolean;
107
+ hasActiveTurn(): boolean;
108
+ /** Drop every queued turn on CLI exit, kill, or worker reinitialization. */
109
+ clear(): void;
110
+ poll(nowMs?: number): CodexAppLivenessPoll;
111
+ private consumeDeferredPrompt;
112
+ }
113
+ /**
114
+ * One flush may cancel a queued liveness slot because writeInput throws or
115
+ * it returns submitted=false. Preserve the deferred real prompt across that
116
+ * async boundary, but replay it only after every peer slot has drained.
117
+ */
118
+ export declare class CodexAppFlushPromptReplay {
119
+ private replayRequested;
120
+ cancelSubmission(tracker: CodexAppTurnLiveness, authority: CodexAppReadyAuthority, handle: number | undefined, nowMs?: number): void;
121
+ consumeAfterFlush(tracker: CodexAppTurnLiveness): boolean;
122
+ }
123
+ /** Apply an activity payload whose signed socket connection was authenticated. */
124
+ export declare function applyTrustedCodexAppActivityMarker(tracker: CodexAppTurnLiveness, payload: unknown, receivedAtMs?: number): CodexAppActivityApplyResult;
125
+ //# sourceMappingURL=codex-app-turn-liveness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-turn-liveness.d.ts","sourceRoot":"","sources":["../../src/utils/codex-app-turn-liveness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Codex App turn liveness, driven by the app-server runner's explicit turn
3
+ * activity markers. This deliberately reports "no observable progress"
4
+ * rather than failure: a long-running tool may recover and emit activity
5
+ * later, at which point the stalled projection clears without replaying work.
6
+ */
7
+ export const CODEX_APP_NO_PROGRESS_TIMEOUT_MS = 90_000;
8
+ const PERSISTENT_BACKEND_TYPES = new Set(['tmux', 'herdr', 'zellij']);
9
+ /**
10
+ * Decide whether an existing persistent pane needs a synthetic observation.
11
+ * This deliberately does not depend on pipe mode: Zellij reattaches through
12
+ * its own PTY (`isPipeMode=false`) but preserves the same running CLI.
13
+ */
14
+ export function shouldBeginCodexAppReattachObservation(input) {
15
+ return input.cliId === 'codex-app'
16
+ && input.isReattach
17
+ && PERSISTENT_BACKEND_TYPES.has(input.backendType);
18
+ }
19
+ /**
20
+ * Signed runner state is the Codex App ready authority. Terminal prompt bytes
21
+ * remain useful as a recovery hint, but PTY/tmux/Herdr/Zellij delivery can be
22
+ * delayed or lost and must never publish idle ahead of the signed final queue.
23
+ */
24
+ export class CodexAppReadyAuthority {
25
+ signedIdle = false;
26
+ latePromptRecoveryArmed = false;
27
+ reset() {
28
+ this.signedIdle = false;
29
+ this.latePromptRecoveryArmed = false;
30
+ }
31
+ beginWork() {
32
+ this.signedIdle = false;
33
+ this.latePromptRecoveryArmed = false;
34
+ }
35
+ /** Returns true only for an authenticated runner's idle boundary. */
36
+ noteSignedState(busy) {
37
+ this.latePromptRecoveryArmed = false;
38
+ this.signedIdle = !busy;
39
+ return this.signedIdle;
40
+ }
41
+ canPublishPromptReady() {
42
+ return this.signedIdle;
43
+ }
44
+ /** Arm only after the worker cancels the exact local submit slot. */
45
+ armLatePromptRecovery() {
46
+ this.signedIdle = false;
47
+ this.latePromptRecoveryArmed = true;
48
+ }
49
+ /**
50
+ * Consume one late terminal prompt after the cancelled slot left no tracked
51
+ * work. New work, authenticated activity/state, or reset clears the arm.
52
+ */
53
+ consumeLatePromptRecovery(trackerEmpty) {
54
+ if (!trackerEmpty || !this.latePromptRecoveryArmed)
55
+ return false;
56
+ this.latePromptRecoveryArmed = false;
57
+ return true;
58
+ }
59
+ }
60
+ /** Apply a state payload from an already authenticated runner connection. */
61
+ export function applyTrustedCodexAppStateMarker(tracker, authority, payload, receivedAtMs = Date.now()) {
62
+ if (!payload || typeof payload !== 'object')
63
+ return { accepted: false };
64
+ const marker = payload;
65
+ if (typeof marker.busy !== 'boolean')
66
+ return { accepted: false };
67
+ const runnerAtMs = typeof marker.atMs === 'number' && Number.isFinite(marker.atMs)
68
+ ? Math.min(marker.atMs, receivedAtMs)
69
+ : receivedAtMs;
70
+ if (marker.busy) {
71
+ authority.noteSignedState(true);
72
+ // Goal auto-continuations are native work but do not own a Botmux dispatch
73
+ // slot. Tracking them as a synthetic user turn would leave an extra slot
74
+ // after a later Lark message steers the same native turn and completes.
75
+ const tracksTurn = marker.tracksTurn !== false;
76
+ if (tracksTurn)
77
+ tracker.noteSubmitted(runnerAtMs);
78
+ else
79
+ tracker.discardReattachObservation();
80
+ return { accepted: true, busy: true, tracksTurn, shouldPublishReady: false, atMs: runnerAtMs };
81
+ }
82
+ authority.noteSignedState(false);
83
+ return {
84
+ accepted: true,
85
+ busy: false,
86
+ shouldPublishReady: tracker.notePrompt(runnerAtMs),
87
+ atMs: runnerAtMs,
88
+ };
89
+ }
90
+ export class CodexAppTurnLiveness {
91
+ timeoutMs;
92
+ turns = [];
93
+ nextHandle = 1;
94
+ promptDeferred = false;
95
+ constructor(timeoutMs = CODEX_APP_NO_PROGRESS_TIMEOUT_MS) {
96
+ this.timeoutMs = timeoutMs;
97
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
98
+ throw new Error('Codex App liveness timeout must be a positive finite number');
99
+ }
100
+ }
101
+ /**
102
+ * Queue one Botmux input immediately before its control line is submitted.
103
+ * Codex App's runner is serial, so only the head turn owns activity/stall
104
+ * state; queued turns get a fresh clock when the head completes.
105
+ */
106
+ begin(turnId, nowMs = Date.now()) {
107
+ // A prompt deferred for an earlier queue has no authority over a new queue.
108
+ if (this.turns.length === 0)
109
+ this.promptDeferred = false;
110
+ const handle = this.nextHandle++;
111
+ this.turns.push({
112
+ handle,
113
+ turnId,
114
+ lastActivityAtMs: nowMs,
115
+ stalled: false,
116
+ notified: false,
117
+ reattachObservation: false,
118
+ });
119
+ return handle;
120
+ }
121
+ /** Observe an authenticated runner whose in-memory turn state survived reattach. */
122
+ beginReattachObservation(nowMs = Date.now()) {
123
+ if (this.turns.length > 0)
124
+ return undefined;
125
+ const handle = this.nextHandle++;
126
+ this.turns.push({
127
+ handle,
128
+ lastActivityAtMs: nowMs,
129
+ stalled: false,
130
+ notified: false,
131
+ reattachObservation: true,
132
+ });
133
+ return handle;
134
+ }
135
+ /** Drop only the synthetic reconnect slot when signed state identifies work
136
+ * as a native Goal continuation rather than a Botmux-owned turn. */
137
+ discardReattachObservation() {
138
+ if (!this.turns[0]?.reattachObservation)
139
+ return;
140
+ this.turns.shift();
141
+ this.promptDeferred = false;
142
+ }
143
+ /**
144
+ * Record runner/app-server activity. Activity after a stall makes the turn
145
+ * working again, but the same turn will not notify the user a second time.
146
+ */
147
+ noteActivity(nowMs = Date.now()) {
148
+ const active = this.turns[0];
149
+ if (!active)
150
+ return;
151
+ // Real work for the head turn supersedes a prompt rendered in the narrow
152
+ // inter-turn gap before its chunked control line finished arriving.
153
+ this.promptDeferred = false;
154
+ // Signed socket records can be buffered behind other process work. Never
155
+ // let an older runner timestamp move the worker's clock backwards.
156
+ active.lastActivityAtMs = Math.max(active.lastActivityAtMs, nowMs);
157
+ active.stalled = false;
158
+ }
159
+ /**
160
+ * A signed submitted record can be the first event after worker reattach.
161
+ * Recover an explicit slot when no local flush state survived the restart.
162
+ */
163
+ noteSubmitted(nowMs = Date.now()) {
164
+ if (this.turns.length === 0)
165
+ this.begin(undefined, nowMs);
166
+ else if (this.turns[0].reattachObservation)
167
+ this.turns[0].reattachObservation = false;
168
+ this.noteActivity(nowMs);
169
+ }
170
+ /** Complete only the runner's current turn and activate the next queued one. */
171
+ completeCurrent(nowMs = Date.now()) {
172
+ if (this.turns.length === 0)
173
+ return false;
174
+ this.turns.shift();
175
+ const next = this.turns[0];
176
+ if (!next)
177
+ return this.consumeDeferredPrompt();
178
+ // Time spent waiting behind the previous turn is not lack of progress for
179
+ // this turn. Its own timeout begins when it becomes runner-current.
180
+ next.lastActivityAtMs = Math.max(next.lastActivityAtMs, nowMs);
181
+ next.stalled = false;
182
+ return false;
183
+ }
184
+ /** Remove the exact control-line submission that failed, preserving peers. */
185
+ cancelExact(handle, nowMs = Date.now()) {
186
+ const index = this.turns.findIndex(turn => turn.handle === handle);
187
+ if (index < 0)
188
+ return { cancelled: false, shouldReplayPrompt: false };
189
+ const wasCurrent = index === 0;
190
+ this.turns.splice(index, 1);
191
+ if (wasCurrent && this.turns[0]) {
192
+ this.turns[0].lastActivityAtMs = Math.max(this.turns[0].lastActivityAtMs, nowMs);
193
+ this.turns[0].stalled = false;
194
+ }
195
+ return { cancelled: true, shouldReplayPrompt: this.consumeDeferredPrompt() };
196
+ }
197
+ /** Backwards-compatible shorthand for callers that only need replay state. */
198
+ cancel(handle, nowMs = Date.now()) {
199
+ return this.cancelExact(handle, nowMs).shouldReplayPrompt;
200
+ }
201
+ /**
202
+ * A prompt is authoritative only for the synthetic reattach observation.
203
+ * Returns whether no explicit/queued turn remains, so the worker can reject
204
+ * a transient inter-turn prompt instead of publishing prompt_ready / idle.
205
+ */
206
+ notePrompt(nowMs = Date.now()) {
207
+ if (this.turns[0]?.reattachObservation)
208
+ this.completeCurrent(nowMs);
209
+ if (this.turns.length === 0) {
210
+ this.promptDeferred = false;
211
+ return true;
212
+ }
213
+ this.promptDeferred = true;
214
+ return false;
215
+ }
216
+ hasActiveTurn() {
217
+ return this.turns.length > 0;
218
+ }
219
+ /** Drop every queued turn on CLI exit, kill, or worker reinitialization. */
220
+ clear() {
221
+ this.turns.length = 0;
222
+ this.promptDeferred = false;
223
+ }
224
+ poll(nowMs = Date.now()) {
225
+ const active = this.turns[0];
226
+ if (!active)
227
+ return { active: false, stalled: false, newlyStalled: false, shouldNotify: false };
228
+ const timedOut = nowMs - active.lastActivityAtMs >= this.timeoutMs;
229
+ const newlyStalled = timedOut && !active.stalled;
230
+ if (newlyStalled)
231
+ active.stalled = true;
232
+ const shouldNotify = newlyStalled && !active.notified;
233
+ if (shouldNotify)
234
+ active.notified = true;
235
+ return {
236
+ active: true,
237
+ stalled: active.stalled,
238
+ newlyStalled,
239
+ shouldNotify,
240
+ turnId: active.turnId,
241
+ };
242
+ }
243
+ consumeDeferredPrompt() {
244
+ if (this.turns.length > 0 || !this.promptDeferred)
245
+ return false;
246
+ this.promptDeferred = false;
247
+ return true;
248
+ }
249
+ }
250
+ /**
251
+ * One flush may cancel a queued liveness slot because writeInput throws or
252
+ * it returns submitted=false. Preserve the deferred real prompt across that
253
+ * async boundary, but replay it only after every peer slot has drained.
254
+ */
255
+ export class CodexAppFlushPromptReplay {
256
+ replayRequested = false;
257
+ cancelSubmission(tracker, authority, handle, nowMs = Date.now()) {
258
+ if (handle === undefined)
259
+ return;
260
+ const cancelled = tracker.cancelExact(handle, nowMs);
261
+ if (!cancelled.cancelled)
262
+ return;
263
+ authority.armLatePromptRecovery();
264
+ if (cancelled.shouldReplayPrompt)
265
+ this.replayRequested = true;
266
+ }
267
+ consumeAfterFlush(tracker) {
268
+ const shouldReplay = this.replayRequested && !tracker.hasActiveTurn();
269
+ this.replayRequested = false;
270
+ return shouldReplay;
271
+ }
272
+ }
273
+ /** Apply an activity payload whose signed socket connection was authenticated. */
274
+ export function applyTrustedCodexAppActivityMarker(tracker, payload, receivedAtMs = Date.now()) {
275
+ if (!payload || typeof payload !== 'object')
276
+ return { accepted: false };
277
+ const marker = payload;
278
+ const phase = marker.phase;
279
+ if (phase !== 'submitted' && phase !== 'progress' && phase !== 'completed') {
280
+ return { accepted: false };
281
+ }
282
+ const runnerAtMs = typeof marker.atMs === 'number' && Number.isFinite(marker.atMs)
283
+ ? marker.atMs
284
+ : receivedAtMs;
285
+ // Runner and worker share one host clock. A marker may arrive late, but it
286
+ // may never push the activity clock into the future and suppress stalls.
287
+ const atMs = Math.min(runnerAtMs, receivedAtMs);
288
+ if (phase === 'completed') {
289
+ return {
290
+ accepted: true,
291
+ phase,
292
+ shouldReplayPrompt: tracker.completeCurrent(atMs),
293
+ };
294
+ }
295
+ if (phase === 'submitted')
296
+ tracker.noteSubmitted(atMs);
297
+ else
298
+ tracker.noteActivity(atMs);
299
+ return { accepted: true, phase };
300
+ }
301
+ //# sourceMappingURL=codex-app-turn-liveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-turn-liveness.js","sourceRoot":"","sources":["../../src/utils/codex-app-turn-liveness.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,18 @@ export declare class IdleDetector {
15
15
  constructor(cli: CliAdapter);
16
16
  onIdle(cb: (source: IdleEvidenceSource) => void): void;
17
17
  onBusy(cb: () => void): void;
18
+ /**
19
+ * Seed readyPattern evidence for a prompt that IS on screen but was rendered
20
+ * before resetReadyEvidence() cleared the flag. A new session (SessionStart
21
+ * source=startup) never redraws after that boundary, so Strategy 2's
22
+ * `!readySeen` early return would suppress quiescence detection forever.
23
+ *
24
+ * The caller must first confirm the PTY is quiet AND the current rendered
25
+ * screen matches readyPattern. This only restores readySeen — a full
26
+ * quiescence check (spinner guard included) still runs on top of it, so no
27
+ * existing check is bypassed.
28
+ */
29
+ seedReadyEvidence(): boolean;
18
30
  feed(data: string): void;
19
31
  reset(): void;
20
32
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/utils/idle-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAYvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,UAAU;IAM3B,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAItD,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqExB,KAAK,IAAI,IAAI;IASb;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI;IAS1B;;;;4EAIwE;IACxE,QAAQ,IAAI,IAAI;IAKhB,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAKlB"}
1
+ {"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/utils/idle-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAYvD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,UAAU;IAM3B,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAItD,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5B;;;;;;;;;;OAUG;IACH,iBAAiB,IAAI,OAAO;IAQ5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqExB,KAAK,IAAI,IAAI;IASb;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI;IAS1B;;;;4EAIwE;IACxE,QAAQ,IAAI,IAAI;IAKhB,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAKlB"}
@@ -29,6 +29,25 @@ export class IdleDetector {
29
29
  onBusy(cb) {
30
30
  this.busyCallback = cb;
31
31
  }
32
+ /**
33
+ * Seed readyPattern evidence for a prompt that IS on screen but was rendered
34
+ * before resetReadyEvidence() cleared the flag. A new session (SessionStart
35
+ * source=startup) never redraws after that boundary, so Strategy 2's
36
+ * `!readySeen` early return would suppress quiescence detection forever.
37
+ *
38
+ * The caller must first confirm the PTY is quiet AND the current rendered
39
+ * screen matches readyPattern. This only restores readySeen — a full
40
+ * quiescence check (spinner guard included) still runs on top of it, so no
41
+ * existing check is bypassed.
42
+ */
43
+ seedReadyEvidence() {
44
+ if (this.isIdle || this.readySeen)
45
+ return false;
46
+ this.readySeen = true;
47
+ this.clearTimer();
48
+ this.quiescenceCheck();
49
+ return true;
50
+ }
32
51
  feed(data) {
33
52
  // A botmux-owned submit calls reset() before writing input, but adopted
34
53
  // panes can also receive local terminal input while we are already idle.