botmux 3.5.2 → 3.6.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 (458) hide show
  1. package/README.en.md +56 -396
  2. package/README.md +55 -396
  3. package/dist/.runtime-build-id +1 -0
  4. package/dist/adapters/cli/claude-code.d.ts +6 -0
  5. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  6. package/dist/adapters/cli/claude-code.js +197 -11
  7. package/dist/adapters/cli/claude-code.js.map +1 -1
  8. package/dist/adapters/cli/coco.js +4 -4
  9. package/dist/adapters/cli/coco.js.map +1 -1
  10. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  11. package/dist/adapters/cli/codex-app.js +9 -6
  12. package/dist/adapters/cli/codex-app.js.map +1 -1
  13. package/dist/adapters/cli/codex.js +5 -5
  14. package/dist/adapters/cli/codex.js.map +1 -1
  15. package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
  16. package/dist/adapters/cli/fs-policy.js +5 -7
  17. package/dist/adapters/cli/fs-policy.js.map +1 -1
  18. package/dist/adapters/cli/grok.d.ts +2 -1
  19. package/dist/adapters/cli/grok.d.ts.map +1 -1
  20. package/dist/adapters/cli/grok.js +2 -1
  21. package/dist/adapters/cli/grok.js.map +1 -1
  22. package/dist/adapters/cli/hermes.d.ts.map +1 -1
  23. package/dist/adapters/cli/hermes.js +8 -4
  24. package/dist/adapters/cli/hermes.js.map +1 -1
  25. package/dist/adapters/cli/mtr.d.ts.map +1 -1
  26. package/dist/adapters/cli/mtr.js +3 -2
  27. package/dist/adapters/cli/mtr.js.map +1 -1
  28. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  29. package/dist/adapters/cli/opencode.js +5 -4
  30. package/dist/adapters/cli/opencode.js.map +1 -1
  31. package/dist/adapters/cli/relay.js +2 -2
  32. package/dist/adapters/cli/relay.js.map +1 -1
  33. package/dist/adapters/cli/runner-input.d.ts +2 -2
  34. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  35. package/dist/adapters/cli/runner-input.js +9 -6
  36. package/dist/adapters/cli/runner-input.js.map +1 -1
  37. package/dist/adapters/cli/seed.d.ts.map +1 -1
  38. package/dist/adapters/cli/seed.js +2 -1
  39. package/dist/adapters/cli/seed.js.map +1 -1
  40. package/dist/adapters/cli/traex.d.ts.map +1 -1
  41. package/dist/adapters/cli/traex.js +3 -2
  42. package/dist/adapters/cli/traex.js.map +1 -1
  43. package/dist/adapters/cli/types.d.ts +25 -18
  44. package/dist/adapters/cli/types.d.ts.map +1 -1
  45. package/dist/bot-registry.d.ts +28 -0
  46. package/dist/bot-registry.d.ts.map +1 -1
  47. package/dist/bot-registry.js +75 -0
  48. package/dist/bot-registry.js.map +1 -1
  49. package/dist/cli.d.ts.map +1 -1
  50. package/dist/cli.js +272 -86
  51. package/dist/cli.js.map +1 -1
  52. package/dist/codex-app-runner.js +85 -192
  53. package/dist/codex-app-runner.js.map +1 -1
  54. package/dist/config.d.ts +0 -16
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +0 -30
  57. package/dist/config.js.map +1 -1
  58. package/dist/core/ask-broker.d.ts +12 -0
  59. package/dist/core/ask-broker.d.ts.map +1 -1
  60. package/dist/core/ask-broker.js +41 -0
  61. package/dist/core/ask-broker.js.map +1 -1
  62. package/dist/core/bot-turn-mutation-gate.d.ts +24 -0
  63. package/dist/core/bot-turn-mutation-gate.d.ts.map +1 -0
  64. package/dist/core/bot-turn-mutation-gate.js +369 -0
  65. package/dist/core/bot-turn-mutation-gate.js.map +1 -0
  66. package/dist/core/command-handler.d.ts +5 -0
  67. package/dist/core/command-handler.d.ts.map +1 -1
  68. package/dist/core/command-handler.js +38 -16
  69. package/dist/core/command-handler.js.map +1 -1
  70. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  71. package/dist/core/dashboard-ipc-server.js +330 -57
  72. package/dist/core/dashboard-ipc-server.js.map +1 -1
  73. package/dist/core/dashboard-rows.d.ts +8 -0
  74. package/dist/core/dashboard-rows.d.ts.map +1 -1
  75. package/dist/core/dashboard-rows.js.map +1 -1
  76. package/dist/core/host-overload-alert.d.ts +157 -0
  77. package/dist/core/host-overload-alert.d.ts.map +1 -0
  78. package/dist/core/host-overload-alert.js +251 -0
  79. package/dist/core/host-overload-alert.js.map +1 -0
  80. package/dist/core/passthrough-commands.d.ts +8 -0
  81. package/dist/core/passthrough-commands.d.ts.map +1 -1
  82. package/dist/core/passthrough-commands.js +19 -0
  83. package/dist/core/passthrough-commands.js.map +1 -1
  84. package/dist/core/restart-coordinator.d.ts +28 -0
  85. package/dist/core/restart-coordinator.d.ts.map +1 -0
  86. package/dist/core/restart-coordinator.js +82 -0
  87. package/dist/core/restart-coordinator.js.map +1 -0
  88. package/dist/core/restart-followup-policy.d.ts +112 -0
  89. package/dist/core/restart-followup-policy.d.ts.map +1 -0
  90. package/dist/core/restart-followup-policy.js +49 -0
  91. package/dist/core/restart-followup-policy.js.map +1 -0
  92. package/dist/core/role-library.d.ts +1 -1
  93. package/dist/core/role-library.js +1 -1
  94. package/dist/core/session-cwd.d.ts.map +1 -1
  95. package/dist/core/session-cwd.js +8 -0
  96. package/dist/core/session-cwd.js.map +1 -1
  97. package/dist/core/session-discovery.d.ts +14 -0
  98. package/dist/core/session-discovery.d.ts.map +1 -1
  99. package/dist/core/session-discovery.js +25 -0
  100. package/dist/core/session-discovery.js.map +1 -1
  101. package/dist/core/session-liveness.d.ts +15 -0
  102. package/dist/core/session-liveness.d.ts.map +1 -0
  103. package/dist/core/session-liveness.js +76 -0
  104. package/dist/core/session-liveness.js.map +1 -0
  105. package/dist/core/session-row-enrichment.d.ts +15 -0
  106. package/dist/core/session-row-enrichment.d.ts.map +1 -0
  107. package/dist/core/session-row-enrichment.js +93 -0
  108. package/dist/core/session-row-enrichment.js.map +1 -0
  109. package/dist/core/slash-inject.js +1 -1
  110. package/dist/core/slash-inject.js.map +1 -1
  111. package/dist/core/trigger-final-suppression.d.ts +24 -0
  112. package/dist/core/trigger-final-suppression.d.ts.map +1 -0
  113. package/dist/core/trigger-final-suppression.js +97 -0
  114. package/dist/core/trigger-final-suppression.js.map +1 -0
  115. package/dist/core/trigger-session.d.ts.map +1 -1
  116. package/dist/core/trigger-session.js +64 -4
  117. package/dist/core/trigger-session.js.map +1 -1
  118. package/dist/core/types.d.ts +6 -0
  119. package/dist/core/types.d.ts.map +1 -1
  120. package/dist/core/types.js.map +1 -1
  121. package/dist/core/worker-pool.d.ts +20 -0
  122. package/dist/core/worker-pool.d.ts.map +1 -1
  123. package/dist/core/worker-pool.js +283 -32
  124. package/dist/core/worker-pool.js.map +1 -1
  125. package/dist/daemon.d.ts +5 -1
  126. package/dist/daemon.d.ts.map +1 -1
  127. package/dist/daemon.js +520 -35
  128. package/dist/daemon.js.map +1 -1
  129. package/dist/dashboard/aggregator.d.ts +1 -0
  130. package/dist/dashboard/aggregator.d.ts.map +1 -1
  131. package/dist/dashboard/aggregator.js +34 -6
  132. package/dist/dashboard/aggregator.js.map +1 -1
  133. package/dist/dashboard/bot-payload.d.ts +3 -0
  134. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  135. package/dist/dashboard/bot-payload.js +3 -0
  136. package/dist/dashboard/bot-payload.js.map +1 -1
  137. package/dist/dashboard/compat.d.ts +102 -2
  138. package/dist/dashboard/compat.d.ts.map +1 -1
  139. package/dist/dashboard/compat.js +78 -14
  140. package/dist/dashboard/compat.js.map +1 -1
  141. package/dist/dashboard/connector-api.d.ts.map +1 -1
  142. package/dist/dashboard/connector-api.js +1 -0
  143. package/dist/dashboard/connector-api.js.map +1 -1
  144. package/dist/dashboard/desktop-asks.d.ts +21 -0
  145. package/dist/dashboard/desktop-asks.d.ts.map +1 -0
  146. package/dist/dashboard/desktop-asks.js +49 -0
  147. package/dist/dashboard/desktop-asks.js.map +1 -0
  148. package/dist/dashboard/public-redact.d.ts +7 -0
  149. package/dist/dashboard/public-redact.d.ts.map +1 -1
  150. package/dist/dashboard/public-redact.js +35 -3
  151. package/dist/dashboard/public-redact.js.map +1 -1
  152. package/dist/dashboard/session-presentation.d.ts +16 -0
  153. package/dist/dashboard/session-presentation.d.ts.map +1 -0
  154. package/dist/dashboard/session-presentation.js +62 -0
  155. package/dist/dashboard/session-presentation.js.map +1 -0
  156. package/dist/dashboard/settings-write-applier.d.ts +2 -1
  157. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  158. package/dist/dashboard/settings-write-applier.js +19 -1
  159. package/dist/dashboard/settings-write-applier.js.map +1 -1
  160. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  161. package/dist/dashboard/trigger-api.js +19 -1
  162. package/dist/dashboard/trigger-api.js.map +1 -1
  163. package/dist/dashboard/vc-consumer-profiles-api.d.ts +7 -2
  164. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  165. package/dist/dashboard/vc-consumer-profiles-api.js +13 -0
  166. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  167. package/dist/dashboard/web/app.d.ts.map +1 -1
  168. package/dist/dashboard/web/app.js +18 -5
  169. package/dist/dashboard/web/app.js.map +1 -1
  170. package/dist/dashboard/web/bot-defaults-page.d.ts +1 -1
  171. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  172. package/dist/dashboard/web/bot-defaults-page.js +97 -35
  173. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  174. package/dist/dashboard/web/bot-defaults.d.ts +3 -0
  175. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  176. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  177. package/dist/dashboard/web/client-shell.d.ts +29 -0
  178. package/dist/dashboard/web/client-shell.d.ts.map +1 -0
  179. package/dist/dashboard/web/client-shell.js +89 -0
  180. package/dist/dashboard/web/client-shell.js.map +1 -0
  181. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  182. package/dist/dashboard/web/connectors-page.js +5 -1
  183. package/dist/dashboard/web/connectors-page.js.map +1 -1
  184. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  185. package/dist/dashboard/web/i18n.js +100 -8
  186. package/dist/dashboard/web/i18n.js.map +1 -1
  187. package/dist/dashboard/web/preferences.d.ts +7 -0
  188. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  189. package/dist/dashboard/web/preferences.js +32 -0
  190. package/dist/dashboard/web/preferences.js.map +1 -1
  191. package/dist/dashboard/web/sessions-kanban.d.ts +1 -1
  192. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  193. package/dist/dashboard/web/sessions-kanban.js +1 -1
  194. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  195. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  196. package/dist/dashboard/web/sessions-page.js +77 -23
  197. package/dist/dashboard/web/sessions-page.js.map +1 -1
  198. package/dist/dashboard/web/sessions.d.ts +4 -0
  199. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  200. package/dist/dashboard/web/sessions.js +14 -1
  201. package/dist/dashboard/web/sessions.js.map +1 -1
  202. package/dist/dashboard/web/settings-page.d.ts +6 -0
  203. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  204. package/dist/dashboard/web/settings-page.js +55 -30
  205. package/dist/dashboard/web/settings-page.js.map +1 -1
  206. package/dist/dashboard/web/store.d.ts +1 -2
  207. package/dist/dashboard/web/store.d.ts.map +1 -1
  208. package/dist/dashboard/web/store.js +69 -20
  209. package/dist/dashboard/web/store.js.map +1 -1
  210. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  211. package/dist/dashboard/web/vc-consumer-profiles-section.js +128 -42
  212. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  213. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  214. package/dist/dashboard/webhook-routes.js +9 -2
  215. package/dist/dashboard/webhook-routes.js.map +1 -1
  216. package/dist/dashboard-web/app.js +1 -1
  217. package/dist/dashboard-web/chunks/bot-defaults-page-VQMPUJ4Y.js +10 -0
  218. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +1 -0
  219. package/dist/dashboard-web/chunks/{chunk-KPQAUX7V.js → chunk-JMRGZQDB.js} +1 -1
  220. package/dist/dashboard-web/chunks/{chunk-R7IAKAYX.js → chunk-NP4JUBGS.js} +1 -1
  221. package/dist/dashboard-web/chunks/{chunk-NRL6CVAS.js → chunk-P327LXOT.js} +1 -1
  222. package/dist/dashboard-web/chunks/{chunk-X2L65IOM.js → chunk-SNKATZWK.js} +15 -15
  223. package/dist/dashboard-web/chunks/connectors-page-DOY4J3ZL.js +1 -0
  224. package/dist/dashboard-web/chunks/{groups-page-6DKXBYOM.js → groups-page-74TS2DIH.js} +1 -1
  225. package/dist/dashboard-web/chunks/{insights-page-NWARTJ6J.js → insights-page-AYCO65JC.js} +1 -1
  226. package/dist/dashboard-web/chunks/{monitor-room-AGX3XRJX.js → monitor-room-YKYLTSAN.js} +1 -1
  227. package/dist/dashboard-web/chunks/{monitoring-page-GGGIWN4C.js → monitoring-page-QBIUNRBR.js} +1 -1
  228. package/dist/dashboard-web/chunks/{office-page-6SIVKSK3.js → office-page-4PH2A26P.js} +1 -1
  229. package/dist/dashboard-web/chunks/overview-page-H73D5UT4.js +1 -0
  230. package/dist/dashboard-web/chunks/{roles-page-WE2YB7KN.js → roles-page-U4BTOQ7F.js} +1 -1
  231. package/dist/dashboard-web/chunks/{schedules-page-TB3I24XN.js → schedules-page-RHRHX7R7.js} +1 -1
  232. package/dist/dashboard-web/chunks/sessions-page-VSC6AM5G.js +2 -0
  233. package/dist/dashboard-web/chunks/settings-page-LF3RKM5P.js +2 -0
  234. package/dist/dashboard-web/chunks/{skills-page-3QAT2IWD.js → skills-page-SYOIGGXH.js} +1 -1
  235. package/dist/dashboard-web/chunks/{team-federation-page-K4VVAVAK.js → team-federation-page-RMBLASTW.js} +1 -1
  236. package/dist/dashboard-web/chunks/{v3-page-V6IOJR2B.js → v3-page-XJXKKJRN.js} +1 -1
  237. package/dist/dashboard-web/chunks/{whiteboards-page-V6CGKRNX.js → whiteboards-page-K3YVSTHJ.js} +1 -1
  238. package/dist/dashboard-web/style.css +551 -0
  239. package/dist/dashboard.js +153 -9
  240. package/dist/dashboard.js.map +1 -1
  241. package/dist/global-config.d.ts +11 -0
  242. package/dist/global-config.d.ts.map +1 -1
  243. package/dist/global-config.js +23 -0
  244. package/dist/global-config.js.map +1 -1
  245. package/dist/i18n/en.d.ts.map +1 -1
  246. package/dist/i18n/en.js +5 -0
  247. package/dist/i18n/en.js.map +1 -1
  248. package/dist/i18n/zh.d.ts.map +1 -1
  249. package/dist/i18n/zh.js +5 -0
  250. package/dist/i18n/zh.js.map +1 -1
  251. package/dist/im/lark/card-builder.d.ts +1 -1
  252. package/dist/im/lark/card-builder.js +1 -1
  253. package/dist/im/lark/card-handler.d.ts +10 -0
  254. package/dist/im/lark/card-handler.d.ts.map +1 -1
  255. package/dist/im/lark/card-handler.js +163 -17
  256. package/dist/im/lark/card-handler.js.map +1 -1
  257. package/dist/im/lark/client.d.ts +11 -0
  258. package/dist/im/lark/client.d.ts.map +1 -1
  259. package/dist/im/lark/client.js +47 -18
  260. package/dist/im/lark/client.js.map +1 -1
  261. package/dist/im/lark/event-dispatcher.d.ts +13 -0
  262. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  263. package/dist/im/lark/event-dispatcher.js +20 -0
  264. package/dist/im/lark/event-dispatcher.js.map +1 -1
  265. package/dist/im/lark/identity-cache.d.ts +25 -1
  266. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  267. package/dist/im/lark/identity-cache.js +47 -1
  268. package/dist/im/lark/identity-cache.js.map +1 -1
  269. package/dist/im/lark/overload-nonce.d.ts +19 -0
  270. package/dist/im/lark/overload-nonce.d.ts.map +1 -0
  271. package/dist/im/lark/overload-nonce.js +72 -0
  272. package/dist/im/lark/overload-nonce.js.map +1 -0
  273. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  274. package/dist/im/lark/v3-progress-card.js +5 -0
  275. package/dist/im/lark/v3-progress-card.js.map +1 -1
  276. package/dist/services/async-trigger-state.d.ts +82 -0
  277. package/dist/services/async-trigger-state.d.ts.map +1 -0
  278. package/dist/services/async-trigger-state.js +95 -0
  279. package/dist/services/async-trigger-state.js.map +1 -0
  280. package/dist/services/async-trigger-store.d.ts +28 -0
  281. package/dist/services/async-trigger-store.d.ts.map +1 -0
  282. package/dist/services/async-trigger-store.js +120 -0
  283. package/dist/services/async-trigger-store.js.map +1 -0
  284. package/dist/services/bot-config-store.d.ts.map +1 -1
  285. package/dist/services/bot-config-store.js +34 -2
  286. package/dist/services/bot-config-store.js.map +1 -1
  287. package/dist/services/bridge-fallback-gate.d.ts +32 -0
  288. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  289. package/dist/services/bridge-fallback-gate.js +39 -0
  290. package/dist/services/bridge-fallback-gate.js.map +1 -1
  291. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  292. package/dist/services/bridge-turn-queue.js +15 -1
  293. package/dist/services/bridge-turn-queue.js.map +1 -1
  294. package/dist/services/card-prefs-store.d.ts +4 -0
  295. package/dist/services/card-prefs-store.d.ts.map +1 -1
  296. package/dist/services/card-prefs-store.js +8 -0
  297. package/dist/services/card-prefs-store.js.map +1 -1
  298. package/dist/services/claude-transcript.d.ts +23 -0
  299. package/dist/services/claude-transcript.d.ts.map +1 -1
  300. package/dist/services/claude-transcript.js +33 -0
  301. package/dist/services/claude-transcript.js.map +1 -1
  302. package/dist/services/codex-app-runner-protocol.d.ts +61 -0
  303. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -0
  304. package/dist/services/codex-app-runner-protocol.js +170 -0
  305. package/dist/services/codex-app-runner-protocol.js.map +1 -0
  306. package/dist/services/codex-app-turn-controller.d.ts +72 -0
  307. package/dist/services/codex-app-turn-controller.d.ts.map +1 -0
  308. package/dist/services/codex-app-turn-controller.js +524 -0
  309. package/dist/services/codex-app-turn-controller.js.map +1 -0
  310. package/dist/services/codex-runner-freshness.d.ts +39 -0
  311. package/dist/services/codex-runner-freshness.d.ts.map +1 -0
  312. package/dist/services/codex-runner-freshness.js +78 -0
  313. package/dist/services/codex-runner-freshness.js.map +1 -0
  314. package/dist/services/connector-store.d.ts +6 -0
  315. package/dist/services/connector-store.d.ts.map +1 -1
  316. package/dist/services/connector-store.js.map +1 -1
  317. package/dist/services/grant-store.d.ts.map +1 -1
  318. package/dist/services/grant-store.js +16 -0
  319. package/dist/services/grant-store.js.map +1 -1
  320. package/dist/services/hermes-transcript.d.ts +1 -0
  321. package/dist/services/hermes-transcript.d.ts.map +1 -1
  322. package/dist/services/hermes-transcript.js +49 -0
  323. package/dist/services/hermes-transcript.js.map +1 -1
  324. package/dist/services/schedule-split-migration.d.ts +2 -0
  325. package/dist/services/schedule-split-migration.d.ts.map +1 -0
  326. package/dist/services/schedule-split-migration.js +159 -0
  327. package/dist/services/schedule-split-migration.js.map +1 -0
  328. package/dist/services/schedule-store.d.ts +28 -4
  329. package/dist/services/schedule-store.d.ts.map +1 -1
  330. package/dist/services/schedule-store.js +118 -33
  331. package/dist/services/schedule-store.js.map +1 -1
  332. package/dist/services/trigger-types.d.ts +18 -1
  333. package/dist/services/trigger-types.d.ts.map +1 -1
  334. package/dist/services/trigger-types.js +3 -0
  335. package/dist/services/trigger-types.js.map +1 -1
  336. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -1
  337. package/dist/services/vc-meeting-consumer-profile-store.js +1 -0
  338. package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -1
  339. package/dist/services/vc-meeting-consumer-profile-templates.d.ts +32 -0
  340. package/dist/services/vc-meeting-consumer-profile-templates.d.ts.map +1 -0
  341. package/dist/services/vc-meeting-consumer-profile-templates.js +106 -0
  342. package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -0
  343. package/dist/services/vc-meeting-delivery-feed.d.ts +1 -1
  344. package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -1
  345. package/dist/services/vc-meeting-delivery-feed.js +2 -1
  346. package/dist/services/vc-meeting-delivery-feed.js.map +1 -1
  347. package/dist/services/vc-meeting-delivery-hub-store.d.ts +3 -1
  348. package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -1
  349. package/dist/services/vc-meeting-delivery-hub-store.js +11 -0
  350. package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -1
  351. package/dist/services/vc-meeting-delivery-protocol.d.ts +9 -2
  352. package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -1
  353. package/dist/services/vc-meeting-delivery-protocol.js +10 -1
  354. package/dist/services/vc-meeting-delivery-protocol.js.map +1 -1
  355. package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -1
  356. package/dist/services/vc-meeting-delivery-receiver.js +10 -1
  357. package/dist/services/vc-meeting-delivery-receiver.js.map +1 -1
  358. package/dist/services/vc-meeting-delivery-store.d.ts +12 -2
  359. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
  360. package/dist/services/vc-meeting-delivery-store.js +14 -2
  361. package/dist/services/vc-meeting-delivery-store.js.map +1 -1
  362. package/dist/services/vc-meeting-im-reply.d.ts +2 -1
  363. package/dist/services/vc-meeting-im-reply.d.ts.map +1 -1
  364. package/dist/services/vc-meeting-im-reply.js +19 -3
  365. package/dist/services/vc-meeting-im-reply.js.map +1 -1
  366. package/dist/services/vc-meeting-listener-output-protocol.d.ts +27 -0
  367. package/dist/services/vc-meeting-listener-output-protocol.d.ts.map +1 -0
  368. package/dist/services/vc-meeting-listener-output-protocol.js +58 -0
  369. package/dist/services/vc-meeting-listener-output-protocol.js.map +1 -0
  370. package/dist/services/vc-meeting-listener-topic-store.d.ts +31 -0
  371. package/dist/services/vc-meeting-listener-topic-store.d.ts.map +1 -0
  372. package/dist/services/vc-meeting-listener-topic-store.js +120 -0
  373. package/dist/services/vc-meeting-listener-topic-store.js.map +1 -0
  374. package/dist/services/vc-meeting-runtime-store.d.ts +2 -1
  375. package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
  376. package/dist/services/vc-meeting-runtime-store.js +8 -0
  377. package/dist/services/vc-meeting-runtime-store.js.map +1 -1
  378. package/dist/services/vc-meeting-send-policy.d.ts +8 -1
  379. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
  380. package/dist/services/vc-meeting-send-policy.js +8 -0
  381. package/dist/services/vc-meeting-send-policy.js.map +1 -1
  382. package/dist/types.d.ts +40 -3
  383. package/dist/types.d.ts.map +1 -1
  384. package/dist/utils/allowed-users-apply.d.ts +76 -0
  385. package/dist/utils/allowed-users-apply.d.ts.map +1 -0
  386. package/dist/utils/allowed-users-apply.js +123 -0
  387. package/dist/utils/allowed-users-apply.js.map +1 -0
  388. package/dist/utils/allowed-users-cache.d.ts +29 -0
  389. package/dist/utils/allowed-users-cache.d.ts.map +1 -0
  390. package/dist/utils/allowed-users-cache.js +82 -0
  391. package/dist/utils/allowed-users-cache.js.map +1 -0
  392. package/dist/utils/child-env.d.ts +2 -1
  393. package/dist/utils/child-env.d.ts.map +1 -1
  394. package/dist/utils/child-env.js +2 -1
  395. package/dist/utils/child-env.js.map +1 -1
  396. package/dist/utils/cli-usage-limit.d.ts +27 -1
  397. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  398. package/dist/utils/cli-usage-limit.js +92 -20
  399. package/dist/utils/cli-usage-limit.js.map +1 -1
  400. package/dist/utils/input-gate.d.ts +2 -0
  401. package/dist/utils/input-gate.d.ts.map +1 -1
  402. package/dist/utils/input-gate.js +2 -0
  403. package/dist/utils/input-gate.js.map +1 -1
  404. package/dist/utils/runtime-build-id.d.ts +21 -0
  405. package/dist/utils/runtime-build-id.d.ts.map +1 -0
  406. package/dist/utils/runtime-build-id.js +83 -0
  407. package/dist/utils/runtime-build-id.js.map +1 -0
  408. package/dist/utils/terminal-renderer.d.ts +3 -3
  409. package/dist/utils/terminal-renderer.js +3 -3
  410. package/dist/vc-agent/cards.d.ts.map +1 -1
  411. package/dist/vc-agent/cards.js +21 -1
  412. package/dist/vc-agent/cards.js.map +1 -1
  413. package/dist/worker.js +601 -179
  414. package/dist/worker.js.map +1 -1
  415. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  416. package/dist/workflows/hostExecutors/botmux-schedule.js +13 -1
  417. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  418. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  419. package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -1
  420. package/dist/workflows/migration/v2-to-v3.js +5 -1
  421. package/dist/workflows/migration/v2-to-v3.js.map +1 -1
  422. package/dist/workflows/v3/architect.d.ts.map +1 -1
  423. package/dist/workflows/v3/architect.js +1 -0
  424. package/dist/workflows/v3/architect.js.map +1 -1
  425. package/dist/workflows/v3/cli-run.d.ts +9 -0
  426. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  427. package/dist/workflows/v3/cli-run.js +17 -2
  428. package/dist/workflows/v3/cli-run.js.map +1 -1
  429. package/dist/workflows/v3/goal-cli.d.ts +58 -0
  430. package/dist/workflows/v3/goal-cli.d.ts.map +1 -0
  431. package/dist/workflows/v3/goal-cli.js +430 -0
  432. package/dist/workflows/v3/goal-cli.js.map +1 -0
  433. package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
  434. package/dist/workflows/v3/library-materialize.js +5 -1
  435. package/dist/workflows/v3/library-materialize.js.map +1 -1
  436. package/dist/workflows/v3/library-schema.d.ts +21 -0
  437. package/dist/workflows/v3/library-schema.d.ts.map +1 -1
  438. package/dist/workflows/v3/library-schema.js +95 -1
  439. package/dist/workflows/v3/library-schema.js.map +1 -1
  440. package/dist/workflows/v3/progress-projection.d.ts +3 -0
  441. package/dist/workflows/v3/progress-projection.d.ts.map +1 -1
  442. package/dist/workflows/v3/progress-projection.js +23 -1
  443. package/dist/workflows/v3/progress-projection.js.map +1 -1
  444. package/dist/workflows/v3/run-envelope.d.ts +46 -1
  445. package/dist/workflows/v3/run-envelope.d.ts.map +1 -1
  446. package/dist/workflows/v3/run-envelope.js +32 -1
  447. package/dist/workflows/v3/run-envelope.js.map +1 -1
  448. package/package.json +2 -2
  449. package/dist/dashboard-web/chunks/bot-defaults-page-AUKV7P4L.js +0 -10
  450. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +0 -1
  451. package/dist/dashboard-web/chunks/connectors-page-HDQFEXZI.js +0 -1
  452. package/dist/dashboard-web/chunks/overview-page-FVR3NKAF.js +0 -1
  453. package/dist/dashboard-web/chunks/sessions-page-KOOOASIL.js +0 -2
  454. package/dist/dashboard-web/chunks/settings-page-IEBR7TGN.js +0 -2
  455. package/dist/utils/screen-analyzer.d.ts +0 -75
  456. package/dist/utils/screen-analyzer.d.ts.map +0 -1
  457. package/dist/utils/screen-analyzer.js +0 -333
  458. package/dist/utils/screen-analyzer.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Decide how to apply a startup / refresh resolve of allowedUsers.
