@smthrs/gateway 0.35.0 → 1.0.0-rc.3

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 (605) hide show
  1. package/CHANGELOG.md +198 -0
  2. package/LICENSE +1 -1
  3. package/README.md +92 -0
  4. package/dist/cjs/Diagnosis.d.ts +275 -0
  5. package/dist/cjs/Diagnosis.d.ts.map +1 -0
  6. package/dist/cjs/Diagnosis.js +476 -0
  7. package/dist/cjs/Diagnosis.js.map +7 -0
  8. package/dist/cjs/EngineTrace.d.ts +76 -0
  9. package/dist/cjs/EngineTrace.d.ts.map +1 -0
  10. package/dist/cjs/EngineTrace.js +501 -0
  11. package/dist/cjs/EngineTrace.js.map +7 -0
  12. package/dist/cjs/GatewayError.d.ts +54 -0
  13. package/dist/cjs/GatewayError.d.ts.map +1 -0
  14. package/dist/cjs/GatewayError.js +51 -0
  15. package/dist/cjs/GatewayError.js.map +7 -0
  16. package/dist/cjs/GatewayProjection.d.ts +480 -0
  17. package/dist/cjs/GatewayProjection.d.ts.map +1 -0
  18. package/dist/cjs/GatewayProjection.js +462 -0
  19. package/dist/cjs/GatewayProjection.js.map +7 -0
  20. package/dist/cjs/GatewayRpcs.d.ts +1886 -0
  21. package/dist/cjs/GatewayRpcs.d.ts.map +1 -0
  22. package/dist/cjs/GatewayRpcs.js +121 -0
  23. package/dist/cjs/GatewayRpcs.js.map +7 -0
  24. package/dist/cjs/GatewaySchema.d.ts +3274 -0
  25. package/dist/cjs/GatewaySchema.d.ts.map +1 -0
  26. package/dist/cjs/GatewaySchema.js +141 -0
  27. package/dist/cjs/GatewaySchema.js.map +7 -0
  28. package/dist/cjs/GatewayServer.d.ts +427 -0
  29. package/dist/cjs/GatewayServer.d.ts.map +1 -0
  30. package/dist/cjs/GatewayServer.js +428 -0
  31. package/dist/cjs/GatewayServer.js.map +7 -0
  32. package/dist/cjs/HostBranchPresence.d.ts +12 -0
  33. package/dist/cjs/HostBranchPresence.d.ts.map +1 -0
  34. package/dist/cjs/HostBranchPresence.js +82 -0
  35. package/dist/cjs/HostBranchPresence.js.map +7 -0
  36. package/dist/cjs/Projections.d.ts +209 -0
  37. package/dist/cjs/Projections.d.ts.map +1 -0
  38. package/dist/cjs/Projections.js +906 -0
  39. package/dist/cjs/Projections.js.map +7 -0
  40. package/dist/cjs/RunDevTools.d.ts +181 -0
  41. package/dist/cjs/RunDevTools.d.ts.map +1 -0
  42. package/dist/cjs/RunDevTools.js +195 -0
  43. package/dist/cjs/RunDevTools.js.map +7 -0
  44. package/dist/cjs/RunHistory.d.ts +185 -0
  45. package/dist/cjs/RunHistory.d.ts.map +1 -0
  46. package/dist/cjs/RunHistory.js +68 -0
  47. package/dist/cjs/RunHistory.js.map +7 -0
  48. package/dist/cjs/RunTrace.d.ts +753 -0
  49. package/dist/cjs/RunTrace.d.ts.map +1 -0
  50. package/dist/cjs/RunTrace.js +1593 -0
  51. package/dist/cjs/RunTrace.js.map +7 -0
  52. package/dist/cjs/RuntimeBridge.d.ts +1386 -0
  53. package/dist/cjs/RuntimeBridge.d.ts.map +1 -0
  54. package/dist/cjs/RuntimeBridge.js +598 -0
  55. package/dist/cjs/RuntimeBridge.js.map +7 -0
  56. package/dist/cjs/bun/BunGateway.d.ts +20 -0
  57. package/dist/cjs/bun/BunGateway.d.ts.map +1 -0
  58. package/dist/cjs/bun/BunGateway.js +62 -0
  59. package/dist/cjs/bun/BunGateway.js.map +7 -0
  60. package/dist/cjs/index.d.ts +65 -0
  61. package/dist/cjs/index.d.ts.map +1 -0
  62. package/dist/cjs/index.js +59 -0
  63. package/dist/cjs/index.js.map +7 -0
  64. package/dist/cjs/internal/NativeGateway.d.ts +176 -0
  65. package/dist/cjs/internal/NativeGateway.d.ts.map +1 -0
  66. package/dist/cjs/internal/NativeGateway.js +187 -0
  67. package/dist/cjs/internal/NativeGateway.js.map +7 -0
  68. package/dist/cjs/internal/actionRenderings.d.ts +2 -0
  69. package/dist/cjs/internal/actionRenderings.d.ts.map +1 -0
  70. package/dist/cjs/internal/actionRenderings.js +224 -0
  71. package/dist/cjs/internal/actionRenderings.js.map +7 -0
  72. package/dist/cjs/internal/callEvents.d.ts +97 -0
  73. package/dist/cjs/internal/callEvents.d.ts.map +1 -0
  74. package/dist/cjs/internal/callEvents.js +169 -0
  75. package/dist/cjs/internal/callEvents.js.map +7 -0
  76. package/dist/cjs/internal/digestIndex.d.ts +31 -0
  77. package/dist/cjs/internal/digestIndex.d.ts.map +1 -0
  78. package/dist/cjs/internal/digestIndex.js +105 -0
  79. package/dist/cjs/internal/digestIndex.js.map +7 -0
  80. package/dist/cjs/internal/digestMemory.d.ts +19 -0
  81. package/dist/cjs/internal/digestMemory.d.ts.map +1 -0
  82. package/dist/cjs/internal/digestMemory.js +33 -0
  83. package/dist/cjs/internal/digestMemory.js.map +7 -0
  84. package/dist/cjs/internal/inspectLabels.d.ts +8 -0
  85. package/dist/cjs/internal/inspectLabels.d.ts.map +1 -0
  86. package/dist/cjs/internal/inspectLabels.js +29 -0
  87. package/dist/cjs/internal/inspectLabels.js.map +7 -0
  88. package/dist/cjs/internal/nativeResolution.d.ts +41 -0
  89. package/dist/cjs/internal/nativeResolution.d.ts.map +1 -0
  90. package/dist/cjs/internal/nativeResolution.js +62 -0
  91. package/dist/cjs/internal/nativeResolution.js.map +7 -0
  92. package/dist/cjs/internal/nodeEvents.d.ts +47 -0
  93. package/dist/cjs/internal/nodeEvents.d.ts.map +1 -0
  94. package/dist/cjs/internal/nodeEvents.js +60 -0
  95. package/dist/cjs/internal/nodeEvents.js.map +7 -0
  96. package/dist/cjs/node/NodeGateway.d.ts +16 -0
  97. package/dist/cjs/node/NodeGateway.d.ts.map +1 -0
  98. package/dist/cjs/node/NodeGateway.js +48 -0
  99. package/dist/cjs/node/NodeGateway.js.map +7 -0
  100. package/dist/cjs/package.json +1 -0
  101. package/dist/esm/Diagnosis.d.ts +275 -0
  102. package/dist/esm/Diagnosis.d.ts.map +1 -0
  103. package/dist/esm/Diagnosis.js +697 -0
  104. package/dist/esm/Diagnosis.js.map +1 -0
  105. package/dist/esm/EngineTrace.d.ts +76 -0
  106. package/dist/esm/EngineTrace.d.ts.map +1 -0
  107. package/dist/esm/EngineTrace.js +548 -0
  108. package/dist/esm/EngineTrace.js.map +1 -0
  109. package/dist/esm/GatewayError.d.ts +54 -0
  110. package/dist/esm/GatewayError.d.ts.map +1 -0
  111. package/dist/esm/GatewayError.js +60 -0
  112. package/dist/esm/GatewayError.js.map +1 -0
  113. package/dist/esm/GatewayProjection.d.ts +480 -0
  114. package/dist/esm/GatewayProjection.d.ts.map +1 -0
  115. package/dist/esm/GatewayProjection.js +792 -0
  116. package/dist/esm/GatewayProjection.js.map +1 -0
  117. package/dist/esm/GatewayRpcs.d.ts +1886 -0
  118. package/dist/esm/GatewayRpcs.d.ts.map +1 -0
  119. package/dist/esm/GatewayRpcs.js +145 -0
  120. package/dist/esm/GatewayRpcs.js.map +1 -0
  121. package/dist/esm/GatewaySchema.d.ts +3274 -0
  122. package/dist/esm/GatewaySchema.d.ts.map +1 -0
  123. package/dist/esm/GatewaySchema.js +244 -0
  124. package/dist/esm/GatewaySchema.js.map +1 -0
  125. package/dist/esm/GatewayServer.d.ts +427 -0
  126. package/dist/esm/GatewayServer.d.ts.map +1 -0
  127. package/dist/esm/GatewayServer.js +725 -0
  128. package/dist/esm/GatewayServer.js.map +1 -0
  129. package/dist/esm/HostBranchPresence.d.ts +12 -0
  130. package/dist/esm/HostBranchPresence.d.ts.map +1 -0
  131. package/dist/esm/HostBranchPresence.js +54 -0
  132. package/dist/esm/HostBranchPresence.js.map +1 -0
  133. package/dist/esm/Projections.d.ts +209 -0
  134. package/dist/esm/Projections.d.ts.map +1 -0
  135. package/dist/esm/Projections.js +1254 -0
  136. package/dist/esm/Projections.js.map +1 -0
  137. package/dist/esm/RunDevTools.d.ts +181 -0
  138. package/dist/esm/RunDevTools.d.ts.map +1 -0
  139. package/dist/esm/RunDevTools.js +281 -0
  140. package/dist/esm/RunDevTools.js.map +1 -0
  141. package/dist/esm/RunHistory.d.ts +185 -0
  142. package/dist/esm/RunHistory.d.ts.map +1 -0
  143. package/dist/esm/RunHistory.js +109 -0
  144. package/dist/esm/RunHistory.js.map +1 -0
  145. package/dist/esm/RunTrace.d.ts +753 -0
  146. package/dist/esm/RunTrace.d.ts.map +1 -0
  147. package/dist/esm/RunTrace.js +2105 -0
  148. package/dist/esm/RunTrace.js.map +1 -0
  149. package/dist/esm/RuntimeBridge.d.ts +1386 -0
  150. package/dist/esm/RuntimeBridge.d.ts.map +1 -0
  151. package/dist/esm/RuntimeBridge.js +659 -0
  152. package/dist/esm/RuntimeBridge.js.map +1 -0
  153. package/dist/esm/bun/BunGateway.d.ts +20 -0
  154. package/dist/esm/bun/BunGateway.d.ts.map +1 -0
  155. package/dist/esm/bun/BunGateway.js +32 -0
  156. package/dist/esm/bun/BunGateway.js.map +1 -0
  157. package/dist/esm/index.d.ts +65 -0
  158. package/dist/esm/index.d.ts.map +1 -0
  159. package/dist/esm/index.js +65 -0
  160. package/dist/esm/index.js.map +1 -0
  161. package/dist/esm/internal/NativeGateway.d.ts +176 -0
  162. package/dist/esm/internal/NativeGateway.d.ts.map +1 -0
  163. package/dist/esm/internal/NativeGateway.js +268 -0
  164. package/dist/esm/internal/NativeGateway.js.map +1 -0
  165. package/dist/esm/internal/actionRenderings.d.ts +2 -0
  166. package/dist/esm/internal/actionRenderings.d.ts.map +1 -0
  167. package/dist/esm/internal/actionRenderings.js +202 -0
  168. package/dist/esm/internal/actionRenderings.js.map +1 -0
  169. package/dist/esm/internal/callEvents.d.ts +97 -0
  170. package/dist/esm/internal/callEvents.d.ts.map +1 -0
  171. package/dist/esm/internal/callEvents.js +206 -0
  172. package/dist/esm/internal/callEvents.js.map +1 -0
  173. package/dist/esm/internal/digestIndex.d.ts +31 -0
  174. package/dist/esm/internal/digestIndex.d.ts.map +1 -0
  175. package/dist/esm/internal/digestIndex.js +87 -0
  176. package/dist/esm/internal/digestIndex.js.map +1 -0
  177. package/dist/esm/internal/digestMemory.d.ts +19 -0
  178. package/dist/esm/internal/digestMemory.d.ts.map +1 -0
  179. package/dist/esm/internal/digestMemory.js +23 -0
  180. package/dist/esm/internal/digestMemory.js.map +1 -0
  181. package/dist/esm/internal/inspectLabels.d.ts +8 -0
  182. package/dist/esm/internal/inspectLabels.d.ts.map +1 -0
  183. package/dist/esm/internal/inspectLabels.js +12 -0
  184. package/dist/esm/internal/inspectLabels.js.map +1 -0
  185. package/dist/esm/internal/nativeResolution.d.ts +41 -0
  186. package/dist/esm/internal/nativeResolution.d.ts.map +1 -0
  187. package/dist/esm/internal/nativeResolution.js +78 -0
  188. package/dist/esm/internal/nativeResolution.js.map +1 -0
  189. package/dist/esm/internal/nodeEvents.d.ts +47 -0
  190. package/dist/esm/internal/nodeEvents.d.ts.map +1 -0
  191. package/dist/esm/internal/nodeEvents.js +60 -0
  192. package/dist/esm/internal/nodeEvents.js.map +1 -0
  193. package/dist/esm/node/NodeGateway.d.ts +16 -0
  194. package/dist/esm/node/NodeGateway.d.ts.map +1 -0
  195. package/dist/esm/node/NodeGateway.js +13 -0
  196. package/dist/esm/node/NodeGateway.js.map +1 -0
  197. package/dist/vendor/adapters.json +2707 -0
  198. package/dist/vendor/bun/BunChildProcessSpawner.d.ts +7 -0
  199. package/dist/vendor/bun/BunChildProcessSpawner.js +14 -0
  200. package/dist/vendor/bun/BunClusterHttp.d.ts +83 -0
  201. package/dist/vendor/bun/BunClusterHttp.js +39 -0
  202. package/dist/vendor/bun/BunClusterSocket.d.ts +65 -0
  203. package/dist/vendor/bun/BunClusterSocket.js +22 -0
  204. package/dist/vendor/bun/BunCrypto.d.ts +10 -0
  205. package/dist/vendor/bun/BunCrypto.js +8 -0
  206. package/dist/vendor/bun/BunFileSystem.d.ts +10 -0
  207. package/dist/vendor/bun/BunFileSystem.js +9 -0
  208. package/dist/vendor/bun/BunHttpClient.d.ts +9 -0
  209. package/dist/vendor/bun/BunHttpClient.js +1 -0
  210. package/dist/vendor/bun/BunHttpPlatform.d.ts +10 -0
  211. package/dist/vendor/bun/BunHttpPlatform.js +11 -0
  212. package/dist/vendor/bun/BunHttpServer.d.ts +142 -0
  213. package/dist/vendor/bun/BunHttpServer.js +38 -0
  214. package/dist/vendor/bun/BunHttpServerRequest.d.ts +18 -0
  215. package/dist/vendor/bun/BunHttpServerRequest.js +7 -0
  216. package/dist/vendor/bun/BunMultipart.d.ts +31 -0
  217. package/dist/vendor/bun/BunMultipart.js +12 -0
  218. package/dist/vendor/bun/BunPath.d.ts +24 -0
  219. package/dist/vendor/bun/BunPath.js +12 -0
  220. package/dist/vendor/bun/BunRedis.d.ts +49 -0
  221. package/dist/vendor/bun/BunRedis.js +11 -0
  222. package/dist/vendor/bun/BunRuntime.d.ts +85 -0
  223. package/dist/vendor/bun/BunRuntime.js +8 -0
  224. package/dist/vendor/bun/BunServices.d.ts +34 -0
  225. package/dist/vendor/bun/BunServices.js +23 -0
  226. package/dist/vendor/bun/BunSink.d.ts +8 -0
  227. package/dist/vendor/bun/BunSink.js +12 -0
  228. package/dist/vendor/bun/BunSocket.d.ts +40 -0
  229. package/dist/vendor/bun/BunSocket.js +29 -0
  230. package/dist/vendor/bun/BunSocketServer.d.ts +8 -0
  231. package/dist/vendor/bun/BunSocketServer.js +21 -0
  232. package/dist/vendor/bun/BunStdio.d.ts +11 -0
  233. package/dist/vendor/bun/BunStdio.js +10 -0
  234. package/dist/vendor/bun/BunStream.d.ts +19 -0
  235. package/dist/vendor/bun/BunStream.js +30 -0
  236. package/dist/vendor/bun/BunTerminal.d.ts +21 -0
  237. package/dist/vendor/bun/BunTerminal.js +10 -0
  238. package/dist/vendor/bun/BunWorker.d.ts +20 -0
  239. package/dist/vendor/bun/BunWorker.js +9 -0
  240. package/dist/vendor/bun/BunWorkerRunner.d.ts +12 -0
  241. package/dist/vendor/bun/BunWorkerRunner.js +7 -0
  242. package/dist/vendor/bun/LICENSE +21 -0
  243. package/dist/vendor/bun/index.d.ts +92 -0
  244. package/dist/vendor/bun/index.js +107 -0
  245. package/dist/vendor/chunk-2GCOZTTW.js +48 -0
  246. package/dist/vendor/chunk-37CUR3PO.js +81 -0
  247. package/dist/vendor/chunk-3ARKKENZ.js +45 -0
  248. package/dist/vendor/chunk-3NV2UDBI.js +7 -0
  249. package/dist/vendor/chunk-3OSW7CT7.js +143 -0
  250. package/dist/vendor/chunk-62R63L74.js +62 -0
  251. package/dist/vendor/chunk-6AQLBC2I.js +118 -0
  252. package/dist/vendor/chunk-6C5H7S6B.js +18 -0
  253. package/dist/vendor/chunk-6DY5RBZD.js +85 -0
  254. package/dist/vendor/chunk-6UPBD47P.js +53 -0
  255. package/dist/vendor/chunk-AVVVN75Z.js +96 -0
  256. package/dist/vendor/chunk-B4DHEMBB.js +14 -0
  257. package/dist/vendor/chunk-BCK3NJOX.js +15 -0
  258. package/dist/vendor/chunk-BFBIHJ6X.js +0 -0
  259. package/dist/vendor/chunk-CES4OUM4.js +63 -0
  260. package/dist/vendor/chunk-D64L6YND.js +59 -0
  261. package/dist/vendor/chunk-DS2R6WOM.js +18 -0
  262. package/dist/vendor/chunk-DX4Z23DM.js +65 -0
  263. package/dist/vendor/chunk-DZ2VOUDP.js +564 -0
  264. package/dist/vendor/chunk-FOXN6JPJ.js +61 -0
  265. package/dist/vendor/chunk-FPQF7CR5.js +55 -0
  266. package/dist/vendor/chunk-FUTCTCEG.js +20 -0
  267. package/dist/vendor/chunk-GUPAV2YZ.js +18 -0
  268. package/dist/vendor/chunk-H2Z2Y4QH.js +70 -0
  269. package/dist/vendor/chunk-HAEDVSSM.js +129 -0
  270. package/dist/vendor/chunk-HY7BBL3K.js +93 -0
  271. package/dist/vendor/chunk-IFTTT6D5.js +31 -0
  272. package/dist/vendor/chunk-KQDSNB7M.js +26 -0
  273. package/dist/vendor/chunk-LIHLXXGQ.js +26 -0
  274. package/dist/vendor/chunk-LKCGQEE5.js +28 -0
  275. package/dist/vendor/chunk-MH2J3BYB.js +0 -0
  276. package/dist/vendor/chunk-ML2NAFH2.js +131 -0
  277. package/dist/vendor/chunk-MLFIZ5O2.js +0 -0
  278. package/dist/vendor/chunk-MLKGABMK.js +9 -0
  279. package/dist/vendor/chunk-MSCLEMYX.js +71 -0
  280. package/dist/vendor/chunk-OBWXQKVP.js +57 -0
  281. package/dist/vendor/chunk-QR557K66.js +20 -0
  282. package/dist/vendor/chunk-R4QUY7DH.js +18 -0
  283. package/dist/vendor/chunk-RGECXXJS.js +18 -0
  284. package/dist/vendor/chunk-TFY7W6D4.js +36 -0
  285. package/dist/vendor/chunk-TGPIVY4A.js +104 -0
  286. package/dist/vendor/chunk-TGXCX6W3.js +398 -0
  287. package/dist/vendor/chunk-TOHSFXMV.js +437 -0
  288. package/dist/vendor/chunk-UHIDPUFF.js +34 -0
  289. package/dist/vendor/chunk-ULT6CWUI.js +109 -0
  290. package/dist/vendor/chunk-UXBGYQR3.js +18 -0
  291. package/dist/vendor/chunk-V6LUGQ7O.js +21 -0
  292. package/dist/vendor/chunk-W4OASVX6.js +92 -0
  293. package/dist/vendor/chunk-WAII54GA.js +18 -0
  294. package/dist/vendor/chunk-WECQDT36.js +426 -0
  295. package/dist/vendor/chunk-WHKMOC7Z.js +28 -0
  296. package/dist/vendor/chunk-WVFOZ2UL.js +40 -0
  297. package/dist/vendor/chunk-X73E2UPI.js +18 -0
  298. package/dist/vendor/chunk-XCYARUII.js +63 -0
  299. package/dist/vendor/chunk-XFEVTDVD.js +34 -0
  300. package/dist/vendor/chunk-XFZZYSJ4.js +22 -0
  301. package/dist/vendor/chunk-XJWJXLXJ.js +18 -0
  302. package/dist/vendor/chunk-XY3Q62EO.js +18 -0
  303. package/dist/vendor/chunk-YDASSC75.js +394 -0
  304. package/dist/vendor/chunk-Z6C7SO5Z.js +507 -0
  305. package/dist/vendor/chunk-Z7QNPJEB.js +229 -0
  306. package/dist/vendor/chunk-Z7QPP4YH.js +249 -0
  307. package/dist/vendor/chunk-ZCHYLHJH.js +86 -0
  308. package/dist/vendor/chunk-ZIQVYVMA.js +22 -0
  309. package/dist/vendor/chunk-ZPIG2CUA.js +34 -0
  310. package/dist/vendor/cjs/bun/BunChildProcessSpawner.d.ts +7 -0
  311. package/dist/vendor/cjs/bun/BunChildProcessSpawner.js +1 -0
  312. package/dist/vendor/cjs/bun/BunClusterHttp.d.ts +83 -0
  313. package/dist/vendor/cjs/bun/BunClusterHttp.js +1 -0
  314. package/dist/vendor/cjs/bun/BunClusterSocket.d.ts +65 -0
  315. package/dist/vendor/cjs/bun/BunClusterSocket.js +1 -0
  316. package/dist/vendor/cjs/bun/BunCrypto.d.ts +10 -0
  317. package/dist/vendor/cjs/bun/BunCrypto.js +1 -0
  318. package/dist/vendor/cjs/bun/BunFileSystem.d.ts +10 -0
  319. package/dist/vendor/cjs/bun/BunFileSystem.js +1 -0
  320. package/dist/vendor/cjs/bun/BunHttpClient.d.ts +9 -0
  321. package/dist/vendor/cjs/bun/BunHttpClient.js +1 -0
  322. package/dist/vendor/cjs/bun/BunHttpPlatform.d.ts +10 -0
  323. package/dist/vendor/cjs/bun/BunHttpPlatform.js +1 -0
  324. package/dist/vendor/cjs/bun/BunHttpServer.d.ts +142 -0
  325. package/dist/vendor/cjs/bun/BunHttpServer.js +1 -0
  326. package/dist/vendor/cjs/bun/BunHttpServerRequest.d.ts +18 -0
  327. package/dist/vendor/cjs/bun/BunHttpServerRequest.js +1 -0
  328. package/dist/vendor/cjs/bun/BunMultipart.d.ts +31 -0
  329. package/dist/vendor/cjs/bun/BunMultipart.js +1 -0
  330. package/dist/vendor/cjs/bun/BunPath.d.ts +24 -0
  331. package/dist/vendor/cjs/bun/BunPath.js +1 -0
  332. package/dist/vendor/cjs/bun/BunRedis.d.ts +49 -0
  333. package/dist/vendor/cjs/bun/BunRedis.js +1 -0
  334. package/dist/vendor/cjs/bun/BunRuntime.d.ts +85 -0
  335. package/dist/vendor/cjs/bun/BunRuntime.js +1 -0
  336. package/dist/vendor/cjs/bun/BunServices.d.ts +34 -0
  337. package/dist/vendor/cjs/bun/BunServices.js +1 -0
  338. package/dist/vendor/cjs/bun/BunSink.d.ts +8 -0
  339. package/dist/vendor/cjs/bun/BunSink.js +1 -0
  340. package/dist/vendor/cjs/bun/BunSocket.d.ts +40 -0
  341. package/dist/vendor/cjs/bun/BunSocket.js +1 -0
  342. package/dist/vendor/cjs/bun/BunSocketServer.d.ts +8 -0
  343. package/dist/vendor/cjs/bun/BunSocketServer.js +1 -0
  344. package/dist/vendor/cjs/bun/BunStdio.d.ts +11 -0
  345. package/dist/vendor/cjs/bun/BunStdio.js +1 -0
  346. package/dist/vendor/cjs/bun/BunStream.d.ts +19 -0
  347. package/dist/vendor/cjs/bun/BunStream.js +1 -0
  348. package/dist/vendor/cjs/bun/BunTerminal.d.ts +21 -0
  349. package/dist/vendor/cjs/bun/BunTerminal.js +1 -0
  350. package/dist/vendor/cjs/bun/BunWorker.d.ts +20 -0
  351. package/dist/vendor/cjs/bun/BunWorker.js +1 -0
  352. package/dist/vendor/cjs/bun/BunWorkerRunner.d.ts +12 -0
  353. package/dist/vendor/cjs/bun/BunWorkerRunner.js +1 -0
  354. package/dist/vendor/cjs/bun/index.d.ts +92 -0
  355. package/dist/vendor/cjs/bun/index.js +1 -0
  356. package/dist/vendor/cjs/node/NodeChildProcessSpawner.d.ts +7 -0
  357. package/dist/vendor/cjs/node/NodeChildProcessSpawner.js +1 -0
  358. package/dist/vendor/cjs/node/NodeClusterHttp.d.ts +63 -0
  359. package/dist/vendor/cjs/node/NodeClusterHttp.js +1 -0
  360. package/dist/vendor/cjs/node/NodeClusterSocket.d.ts +79 -0
  361. package/dist/vendor/cjs/node/NodeClusterSocket.js +1 -0
  362. package/dist/vendor/cjs/node/NodeCrypto.d.ts +10 -0
  363. package/dist/vendor/cjs/node/NodeCrypto.js +1 -0
  364. package/dist/vendor/cjs/node/NodeFileSystem.d.ts +10 -0
  365. package/dist/vendor/cjs/node/NodeFileSystem.js +1 -0
  366. package/dist/vendor/cjs/node/NodeHttpClient.d.ts +179 -0
  367. package/dist/vendor/cjs/node/NodeHttpClient.js +1 -0
  368. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.d.ts +62 -0
  369. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.js +1 -0
  370. package/dist/vendor/cjs/node/NodeHttpPlatform.d.ts +36 -0
  371. package/dist/vendor/cjs/node/NodeHttpPlatform.js +1 -0
  372. package/dist/vendor/cjs/node/NodeHttpServer.d.ts +120 -0
  373. package/dist/vendor/cjs/node/NodeHttpServer.js +1 -0
  374. package/dist/vendor/cjs/node/NodeHttpServerRequest.d.ts +29 -0
  375. package/dist/vendor/cjs/node/NodeHttpServerRequest.js +1 -0
  376. package/dist/vendor/cjs/node/NodeMultipart.d.ts +46 -0
  377. package/dist/vendor/cjs/node/NodeMultipart.js +1 -0
  378. package/dist/vendor/cjs/node/NodeMultipartParser.d.ts +97 -0
  379. package/dist/vendor/cjs/node/NodeMultipartParser.js +1 -0
  380. package/dist/vendor/cjs/node/NodePath.d.ts +27 -0
  381. package/dist/vendor/cjs/node/NodePath.js +1 -0
  382. package/dist/vendor/cjs/node/NodeRedis.d.ts +74 -0
  383. package/dist/vendor/cjs/node/NodeRedis.js +1 -0
  384. package/dist/vendor/cjs/node/NodeRuntime.d.ts +85 -0
  385. package/dist/vendor/cjs/node/NodeRuntime.js +1 -0
  386. package/dist/vendor/cjs/node/NodeServices.d.ts +34 -0
  387. package/dist/vendor/cjs/node/NodeServices.js +1 -0
  388. package/dist/vendor/cjs/node/NodeSink.d.ts +8 -0
  389. package/dist/vendor/cjs/node/NodeSink.js +1 -0
  390. package/dist/vendor/cjs/node/NodeSocket.d.ts +38 -0
  391. package/dist/vendor/cjs/node/NodeSocket.js +1 -0
  392. package/dist/vendor/cjs/node/NodeSocketServer.d.ts +8 -0
  393. package/dist/vendor/cjs/node/NodeSocketServer.js +1 -0
  394. package/dist/vendor/cjs/node/NodeStdio.d.ts +11 -0
  395. package/dist/vendor/cjs/node/NodeStdio.js +1 -0
  396. package/dist/vendor/cjs/node/NodeStream.d.ts +8 -0
  397. package/dist/vendor/cjs/node/NodeStream.js +1 -0
  398. package/dist/vendor/cjs/node/NodeTerminal.d.ts +21 -0
  399. package/dist/vendor/cjs/node/NodeTerminal.js +1 -0
  400. package/dist/vendor/cjs/node/NodeWorker.d.ts +22 -0
  401. package/dist/vendor/cjs/node/NodeWorker.js +1 -0
  402. package/dist/vendor/cjs/node/NodeWorkerRunner.d.ts +12 -0
  403. package/dist/vendor/cjs/node/NodeWorkerRunner.js +1 -0
  404. package/dist/vendor/cjs/node/Undici.d.ts +28 -0
  405. package/dist/vendor/cjs/node/Undici.js +1 -0
  406. package/dist/vendor/cjs/node/index.d.ts +100 -0
  407. package/dist/vendor/cjs/node/index.js +1 -0
  408. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  409. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.js +1 -0
  410. package/dist/vendor/cjs/node-shared/NodeClusterSocket.d.ts +22 -0
  411. package/dist/vendor/cjs/node-shared/NodeClusterSocket.js +1 -0
  412. package/dist/vendor/cjs/node-shared/NodeCrypto.d.ts +27 -0
  413. package/dist/vendor/cjs/node-shared/NodeCrypto.js +1 -0
  414. package/dist/vendor/cjs/node-shared/NodeFileSystem.d.ts +11 -0
  415. package/dist/vendor/cjs/node-shared/NodeFileSystem.js +1 -0
  416. package/dist/vendor/cjs/node-shared/NodeHttpCompression.d.ts +36 -0
  417. package/dist/vendor/cjs/node-shared/NodeHttpCompression.js +1 -0
  418. package/dist/vendor/cjs/node-shared/NodePath.d.ts +27 -0
  419. package/dist/vendor/cjs/node-shared/NodePath.js +1 -0
  420. package/dist/vendor/cjs/node-shared/NodeRuntime.d.ts +47 -0
  421. package/dist/vendor/cjs/node-shared/NodeRuntime.js +1 -0
  422. package/dist/vendor/cjs/node-shared/NodeSink.d.ts +69 -0
  423. package/dist/vendor/cjs/node-shared/NodeSink.js +1 -0
  424. package/dist/vendor/cjs/node-shared/NodeSocket.d.ts +134 -0
  425. package/dist/vendor/cjs/node-shared/NodeSocket.js +1 -0
  426. package/dist/vendor/cjs/node-shared/NodeSocketServer.d.ts +80 -0
  427. package/dist/vendor/cjs/node-shared/NodeSocketServer.js +1 -0
  428. package/dist/vendor/cjs/node-shared/NodeStdio.d.ts +12 -0
  429. package/dist/vendor/cjs/node-shared/NodeStdio.js +1 -0
  430. package/dist/vendor/cjs/node-shared/NodeStream.d.ts +179 -0
  431. package/dist/vendor/cjs/node-shared/NodeStream.js +1 -0
  432. package/dist/vendor/cjs/node-shared/NodeTerminal.d.ts +22 -0
  433. package/dist/vendor/cjs/node-shared/NodeTerminal.js +1 -0
  434. package/dist/vendor/cjs/node-shared/index.d.ts +56 -0
  435. package/dist/vendor/cjs/node-shared/index.js +1 -0
  436. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  437. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.js +1 -0
  438. package/dist/vendor/cjs/node-shared/internal/utils.d.ts +2 -0
  439. package/dist/vendor/cjs/node-shared/internal/utils.js +1 -0
  440. package/dist/vendor/cjs/package.json +1 -0
  441. package/dist/vendor/cjs/platform-bun.d.ts +92 -0
  442. package/dist/vendor/cjs/platform-bun.js +1 -0
  443. package/dist/vendor/cjs/platform-node-shared.d.ts +56 -0
  444. package/dist/vendor/cjs/platform-node-shared.js +1 -0
  445. package/dist/vendor/cjs/platform-node.d.ts +100 -0
  446. package/dist/vendor/cjs/platform-node.js +1 -0
  447. package/dist/vendor/node/LICENSE +21 -0
  448. package/dist/vendor/node/NodeChildProcessSpawner.d.ts +7 -0
  449. package/dist/vendor/node/NodeChildProcessSpawner.js +14 -0
  450. package/dist/vendor/node/NodeClusterHttp.d.ts +63 -0
  451. package/dist/vendor/node/NodeClusterHttp.js +43 -0
  452. package/dist/vendor/node/NodeClusterSocket.d.ts +79 -0
  453. package/dist/vendor/node/NodeClusterSocket.js +30 -0
  454. package/dist/vendor/node/NodeCrypto.d.ts +10 -0
  455. package/dist/vendor/node/NodeCrypto.js +8 -0
  456. package/dist/vendor/node/NodeFileSystem.d.ts +10 -0
  457. package/dist/vendor/node/NodeFileSystem.js +9 -0
  458. package/dist/vendor/node/NodeHttpClient.d.ts +179 -0
  459. package/dist/vendor/node/NodeHttpClient.js +46 -0
  460. package/dist/vendor/node/NodeHttpIncomingMessage.d.ts +62 -0
  461. package/dist/vendor/node/NodeHttpIncomingMessage.js +10 -0
  462. package/dist/vendor/node/NodeHttpPlatform.d.ts +36 -0
  463. package/dist/vendor/node/NodeHttpPlatform.js +16 -0
  464. package/dist/vendor/node/NodeHttpServer.d.ts +120 -0
  465. package/dist/vendor/node/NodeHttpServer.js +46 -0
  466. package/dist/vendor/node/NodeHttpServerRequest.d.ts +29 -0
  467. package/dist/vendor/node/NodeHttpServerRequest.js +9 -0
  468. package/dist/vendor/node/NodeMultipart.d.ts +46 -0
  469. package/dist/vendor/node/NodeMultipart.js +15 -0
  470. package/dist/vendor/node/NodeMultipartParser.d.ts +97 -0
  471. package/dist/vendor/node/NodeMultipartParser.js +11 -0
  472. package/dist/vendor/node/NodePath.d.ts +27 -0
  473. package/dist/vendor/node/NodePath.js +12 -0
  474. package/dist/vendor/node/NodeRedis.d.ts +74 -0
  475. package/dist/vendor/node/NodeRedis.js +11 -0
  476. package/dist/vendor/node/NodeRuntime.d.ts +85 -0
  477. package/dist/vendor/node/NodeRuntime.js +8 -0
  478. package/dist/vendor/node/NodeServices.d.ts +34 -0
  479. package/dist/vendor/node/NodeServices.js +23 -0
  480. package/dist/vendor/node/NodeSink.d.ts +8 -0
  481. package/dist/vendor/node/NodeSink.js +12 -0
  482. package/dist/vendor/node/NodeSocket.d.ts +38 -0
  483. package/dist/vendor/node/NodeSocket.js +31 -0
  484. package/dist/vendor/node/NodeSocketServer.d.ts +8 -0
  485. package/dist/vendor/node/NodeSocketServer.js +21 -0
  486. package/dist/vendor/node/NodeStdio.d.ts +11 -0
  487. package/dist/vendor/node/NodeStdio.js +10 -0
  488. package/dist/vendor/node/NodeStream.d.ts +8 -0
  489. package/dist/vendor/node/NodeStream.js +27 -0
  490. package/dist/vendor/node/NodeTerminal.d.ts +21 -0
  491. package/dist/vendor/node/NodeTerminal.js +10 -0
  492. package/dist/vendor/node/NodeWorker.d.ts +22 -0
  493. package/dist/vendor/node/NodeWorker.js +9 -0
  494. package/dist/vendor/node/NodeWorkerRunner.d.ts +12 -0
  495. package/dist/vendor/node/NodeWorkerRunner.js +7 -0
  496. package/dist/vendor/node/Undici.d.ts +28 -0
  497. package/dist/vendor/node/Undici.js +9 -0
  498. package/dist/vendor/node/index.d.ts +100 -0
  499. package/dist/vendor/node/index.js +115 -0
  500. package/dist/vendor/node-shared/LICENSE +21 -0
  501. package/dist/vendor/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  502. package/dist/vendor/node-shared/NodeChildProcessSpawner.js +13 -0
  503. package/dist/vendor/node-shared/NodeClusterSocket.d.ts +22 -0
  504. package/dist/vendor/node-shared/NodeClusterSocket.js +11 -0
  505. package/dist/vendor/node-shared/NodeCrypto.d.ts +27 -0
  506. package/dist/vendor/node-shared/NodeCrypto.js +9 -0
  507. package/dist/vendor/node-shared/NodeFileSystem.d.ts +11 -0
  508. package/dist/vendor/node-shared/NodeFileSystem.js +8 -0
  509. package/dist/vendor/node-shared/NodeHttpCompression.d.ts +36 -0
  510. package/dist/vendor/node-shared/NodeHttpCompression.js +13 -0
  511. package/dist/vendor/node-shared/NodePath.d.ts +27 -0
  512. package/dist/vendor/node-shared/NodePath.js +11 -0
  513. package/dist/vendor/node-shared/NodeRuntime.d.ts +47 -0
  514. package/dist/vendor/node-shared/NodeRuntime.js +7 -0
  515. package/dist/vendor/node-shared/NodeSink.d.ts +69 -0
  516. package/dist/vendor/node-shared/NodeSink.js +11 -0
  517. package/dist/vendor/node-shared/NodeSocket.d.ts +134 -0
  518. package/dist/vendor/node-shared/NodeSocket.js +23 -0
  519. package/dist/vendor/node-shared/NodeSocketServer.d.ts +80 -0
  520. package/dist/vendor/node-shared/NodeSocketServer.js +20 -0
  521. package/dist/vendor/node-shared/NodeStdio.d.ts +12 -0
  522. package/dist/vendor/node-shared/NodeStdio.js +9 -0
  523. package/dist/vendor/node-shared/NodeStream.d.ts +179 -0
  524. package/dist/vendor/node-shared/NodeStream.js +26 -0
  525. package/dist/vendor/node-shared/NodeTerminal.d.ts +22 -0
  526. package/dist/vendor/node-shared/NodeTerminal.js +9 -0
  527. package/dist/vendor/node-shared/index.d.ts +56 -0
  528. package/dist/vendor/node-shared/index.js +58 -0
  529. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  530. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.js +7 -0
  531. package/dist/vendor/node-shared/internal/utils.d.ts +2 -0
  532. package/dist/vendor/node-shared/internal/utils.js +7 -0
  533. package/dist/vendor/platform-bun.d.ts +92 -0
  534. package/dist/vendor/platform-bun.js +107 -0
  535. package/dist/vendor/platform-node-shared.d.ts +56 -0
  536. package/dist/vendor/platform-node-shared.js +58 -0
  537. package/dist/vendor/platform-node.d.ts +100 -0
  538. package/dist/vendor/platform-node.js +115 -0
  539. package/docs/README.md +158 -0
  540. package/docs/api.md +601 -0
  541. package/docs/concepts/projections.md +250 -0
  542. package/docs/concepts/subscriptions.md +204 -0
  543. package/docs/concepts/trust-boundary.md +256 -0
  544. package/docs/guides/diagnose-a-run.md +115 -0
  545. package/docs/guides/follow-a-run.md +150 -0
  546. package/docs/guides/host-the-gateway.md +153 -0
  547. package/docs/guides/read-a-projection.md +138 -0
  548. package/docs/guides/serve-beyond-loopback.md +166 -0
  549. package/docs/guides/submit-an-approval.md +187 -0
  550. package/docs/guides/testing.md +148 -0
  551. package/docs/installation.md +89 -0
  552. package/docs/quickstart.md +200 -0
  553. package/docs/troubleshooting.md +355 -0
  554. package/package.json +264 -32
  555. package/src/Diagnosis.ts +892 -0
  556. package/src/EngineTrace.ts +605 -0
  557. package/src/GatewayError.ts +71 -0
  558. package/src/GatewayProjection.ts +948 -0
  559. package/src/GatewayRpcs.ts +179 -0
  560. package/src/GatewaySchema.ts +516 -0
  561. package/src/GatewayServer.ts +932 -0
  562. package/src/HostBranchPresence.ts +72 -0
  563. package/src/Projections.ts +1735 -0
  564. package/src/RunDevTools.ts +394 -0
  565. package/src/RunHistory.ts +174 -0
  566. package/src/RunTrace.ts +2793 -0
  567. package/src/RuntimeBridge.ts +835 -0
  568. package/src/bun/BunGateway.ts +52 -0
  569. package/src/index.ts +77 -0
  570. package/src/internal/NativeGateway.ts +360 -0
  571. package/src/internal/actionRenderings.ts +201 -0
  572. package/src/internal/callEvents.ts +257 -0
  573. package/src/internal/digestIndex.ts +134 -0
  574. package/src/internal/digestMemory.ts +27 -0
  575. package/src/internal/inspectLabels.ts +13 -0
  576. package/src/internal/nativeResolution.ts +103 -0
  577. package/src/internal/nodeEvents.ts +100 -0
  578. package/src/node/NodeGateway.ts +30 -0
  579. package/openapi.yaml +0 -29945
  580. package/src/README.md +0 -39
  581. package/src/api/README.md +0 -23
  582. package/src/api/apiCollectionNames.js +0 -10
  583. package/src/api/index.d.ts +0 -126
  584. package/src/api/index.js +0 -14
  585. package/src/api/normalizeApiRow.js +0 -36
  586. package/src/api/serializeAccountRow.js +0 -10
  587. package/src/api/serializeApprovalRow.js +0 -53
  588. package/src/api/serializeComparisonScoreRow.js +0 -18
  589. package/src/api/serializeCronRow.js +0 -30
  590. package/src/api/serializeDocRow.js +0 -20
  591. package/src/api/serializeMemoryFactRow.js +0 -21
  592. package/src/api/serializePromptRow.js +0 -10
  593. package/src/api/serializeRunEventRow.js +0 -28
  594. package/src/api/serializeRunRow.js +0 -93
  595. package/src/api/serializeScoreDetailRow.js +0 -25
  596. package/src/api/serializeScoreRow.js +0 -26
  597. package/src/api/serializeTicketRow.js +0 -20
  598. package/src/api/serializeWorkflowRow.js +0 -10
  599. package/src/auth/scopes.d.ts +0 -19
  600. package/src/auth/scopes.js +0 -164
  601. package/src/index.d.ts +0 -316
  602. package/src/index.js +0 -108
  603. package/src/rpc/gatewayRpcTypes.ts +0 -186
  604. package/src/rpc/index.d.ts +0 -223
  605. package/src/rpc/index.js +0 -2527
