@smthrs/gateway 0.35.0 → 1.0.0-rc.4

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 +509 -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 +471 -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 +19 -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 +1595 -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 +12 -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 +13 -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 +557 -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 +799 -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 +19 -0
  130. package/dist/esm/HostBranchPresence.d.ts.map +1 -0
  131. package/dist/esm/HostBranchPresence.js +57 -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 +2106 -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 +12 -0
  166. package/dist/esm/internal/actionRenderings.d.ts.map +1 -0
  167. package/dist/esm/internal/actionRenderings.js +212 -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 +13 -0
  182. package/dist/esm/internal/inspectLabels.d.ts.map +1 -0
  183. package/dist/esm/internal/inspectLabels.js +17 -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 +627 -0
  557. package/src/GatewayError.ts +71 -0
  558. package/src/GatewayProjection.ts +959 -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 +76 -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 +2796 -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 +212 -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 +18 -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,959 @@
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(
328
+ "finalOutput",
329
+ Diagnosis.resolvedOutput(facts) ?? (
330
+ run.status === "failed" && facts.fault?.tag.endsWith("/source_refused") &&
331
+ facts.cause?.match(/source_refused: ([a-z_]+)/)
332
+ ? JSON.stringify({ message: facts.cause.match(/source_refused: ([a-z_]+)/)![0] })
333
+ : undefined
334
+ )
335
+ ),
336
+ ...(run.status === "failed" ? optional("failureFault", facts.fault?.class) : {}),
337
+ ...(run.status === "failed" ? optional("failureTag", facts.fault?.tag) : {})
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Claims a call by its durable dispatch identity. Legacy history has no id:
343
+ * match only legacy starts by flow name (or FIFO when unnamed). A new
344
+ * settlement can close a legacy start after an old parked run resumes, but
345
+ * neither fallback may steal an identified call.
346
+ */
347
+ const takeOpenCall = <
348
+ A extends { readonly flowName: string; readonly callId: string | undefined; readonly scope: string | undefined }
349
+ >(
350
+ open: Array<A>,
351
+ callId: string | undefined,
352
+ flowName: string | undefined,
353
+ scope: string | undefined
354
+ ): A | undefined => {
355
+ const found = openCallIndex(open, callId, flowName, scope)
356
+ return found < 0 ? undefined : open.splice(found, 1)[0]
357
+ }
358
+
359
+ /**
360
+ * One agent call, as every node projection sees it: the ordinal it opened on,
361
+ * the seat that ran it, and the settlement that closed it, if one did.
362
+ */
363
+ interface CallRecord {
364
+ readonly nodeId: string
365
+ readonly flowName: string
366
+ readonly seat: string | undefined
367
+ readonly startedAt: number
368
+ readonly settlement: CallSettlement | undefined
369
+ }
370
+
371
+ /** What closed a call, and where among the run's settlements it closed. */
372
+ interface CallSettlement {
373
+ /** The rank of this settlement among the run's, counting from one. */
374
+ readonly order: number
375
+ /** The run the settlement named, which a malformed journal can omit. */
376
+ readonly runId: string | undefined
377
+ readonly at: number
378
+ readonly outcome: "success" | "failure"
379
+ readonly output: string
380
+ }
381
+
382
+ /**
383
+ * Folds one run's events into the agent calls it made, in the order they
384
+ * opened.
385
+ *
386
+ * This is the only fold that assigns a call its `call-N` identity, records the
387
+ * seat and time it opened on, and pairs a settlement with the call it closed.
388
+ * A client asks for a node's output by the id a tree row carries, so the two
389
+ * projections have to agree on that id; when they counted separately they
390
+ * could disagree, and once did, because skipping an event before the ordinal
391
+ * advanced shifted one fold's keys against the other's. The ordinal therefore
392
+ * advances on every distinct start, whatever else that event is missing.
393
+ * Identified duplicate starts and settlements are ignored. Old idless rows
394
+ * retain their original ordinal/FIFO interpretation; their missing dispatch
395
+ * identity cannot be reconstructed when same-name calls overlapped.
396
+ *
397
+ * `uniqueCallEvents` also normalizes native step facts, so this fold reads the
398
+ * run's own records and one stream per step a module run dispatched. The three
399
+ * classes `Diagnosis` names apply here too, field by field:
400
+ *
401
+ * | Field | Class | Why |
402
+ * | ----------------------- | --------------- | ------------------------------------------------------ |
403
+ * | `nodeId` (`call-N`) | aggregate | one tree lists every call the run made, steps included |
404
+ * | `flowName`, `startedAt` | aggregate | read off the call's own record |
405
+ * | `settlement` | aggregate | claimed by call identity within the recorded scope |
406
+ * | `seat` | scope dependent | who ran THIS call, so the turn must be this call's own |
407
+ *
408
+ * There is no root-only field here: a tree row describes a call, never the
409
+ * run's answer or state. A new field has to name its class.
410
+ */
411
+ const callHistory = (
412
+ events: ReadonlyArray<ControlSchema.ControlEvent>
413
+ ): ReadonlyArray<CallRecord> => {
414
+ const calls = new Map<string, CallRecord>()
415
+ const open: Array<
416
+ {
417
+ readonly callId: string | undefined
418
+ readonly flowName: string
419
+ readonly call: CallRecord
420
+ readonly scope: string | undefined
421
+ }
422
+ > = []
423
+ // The seat of the last turn opened in each scope. A module run interleaves
424
+ // steps in one journal, so the run-wide reading attributed one step's seat
425
+ // to another step's calls. A prompt run records one unscoped stream and
426
+ // reads exactly as it did.
427
+ const seats = new Map<string | undefined, string | undefined>()
428
+ let ordinal = 0
429
+ let settlements = 0
430
+
431
+ for (const event of uniqueCallEvents(events)) {
432
+ const payload = Diagnosis.asRecord(event.payload)
433
+ if (event.kind === "control.agent.turn-opened") {
434
+ const scope = callScope(event)
435
+ seats.set(scope, Diagnosis.asString(payload.seat) ?? seats.get(scope))
436
+ continue
437
+ }
438
+ if (event.kind === "control.agent.cell-call-started") {
439
+ const callId = Diagnosis.asString(payload.callId)
440
+ ordinal += 1
441
+ const nodeId = `call-${ordinal}`
442
+ const flowName = Diagnosis.asString(payload.flowName) ?? nodeId
443
+ const scope = callScope(event)
444
+ // This scope's own turn, else the run's. A step that opened no turn of
445
+ // its own borrows nothing from a sibling step.
446
+ const seat = seats.get(scope) ?? seats.get(undefined)
447
+ const call: CallRecord = { nodeId, flowName, seat, startedAt: Diagnosis.timeOf(event), settlement: undefined }
448
+ open.push({ callId, flowName, call, scope })
449
+ calls.set(nodeId, call)
450
+ continue
451
+ }
452
+ if (event.kind !== "control.agent.cell-call-settled") continue
453
+ const callId = Diagnosis.asString(payload.callId)
454
+ const claimed = takeOpenCall(open, callId, Diagnosis.asString(payload.flowName), callScope(event))
455
+ if (claimed === undefined) continue
456
+ const failed = Diagnosis.asString(payload.outcome) === "failure"
457
+ settlements += 1
458
+ // Rewriting the entry keeps the call in the position it opened on, which
459
+ // is the order a tree renders.
460
+ calls.set(claimed.call.nodeId, {
461
+ ...claimed.call,
462
+ settlement: {
463
+ order: settlements,
464
+ runId: Diagnosis.asString(payload.runId) ?? event.runId,
465
+ at: Diagnosis.timeOf(event),
466
+ outcome: failed ? "failure" : "success",
467
+ output: failed
468
+ ? Diagnosis.asString(payload.message) ?? ""
469
+ : Diagnosis.asString(payload.value) ?? JSON.stringify(payload.value ?? null)
470
+ }
471
+ })
472
+ }
473
+ return [...calls.values()]
474
+ }
475
+
476
+ /** How a tree row reports a call: settled the way it settled, or still running. */
477
+ const treeStatus = (settlement: CallSettlement | undefined): RunTreeRow["status"] => {
478
+ if (settlement === undefined) return "running"
479
+ return settlement.outcome === "failure" ? "failed" : "completed"
480
+ }
481
+
482
+ /**
483
+ * Folds one run's events into its node rows.
484
+ *
485
+ * A node opens on `control.agent.cell-call-started` and settles on the
486
+ * matching `control.agent.cell-call-settled`.
487
+ *
488
+ * AgentSession journals the same `callId` from the harness's dispatch identity
489
+ * on both records. Settlements join on it even when same-name calls overlap
490
+ * and finish out of order. The distinct-start ordinal remains the published
491
+ * `call-N` node key, preserving existing node links. Legacy records without
492
+ * callId retain same-name FIFO pairing, restricted to other legacy records
493
+ * (including a newly identified settlement of an old parked call).
494
+ *
495
+ * The durable engine's own `flows.engine.*` records are not folded here, but
496
+ * that is a choice rather than a limit. A host keeps the control plane and the
497
+ * engine in two databases with two journals (`@smthrs/cli`
498
+ * `NodeControl.databasePath` and `executionDatabasePath`), and
499
+ * `EngineJournalProjection` copies every engine entry of the run into the
500
+ * control journal as a `control.engine.event` envelope, which is how
501
+ * {@link nodeDurations} reads the node records. A tree row is an agent cell
502
+ * call, so what an engine step did reaches this projection as the call that
503
+ * made it.
504
+ *
505
+ * A node that never settled stays `running`, which is how a live tree renders
506
+ * work in flight.
507
+ *
508
+ * @param run the control-plane run summary
509
+ * @param events that run's ordered control events
510
+ * @since 1.0.0
511
+ * @category projections
512
+ */
513
+ export const runTree = (
514
+ run: ControlSchema.RunSummary,
515
+ events: ReadonlyArray<ControlSchema.ControlEvent>
516
+ ): ReadonlyArray<RunTreeRow> =>
517
+ callHistory(events).map((call): RunTreeRow => ({
518
+ runId: run.runId,
519
+ nodeId: call.nodeId,
520
+ label: call.flowName,
521
+ status: treeStatus(call.settlement),
522
+ ...optional("seat", call.seat),
523
+ startedAt: call.startedAt,
524
+ ...optional("endedAt", call.settlement?.at),
525
+ ...optional("parentRunId", run.parentRunId)
526
+ }))
527
+
528
+ /**
529
+ * The declared question of a human wait, as far as it can be read.
530
+ *
531
+ * `request` is whatever the wait wrote about itself, which for `HumanTask` is
532
+ * `{task, name, kind, prompt, attempt, maxAttempts}`. A wait that declared
533
+ * nothing — an older park, or a plugin's own — still produces a row, because a
534
+ * gate a person cannot see is a run that waits forever; it just has less to
535
+ * render.
536
+ */
537
+ const questionOf = (wait: ControlSchema.PendingWait): Record<string, unknown> => Diagnosis.asRecord(wait.request)
538
+
539
+ /**
540
+ * One pending row for a human wait held anywhere in a run's tree.
541
+ *
542
+ * `runId` is the ROOT: this is the run a person opened, and the run a decision
543
+ * is addressed to. `waitRunId` is the execution actually holding it, because a
544
+ * client routes by run and the control plane routes within the tree.
545
+ *
546
+ * `requestId` is the wait point's own name (`coding-clarification#1`), which is
547
+ * unique within a tree, stable across a re-read, and the name a `Signal`
548
+ * addresses. The token travels in the request too, for a client that would
549
+ * rather submit the exact durable address back.
550
+ */
551
+ const humanWaitRow = (
552
+ run: ControlSchema.RunSummary,
553
+ wait: ControlSchema.PendingWait,
554
+ projected?: ExecutionFact.Observation,
555
+ questionProvenance: "events" | "legacy-observation" | "unverified-observation" = "legacy-observation"
556
+ ): ApprovalRow => {
557
+ const question = projected === undefined ? questionOf(wait) : Diagnosis.asRecord(projected.waiting?.request)
558
+ const name = wait.name ?? Diagnosis.asString(question["name"]) ?? wait.token
559
+ const requestId = wait.attempt === undefined ? name : `${name}#${wait.attempt}`
560
+ const prompt = Diagnosis.asString(question["prompt"])
561
+ const waitFlowId = projected?.flowName ?? wait.flowId
562
+ return {
563
+ runId: run.runId,
564
+ waitRunId: wait.runId,
565
+ questionProvenance,
566
+ requestId,
567
+ title: prompt ?? `Answer needed — ${name}`,
568
+ request: {
569
+ ...question,
570
+ kind: Diagnosis.asString(question["kind"]) ?? "ask",
571
+ name,
572
+ ...(wait.attempt === undefined ? {} : { attempt: wait.attempt }),
573
+ ...(waitFlowId === undefined ? {} : { waitFlowId }),
574
+ token: wait.token
575
+ },
576
+ payload: {
577
+ target: {
578
+ _tag: "Node",
579
+ runId: run.runId,
580
+ requestId,
581
+ digest: wait.token,
582
+ // A human answer grants no capabilities: the envelope a decision binds
583
+ // to is the empty one, the same shape a flow with none carries.
584
+ envelope: { capabilities: [], flows: [], budget: {} }
585
+ },
586
+ scope: "once",
587
+ // The identity is the PARK, not its name: a loop that re-asks one
588
+ // question parks again under the same run, name and attempt, and a
589
+ // name-keyed answer would deduplicate the second decision into the
590
+ // first — accepted, never delivered, and parked forever.
591
+ idempotencyKey: `answer:${run.runId}:${requestId}:${wait.tokenDigest ?? wait.token}`
592
+ },
593
+ requestedAt: projected?.createdAtMs ?? wait.createdAt,
594
+ status: "pending"
595
+ }
596
+ }
597
+
598
+ /**
599
+ * Folds one run's events into its approval rows.
600
+ *
601
+ * A request opens a pending row carrying the submit-ready payload; the
602
+ * matching `control.approval.approved` or `control.approval.denied` closes it
603
+ * without discarding the request, so a decided gate stays readable.
604
+ *
605
+ * A `HumanTask` declares its question on the parked row. Native execution
606
+ * facts carry the redacted question and token digest; verified facts supply
607
+ * its display metadata here. `@smthrs/control` rolls current open waits onto
608
+ * the root as `pendingWaits`, which supply each row's protected wake address.
609
+ * History alone cannot create an answerable human wait. Older observations
610
+ * remain visible with explicit question provenance when native fact coverage
611
+ * is unavailable. These rows come first because they still need an answer.
612
+ *
613
+ * A decision names the gate it closed by `tokenId`. `@smthrs/control`
614
+ * `SqlControlRuntime.lookupApproval` mints that token id from the target, and
615
+ * for the `Node` target a run parks on it is the request id itself, so the two
616
+ * records join on one field. A decision whose `tokenId` or `requestId` names
617
+ * no row is retained for an exact later request. Only a legacy decision that
618
+ * names neither field closes the oldest pending legacy row in that run.
619
+ * Current facts bind the target digest; duplicates cannot reopen a decision.
620
+ *
621
+ * @param events the run's ordered control events
622
+ * @since 1.0.0
623
+ * @category projections
624
+ */
625
+ export const approvals = (
626
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
627
+ run?: ControlSchema.RunSummary | undefined
628
+ ): ReadonlyArray<ApprovalRow> => {
629
+ const native = run === undefined ? undefined : ExecutionFact.foldControl(events, run.runId, run.executionView)
630
+ const grantFacts = events.filter((event) =>
631
+ event.kind === "control.approval.requested" && Schema.is(ControlFacts.ApprovalRequestFact)(event.payload)
632
+ )
633
+ const grants = ControlFacts.fold(grantFacts).approvals
634
+ const observed = run?.pendingWaits?.map((wait) => {
635
+ // An agent ask parks on its registered grant token, not a HumanTask answer.
636
+ // Preserve the committed target instead of inventing an answer-only target.
637
+ const grant = grants.find((row) => row.runId === run.runId && row.requestId === wait.token)
638
+ if (grant !== undefined) return grant
639
+ const projected = native?.provenance.humanWaits === "events" ?
640
+ native.view?.humanWaits?.find((candidate) =>
641
+ candidate.executionId === wait.runId && candidate.waiting?.tokenDigest === wait.tokenDigest
642
+ ) :
643
+ undefined
644
+ return humanWaitRow(
645
+ run,
646
+ wait,
647
+ projected,
648
+ projected === undefined
649
+ ? native?.provenance.humanWaits === "events" ?
650
+ "unverified-observation" :
651
+ native?.provenance.humanWaits ?? "legacy-observation"
652
+ : "events"
653
+ )
654
+ })
655
+ // The current observation supplies wake authority. History supplies only the
656
+ // display metadata that verifies against that exact observed token digest.
657
+ return ControlFacts.fold(events, undefined, observed).approvals
658
+ }
659
+
660
+ /**
661
+ * Folds one run's events into its node outputs, keyed the way {@link runTree}
662
+ * keys its rows: by the ordinal the call opened on.
663
+ *
664
+ * A settled call carries the value it produced, so the row carries that value.
665
+ * A run's own result reaches a client as `RunSummaryRow.finalOutput` instead.
666
+ *
667
+ * @param events the run's ordered control events
668
+ * @since 1.0.0
669
+ * @category projections
670
+ */
671
+ export const nodeOutput = (
672
+ events: ReadonlyArray<ControlSchema.ControlEvent>
673
+ ): ReadonlyArray<NodeOutputRow> => {
674
+ const settled: Array<{ readonly order: number; readonly row: NodeOutputRow }> = []
675
+ for (const call of callHistory(events)) {
676
+ const settlement = call.settlement
677
+ if (settlement === undefined) continue
678
+ // A row names the run it belongs to. A settlement that names none closes
679
+ // its call without producing one.
680
+ if (settlement.runId === undefined) continue
681
+ settled.push({
682
+ order: settlement.order,
683
+ row: {
684
+ runId: settlement.runId,
685
+ nodeId: call.nodeId,
686
+ outcome: settlement.outcome,
687
+ output: settlement.output,
688
+ settledAt: settlement.at
689
+ }
690
+ })
691
+ }
692
+ // A tree reads in the order calls opened; outputs read in the order they
693
+ // settled, which is the order a client watched them arrive.
694
+ return settled.sort((left, right) => left.order - right.order).map((entry) => entry.row)
695
+ }
696
+
697
+ /** The node id every execution gives the flow it was started to run. */
698
+ const rootNodeId = "root"
699
+
700
+ /**
701
+ * The native execution the host bound this control run to, when one is known.
702
+ *
703
+ * Only the host's own binding record names the root, and two records that
704
+ * disagree name nothing: an ambiguous binding cannot tell a callee's
705
+ * execution apart from the root's, so it authorizes no skip.
706
+ *
707
+ * The binding is written once, when the host takes the root up, so a window
708
+ * bounded to a run's newest events is the one window it falls out of. The
709
+ * carried digest keeps it across that eviction, and reading from the carry is
710
+ * what keeps a long run's calls counted the same as a short run's.
711
+ */
712
+ const boundExecution = (
713
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
714
+ carry: Diagnosis.Digest | undefined
715
+ ): string | undefined => {
716
+ let resolution = carry?.nativeResolution
717
+ for (const event of events) resolution = NativeResolution.combine(resolution, NativeResolution.fromEvent(event))
718
+ return resolution === undefined || resolution.conflict === true ? undefined : resolution.binding?.executionId
719
+ }
720
+
721
+ /**
722
+ * A callee's own view of a call its caller already measured.
723
+ *
724
+ * Every execution below the bound root was started by a `FlowCall` node in
725
+ * the execution above it, and that node carries the same action tag over the
726
+ * same span. The caller's node is the one kept, because it is the node a plan
727
+ * carries and the one a graph can join a prediction onto.
728
+ *
729
+ * With no binding nothing is echoed: a fold that cannot name the root cannot
730
+ * tell which `root` record belongs to it, and dropping samples on a guess
731
+ * would answer a smaller history than the flow ran.
732
+ */
733
+ const echoedRoot = (bound: string | undefined, executionId: string, nodeId: string): boolean =>
734
+ bound !== undefined && nodeId === rootNodeId && executionId !== bound
735
+
736
+ /**
737
+ * Folds one run's events into the executions it measured.
738
+ *
739
+ * A node's work starts when the engine recorded it scheduled and ends when it
740
+ * recorded it settled, so a duration is the distance between those two native
741
+ * stamps. Four of the five outcomes contribute nothing: `clean` was served
742
+ * from records rather than run, `failed` measures a collapse, `skipped` was
743
+ * never reached, and `deferred` is scheduling debt. Only `built` ran.
744
+ *
745
+ * A settlement pairs with the LAST schedule of the same execution and node,
746
+ * which is what makes a retried node measure its final attempt rather than
747
+ * the span across every attempt. Two executions of one node id stay apart
748
+ * because the pairing key carries the execution, and a settlement no schedule
749
+ * opened measures nothing rather than measuring from zero.
750
+ *
751
+ * A record that names no action tag contributes nothing either: history is
752
+ * grouped by tag, and a sample with no tag has nowhere honest to go.
753
+ *
754
+ * A called flow is measured once. The engine records one call twice: the
755
+ * caller admits and settles the node that made it, and the callee's own
756
+ * execution admits and settles its `root` over the same span with the same
757
+ * action tag. {@link echoedRoot} drops the callee's copy, so one invocation
758
+ * is one sample rather than two, and `samples` stays the count of executions
759
+ * the flow performed.
760
+ *
761
+ * @param events the run's ordered control events
762
+ * @param carry the digest of the events a bounded window dropped, when it dropped any
763
+ * @since 1.0.0
764
+ * @category projections
765
+ */
766
+ export const nodeDurations = (
767
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
768
+ carry?: Diagnosis.Digest | undefined
769
+ ): ReadonlyArray<NodeDuration> => {
770
+ const bound = boundExecution(events, carry)
771
+ const started = new Map<string, number>()
772
+ const measured: Array<NodeDuration> = []
773
+ for (const event of events) {
774
+ const schedule = NodeEvents.nodeScheduled(event)
775
+ if (schedule !== undefined) {
776
+ if (echoedRoot(bound, schedule.executionId, schedule.payload.nodeId)) continue
777
+ started.set(`${schedule.executionId}\u0000${schedule.payload.nodeId}`, schedule.emittedAtMs)
778
+ continue
779
+ }
780
+ const settlement = NodeEvents.nodeSettled(event)
781
+ if (settlement === undefined) continue
782
+ if (echoedRoot(bound, settlement.executionId, settlement.payload.nodeId)) continue
783
+ if (settlement.payload.outcome !== "built") continue
784
+ const actionTag = settlement.payload.action
785
+ if (actionTag === undefined) continue
786
+ const key = `${settlement.executionId}\u0000${settlement.payload.nodeId}`
787
+ const startedAt = started.get(key)
788
+ if (startedAt === undefined) continue
789
+ started.delete(key)
790
+ const durationMs = settlement.emittedAtMs - startedAt
791
+ // Wall clocks can move backwards, and a completion that predates its own
792
+ // start is a clock fact rather than a duration.
793
+ if (durationMs < 0) continue
794
+ measured.push({ actionTag, durationMs })
795
+ }
796
+ return measured
797
+ }
798
+
799
+ /** The nearest-rank percentile of an ascending sample, which is one observed value. */
800
+ const nearestRank = (ascending: ReadonlyArray<number>, percentile: number): number =>
801
+ ascending[Math.ceil((percentile / 100) * ascending.length) - 1]!
802
+
803
+ /**
804
+ * Folds every measured execution of one flow into one row per action tag.
805
+ *
806
+ * Both percentiles are nearest-rank, so each answer is a duration the flow
807
+ * really took rather than an interpolation between two it did not. Rows are
808
+ * ordered by tag, so two reads of the same history answer in the same order.
809
+ *
810
+ * A tag reaches this function only by having been measured, so every row
811
+ * carries at least one sample, and a flow nothing has measured answers with
812
+ * no rows at all.
813
+ *
814
+ * @param flowId the flow whose history was read
815
+ * @param samples every measured execution of that flow's runs
816
+ * @since 1.0.0
817
+ * @category projections
818
+ */
819
+ export const flowDurations = (
820
+ flowId: string,
821
+ samples: ReadonlyArray<NodeDuration>
822
+ ): ReadonlyArray<FlowDurationRow> => {
823
+ const byTag = new Map<string, Array<number>>()
824
+ for (const sample of samples) {
825
+ const held = byTag.get(sample.actionTag)
826
+ if (held === undefined) byTag.set(sample.actionTag, [sample.durationMs])
827
+ else held.push(sample.durationMs)
828
+ }
829
+ return [...byTag.entries()]
830
+ .sort(([left], [right]) => left < right ? -1 : 1)
831
+ .map(([actionTag, observed]) => {
832
+ const ascending = [...observed].sort((left, right) => left - right)
833
+ return {
834
+ flowId,
835
+ actionTag,
836
+ samples: ascending.length,
837
+ p50Ms: nearestRank(ascending, 50),
838
+ p90Ms: nearestRank(ascending, 90)
839
+ }
840
+ })
841
+ }
842
+
843
+ /** Events the transcript reports verbatim rather than as agent activity. */
844
+ const transcriptKinds: ReadonlySet<string> = new Set(["control.approval.requested"])
845
+
846
+ /**
847
+ * Folds one run's events into a turn-numbered transcript.
848
+ *
849
+ * A row is reported for every `control.run.*` and `control.agent.*` event and
850
+ * for an approval request, and for nothing else: the transcript is what a
851
+ * reader follows, not the whole journal, which `run-events` already serves.
852
+ * The turn counter advances on `control.agent.turn-opened`, so every row
853
+ * carries the turn it belongs to, and each row's text is one display line, so
854
+ * a multi-line seat, message, or question cannot split one row into several.
855
+ *
856
+ * `uniqueCallEvents` normalizes native step facts, so a module run's steps
857
+ * report here too. The classes `Diagnosis` names apply, field by field:
858
+ *
859
+ * | Field | Class | Why |
860
+ * | ------ | --------- | --------------------------------------------------------- |
861
+ * | rows | aggregate | every row is one event this run recorded, wherever it ran |
862
+ * | `turn` | aggregate | a turn a step opened is a turn this run opened |
863
+ *
864
+ * No row is root only, because no row claims to be the run's answer or state:
865
+ * a `control.agent.resolved` row says one agent resolved, and the run's own
866
+ * answer is served by `runSummary` from `Diagnosis`. A new field has to name
867
+ * its class.
868
+ *
869
+ * @param events the run's ordered control events
870
+ * @since 1.0.0
871
+ * @category projections
872
+ */
873
+ export const transcript = (
874
+ events: ReadonlyArray<ControlSchema.ControlEvent>
875
+ ): ReadonlyArray<TranscriptRow> => {
876
+ const rows: Array<TranscriptRow> = []
877
+ let turn = 0
878
+ for (const event of uniqueCallEvents(events)) {
879
+ const payload = Diagnosis.asRecord(event.payload)
880
+ const runId = Diagnosis.asString(payload.runId) ?? event.runId
881
+ if (runId === undefined) continue
882
+ const reported = event.kind.startsWith("control.run.") ||
883
+ event.kind.startsWith("control.agent.") ||
884
+ transcriptKinds.has(event.kind)
885
+ if (!reported) continue
886
+ if (event.kind === "control.agent.turn-opened") turn += 1
887
+ rows.push({
888
+ runId,
889
+ sequence: event.sequence,
890
+ turn,
891
+ at: Diagnosis.timeOf(event),
892
+ kind: event.kind,
893
+ ...optional("callId", Diagnosis.asString(payload.callId)),
894
+ text: line(event.kind, payload)
895
+ })
896
+ }
897
+ return rows
898
+ }
899
+
900
+ /** One event as a single transcript line. */
901
+ const line = (kind: string, payload: Record<string, unknown>): string => {
902
+ switch (kind) {
903
+ case "control.agent.turn-opened":
904
+ return `turn opened · ${Diagnosis.firstLine(Diagnosis.asString(payload.seat) ?? "")}`
905
+ case "control.agent.model-settled": {
906
+ const usage = Diagnosis.asRecord(payload.usage)
907
+ return `model ${Diagnosis.asNumber(usage.inputTokens) ?? 0} in / ${
908
+ Diagnosis.asNumber(usage.outputTokens) ?? 0
909
+ } out`
910
+ }
911
+ case "control.agent.cell-call-started":
912
+ return `call ${Diagnosis.firstLine(Diagnosis.asString(payload.flowName) ?? "?")}`
913
+ case "control.agent.cell-call-settled":
914
+ return Diagnosis.asString(payload.outcome) === "failure"
915
+ ? ` -> FAIL ${Diagnosis.clip(Diagnosis.firstLine(Diagnosis.asString(payload.message) ?? ""), 100)}`
916
+ : " -> ok"
917
+ case "control.agent.resolved":
918
+ return `resolved ${Diagnosis.clip(Diagnosis.firstLine(Diagnosis.asString(payload.text) ?? ""), 100)}`
919
+ case "control.approval.requested":
920
+ return `approval requested: ${Diagnosis.firstLine(Diagnosis.asString(payload.question) ?? "")}`
921
+ default:
922
+ return kind.slice("control.".length)
923
+ }
924
+ }
925
+
926
+ /** Fold health from the same authoritative summary and committed event buffer as the run card.
927
+ * Invalid observations and foreign incarnations cannot color the current owner.
928
+ * @category projections
929
+ * @since 1.0.0
930
+ */
931
+ export const statusRollup = (
932
+ run: ControlSchema.RunSummary,
933
+ events: ReadonlyArray<ControlSchema.ControlEvent>,
934
+ now: number
935
+ ): Health.StatusRollup => {
936
+ const incarnation = Health.runIncarnation(run)
937
+ const candidates: Array<Health.RecordedObservation> = []
938
+ const decode = Schema.decodeUnknownOption(Health.HealthObservation)
939
+ let evidenceSeq = 0
940
+ for (const event of events) {
941
+ if (event.kind === Health.statusObservedEventType) {
942
+ const reading = decode(event.payload)
943
+ if (reading._tag === "Some") candidates.push({ observation: reading.value, sequence: event.sequence })
944
+ } else if (!Monitor.isBookkeepingEvent(event.kind)) evidenceSeq = Math.max(evidenceSeq, event.sequence)
945
+ }
946
+ const latest = Health.latestObservation(candidates, `run:${run.runId}`, incarnation)
947
+ return Health.rollup({
948
+ subjectId: `run:${run.runId}`,
949
+ state: run.status,
950
+ incarnation,
951
+ waitingReason: run.waitingReason,
952
+ baseHealth: latest?.observation.baseHealth ??
953
+ Monitor.classify({ summary: run, events, beatsWithoutProgress: 0, stallBeats: 3 }),
954
+ latest,
955
+ now,
956
+ evidenceSeq,
957
+ updatedAt: run.updatedAt
958
+ })
959
+ }