3
+ *
4
+ * Runtime permission (canTalk/canOperate) only matches app-scoped open_ids
5
+ * (`ou_…`). Config may store stable `on_…` / emails that must be resolved each
6
+ * boot. A transient contact API failure used to overwrite the runtime list with
7
+ * `[]`, which fail-closed locks out even the real owner with almost no signal.
8
+ *
9
+ * This module merges the fresh resolve with a last-known-good `raw → ou_` cache,
10
+ * but ONLY per-entry and ONLY when that entry both (a) transient-failed this
11
+ * pass and (b) is still present in the current raw config. That guards against
12
+ * two revival hazards a bare `ou_[]` fallback list would create:
13
+ * - config swaps owner `on_old → on_new`, contact API blips → `ou_old` would
14
+ * be resurrected from cache even though the operator removed it;
15
+ * - an owner is definitively removed from the tenant (errored=false,
16
+ * resolved=[]) → they would be revived indefinitely.
17
+ * The cache is keyed by raw entry, so an entry no longer in config, or one that
18
+ * resolved definitively-gone, is never reused.
19
+ */
20
+ /** Config entries that require a contact resolve (email / union / literal ou_). */
21
+ function needsContactResolve(rawEntries) {
22
+ return rawEntries.some(u => u.includes('@') || u.startsWith('on_') || u.startsWith('ou_'));
23
+ }
24
+ function entryStatusOf(status, entry) {
25
+ // Absent → definitive: never revive an entry the resolver did not explicitly
26
+ // flag as transient. Safer to drop than to resurrect a stale grant.
27
+ return status?.get(entry) ?? 'definitive';
28
+ }
29
+ /**
30
+ * Pure merge of a fresh resolve result + a last-known-good `raw → ou_` cache.
31
+ *
32
+ * Walk raw config in order. For each entry:
33
+ * - fresh `ou_` from this resolve → use it (authoritative);
34
+ * - else if this entry transient-failed AND has a cached `ou_` → reuse cache
35
+ * (marks usedFallback + failed);
36
+ * - else (definitive miss / no cache / non-resolvable literal) → drop it.
37
+ * Never leaves bare `on_` / emails in the runtime list — those cannot match
38
+ * message senders and would still lock the owner out. Output `map` mirrors the
39
+ * chosen `resolved` set so downstream `/revoke` + sidecar stay consistent.
40
+ */
41
+ export function applyAllowedUsersResolve(input) {
42
+ const rawEntries = input.rawEntries.filter(u => typeof u === 'string' && u.trim().length > 0);
43
+ const prevMap = input.previousResolvedMap ?? {};
44
+ const { map: freshMap, errored, entryStatus } = input.resolveResult;
45
+ if (rawEntries.length === 0) {
46
+ return { resolved: [], map: new Map(), usedFallback: false, failed: false, notice: null };
47
+ }
48
+ const outMap = new Map();
49
+ const resolved = [];
50
+ const seen = new Set();
51
+ let usedFallback = false;
52
+ let transientMissWithoutCache = false;
53
+ const recoveredEntries = [];
54
+ const push = (rawEntry, oid) => {
55
+ if (!oid.startsWith('ou_'))
56
+ return;
57
+ outMap.set(rawEntry, oid);
58
+ if (!seen.has(oid)) {
59
+ seen.add(oid);
60
+ resolved.push(oid);
61
+ }
62
+ };
63
+ for (const entry of rawEntries) {
64
+ const fresh = freshMap.get(entry);
65
+ if (fresh && fresh.startsWith('ou_')) {
66
+ push(entry, fresh);
67
+ continue;
68
+ }
69
+ // No fresh ou_. Only reuse cache if this entry TRANSIENT-failed this pass —
70
+ // a definitive miss (removed / invalid / swapped out) must not be revived.
71
+ if (entryStatusOf(entryStatus, entry) === 'transient') {
72
+ const cached = prevMap[entry];
73
+ if (typeof cached === 'string' && cached.startsWith('ou_')) {
74
+ push(entry, cached);
75
+ usedFallback = true;
76
+ recoveredEntries.push(entry);
77
+ }
78
+ else {
79
+ transientMissWithoutCache = true;
80
+ }
81
+ }
82
+ // definitive / resolved-without-ou_ / non-resolvable literal → drop entry.
83
+ }
84
+ // A resolve is "healthy" only when nothing transient-failed. Definitive
85
+ // drops (removed owners) are expected and do NOT mark failed — the config
86
+ // is simply reflecting reality; there is nothing to retry.
87
+ const anyTransient = rawEntries.some(e => entryStatusOf(entryStatus, e) === 'transient');
88
+ const failed = !!errored || anyTransient;
89
+ if (!failed) {
90
+ // Clean pass. resolved may still be empty here if config holds only
91
+ // definitively-gone / non-resolvable entries — that is a legitimate empty
92
+ // allowlist, not a fallback situation. Non-resolvable-only configs (no
93
+ // contact entries) also land here with no notice.
94
+ return { resolved, map: outMap, usedFallback: false, failed: false, notice: null };
95
+ }
96
+ // Degraded pass (something transient-failed). Build an operator-facing notice.
97
+ let notice;
98
+ if (resolved.length > 0 && usedFallback) {
99
+ notice =
100
+ `allowedUsers resolve degraded: contact API transiently failed for ` +
101
+ `${recoveredEntries.length} entr${recoveredEntries.length === 1 ? 'y' : 'ies'} ` +
102
+ `(${recoveredEntries.join(', ')}); reused last-known ou_ from cache so owner talk keeps working. ` +
103
+ `Retrying automatically; restart after Feishu contact recovers if needed.`;
104
+ }
105
+ else if (resolved.length > 0) {
106
+ notice =
107
+ `allowedUsers resolve degraded: some entries transiently failed but ` +
108
+ `${resolved.length} open_id(s) resolved/recovered. Raw entries: ${rawEntries.join(', ')}. Retrying.`;
109
+ }
110
+ else if (transientMissWithoutCache || needsContactResolve(rawEntries)) {
111
+ notice =
112
+ `allowedUsers resolve failed: contact API unavailable and no last-known ou_ cache for the ` +
113
+ `affected entr${recoveredEntries.length === 1 ? 'y' : 'ies'}; runtime allowlist is empty so ` +
114
+ `everyone (including the real owner) is denied. Raw entries: ${rawEntries.join(', ')}. ` +
115
+ `Check Feishu contact API / bot scopes; retrying automatically.`;
116
+ }
117
+ else {
118
+ notice =
119
+ `allowedUsers resolve degraded; runtime allowlist is empty. Raw entries: ${rawEntries.join(', ')}.`;
120
+ }
121
+ return { resolved, map: outMap, usedFallback, failed: true, notice };
122
+ }
123
+ //# sourceMappingURL=allowed-users-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-users-apply.js","sourceRoot":"","sources":["../../src/utils/allowed-users-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare function allowedUsersCachePath(dataDir: string, larkAppId: string): string;
2
+ /** Read the persisted `raw → ou_` cache (ou_ values only). `{}` on any error. */
3
+ export declare function readAllowedUsersResolveCache(dataDir: string, larkAppId: string): Record<string, string>;
4
+ export interface WriteAllowedUsersCacheOpts {
5
+ /**
6
+ * Fresh `raw → ou_` pairs to upsert (only ou_ values are kept). Callers pass
7
+ * the resolve/mutation result map.
8
+ */
9
+ map: Map<string, string> | Record<string, string>;
10
+ /**
11
+ * Entries to delete from the cache regardless of `map` — e.g. definitively-gone
12
+ * ids (removed from tenant) or a raw entry just revoked. Pruned so a later
13
+ * restart during an API blip can't mark them transient and revive a stale owner.
14
+ */
15
+ deleteEntries?: Iterable<string>;
16
+ /**
17
+ * When provided, the cache is pruned to ONLY these raw keys (plus whatever
18
+ * `map` upserts). Pass the current raw allowedUsers config so keys no longer
19
+ * configured (owner swap) never linger. Omit to merge without pruning.
20
+ */
21
+ retainKeys?: Iterable<string>;
22
+ }
23
+ /**
24
+ * Persist the `raw → ou_` cache. Merges `map` over the existing cache, deletes
25
+ * `deleteEntries`, and — when `retainKeys` is given — drops every key not in
26
+ * that set. Best-effort; never throws.
27
+ */
28
+ export declare function writeAllowedUsersResolveCache(dataDir: string, larkAppId: string, opts: WriteAllowedUsersCacheOpts): void;
29
+ //# sourceMappingURL=allowed-users-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-users-cache.d.ts","sourceRoot":"","sources":["../../src/utils/allowed-users-cache.ts"],"names":[],"mappings":"AAsBA,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,iFAAiF;AACjF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAevG;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD;;;;OAIG;IACH,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,0BAA0B,GAC/B,IAAI,CA+BN"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Persistent last-known-good `raw entry → ou_` cache for allowedUsers.
3
+ *
4
+ * This is DELIBERATELY NOT the dashboard descriptor: that descriptor is
5
+ * (a) overwritten unconditionally early in daemon boot with the still-unresolved
6
+ * raw config (so its `resolvedAllowedUsers` is `[]` for an on_/email-only owner),
7
+ * and (b) deleted on every clean shutdown. Reading it as a fallback source is
8
+ * dead-on-arrival for the transient-failure-on-restart scenario this cache
9
+ * exists to survive. This sidecar lives in the persistent data dir, is written
10
+ * whenever a healthy/partial resolve or a hot config/grant mutation produces a
11
+ * fresh `raw → ou_` mapping, and is never deleted on shutdown.
12
+ *
13
+ * Keyed by raw config entry so recovery is per-entry: an entry removed from
14
+ * config (owner swap / revoke) or definitively gone is never revived. Both the
15
+ * daemon startup/retry path and the runtime set/revoke paths write through here
16
+ * so the cache never diverges from the live allowlist.
17
+ */
18
+ import { readFileSync, existsSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { atomicWriteFileSync } from './atomic-write.js';
21
+ import { logger } from './logger.js';
22
+ export function allowedUsersCachePath(dataDir, larkAppId) {
23
+ return join(dataDir, `allowed-users-cache-${larkAppId}.json`);
24
+ }
25
+ /** Read the persisted `raw → ou_` cache (ou_ values only). `{}` on any error. */
26
+ export function readAllowedUsersResolveCache(dataDir, larkAppId) {
27
+ try {
28
+ const fp = allowedUsersCachePath(dataDir, larkAppId);
29
+ if (!existsSync(fp))
30
+ return {};
31
+ const raw = JSON.parse(readFileSync(fp, 'utf8'));
32
+ const m = raw?.map;
33
+ if (!m || typeof m !== 'object' || Array.isArray(m))
34
+ return {};
35
+ const out = {};
36
+ for (const [k, v] of Object.entries(m)) {
37
+ if (typeof k === 'string' && typeof v === 'string' && v.startsWith('ou_'))
38
+ out[k] = v;
39
+ }
40
+ return out;
41
+ }
42
+ catch {
43
+ return {};
44
+ }
45
+ }
46
+ /**
47
+ * Persist the `raw → ou_` cache. Merges `map` over the existing cache, deletes
48
+ * `deleteEntries`, and — when `retainKeys` is given — drops every key not in
49
+ * that set. Best-effort; never throws.
50
+ */
51
+ export function writeAllowedUsersResolveCache(dataDir, larkAppId, opts) {
52
+ try {
53
+ let merged = readAllowedUsersResolveCache(dataDir, larkAppId);
54
+ if (opts.retainKeys) {
55
+ const keep = new Set();
56
+ for (const k of opts.retainKeys)
57
+ if (typeof k === 'string')
58
+ keep.add(k);
59
+ const pruned = {};
60
+ for (const [k, v] of Object.entries(merged))
61
+ if (keep.has(k))
62
+ pruned[k] = v;
63
+ merged = pruned;
64
+ }
65
+ for (const e of opts.deleteEntries ?? []) {
66
+ if (typeof e === 'string')
67
+ delete merged[e];
68
+ }
69
+ const entries = opts.map instanceof Map
70
+ ? opts.map.entries()
71
+ : Object.entries(opts.map);
72
+ for (const [k, v] of entries) {
73
+ if (typeof k === 'string' && typeof v === 'string' && v.startsWith('ou_'))
74
+ merged[k] = v;
75
+ }
76
+ atomicWriteFileSync(allowedUsersCachePath(dataDir, larkAppId), JSON.stringify({ map: merged, updatedAt: Date.now() }), { mode: 0o600 });
77
+ }
78
+ catch (err) {
79
+ logger.debug(`[${larkAppId}] failed to persist allowedUsers cache: ${err?.message ?? err}`);
80
+ }
81
+ }
82
+ //# sourceMappingURL=allowed-users-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-users-cache.js","sourceRoot":"","sources":["../../src/utils/allowed-users-cache.ts"],"names":[],"mappings":"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"}
@@ -77,7 +77,8 @@ export declare const BOTMUX_INJECTED_ENV_KEYS: readonly ["__OWNER_OPEN_ID", "BOT
77
77
  /** Proxy env vars that must reach the CLI child process so it can dial the
78
78
  * upstream API on hosts without direct internet access. Forwarded explicitly
79
79
  * by buildBotmuxEnvAssignments (tmux/tmux-pipe/zellij backends) and
80
- * prepareSandbox (bwrap); the pty backend inherits them via the full child env.
80
+ * prepareDirectSandbox (bwrap --setenv); the pty backend inherits them via the
81
+ * full child env.
81
82
  * Deliberately NOT in BOTMUX_INJECTED_ENV_KEYS: that list drives tmuxEnv()
82
83
  * stripping and scrubTmuxServerGlobalEnv() cleanup — adding proxy keys there
83
84
  * would delete the user's own tmux server proxy config. */
@@ -1 +1 @@
1
- {"version":3,"file":"child-env.d.ts","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,4GAiB1B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,yBAAyB,8CAA+C,CAAC;AAEtF;;;iBAGiB;AACjB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,qpBA+C3B,CAAC;AAEX;;;;;;4DAM4D;AAC5D,eAAO,MAAM,cAAc,uHAGjB,CAAC;AAsBX;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAIzE"}
1
+ {"version":3,"file":"child-env.d.ts","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,4GAiB1B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,yBAAyB,8CAA+C,CAAC;AAEtF;;;iBAGiB;AACjB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,qpBA+C3B,CAAC;AAEX;;;;;;;4DAO4D;AAC5D,eAAO,MAAM,cAAc,uHAGjB,CAAC;AAsBX;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAIzE"}
@@ -144,7 +144,8 @@ export const BOTMUX_INJECTED_ENV_KEYS = [
144
144
  /** Proxy env vars that must reach the CLI child process so it can dial the
145
145
  * upstream API on hosts without direct internet access. Forwarded explicitly
146
146
  * by buildBotmuxEnvAssignments (tmux/tmux-pipe/zellij backends) and
147
- * prepareSandbox (bwrap); the pty backend inherits them via the full child env.
147
+ * prepareDirectSandbox (bwrap --setenv); the pty backend inherits them via the
148
+ * full child env.
148
149
  * Deliberately NOT in BOTMUX_INJECTED_ENV_KEYS: that list drives tmuxEnv()
149
150
  * stripping and scrubTmuxServerGlobalEnv() cleanup — adding proxy keys there
150
151
  * would delete the user's own tmux server proxy config. */
@@ -1 +1 @@
1
- {"version":3,"file":"child-env.js","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"child-env.js","sourceRoot":"","sources":["../../src/utils/child-env.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,32 @@ export interface CliUsageLimitNotDetected {
10
10
  limited: false;
11
11
  }
12
12
  export type CliUsageLimitDetection = CliUsageLimitState | CliUsageLimitNotDetected;
13
- export declare function detectCliUsageLimit(text: string, now?: Date): CliUsageLimitDetection;
13
+ export declare const HARD_RATE_LIMIT_COOLDOWN_MS: number;
14
+ export interface DetectUsageLimitOptions {
15
+ /**
16
+ * Suppress the screen-scan `rate` verdict entirely. Set for CLIs that have an
17
+ * authoritative structured rate-limit signal (Claude family via transcript
18
+ * `error:"rate_limit"`): there, scraping the screen for "429" / "rate limit"
19
+ * only produces false positives (the model's own output, or a dev editing
20
+ * rate-limit code, puts those phrases on screen). `usage` quota detection is
21
+ * unaffected — it has no structured equivalent yet.
22
+ */
23
+ suppressRateKind?: boolean;
24
+ }
25
+ export declare function detectCliUsageLimit(text: string, now?: Date, opts?: DetectUsageLimitOptions): CliUsageLimitDetection;
14
26
  export declare function usageLimitStateKey(state: CliUsageLimitState): string;
27
+ /**
28
+ * Build a rate-limit state from a STRUCTURED signal (e.g. Claude Code's
29
+ * transcript `error: "rate_limit"` record) instead of screen text.
30
+ *
31
+ * The caller has already decided this IS a rate limit via a machine field, so
32
+ * unlike detectCliUsageLimit() there is no pattern gate here — we only need to
33
+ * fix the retry time. Claude's rate-limit records usually carry a human clock
34
+ * in their text ("You've hit your session limit · resets 10:40pm"); when
35
+ * `text` yields a parseable time we honor it (accurate retry_ready flip),
36
+ * otherwise we reuse the same wall-clock-bucketed fallback the screen-text
37
+ * hard-429 path uses so the usageLimitStateKey stays stable across repeated
38
+ * ticks within a bucket (no persist/timer churn on the daemon side).
39
+ */
40
+ export declare function structuredRateLimitState(text?: string, now?: Date): CliUsageLimitState;
15
41
  //# sourceMappingURL=cli-usage-limit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-usage-limit.d.ts","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,wBAAwB,CAAC;AAuDnF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,sBAAsB,CAwB1F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEpE"}
1
+ {"version":3,"file":"cli-usage-limit.d.ts","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,wBAAwB,CAAC;AAoCnF,eAAO,MAAM,2BAA2B,QAAgB,CAAC;AA0DzD,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,OAAa,EAChB,IAAI,GAAE,uBAA4B,GACjC,sBAAsB,CAsCxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAK,EAAE,GAAG,OAAa,GAAG,kBAAkB,CAUxF"}
@@ -7,7 +7,29 @@ const USAGE_LIMIT_PATTERNS = [
7
7
  const RATE_LIMIT_PATTERNS = [
8
8
  /\brate limits?.*(?:reached|exceeded)\b/i,
9
9
  /\brate limited\b/i,
10
+ // HTTP-style hard rate limits from CLI/provider retries (Codex/OpenAI path).
11
+ // Anchor 429 to rate-limit context. A bare /\b429\b/ (or a bare "too many
12
+ // requests") false-positives on ordinary TUI content — port numbers, log
13
+ // line numbers, and especially agent command output (e.g. code/docs that
14
+ // literally print "Too Many Requests"). This detector runs on every screen
15
+ // frame, so keep it tight: only 429 that sits next to a status word or the
16
+ // full "429 Too Many Requests" phrase, plus the explicit retry-exhaustion line.
17
+ /status:\s*429\b/i,
18
+ /\b429\s+too many requests\b/i,
19
+ /\bexceeded retry limit\b/i,
10
20
  ];
21
+ // Hard rate-limit signatures that often omit a wall-clock retry time.
22
+ // Only these get the fixed-cooldown fallback so generic "try again later"
23
+ // usage copy stays non-blocking (existing product decision). Same tightened
24
+ // contexts as above — never a bare 429 / bare "too many requests".
25
+ const HARD_RATE_LIMIT_WITHOUT_TIME_PATTERNS = [
26
+ /status:\s*429\b/i,
27
+ /\b429\s+too many requests\b/i,
28
+ /\bexceeded retry limit\b/i,
29
+ ];
30
+ // Quantized cooldown for hard 429-style errors without a parseable clock time.
31
+ // Bucketed so repeated screen ticks produce a stable usageLimitStateKey.
32
+ export const HARD_RATE_LIMIT_COOLDOWN_MS = 5 * 60 * 1000;
11
33
  const RETRY_TIME_PATTERNS = [
12
34
  /\btry\s+again\s+at\s+(\d{1,2})(?::(\d{2}))?\s*([ap]\.?m\.?)\b/i,
13
35
  /\bresets?(?:\s+at)?\s+(\d{1,2})(?::(\d{2}))?\s*([ap]\.?m\.?)\b/i,
@@ -46,31 +68,81 @@ function parseMeridiemTime(text, now) {
46
68
  }
47
69
  return null;
48
70
  }
49
- export function detectCliUsageLimit(text, now = new Date()) {
50
- // Hot path: runs on every screen tick for every active session. The retry
51
- // patterns all require the literal "again" or "reset", so gate the heavier
52
- // regex work behind one cheap scan to skip it for the >99% no-limit case.
53
- if (!/again|reset/i.test(text))
71
+ /** Stable fixed cooldown pinned to wall-clock buckets for hard 429 fallbacks. */
72
+ function hardRateLimitFallbackTime(now) {
73
+ const nowMs = now.getTime();
74
+ const bucketStart = Math.floor(nowMs / HARD_RATE_LIMIT_COOLDOWN_MS) * HARD_RATE_LIMIT_COOLDOWN_MS;
75
+ // End of the *next* full bucket so the wait is always in (5min, 10min].
76
+ // Within one bucket every screen tick returns the same retryAtMs/key.
77
+ const retryAtMs = bucketStart + 2 * HARD_RATE_LIMIT_COOLDOWN_MS;
78
+ return {
79
+ retryAtMs,
80
+ // Label reflects the real (5min, 10min] window, not an optimistic "~5 min":
81
+ // the card's countdown text must not undersell how long the wait can be.
82
+ retryLabel: '5-10 min',
83
+ };
84
+ }
85
+ export function detectCliUsageLimit(text, now = new Date(), opts = {}) {
86
+ // Hot path: runs on every screen tick for every active session. Gate heavier
87
+ // regex work behind one cheap scan for the >99% no-limit case.
88
+ // Include 429 / retry-limit tokens — "retry" does not contain "again".
89
+ if (!/again|reset|429|too many requests|rate limit|retry limit/i.test(text)) {
54
90
  return { limited: false };
91
+ }
55
92
  const time = parseMeridiemTime(text, now);
56
- if (!time)
93
+ const isRate = !opts.suppressRateKind && hasPattern(text, RATE_LIMIT_PATTERNS);
94
+ const isUsage = !isRate && hasPattern(text, USAGE_LIMIT_PATTERNS);
95
+ if (!isRate && !isUsage)
57
96
  return { limited: false };
58
- const kind = hasPattern(text, RATE_LIMIT_PATTERNS)
59
- ? 'rate'
60
- : hasPattern(text, USAGE_LIMIT_PATTERNS)
61
- ? 'usage'
62
- : null;
63
- if (!kind)
64
- return { limited: false };
65
- return {
66
- limited: true,
67
- kind,
68
- retryAtMs: time.retryAtMs,
69
- retryLabel: time.retryLabel,
70
- retryReady: now.getTime() >= time.retryAtMs,
71
- };
97
+ if (time) {
98
+ return {
99
+ limited: true,
100
+ kind: isRate ? 'rate' : 'usage',
101
+ retryAtMs: time.retryAtMs,
102
+ retryLabel: time.retryLabel,
103
+ retryReady: now.getTime() >= time.retryAtMs,
104
+ };
105
+ }
106
+ // Usage limits without a concrete clock time stay non-blocking (existing tests).
107
+ // Hard HTTP 429 / exceeded-retry-limit paths get a stable cooldown fallback so
108
+ // the session can still surface as limited → Dashboard「需要你」.
109
+ if (isRate && hasPattern(text, HARD_RATE_LIMIT_WITHOUT_TIME_PATTERNS)) {
110
+ const fallback = hardRateLimitFallbackTime(now);
111
+ return {
112
+ limited: true,
113
+ kind: 'rate',
114
+ retryAtMs: fallback.retryAtMs,
115
+ retryLabel: fallback.retryLabel,
116
+ retryReady: now.getTime() >= fallback.retryAtMs,
117
+ };
118
+ }
119
+ return { limited: false };
72
120
  }
73
121
  export function usageLimitStateKey(state) {
74
122
  return `${state.kind}:${state.retryAtMs}:${state.retryLabel}`;
75
123
  }
124
+ /**
125
+ * Build a rate-limit state from a STRUCTURED signal (e.g. Claude Code's
126
+ * transcript `error: "rate_limit"` record) instead of screen text.
127
+ *
128
+ * The caller has already decided this IS a rate limit via a machine field, so
129
+ * unlike detectCliUsageLimit() there is no pattern gate here — we only need to
130
+ * fix the retry time. Claude's rate-limit records usually carry a human clock
131
+ * in their text ("You've hit your session limit · resets 10:40pm"); when
132
+ * `text` yields a parseable time we honor it (accurate retry_ready flip),
133
+ * otherwise we reuse the same wall-clock-bucketed fallback the screen-text
134
+ * hard-429 path uses so the usageLimitStateKey stays stable across repeated
135
+ * ticks within a bucket (no persist/timer churn on the daemon side).
136
+ */
137
+ export function structuredRateLimitState(text = '', now = new Date()) {
138
+ const parsed = parseMeridiemTime(text, now);
139
+ const { retryAtMs, retryLabel } = parsed ?? hardRateLimitFallbackTime(now);
140
+ return {
141
+ limited: true,
142
+ kind: 'rate',
143
+ retryAtMs,
144
+ retryLabel,
145
+ retryReady: now.getTime() >= retryAtMs,
146
+ };
147
+ }
76
148
  //# sourceMappingURL=cli-usage-limit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,8 @@ export declare function shouldWriteNow(state: {
27
27
  supportsTypeAhead: boolean;
28
28
  /** True until the CLI has reached its first ready state (boot / re-attach window). */
29
29
  awaitingFirstPrompt: boolean;
30
+ /** A stale Codex App runner must not receive normal or type-ahead input. */
31
+ holdForRunnerReload?: boolean;
30
32
  }): boolean;
31
33
  /**
32
34
  * Claude runs every matching SessionStart hook in parallel and waits for all of
@@ -1 +1 @@
1
- {"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAIV;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2CAA2C,CAAC,KAAK,EAAE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAMV;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,sEAAsE;IACtE,iCAAiC,EAAE,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAIV;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,sBAAsB,EAAE,OAAO,CAAC;IAChC,+BAA+B,EAAE,OAAO,CAAC;IACzC,0BAA0B,EAAE,OAAO,CAAC;CACrC,GAAG,OAAO,CAEV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,CAE1F"}
1
+ {"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,OAAO,CAKV;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2CAA2C,CAAC,KAAK,EAAE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAMV;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,sEAAsE;IACtE,iCAAiC,EAAE,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAIV;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,sBAAsB,EAAE,OAAO,CAAC;IAChC,+BAA+B,EAAE,OAAO,CAAC;IACzC,0BAA0B,EAAE,OAAO,CAAC;CACrC,GAAG,OAAO,CAEV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,CAE1F"}
@@ -19,6 +19,8 @@
19
19
  * QUEUE even type-ahead messages and let `markPromptReady()`'s flush deliver them.
20
20
  */
21
21
  export function shouldWriteNow(state) {
22
+ if (state.holdForRunnerReload)
23
+ return false;
22
24
  if (state.isPromptReady || state.isFlushing)
23
25
  return true;
24
26
  // Type-ahead is only safe after the TUI has booted at least once.
@@ -1 +1 @@
1
- {"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,KAS9B;IACC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACzD,kEAAkE;IAClE,OAAO,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2CAA2C,CAAC,KAM3D;IACC,OAAO,KAAK,CAAC,cAAc;WACtB,KAAK,CAAC,eAAe;WACrB,KAAK,CAAC,mBAAmB;WACzB,CAAC,KAAK,CAAC,aAAa;WACpB,CAAC,KAAK,CAAC,cAAc,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAS/C;IACC,IAAI,CAAC,KAAK,CAAC,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,OAAO,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,CAAC,0BAA0B,CAAC;AACnH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,iBAA0B;IAChE,OAAO,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,KAW9B;IACC,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACzD,kEAAkE;IAClE,OAAO,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2CAA2C,CAAC,KAM3D;IACC,OAAO,KAAK,CAAC,cAAc;WACtB,KAAK,CAAC,eAAe;WACrB,KAAK,CAAC,mBAAmB;WACzB,CAAC,KAAK,CAAC,aAAa;WACpB,CAAC,KAAK,CAAC,cAAc,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAS/C;IACC,IAAI,CAAC,KAAK,CAAC,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,OAAO,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,CAAC,0BAA0B,CAAC;AACnH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,iBAA0B;IAChE,OAAO,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;AACpD,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface RuntimeBuildEntry {
2
+ path: string;
3
+ content: string | Buffer;
4
+ }
5
+ export type RuntimeBuildIdentity = {
6
+ status: 'known';
7
+ id: string;
8
+ source: 'artifact' | 'source';
9
+ } | {
10
+ status: 'unknown';
11
+ reason: 'artifact_invalid' | 'source_unavailable' | 'read_failed';
12
+ };
13
+ export declare function computeRuntimeBuildId(entries: readonly RuntimeBuildEntry[]): string;
14
+ export declare function isRuntimeBuildId(value: unknown): value is string;
15
+ export declare function collectCompiledRuntimeEntries(sourceRoot: string, distRoot: string): RuntimeBuildEntry[];
16
+ export declare function resolveRuntimeBuildIdentity(options: {
17
+ artifactPath: string;
18
+ sourceRoot?: string;
19
+ }): RuntimeBuildIdentity;
20
+ export declare function runtimeBuildIdentity(): RuntimeBuildIdentity;
21
+ //# sourceMappingURL=runtime-build-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-build-id.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-build-id.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,aAAa,CAAA;CAAE,CAAC;AAK7F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAUnF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAwBD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,iBAAiB,EAAE,CAKrB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,oBAAoB,CAsBvB;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,CAQ3D"}