@@ -0,0 +1,948 @@
1
+ /**
2
+ * The stable wire rows the gateway serves for each projection, and the pure
3
+ * folds that compute them from control-plane facts.
4
+ *
5
+ * These rows are the whole read contract. Nothing here exposes a store row, a
6
+ * database column, or an engine type: every field is either a
7
+ * `@smthrs/control` projection value or something folded out of the ordered
8
+ * `ControlEvent` deltas `Control.watch` publishes. Wire names are the flows
9
+ * names (`flowId`, `createdAt`, and the `ApprovalTarget.Node` envelope), so a
10
+ * client written against the control plane reads these rows without a
11
+ * translation table.
12
+ *
13
+ * @since 1.0.0
14
+ */
15
+
16
+ import { ControlFacts, ControlSchema, Health, Monitor } from "@smthrs/control"
17
+ import * as Fault from "@smthrs/flow/Fault"
18
+ import { ExecutionFact } from "@smthrs/journal"
19
+ import { Schema } from "effect"
20
+ import * as Diagnosis from "./Diagnosis.ts"
21
+ import { callScope, openCallIndex, uniqueCallEvents } from "./internal/callEvents.ts"
22
+ import * as NativeResolution from "./internal/nativeResolution.ts"
23
+ import * as NodeEvents from "./internal/nodeEvents.ts"
24
+
25
+ /**
26
+ * One run, everything a run card displays, and the diagnosis of what happened
27
+ * to it.
28
+ *
29
+ * `flowId` carries what the old wire split across `run.workflowKey` and
30
+ * `run.workflow`, and `createdAt` carries `run.createdAtMs`: one flows name
31
+ * each, rather than two spellings of one fact.
32
+ *
33
+ * @since 1.0.0
34
+ * @category models
35
+ */
36
+ export const RunSummaryRow = Schema.Struct({
37
+ runId: Schema.String,
38
+ flowId: Schema.String,
39
+ statusRollup: Schema.optional(Health.StatusRollup),
40
+ status: ControlSchema.RunStatus,
41
+ lifecycleProvenance: Schema.optional(ControlFacts.LifecycleProvenance),
42
+ executionProvenance: Schema.optional(ExecutionFact.Provenance),
43
+ createdAt: Schema.Number,
44
+ updatedAt: Schema.Number,
45
+ planId: Schema.optional(Schema.String),
46
+ planDigest: Schema.optional(Schema.String),
47
+ parentRunId: Schema.optional(Schema.String),
48
+ lineageId: Schema.optional(Schema.String),
49
+ roundOrdinal: Schema.optional(Schema.Number),
50
+ waitingReason: Schema.optional(Schema.String),
51
+ steeringPending: Schema.optional(Schema.Number),
52
+ cancellation: Schema.optional(ControlSchema.Cancellation),
53
+ /** When the run's approved deadline passes; absent for a run with none. */
54
+ deadlineAt: Schema.optional(Schema.Number),
55
+ /** The model seat the run's last opened turn ran on. */
56
+ seat: Schema.optional(Schema.String),
57
+ turns: Schema.Number,
58
+ calls: Schema.Number,
59
+ callsFailed: Schema.Number,
60
+ editsAttempted: Schema.Number,
61
+ editsSucceeded: Schema.Number,
62
+ inputTokens: Schema.Number,
63
+ outputTokens: Schema.Number,
64
+ /**
65
+ * One line: the run row's status plus the reason that most explains it.
66
+ *
67
+ * Lifecycle provenance distinguishes a covered control fact from a legacy
68
+ * snapshot or a separate engine observation. Missing facts never silently
69
+ * replace a newer observed state with the last recorded status.
70
+ */
71
+ verdict: Schema.String,
72
+ /** The whole diagnosis card, which the old wire called `whatHappened`. */
73
+ diagnosis: Schema.String,
74
+ finalOutput: Schema.optional(Schema.String),
75
+ /** The failed run's fault class and `<_tag>/<code>`, stamped when it failed. */
76
+ failureFault: Schema.optional(Fault.Class),
77
+ failureTag: Schema.optional(Schema.String)
78
+ })
79
+
80
+ /**
81
+ * One run, everything a run card displays, and its diagnosis.
82
+ *
83
+ * @since 1.0.0
84
+ * @category models
85
+ */
86
+ export type RunSummaryRow = typeof RunSummaryRow.Type
87
+
88
+ /**
89
+ * One node of a run, as a tree view renders it.
90
+ *
91
+ * `label` carries what the old wire called `node.cardLabel`, and `seat`
92
+ * carries `node.agent`: the model seat is the flows name for who ran a node.
93
+ *
94
+ * `nodeId` is the ordinal the call opened on, because the emitter names no
95
+ * node. {@link runTree} says why.
96
+ *
97
+ * @since 1.0.0
98
+ * @category models
99
+ */
100
+ export const RunTreeRow = Schema.Struct({
101
+ runId: Schema.String,
102
+ nodeId: Schema.String,
103
+ label: Schema.String,
104
+ status: Schema.Literals(["running", "completed", "failed"]),
105
+ seat: Schema.optional(Schema.String),
106
+ startedAt: Schema.Number,
107
+ endedAt: Schema.optional(Schema.Number),
108
+ parentRunId: Schema.optional(Schema.String)
109
+ })
110
+
111
+ /**
112
+ * One node of a run, as a tree view renders it.
113
+ *
114
+ * @since 1.0.0
115
+ * @category models
116
+ */
117
+ export type RunTreeRow = typeof RunTreeRow.Type
118
+
119
+ /**
120
+ * One approval a run is parked on, carrying the exact payload that decides it.
121
+ *
122
+ * `title` carries the old `approval.requestTitle` and `request` the old
123
+ * `approval.request`; `payload` is the `ApprovalTarget.Node` envelope a client
124
+ * submits back unchanged, so no client reconstructs authority.
125
+ *
126
+ * @since 1.0.0
127
+ * @category models
128
+ */
129
+ export const ApprovalRow = Schema.Struct({
130
+ runId: Schema.String,
131
+ /**
132
+ * The execution holding the wait, when this gate is a question a person owes
133
+ * an answer to and it is held below `runId`.
134
+ *
135
+ * `runId` is the run a person opened and the run a decision is addressed to;
136
+ * a `HumanTask` in a nested flow parks its own execution, and the two are
137
+ * different runs. Present only on such a gate, so a reader can tell a
138
+ * question rolled up from a tree from one the named run raised itself, and
139
+ * an inbox can list one question once however many ancestors carry it.
140
+ */
141
+ waitRunId: Schema.optional(Schema.String),
142
+ questionProvenance: Schema.optional(Schema.Literals(["events", "legacy-observation", "unverified-observation"])),
143
+ requestId: Schema.String,
144
+ title: Schema.String,
145
+ request: Schema.Json,
146
+ payload: ControlSchema.ApprovalPayload,
147
+ requestedAt: Schema.Number,
148
+ status: Schema.Literals(["pending", "approved", "denied"])
149
+ })
150
+
151
+ /**
152
+ * One approval a run is parked on.
153
+ *
154
+ * @since 1.0.0
155
+ * @category models
156
+ */
157
+ export type ApprovalRow = typeof ApprovalRow.Type
158
+
159
+ /**
160
+ * The output one node produced.
161
+ *
162
+ * @since 1.0.0
163
+ * @category models
164
+ */
165
+ export const NodeOutputRow = Schema.Struct({
166
+ runId: Schema.String,
167
+ nodeId: Schema.String,
168
+ outcome: Schema.Literals(["success", "failure"]),
169
+ output: Schema.String,
170
+ settledAt: Schema.Number
171
+ })
172
+
173
+ /**
174
+ * The output one node produced.
175
+ *
176
+ * @since 1.0.0
177
+ * @category models
178
+ */
179
+ export type NodeOutputRow = typeof NodeOutputRow.Type
180
+
181
+ /**
182
+ * How long one flow's nodes take, per action tag.
183
+ *
184
+ * `samples` is the number of measured executions behind the two percentiles,
185
+ * and it is on the wire because a percentile over one sample and a percentile
186
+ * over twenty are different claims. A tag with no measured execution has no
187
+ * row at all: there is no shape here for an unmeasured prediction.
188
+ *
189
+ * @since 1.0.0
190
+ * @category models
191
+ */
192
+ export const FlowDurationRow = Schema.Struct({
193
+ flowId: Schema.String,
194
+ actionTag: Schema.String,
195
+ samples: Schema.Number,
196
+ p50Ms: Schema.Number,
197
+ p90Ms: Schema.Number
198
+ })
199
+
200
+ /**
201
+ * How long one flow's nodes take, per action tag.
202
+ *
203
+ * @since 1.0.0
204
+ * @category models
205
+ */
206
+ export type FlowDurationRow = typeof FlowDurationRow.Type
207
+
208
+ /**
209
+ * One measured execution of one node, as a duration fold's sample.
210
+ *
211
+ * The action tag is the only part of a node's key material that survives a
212
+ * re-key, which is why history is grouped by it rather than by node id or by
213
+ * dispatch key.
214
+ *
215
+ * @since 1.0.0
216
+ * @category models
217
+ */
218
+ export interface NodeDuration {
219
+ readonly actionTag: string
220
+ readonly durationMs: number
221
+ }
222
+
223
+ /**
224
+ * One line of a run's turn-by-turn transcript.
225
+ *
226
+ * @since 1.0.0
227
+ * @category models
228
+ */
229
+ export const TranscriptRow = Schema.Struct({
230
+ runId: Schema.String,
231
+ sequence: Schema.Number,
232
+ turn: Schema.Number,
233
+ at: Schema.Number,
234
+ kind: Schema.String,
235
+ /** Dispatch identity on current call records; absent on legacy history. */
236
+ callId: Schema.optional(Schema.String),
237
+ text: Schema.String
238
+ })
239
+
240
+ /**
241
+ * One line of a run's turn-by-turn transcript.
242
+ *
243
+ * @since 1.0.0
244
+ * @category models
245
+ */
246
+ export type TranscriptRow = typeof TranscriptRow.Type
247
+
248
+ /** Copies only the optional fields a run summary actually carries. */
249
+ const optional = <A>(key: string, value: A | undefined): Record<string, A> =>
250
+ value === undefined ? {} : { [key]: value }
251
+
252
+ /**
253
+ * Folds one run's summary and events into the served `run-summary` row.
254
+ *
255
+ * @param run the control-plane run summary
256
+ * @param events that run's ordered control events
257
+ * @param now the instant the row is rendered at
258
+ * @param carry the digest of the events a bounded reader dropped before them
259
+ * @since 1.0.0
260
+ * @category projections
261
+ */
262
+ export const runSummary = (
263
+ run: ControlSchema.RunSummary,
264
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
265
+ now: number = Math.max(run.updatedAt, events.at(-1)?.occurredAt ?? 0),
266
+ carry?: Diagnosis.Digest | undefined
267
+ ): RunSummaryRow => {
268
+ const projected = ControlFacts.fold(events, run)
269
+ // Supplying a snapshot guarantees a run: uncovered facts retain that
270
+ // observation; only the event-only fold can return an absent run.
271
+ run = projected.run!
272
+ const native = ExecutionFact.foldControl(events, run.runId, run.executionView)
273
+ // The control fold remains control authority. Native lifecycle is independently
274
+ // replayed/verified against the coherent executor observation when available.
275
+ if (run.executionObservation === "observed" && native?.view !== undefined) {
276
+ const { root, current } = native.view
277
+ run = {
278
+ ...run,
279
+ status: current.status === "pending" ? "accepted" : current.status === "suspended"
280
+ ? current.waiting?.reason === "approval" ||
281
+ (native.view.humanWaits?.length ?? run.pendingWaits?.length ?? 0) > 0
282
+ ? "waiting-approval" :
283
+ "parked"
284
+ : current.status === "running" && (native.view.humanWaits?.length ?? run.pendingWaits?.length ?? 0) > 0
285
+ ? "waiting-approval" :
286
+ current.status,
287
+ waitingReason: current.status === "suspended" ? current.waiting?.reason : undefined,
288
+ parentRunId: root.parentRunId ?? undefined,
289
+ lineageId: root.lineageId,
290
+ roundOrdinal: root.roundOrdinal
291
+ }
292
+ }
293
+ // `carry` is the digest of the events a bounded reader dropped ahead of
294
+ // `events`. Combining it keeps turns, calls, edits and tokens exact for a run
295
+ // whose journal no longer fits one window, so the counters a run card shows
296
+ // describe the whole run and not just its tail.
297
+ const window = Diagnosis.digest(events, run.runId)
298
+ const facts = { ...(carry === undefined ? window : Diagnosis.combine(carry, window)), status: run.status }
299
+ return {
300
+ runId: run.runId,
301
+ flowId: run.flowId,
302
+ status: run.status,
303
+ lifecycleProvenance: projected.provenance,
304
+ ...optional("executionProvenance", native?.provenance),
305
+ statusRollup: statusRollup(run, events, now),
306
+ createdAt: run.createdAt,
307
+ updatedAt: run.updatedAt,
308
+ ...optional("planId", run.planId),
309
+ ...optional("planDigest", run.planDigest),
310
+ ...optional("parentRunId", run.parentRunId),
311
+ ...optional("lineageId", run.lineageId),
312
+ ...optional("roundOrdinal", run.roundOrdinal),
313
+ ...optional("waitingReason", run.waitingReason),
314
+ ...optional("steeringPending", run.steering?.pending),
315
+ ...optional("cancellation", run.cancellation),
316
+ ...optional("deadlineAt", run.deadlineAt),
317
+ ...optional("seat", facts.seat),
318
+ turns: facts.turns,
319
+ calls: facts.calls,
320
+ callsFailed: facts.callsFailed,
321
+ editsAttempted: facts.editsAttempted,
322
+ editsSucceeded: facts.editsSucceeded,
323
+ inputTokens: facts.inputTokens,
324
+ outputTokens: facts.outputTokens,
325
+ verdict: Diagnosis.verdict(facts),
326
+ diagnosis: Diagnosis.render({ runId: run.runId, ...optional("flowId", run.flowId) }, facts),
327
+ ...optional("finalOutput", Diagnosis.resolvedOutput(facts) ?? (
328
+ run.status === "failed" && facts.fault?.tag.endsWith("/source_refused") &&
329
+ facts.cause?.match(/source_refused: ([a-z_]+)/)
330
+ ? JSON.stringify({ message: facts.cause.match(/source_refused: ([a-z_]+)/)![0] })
331
+ : undefined
332
+ )) ,
333
+ ...(run.status === "failed" ? optional("failureFault", facts.fault?.class) : {}),
334
+ ...(run.status === "failed" ? optional("failureTag", facts.fault?.tag) : {})
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Claims a call by its durable dispatch identity. Legacy history has no id:
340
+ * match only legacy starts by flow name (or FIFO when unnamed). A new
341
+ * settlement can close a legacy start after an old parked run resumes, but
342
+ * neither fallback may steal an identified call.
343
+ */
344
+ const takeOpenCall = <
345
+ A extends { readonly flowName: string; readonly callId: string | undefined; readonly scope: string | undefined }
346
+ >(
347
+ open: Array<A>,
348
+ callId: string | undefined,
349
+ flowName: string | undefined,
350
+ scope: string | undefined
351
+ ): A | undefined => {
352
+ const found = openCallIndex(open, callId, flowName, scope)
353
+ return found < 0 ? undefined : open.splice(found, 1)[0]
354
+ }
355
+
356
+ /**
357
+ * One agent call, as every node projection sees it: the ordinal it opened on,
358
+ * the seat that ran it, and the settlement that closed it, if one did.
359
+ */
360
+ interface CallRecord {
361
+ readonly nodeId: string
362
+ readonly flowName: string
363
+ readonly seat: string | undefined
364
+ readonly startedAt: number
365
+ readonly settlement: CallSettlement | undefined
366
+ }
367
+
368
+ /** What closed a call, and where among the run's settlements it closed. */
369
+ interface CallSettlement {
370
+ /** The rank of this settlement among the run's, counting from one. */
371
+ readonly order: number
372
+ /** The run the settlement named, which a malformed journal can omit. */
373
+ readonly runId: string | undefined
374
+ readonly at: number
375
+ readonly outcome: "success" | "failure"
376
+ readonly output: string
377
+ }
378
+
379
+ /**
380
+ * Folds one run's events into the agent calls it made, in the order they
381
+ * opened.
382
+ *
383
+ * This is the only fold that assigns a call its `call-N` identity, records the
384
+ * seat and time it opened on, and pairs a settlement with the call it closed.
385
+ * A client asks for a node's output by the id a tree row carries, so the two
386
+ * projections have to agree on that id; when they counted separately they
387
+ * could disagree, and once did, because skipping an event before the ordinal
388
+ * advanced shifted one fold's keys against the other's. The ordinal therefore
389
+ * advances on every distinct start, whatever else that event is missing.
390
+ * Identified duplicate starts and settlements are ignored. Old idless rows
391
+ * retain their original ordinal/FIFO interpretation; their missing dispatch
392
+ * identity cannot be reconstructed when same-name calls overlapped.
393
+ *
394
+ * `uniqueCallEvents` also normalizes native step facts, so this fold reads the
395
+ * run's own records and one stream per step a module run dispatched. The three
396
+ * classes `Diagnosis` names apply here too, field by field:
397
+ *
398
+ * | Field | Class | Why |
399
+ * | ----------------------- | --------------- | ------------------------------------------------------ |
400
+ * | `nodeId` (`call-N`) | aggregate | one tree lists every call the run made, steps included |
401
+ * | `flowName`, `startedAt` | aggregate | read off the call's own record |
402
+ * | `settlement` | aggregate | claimed by call identity within the recorded scope |
403
+ * | `seat` | scope dependent | who ran THIS call, so the turn must be this call's own |
404
+ *
405
+ * There is no root-only field here: a tree row describes a call, never the
406
+ * run's answer or state. A new field has to name its class.
407
+ */
408
+ const callHistory = (
409
+ events: ReadonlyArray<ControlSchema.ControlEvent>
410
+ ): ReadonlyArray<CallRecord> => {
411
+ const calls = new Map<string, CallRecord>()
412
+ const open: Array<
413
+ {
414
+ readonly callId: string | undefined
415
+ readonly flowName: string
416
+ readonly call: CallRecord
417
+ readonly scope: string | undefined
418
+ }
419
+ > = []
420
+ // The seat of the last turn opened in each scope. A module run interleaves
421
+ // steps in one journal, so the run-wide reading attributed one step's seat
422
+ // to another step's calls. A prompt run records one unscoped stream and
423
+ // reads exactly as it did.
424
+ const seats = new Map<string | undefined, string | undefined>()
425
+ let ordinal = 0
426
+ let settlements = 0
427
+
428
+ for (const event of uniqueCallEvents(events)) {
429
+ const payload = Diagnosis.asRecord(event.payload)
430
+ if (event.kind === "control.agent.turn-opened") {
431
+ const scope = callScope(event)
432
+ seats.set(scope, Diagnosis.asString(payload.seat) ?? seats.get(scope))
433
+ continue
434
+ }
435
+ if (event.kind === "control.agent.cell-call-started") {
436
+ const callId = Diagnosis.asString(payload.callId)
437
+ ordinal += 1
438
+ const nodeId = `call-${ordinal}`
439
+ const flowName = Diagnosis.asString(payload.flowName) ?? nodeId
440
+ const scope = callScope(event)
441
+ // This scope's own turn, else the run's. A step that opened no turn of
442
+ // its own borrows nothing from a sibling step.
443
+ const seat = seats.get(scope) ?? seats.get(undefined)
444
+ const call: CallRecord = { nodeId, flowName, seat, startedAt: Diagnosis.timeOf(event), settlement: undefined }
445
+ open.push({ callId, flowName, call, scope })
446
+ calls.set(nodeId, call)
447
+ continue
448
+ }
449
+ if (event.kind !== "control.agent.cell-call-settled") continue
450
+ const callId = Diagnosis.asString(payload.callId)
451
+ const claimed = takeOpenCall(open, callId, Diagnosis.asString(payload.flowName), callScope(event))
452
+ if (claimed === undefined) continue
453
+ const failed = Diagnosis.asString(payload.outcome) === "failure"
454
+ settlements += 1
455
+ // Rewriting the entry keeps the call in the position it opened on, which
456
+ // is the order a tree renders.
457
+ calls.set(claimed.call.nodeId, {
458
+ ...claimed.call,
459
+ settlement: {
460
+ order: settlements,
461
+ runId: Diagnosis.asString(payload.runId) ?? event.runId,
462
+ at: Diagnosis.timeOf(event),
463
+ outcome: failed ? "failure" : "success",
464
+ output: failed
465
+ ? Diagnosis.asString(payload.message) ?? ""
466
+ : Diagnosis.asString(payload.value) ?? JSON.stringify(payload.value ?? null)
467
+ }
468
+ })
469
+ }
470
+ return [...calls.values()]
471
+ }
472
+
473
+ /** How a tree row reports a call: settled the way it settled, or still running. */
474
+ const treeStatus = (settlement: CallSettlement | undefined): RunTreeRow["status"] => {
475
+ if (settlement === undefined) return "running"
476
+ return settlement.outcome === "failure" ? "failed" : "completed"
477
+ }
478
+
479
+ /**
480
+ * Folds one run's events into its node rows.
481
+ *
482
+ * A node opens on `control.agent.cell-call-started` and settles on the
483
+ * matching `control.agent.cell-call-settled`.
484
+ *
485
+ * AgentSession journals the same `callId` from the harness's dispatch identity
486
+ * on both records. Settlements join on it even when same-name calls overlap
487
+ * and finish out of order. The distinct-start ordinal remains the published
488
+ * `call-N` node key, preserving existing node links. Legacy records without
489
+ * callId retain same-name FIFO pairing, restricted to other legacy records
490
+ * (including a newly identified settlement of an old parked call).
491
+ *
492
+ * The durable engine's own `flows.engine.*` records are not folded here, but
493
+ * that is a choice rather than a limit. A host keeps the control plane and the
494
+ * engine in two databases with two journals (`@smthrs/cli`
495
+ * `NodeControl.databasePath` and `executionDatabasePath`), and
496
+ * `EngineJournalProjection` copies every engine entry of the run into the
497
+ * control journal as a `control.engine.event` envelope, which is how
498
+ * {@link nodeDurations} reads the node records. A tree row is an agent cell
499
+ * call, so what an engine step did reaches this projection as the call that
500
+ * made it.
501
+ *
502
+ * A node that never settled stays `running`, which is how a live tree renders
503
+ * work in flight.
504
+ *
505
+ * @param run the control-plane run summary
506
+ * @param events that run's ordered control events
507
+ * @since 1.0.0
508
+ * @category projections
509
+ */
510
+ export const runTree = (
511
+ run: ControlSchema.RunSummary,
512
+ events: ReadonlyArray<ControlSchema.ControlEvent>
513
+ ): ReadonlyArray<RunTreeRow> =>
514
+ callHistory(events).map((call): RunTreeRow => ({
515
+ runId: run.runId,
516
+ nodeId: call.nodeId,
517
+ label: call.flowName,
518
+ status: treeStatus(call.settlement),
519
+ ...optional("seat", call.seat),
520
+ startedAt: call.startedAt,
521
+ ...optional("endedAt", call.settlement?.at),
522
+ ...optional("parentRunId", run.parentRunId)
523
+ }))
524
+
525
+ /**
526
+ * The declared question of a human wait, as far as it can be read.
527
+ *
528
+ * `request` is whatever the wait wrote about itself, which for `HumanTask` is
529
+ * `{task, name, kind, prompt, attempt, maxAttempts}`. A wait that declared
530
+ * nothing — an older park, or a plugin's own — still produces a row, because a
531
+ * gate a person cannot see is a run that waits forever; it just has less to
532
+ * render.
533
+ */
534
+ const questionOf = (wait: ControlSchema.PendingWait): Record<string, unknown> => Diagnosis.asRecord(wait.request)
535
+
536
+ /**
537
+ * One pending row for a human wait held anywhere in a run's tree.
538
+ *
539
+ * `runId` is the ROOT: this is the run a person opened, and the run a decision
540
+ * is addressed to. `waitRunId` is the execution actually holding it, because a
541
+ * client routes by run and the control plane routes within the tree.
542
+ *
543
+ * `requestId` is the wait point's own name (`coding-clarification#1`), which is
544
+ * unique within a tree, stable across a re-read, and the name a `Signal`
545
+ * addresses. The token travels in the request too, for a client that would
546
+ * rather submit the exact durable address back.
547
+ */
548
+ const humanWaitRow = (
549
+ run: ControlSchema.RunSummary,
550
+ wait: ControlSchema.PendingWait,
551
+ projected?: ExecutionFact.Observation,
552
+ questionProvenance: "events" | "legacy-observation" | "unverified-observation" = "legacy-observation"
553
+ ): ApprovalRow => {
554
+ const question = projected === undefined ? questionOf(wait) : Diagnosis.asRecord(projected.waiting?.request)
555
+ const name = wait.name ?? Diagnosis.asString(question["name"]) ?? wait.token
556
+ const requestId = wait.attempt === undefined ? name : `${name}#${wait.attempt}`
557
+ const prompt = Diagnosis.asString(question["prompt"])
558
+ const waitFlowId = projected?.flowName ?? wait.flowId
559
+ return {
560
+ runId: run.runId,
561
+ waitRunId: wait.runId,
562
+ questionProvenance,
563
+ requestId,
564
+ title: prompt ?? `Answer needed — ${name}`,
565
+ request: {
566
+ ...question,
567
+ kind: Diagnosis.asString(question["kind"]) ?? "ask",
568
+ name,
569
+ ...(wait.attempt === undefined ? {} : { attempt: wait.attempt }),
570
+ ...(waitFlowId === undefined ? {} : { waitFlowId }),
571
+ token: wait.token
572
+ },
573
+ payload: {
574
+ target: {
575
+ _tag: "Node",
576
+ runId: run.runId,
577
+ requestId,
578
+ digest: wait.token,
579
+ // A human answer grants no capabilities: the envelope a decision binds
580
+ // to is the empty one, the same shape a flow with none carries.
581
+ envelope: { capabilities: [], flows: [], budget: {} }
582
+ },
583
+ scope: "once",
584
+ // The identity is the PARK, not its name: a loop that re-asks one
585
+ // question parks again under the same run, name and attempt, and a
586
+ // name-keyed answer would deduplicate the second decision into the
587
+ // first — accepted, never delivered, and parked forever.
588
+ idempotencyKey: `answer:${run.runId}:${requestId}:${wait.tokenDigest ?? wait.token}`
589
+ },
590
+ requestedAt: projected?.createdAtMs ?? wait.createdAt,
591
+ status: "pending"
592
+ }
593
+ }
594
+
595
+ /**
596
+ * Folds one run's events into its approval rows.
597
+ *
598
+ * A request opens a pending row carrying the submit-ready payload; the
599
+ * matching `control.approval.approved` or `control.approval.denied` closes it
600
+ * without discarding the request, so a decided gate stays readable.
601
+ *
602
+ * A `HumanTask` declares its question on the parked row. Native execution
603
+ * facts carry the redacted question and token digest; verified facts supply
604
+ * its display metadata here. `@smthrs/control` rolls current open waits onto
605
+ * the root as `pendingWaits`, which supply each row's protected wake address.
606
+ * History alone cannot create an answerable human wait. Older observations
607
+ * remain visible with explicit question provenance when native fact coverage
608
+ * is unavailable. These rows come first because they still need an answer.
609
+ *
610
+ * A decision names the gate it closed by `tokenId`. `@smthrs/control`
611
+ * `SqlControlRuntime.lookupApproval` mints that token id from the target, and
612
+ * for the `Node` target a run parks on it is the request id itself, so the two
613
+ * records join on one field. A decision whose `tokenId` or `requestId` names
614
+ * no row is retained for an exact later request. Only a legacy decision that
615
+ * names neither field closes the oldest pending legacy row in that run.
616
+ * Current facts bind the target digest; duplicates cannot reopen a decision.
617
+ *
618
+ * @param events the run's ordered control events
619
+ * @since 1.0.0
620
+ * @category projections
621
+ */
622
+ export const approvals = (
623
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
624
+ run?: ControlSchema.RunSummary | undefined
625
+ ): ReadonlyArray<ApprovalRow> => {
626
+ const native = run === undefined ? undefined : ExecutionFact.foldControl(events, run.runId, run.executionView)
627
+ const observed = run?.pendingWaits?.map((wait) => {
628
+ const projected = native?.provenance.humanWaits === "events" ?
629
+ native.view?.humanWaits?.find((candidate) =>
630
+ candidate.executionId === wait.runId && candidate.waiting?.tokenDigest === wait.tokenDigest
631
+ ) :
632
+ undefined
633
+ return humanWaitRow(
634
+ run,
635
+ wait,
636
+ projected,
637
+ projected === undefined
638
+ ? native?.provenance.humanWaits === "events" ?
639
+ "unverified-observation" :
640
+ native?.provenance.humanWaits ?? "legacy-observation"
641
+ : "events"
642
+ )
643
+ })
644
+ // The current observation supplies wake authority. History supplies only the
645
+ // display metadata that verifies against that exact observed token digest.
646
+ return ControlFacts.fold(events, undefined, observed).approvals
647
+ }
648
+
649
+ /**
650
+ * Folds one run's events into its node outputs, keyed the way {@link runTree}
651
+ * keys its rows: by the ordinal the call opened on.
652
+ *
653
+ * A settled call carries the value it produced, so the row carries that value.
654
+ * A run's own result reaches a client as `RunSummaryRow.finalOutput` instead.
655
+ *
656
+ * @param events the run's ordered control events
657
+ * @since 1.0.0
658
+ * @category projections
659
+ */
660
+ export const nodeOutput = (
661
+ events: ReadonlyArray<ControlSchema.ControlEvent>
662
+ ): ReadonlyArray<NodeOutputRow> => {
663
+ const settled: Array<{ readonly order: number; readonly row: NodeOutputRow }> = []
664
+ for (const call of callHistory(events)) {
665
+ const settlement = call.settlement
666
+ if (settlement === undefined) continue
667
+ // A row names the run it belongs to. A settlement that names none closes
668
+ // its call without producing one.
669
+ if (settlement.runId === undefined) continue
670
+ settled.push({
671
+ order: settlement.order,
672
+ row: {
673
+ runId: settlement.runId,
674
+ nodeId: call.nodeId,
675
+ outcome: settlement.outcome,
676
+ output: settlement.output,
677
+ settledAt: settlement.at
678
+ }
679
+ })
680
+ }
681
+ // A tree reads in the order calls opened; outputs read in the order they
682
+ // settled, which is the order a client watched them arrive.
683
+ return settled.sort((left, right) => left.order - right.order).map((entry) => entry.row)
684
+ }
685
+
686
+ /** The node id every execution gives the flow it was started to run. */
687
+ const rootNodeId = "root"
688
+
689
+ /**
690
+ * The native execution the host bound this control run to, when one is known.
691
+ *
692
+ * Only the host's own binding record names the root, and two records that
693
+ * disagree name nothing: an ambiguous binding cannot tell a callee's
694
+ * execution apart from the root's, so it authorizes no skip.
695
+ *
696
+ * The binding is written once, when the host takes the root up, so a window
697
+ * bounded to a run's newest events is the one window it falls out of. The
698
+ * carried digest keeps it across that eviction, and reading from the carry is
699
+ * what keeps a long run's calls counted the same as a short run's.
700
+ */
701
+ const boundExecution = (
702
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
703
+ carry: Diagnosis.Digest | undefined
704
+ ): string | undefined => {
705
+ let resolution = carry?.nativeResolution
706
+ for (const event of events) resolution = NativeResolution.combine(resolution, NativeResolution.fromEvent(event))
707
+ return resolution === undefined || resolution.conflict === true ? undefined : resolution.binding?.executionId
708
+ }
709
+
710
+ /**
711
+ * A callee's own view of a call its caller already measured.
712
+ *
713
+ * Every execution below the bound root was started by a `FlowCall` node in
714
+ * the execution above it, and that node carries the same action tag over the
715
+ * same span. The caller's node is the one kept, because it is the node a plan
716
+ * carries and the one a graph can join a prediction onto.
717
+ *
718
+ * With no binding nothing is echoed: a fold that cannot name the root cannot
719
+ * tell which `root` record belongs to it, and dropping samples on a guess
720
+ * would answer a smaller history than the flow ran.
721
+ */
722
+ const echoedRoot = (bound: string | undefined, executionId: string, nodeId: string): boolean =>
723
+ bound !== undefined && nodeId === rootNodeId && executionId !== bound
724
+
725
+ /**
726
+ * Folds one run's events into the executions it measured.
727
+ *
728
+ * A node's work starts when the engine recorded it scheduled and ends when it
729
+ * recorded it settled, so a duration is the distance between those two native
730
+ * stamps. Four of the five outcomes contribute nothing: `clean` was served
731
+ * from records rather than run, `failed` measures a collapse, `skipped` was
732
+ * never reached, and `deferred` is scheduling debt. Only `built` ran.
733
+ *
734
+ * A settlement pairs with the LAST schedule of the same execution and node,
735
+ * which is what makes a retried node measure its final attempt rather than
736
+ * the span across every attempt. Two executions of one node id stay apart
737
+ * because the pairing key carries the execution, and a settlement no schedule
738
+ * opened measures nothing rather than measuring from zero.
739
+ *
740
+ * A record that names no action tag contributes nothing either: history is
741
+ * grouped by tag, and a sample with no tag has nowhere honest to go.
742
+ *
743
+ * A called flow is measured once. The engine records one call twice: the
744
+ * caller admits and settles the node that made it, and the callee's own
745
+ * execution admits and settles its `root` over the same span with the same
746
+ * action tag. {@link echoedRoot} drops the callee's copy, so one invocation
747
+ * is one sample rather than two, and `samples` stays the count of executions
748
+ * the flow performed.
749
+ *
750
+ * @param events the run's ordered control events
751
+ * @param carry the digest of the events a bounded window dropped, when it dropped any
752
+ * @since 1.0.0
753
+ * @category projections
754
+ */
755
+ export const nodeDurations = (
756
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
757
+ carry?: Diagnosis.Digest | undefined
758
+ ): ReadonlyArray<NodeDuration> => {
759
+ const bound = boundExecution(events, carry)
760
+ const started = new Map<string, number>()
761
+ const measured: Array<NodeDuration> = []
762
+ for (const event of events) {
763
+ const schedule = NodeEvents.nodeScheduled(event)
764
+ if (schedule !== undefined) {
765
+ if (echoedRoot(bound, schedule.executionId, schedule.payload.nodeId)) continue
766
+ started.set(`${schedule.executionId}\u0000${schedule.payload.nodeId}`, schedule.emittedAtMs)
767
+ continue
768
+ }
769
+ const settlement = NodeEvents.nodeSettled(event)
770
+ if (settlement === undefined) continue
771
+ if (echoedRoot(bound, settlement.executionId, settlement.payload.nodeId)) continue
772
+ if (settlement.payload.outcome !== "built") continue
773
+ const actionTag = settlement.payload.action
774
+ if (actionTag === undefined) continue
775
+ const key = `${settlement.executionId}\u0000${settlement.payload.nodeId}`
776
+ const startedAt = started.get(key)
777
+ if (startedAt === undefined) continue
778
+ started.delete(key)
779
+ const durationMs = settlement.emittedAtMs - startedAt
780
+ // Wall clocks can move backwards, and a completion that predates its own
781
+ // start is a clock fact rather than a duration.
782
+ if (durationMs < 0) continue
783
+ measured.push({ actionTag, durationMs })
784
+ }
785
+ return measured
786
+ }
787
+
788
+ /** The nearest-rank percentile of an ascending sample, which is one observed value. */
789
+ const nearestRank = (ascending: ReadonlyArray<number>, percentile: number): number =>
790
+ ascending[Math.ceil((percentile / 100) * ascending.length) - 1]!
791
+
792
+ /**
793
+ * Folds every measured execution of one flow into one row per action tag.
794
+ *
795
+ * Both percentiles are nearest-rank, so each answer is a duration the flow
796
+ * really took rather than an interpolation between two it did not. Rows are
797
+ * ordered by tag, so two reads of the same history answer in the same order.
798
+ *
799
+ * A tag reaches this function only by having been measured, so every row
800
+ * carries at least one sample, and a flow nothing has measured answers with
801
+ * no rows at all.
802
+ *
803
+ * @param flowId the flow whose history was read
804
+ * @param samples every measured execution of that flow's runs
805
+ * @since 1.0.0
806
+ * @category projections
807
+ */
808
+ export const flowDurations = (
809
+ flowId: string,
810
+ samples: ReadonlyArray<NodeDuration>
811
+ ): ReadonlyArray<FlowDurationRow> => {
812
+ const byTag = new Map<string, Array<number>>()
813
+ for (const sample of samples) {
814
+ const held = byTag.get(sample.actionTag)
815
+ if (held === undefined) byTag.set(sample.actionTag, [sample.durationMs])
816
+ else held.push(sample.durationMs)
817
+ }
818
+ return [...byTag.entries()]
819
+ .sort(([left], [right]) => left < right ? -1 : 1)
820
+ .map(([actionTag, observed]) => {
821
+ const ascending = [...observed].sort((left, right) => left - right)
822
+ return {
823
+ flowId,
824
+ actionTag,
825
+ samples: ascending.length,
826
+ p50Ms: nearestRank(ascending, 50),
827
+ p90Ms: nearestRank(ascending, 90)
828
+ }
829
+ })
830
+ }
831
+
832
+ /** Events the transcript reports verbatim rather than as agent activity. */
833
+ const transcriptKinds: ReadonlySet<string> = new Set(["control.approval.requested"])
834
+
835
+ /**
836
+ * Folds one run's events into a turn-numbered transcript.
837
+ *
838
+ * A row is reported for every `control.run.*` and `control.agent.*` event and
839
+ * for an approval request, and for nothing else: the transcript is what a
840
+ * reader follows, not the whole journal, which `run-events` already serves.
841
+ * The turn counter advances on `control.agent.turn-opened`, so every row
842
+ * carries the turn it belongs to, and each row's text is one display line, so
843
+ * a multi-line seat, message, or question cannot split one row into several.
844
+ *
845
+ * `uniqueCallEvents` normalizes native step facts, so a module run's steps
846
+ * report here too. The classes `Diagnosis` names apply, field by field:
847
+ *
848
+ * | Field | Class | Why |
849
+ * | ------ | --------- | --------------------------------------------------------- |
850
+ * | rows | aggregate | every row is one event this run recorded, wherever it ran |
851
+ * | `turn` | aggregate | a turn a step opened is a turn this run opened |
852
+ *
853
+ * No row is root only, because no row claims to be the run's answer or state:
854
+ * a `control.agent.resolved` row says one agent resolved, and the run's own
855
+ * answer is served by `runSummary` from `Diagnosis`. A new field has to name
856
+ * its class.
857
+ *
858
+ * @param events the run's ordered control events
859
+ * @since 1.0.0
860
+ * @category projections
861
+ */
862
+ export const transcript = (
863
+ events: ReadonlyArray<ControlSchema.ControlEvent>
864
+ ): ReadonlyArray<TranscriptRow> => {
865
+ const rows: Array<TranscriptRow> = []
866
+ let turn = 0
867
+ for (const event of uniqueCallEvents(events)) {
868
+ const payload = Diagnosis.asRecord(event.payload)
869
+ const runId = Diagnosis.asString(payload.runId) ?? event.runId
870
+ if (runId === undefined) continue
871
+ const reported = event.kind.startsWith("control.run.") ||
872
+ event.kind.startsWith("control.agent.") ||
873
+ transcriptKinds.has(event.kind)
874
+ if (!reported) continue
875
+ if (event.kind === "control.agent.turn-opened") turn += 1
876
+ rows.push({
877
+ runId,
878
+ sequence: event.sequence,
879
+ turn,
880
+ at: Diagnosis.timeOf(event),
881
+ kind: event.kind,
882
+ ...optional("callId", Diagnosis.asString(payload.callId)),
883
+ text: line(event.kind, payload)
884
+ })
885
+ }
886
+ return rows
887
+ }
888
+
889
+ /** One event as a single transcript line. */
890
+ const line = (kind: string, payload: Record<string, unknown>): string => {
891
+ switch (kind) {
892
+ case "control.agent.turn-opened":
893
+ return `turn opened · ${Diagnosis.firstLine(Diagnosis.asString(payload.seat) ?? "")}`
894
+ case "control.agent.model-settled": {
895
+ const usage = Diagnosis.asRecord(payload.usage)
896
+ return `model ${Diagnosis.asNumber(usage.inputTokens) ?? 0} in / ${
897
+ Diagnosis.asNumber(usage.outputTokens) ?? 0
898
+ } out`
899
+ }
900
+ case "control.agent.cell-call-started":
901
+ return `call ${Diagnosis.firstLine(Diagnosis.asString(payload.flowName) ?? "?")}`
902
+ case "control.agent.cell-call-settled":
903
+ return Diagnosis.asString(payload.outcome) === "failure"
904
+ ? ` -> FAIL ${Diagnosis.clip(Diagnosis.firstLine(Diagnosis.asString(payload.message) ?? ""), 100)}`
905
+ : " -> ok"
906
+ case "control.agent.resolved":
907
+ return `resolved ${Diagnosis.clip(Diagnosis.firstLine(Diagnosis.asString(payload.text) ?? ""), 100)}`
908
+ case "control.approval.requested":
909
+ return `approval requested: ${Diagnosis.firstLine(Diagnosis.asString(payload.question) ?? "")}`
910
+ default:
911
+ return kind.slice("control.".length)
912
+ }
913
+ }
914
+
915
+ /** Fold health from the same authoritative summary and committed event buffer as the run card.
916
+ * Invalid observations and foreign incarnations cannot color the current owner.
917
+ * @category projections
918
+ * @since 1.0.0
919
+ */
920
+ export const statusRollup = (
921
+ run: ControlSchema.RunSummary,
922
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
923
+ now: number
924
+ ): Health.StatusRollup => {
925
+ const incarnation = Health.runIncarnation(run)
926
+ const candidates: Array<Health.RecordedObservation> = []
927
+ const decode = Schema.decodeUnknownOption(Health.HealthObservation)
928
+ let evidenceSeq = 0
929
+ for (const event of events) {
930
+ if (event.kind === Health.statusObservedEventType) {
931
+ const reading = decode(event.payload)
932
+ if (reading._tag === "Some") candidates.push({ observation: reading.value, sequence: event.sequence })
933
+ } else if (!Monitor.isBookkeepingEvent(event.kind)) evidenceSeq = Math.max(evidenceSeq, event.sequence)
934
+ }
935
+ const latest = Health.latestObservation(candidates, `run:${run.runId}`, incarnation)
936
+ return Health.rollup({
937
+ subjectId: `run:${run.runId}`,
938
+ state: run.status,
939
+ incarnation,
940
+ waitingReason: run.waitingReason,
941
+ baseHealth: latest?.observation.baseHealth ??
942
+ Monitor.classify({ summary: run, events, beatsWithoutProgress: 0, stallBeats: 3 }),
943
+ latest,
944
+ now,
945
+ evidenceSeq,
946
+ updatedAt: run.updatedAt
947
+ })
948
+ }