@graphrefly/ts 0.0.1 → 0.0.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 (333) hide show
  1. package/README.md +197 -117
  2. package/dist/actions-types-CH-XCU9O.d.cts +657 -0
  3. package/dist/actions-types-w2iPQTkv.d.ts +657 -0
  4. package/dist/adapters/index.cjs +5157 -2951
  5. package/dist/adapters/index.cjs.map +1 -1
  6. package/dist/adapters/index.d.cts +207 -70
  7. package/dist/adapters/index.d.ts +207 -70
  8. package/dist/adapters/index.js +3738 -1688
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/nestjs/microservices.cjs +841 -0
  11. package/dist/adapters/nestjs/microservices.cjs.map +1 -0
  12. package/dist/adapters/nestjs/microservices.d.cts +45 -0
  13. package/dist/adapters/nestjs/microservices.d.ts +45 -0
  14. package/dist/adapters/nestjs/microservices.js +206 -0
  15. package/dist/adapters/nestjs/microservices.js.map +1 -0
  16. package/dist/adapters/nestjs/native.cjs +1391 -0
  17. package/dist/adapters/nestjs/native.cjs.map +1 -0
  18. package/dist/adapters/nestjs/native.d.cts +111 -0
  19. package/dist/adapters/nestjs/native.d.ts +111 -0
  20. package/dist/adapters/nestjs/native.js +577 -0
  21. package/dist/adapters/nestjs/native.js.map +1 -0
  22. package/dist/adapters/nestjs/websockets.cjs +924 -0
  23. package/dist/adapters/nestjs/websockets.cjs.map +1 -0
  24. package/dist/adapters/nestjs/websockets.d.cts +47 -0
  25. package/dist/adapters/nestjs/websockets.d.ts +47 -0
  26. package/dist/adapters/nestjs/websockets.js +286 -0
  27. package/dist/adapters/nestjs/websockets.js.map +1 -0
  28. package/dist/adapters/nestjs.cjs +1085 -0
  29. package/dist/adapters/nestjs.cjs.map +1 -0
  30. package/dist/adapters/nestjs.d.cts +385 -0
  31. package/dist/adapters/nestjs.d.ts +385 -0
  32. package/dist/adapters/nestjs.js +112 -0
  33. package/dist/adapters/nestjs.js.map +1 -0
  34. package/dist/adapters/observe-storage.d.cts +3 -3
  35. package/dist/adapters/observe-storage.d.ts +3 -3
  36. package/dist/adapters/observe-storage.js +4 -4
  37. package/dist/adapters/react.cjs.map +1 -1
  38. package/dist/adapters/react.d.cts +2 -2
  39. package/dist/adapters/react.d.ts +2 -2
  40. package/dist/adapters/react.js +1 -1
  41. package/dist/adapters/solid.cjs.map +1 -1
  42. package/dist/adapters/solid.d.cts +2 -2
  43. package/dist/adapters/solid.d.ts +2 -2
  44. package/dist/adapters/solid.js +1 -1
  45. package/dist/adapters/svelte.cjs.map +1 -1
  46. package/dist/adapters/svelte.d.cts +2 -2
  47. package/dist/adapters/svelte.d.ts +2 -2
  48. package/dist/adapters/svelte.js +1 -1
  49. package/dist/adapters/vue.cjs.map +1 -1
  50. package/dist/adapters/vue.d.cts +2 -2
  51. package/dist/adapters/vue.d.ts +2 -2
  52. package/dist/adapters/vue.js +1 -1
  53. package/dist/{agent-runtime-BesGDZcB.d.ts → agent-runtime-types-core-CKwrBDyi.d.ts} +171 -320
  54. package/dist/{agent-runtime-DZTJ3C-p.d.cts → agent-runtime-types-core-bfl4m0vM.d.cts} +171 -320
  55. package/dist/agent-runtime-types-tool-BLPV3azj.d.cts +695 -0
  56. package/dist/agent-runtime-types-tool-hwqvVqNt.d.ts +695 -0
  57. package/dist/agentic-memory-retention-CLwI76JK.d.ts +14 -0
  58. package/dist/agentic-memory-retention-Cz8GR6ie.d.cts +14 -0
  59. package/dist/{agentic-memory-DfuVZ-lY.d.cts → agentic-memory-types-JDr7MPhh.d.cts} +13 -57
  60. package/dist/{agentic-memory-BmRCvh0d.d.ts → agentic-memory-types-khYJgzKL.d.ts} +13 -57
  61. package/dist/{capability-admission-B0BzqAm5.d.cts → capability-admission-B8RNFyaZ.d.cts} +3 -3
  62. package/dist/{capability-admission-g0mn9hpq.d.ts → capability-admission-Dkw1Xz3r.d.ts} +3 -3
  63. package/dist/chunk-2KUAG2GZ.js +9693 -0
  64. package/dist/chunk-2KUAG2GZ.js.map +1 -0
  65. package/dist/{chunk-CZNV3VXM.js → chunk-3J7UPZL5.js} +11 -11
  66. package/dist/{chunk-HKK2JD7Z.js → chunk-3LYI6ADX.js} +12 -125
  67. package/dist/chunk-3LYI6ADX.js.map +1 -0
  68. package/dist/{chunk-YXMZ2N6J.js → chunk-4M37FH2I.js} +1071 -1025
  69. package/dist/chunk-4M37FH2I.js.map +1 -0
  70. package/dist/{chunk-YDSIVHRR.js → chunk-4NWSNI4K.js} +1598 -1584
  71. package/dist/chunk-4NWSNI4K.js.map +1 -0
  72. package/dist/{chunk-Z2ANQ6JW.js → chunk-4Q77MMJY.js} +2 -2
  73. package/dist/{chunk-SS2A464I.js → chunk-54WPEODM.js} +3 -3
  74. package/dist/chunk-54WPEODM.js.map +1 -0
  75. package/dist/chunk-6E76H4OU.js +132 -0
  76. package/dist/chunk-6E76H4OU.js.map +1 -0
  77. package/dist/chunk-7GOTIIQ7.js +819 -0
  78. package/dist/chunk-7GOTIIQ7.js.map +1 -0
  79. package/dist/{chunk-V7CIJE4B.js → chunk-DKFWDTVY.js} +92 -9
  80. package/dist/chunk-DKFWDTVY.js.map +1 -0
  81. package/dist/{chunk-FBUU43PM.js → chunk-E4QCH32M.js} +448 -446
  82. package/dist/chunk-E4QCH32M.js.map +1 -0
  83. package/dist/{chunk-XKXWK2KP.js → chunk-GXU6WFEJ.js} +1157 -1021
  84. package/dist/chunk-GXU6WFEJ.js.map +1 -0
  85. package/dist/{chunk-K3FXTC3I.js → chunk-HJACH5PU.js} +3 -3
  86. package/dist/{chunk-GTPCOEOZ.js → chunk-IDMLXLLG.js} +3 -3
  87. package/dist/{chunk-DKP56CSW.js → chunk-JKAYLDQV.js} +2 -2
  88. package/dist/{chunk-4VLAQHZI.js → chunk-K7FB3JTD.js} +17 -1
  89. package/dist/chunk-K7FB3JTD.js.map +1 -0
  90. package/dist/{chunk-43BKLFZU.js → chunk-KFURM6FM.js} +10 -10
  91. package/dist/{chunk-H75VXTGT.js → chunk-L6LDXRWE.js} +3 -3
  92. package/dist/{chunk-H75VXTGT.js.map → chunk-L6LDXRWE.js.map} +1 -1
  93. package/dist/chunk-MCOFHMUU.js +4131 -0
  94. package/dist/chunk-MCOFHMUU.js.map +1 -0
  95. package/dist/chunk-MQEQMS7B.js +1009 -0
  96. package/dist/chunk-MQEQMS7B.js.map +1 -0
  97. package/dist/chunk-MTELVIYR.js +1421 -0
  98. package/dist/chunk-MTELVIYR.js.map +1 -0
  99. package/dist/{chunk-3JR3EDB2.js → chunk-NNDIFUKX.js} +121 -115
  100. package/dist/chunk-NNDIFUKX.js.map +1 -0
  101. package/dist/{chunk-2747WN4Y.js → chunk-PUSRRALM.js} +3 -3
  102. package/dist/{chunk-QFY4AFY4.js → chunk-PVC7WDKI.js} +58 -52
  103. package/dist/chunk-PVC7WDKI.js.map +1 -0
  104. package/dist/{chunk-VTHLCFN4.js → chunk-RAHNUYA5.js} +2 -2
  105. package/dist/chunk-TQPCAIQI.js +612 -0
  106. package/dist/chunk-TQPCAIQI.js.map +1 -0
  107. package/dist/{chunk-IXZBUWSP.js → chunk-UEMN5URK.js} +2 -2
  108. package/dist/chunk-WOS7RJYZ.js +1320 -0
  109. package/dist/chunk-WOS7RJYZ.js.map +1 -0
  110. package/dist/{chunk-6PHB5CJS.js → chunk-ZLFRB6FI.js} +2 -2
  111. package/dist/composition/index.cjs +1228 -1076
  112. package/dist/composition/index.cjs.map +1 -1
  113. package/dist/composition/index.d.cts +3 -3
  114. package/dist/composition/index.d.ts +3 -3
  115. package/dist/composition/index.js +4 -4
  116. package/dist/core/index.cjs +1198 -1046
  117. package/dist/core/index.cjs.map +1 -1
  118. package/dist/core/index.d.cts +23 -2
  119. package/dist/core/index.d.ts +23 -2
  120. package/dist/core/index.js +2 -2
  121. package/dist/cqrs/index.d.cts +3 -3
  122. package/dist/cqrs/index.d.ts +3 -3
  123. package/dist/cqrs/messaging.d.cts +4 -4
  124. package/dist/cqrs/messaging.d.ts +4 -4
  125. package/dist/cqrs/work-queue.d.cts +5 -5
  126. package/dist/cqrs/work-queue.d.ts +5 -5
  127. package/dist/data-structures/index.cjs +1226 -1074
  128. package/dist/data-structures/index.cjs.map +1 -1
  129. package/dist/data-structures/index.d.cts +8 -7
  130. package/dist/data-structures/index.d.ts +8 -7
  131. package/dist/data-structures/index.js +6 -5
  132. package/dist/{describe-DYMw_l1C.d.cts → describe-BumQ-3_0.d.cts} +1 -1
  133. package/dist/{describe-BpyJuWkw.d.ts → describe-cYr_Z5zm.d.ts} +1 -1
  134. package/dist/executors/tool-provider-adapters.cjs +3091 -0
  135. package/dist/executors/tool-provider-adapters.cjs.map +1 -0
  136. package/dist/executors/tool-provider-adapters.d.cts +174 -0
  137. package/dist/executors/tool-provider-adapters.d.ts +174 -0
  138. package/dist/executors/tool-provider-adapters.js +1336 -0
  139. package/dist/executors/tool-provider-adapters.js.map +1 -0
  140. package/dist/executors/tool-provider-runtime.cjs +5178 -0
  141. package/dist/executors/tool-provider-runtime.cjs.map +1 -0
  142. package/dist/executors/tool-provider-runtime.d.cts +17 -0
  143. package/dist/executors/tool-provider-runtime.d.ts +17 -0
  144. package/dist/executors/tool-provider-runtime.js +15 -0
  145. package/dist/executors/tool-provider-runtime.js.map +1 -0
  146. package/dist/executors/tool-provider.cjs +6392 -0
  147. package/dist/executors/tool-provider.cjs.map +1 -0
  148. package/dist/executors/tool-provider.d.cts +60 -0
  149. package/dist/executors/tool-provider.d.ts +60 -0
  150. package/dist/executors/tool-provider.js +89 -0
  151. package/dist/executors/tool-provider.js.map +1 -0
  152. package/dist/executors/work-queue.d.cts +6 -6
  153. package/dist/executors/work-queue.d.ts +6 -6
  154. package/dist/graph/index.cjs +1499 -1341
  155. package/dist/graph/index.cjs.map +1 -1
  156. package/dist/graph/index.d.cts +9 -8
  157. package/dist/graph/index.d.ts +9 -8
  158. package/dist/graph/index.js +23 -22
  159. package/dist/{graph-DCEWh4T2.d.cts → graph-C1C-wb0L.d.cts} +266 -137
  160. package/dist/{graph-D-1-SQeC.d.ts → graph-CS0b4V9B.d.ts} +266 -137
  161. package/dist/{index-72VZC0-E.d.cts → index-DLrNopda.d.cts} +151 -10
  162. package/dist/{index-Bmxeu0nK.d.ts → index-DzJni3_6.d.ts} +151 -10
  163. package/dist/index.cjs +3397 -3140
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/index.d.cts +12 -9
  166. package/dist/index.d.ts +12 -9
  167. package/dist/index.js +110 -109
  168. package/dist/inspection/boundary.d.cts +4 -4
  169. package/dist/inspection/boundary.d.ts +4 -4
  170. package/dist/measurements-BWAnochv.d.ts +294 -0
  171. package/dist/measurements-B_gJfD8h.d.cts +294 -0
  172. package/dist/messaging/index.cjs +57 -51
  173. package/dist/messaging/index.cjs.map +1 -1
  174. package/dist/messaging/index.d.cts +11 -276
  175. package/dist/messaging/index.d.ts +11 -276
  176. package/dist/messaging/index.js +1 -1
  177. package/dist/operators/index.cjs +1228 -1076
  178. package/dist/operators/index.cjs.map +1 -1
  179. package/dist/operators/index.d.cts +5 -5
  180. package/dist/operators/index.d.ts +5 -5
  181. package/dist/operators/index.js +5 -5
  182. package/dist/orchestration/index.cjs +8844 -6071
  183. package/dist/orchestration/index.cjs.map +1 -1
  184. package/dist/orchestration/index.d.cts +171 -224
  185. package/dist/orchestration/index.d.ts +171 -224
  186. package/dist/orchestration/index.js +42 -991
  187. package/dist/orchestration/index.js.map +1 -1
  188. package/dist/orchestration/messaging.d.cts +5 -8
  189. package/dist/orchestration/messaging.d.ts +5 -8
  190. package/dist/orchestration/work-queue.cjs +1243 -5
  191. package/dist/orchestration/work-queue.cjs.map +1 -1
  192. package/dist/orchestration/work-queue.d.cts +121 -10
  193. package/dist/orchestration/work-queue.d.ts +121 -10
  194. package/dist/orchestration/work-queue.js +1067 -4
  195. package/dist/orchestration/work-queue.js.map +1 -1
  196. package/dist/patterns/event-flow.cjs +6 -20
  197. package/dist/patterns/event-flow.cjs.map +1 -1
  198. package/dist/patterns/event-flow.d.cts +4 -4
  199. package/dist/patterns/event-flow.d.ts +4 -4
  200. package/dist/patterns/event-flow.js +2 -2
  201. package/dist/patterns/index.cjs +453 -465
  202. package/dist/patterns/index.cjs.map +1 -1
  203. package/dist/patterns/index.d.cts +6 -5
  204. package/dist/patterns/index.d.ts +6 -5
  205. package/dist/patterns/index.js +3 -3
  206. package/dist/process-types-BB7oRhX3.d.cts +200 -0
  207. package/dist/process-types-QNhyoYJ8.d.ts +200 -0
  208. package/dist/{reactive-collection-DNV0-gFi.d.cts → reactive-collection-BYlWvtnp.d.cts} +4 -34
  209. package/dist/{reactive-collection-BAmfrGjd.d.ts → reactive-collection-efOEdGFN.d.ts} +4 -34
  210. package/dist/{reactive-collection-storage-BNEldDyi.d.cts → reactive-collection-storage-BjoLsoiC.d.cts} +5 -5
  211. package/dist/{reactive-collection-storage-YZsAQsWK.d.ts → reactive-collection-storage-DwW6UuK_.d.ts} +5 -5
  212. package/dist/{reactive-map-DRD1LJ2H.d.cts → reactive-map-BHacbIqz.d.cts} +7 -2
  213. package/dist/{reactive-map-EsDiCmJk.d.ts → reactive-map-DN4Jyqnf.d.ts} +7 -2
  214. package/dist/render/index.d.cts +2 -2
  215. package/dist/render/index.d.ts +2 -2
  216. package/dist/scheduled-readiness-BmqXxnzX.d.ts +91 -0
  217. package/dist/scheduled-readiness-CYSw7KDE.d.cts +91 -0
  218. package/dist/semantic-memory-graph-B_LwbM-E.d.cts +30 -0
  219. package/dist/semantic-memory-graph-rsFNNhwn.d.ts +30 -0
  220. package/dist/{semantic-memory-graph-DKuNzuWw.d.cts → semantic-memory-graph-types-Y73bbwVI.d.cts} +2 -28
  221. package/dist/{semantic-memory-graph-uwbwJdhe.d.ts → semantic-memory-graph-types-safmPkuX.d.ts} +2 -28
  222. package/dist/solutions/index.cjs +6353 -6169
  223. package/dist/solutions/index.cjs.map +1 -1
  224. package/dist/solutions/index.d.cts +12 -10
  225. package/dist/solutions/index.d.ts +12 -10
  226. package/dist/solutions/index.js +5 -5
  227. package/dist/solutions/reactive-layout/browser/index.cjs +116 -108
  228. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -1
  229. package/dist/solutions/reactive-layout/browser/index.d.cts +4 -4
  230. package/dist/solutions/reactive-layout/browser/index.d.ts +4 -4
  231. package/dist/solutions/reactive-layout/browser/index.js +3 -3
  232. package/dist/solutions/reactive-layout/index.cjs +3578 -3350
  233. package/dist/solutions/reactive-layout/index.cjs.map +1 -1
  234. package/dist/solutions/reactive-layout/index.d.cts +32 -576
  235. package/dist/solutions/reactive-layout/index.d.ts +32 -576
  236. package/dist/solutions/reactive-layout/index.js +65 -5
  237. package/dist/solutions/reactive-layout/node-canvas/index.cjs +127 -117
  238. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -1
  239. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +4 -4
  240. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +4 -4
  241. package/dist/solutions/reactive-layout/node-canvas/index.js +3 -3
  242. package/dist/solutions/reactive-layout/react-native/index.cjs +127 -117
  243. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -1
  244. package/dist/solutions/reactive-layout/react-native/index.d.cts +4 -4
  245. package/dist/solutions/reactive-layout/react-native/index.d.ts +4 -4
  246. package/dist/solutions/reactive-layout/react-native/index.js +3 -3
  247. package/dist/solutions/reactive-layout/skia/index.cjs +127 -117
  248. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -1
  249. package/dist/solutions/reactive-layout/skia/index.d.cts +4 -4
  250. package/dist/solutions/reactive-layout/skia/index.d.ts +4 -4
  251. package/dist/solutions/reactive-layout/skia/index.js +3 -3
  252. package/dist/solutions/work-item/actions.cjs +1609 -1428
  253. package/dist/solutions/work-item/actions.cjs.map +1 -1
  254. package/dist/solutions/work-item/actions.d.cts +23 -184
  255. package/dist/solutions/work-item/actions.d.ts +23 -184
  256. package/dist/solutions/work-item/actions.js +1558 -934
  257. package/dist/solutions/work-item/actions.js.map +1 -1
  258. package/dist/solutions/work-item/scheduling.cjs +9181 -1838
  259. package/dist/solutions/work-item/scheduling.cjs.map +1 -1
  260. package/dist/solutions/work-item/scheduling.d.cts +1763 -328
  261. package/dist/solutions/work-item/scheduling.d.ts +1763 -328
  262. package/dist/solutions/work-item/scheduling.js +117 -3
  263. package/dist/solutions/work-item/work-queue.d.cts +7 -7
  264. package/dist/solutions/work-item/work-queue.d.ts +7 -7
  265. package/dist/sources/browser.cjs +1318 -1083
  266. package/dist/sources/browser.cjs.map +1 -1
  267. package/dist/sources/browser.d.cts +22 -6
  268. package/dist/sources/browser.d.ts +22 -6
  269. package/dist/sources/browser.js +4 -4
  270. package/dist/sources/browser.js.map +1 -1
  271. package/dist/sources/index.cjs +1318 -1083
  272. package/dist/sources/index.cjs.map +1 -1
  273. package/dist/sources/index.d.cts +4 -4
  274. package/dist/sources/index.d.ts +4 -4
  275. package/dist/sources/index.js +4 -4
  276. package/dist/sources/node.d.cts +3 -3
  277. package/dist/sources/node.d.ts +3 -3
  278. package/dist/storage/browser.cjs +16 -0
  279. package/dist/storage/browser.cjs.map +1 -1
  280. package/dist/storage/browser.js +3 -3
  281. package/dist/storage/index.cjs +16 -0
  282. package/dist/storage/index.cjs.map +1 -1
  283. package/dist/storage/index.d.cts +5 -4
  284. package/dist/storage/index.d.ts +5 -4
  285. package/dist/storage/index.js +6 -6
  286. package/dist/storage/node.cjs +16 -0
  287. package/dist/storage/node.cjs.map +1 -1
  288. package/dist/storage/node.js +3 -3
  289. package/dist/{store-C-joM4gh.d.ts → store-6_CHF6Ge.d.ts} +1 -1
  290. package/dist/{store-CNJwmT-h.d.cts → store-BljX8RkQ.d.cts} +1 -1
  291. package/dist/types-BAw2QVVE.d.cts +274 -0
  292. package/dist/types-BUbbbh4f.d.cts +34 -0
  293. package/dist/types-CMnzoL54.d.cts +457 -0
  294. package/dist/{types-CcPIn7sy.d.cts → types-CTN3XoMl.d.cts} +57 -108
  295. package/dist/types-CV_ohy5T.d.cts +357 -0
  296. package/dist/{types-BsJvElYZ.d.ts → types-DChxk1vK.d.ts} +57 -108
  297. package/dist/types-DRu7SnLV.d.ts +274 -0
  298. package/dist/types-DeID_FRl.d.ts +34 -0
  299. package/dist/types-IhKH0hGW.d.ts +357 -0
  300. package/dist/types-ePlD2uyT.d.ts +457 -0
  301. package/dist/{work-item-runtime-qaVgsL0T.d.cts → work-item-runtime-types-BTxLskN5.d.cts} +3 -93
  302. package/dist/{work-item-runtime-C3M79vE9.d.ts → work-item-runtime-types-DAsZbb2y.d.ts} +3 -93
  303. package/dist/work-queue/index.cjs +957 -953
  304. package/dist/work-queue/index.cjs.map +1 -1
  305. package/dist/work-queue/index.d.cts +9 -357
  306. package/dist/work-queue/index.d.ts +9 -357
  307. package/dist/work-queue/index.js +957 -953
  308. package/dist/work-queue/index.js.map +1 -1
  309. package/package.json +611 -513
  310. package/dist/chunk-3JR3EDB2.js.map +0 -1
  311. package/dist/chunk-4VLAQHZI.js.map +0 -1
  312. package/dist/chunk-6XAIOL3X.js +0 -2407
  313. package/dist/chunk-6XAIOL3X.js.map +0 -1
  314. package/dist/chunk-FBUU43PM.js.map +0 -1
  315. package/dist/chunk-HKK2JD7Z.js.map +0 -1
  316. package/dist/chunk-PC3BTTBE.js +0 -3217
  317. package/dist/chunk-PC3BTTBE.js.map +0 -1
  318. package/dist/chunk-QFY4AFY4.js.map +0 -1
  319. package/dist/chunk-SS2A464I.js.map +0 -1
  320. package/dist/chunk-V7CIJE4B.js.map +0 -1
  321. package/dist/chunk-XKXWK2KP.js.map +0 -1
  322. package/dist/chunk-YDSIVHRR.js.map +0 -1
  323. package/dist/chunk-YXMZ2N6J.js.map +0 -1
  324. /package/dist/{chunk-CZNV3VXM.js.map → chunk-3J7UPZL5.js.map} +0 -0
  325. /package/dist/{chunk-Z2ANQ6JW.js.map → chunk-4Q77MMJY.js.map} +0 -0
  326. /package/dist/{chunk-K3FXTC3I.js.map → chunk-HJACH5PU.js.map} +0 -0
  327. /package/dist/{chunk-GTPCOEOZ.js.map → chunk-IDMLXLLG.js.map} +0 -0
  328. /package/dist/{chunk-DKP56CSW.js.map → chunk-JKAYLDQV.js.map} +0 -0
  329. /package/dist/{chunk-43BKLFZU.js.map → chunk-KFURM6FM.js.map} +0 -0
  330. /package/dist/{chunk-2747WN4Y.js.map → chunk-PUSRRALM.js.map} +0 -0
  331. /package/dist/{chunk-VTHLCFN4.js.map → chunk-RAHNUYA5.js.map} +0 -0
  332. /package/dist/{chunk-IXZBUWSP.js.map → chunk-UEMN5URK.js.map} +0 -0
  333. /package/dist/{chunk-6PHB5CJS.js.map → chunk-ZLFRB6FI.js.map} +0 -0
@@ -1,3217 +0,0 @@
1
- import {
2
- depBatch
3
- } from "./chunk-WQIA3GFB.js";
4
-
5
- // src/orchestration/agent-runtime.ts
6
- function effectRun(opts) {
7
- return {
8
- kind: "effect-run",
9
- effectRunId: opts.effectRunId,
10
- agentRunId: opts.agentRunId,
11
- subjectRefs: opts.subjectRefs,
12
- goal: opts.goal,
13
- sourceRefs: opts.sourceRefs,
14
- policyRefs: opts.policyRefs,
15
- limits: opts.limits,
16
- createdBy: opts.createdBy,
17
- createdAtMs: opts.createdAtMs,
18
- metadata: opts.metadata
19
- };
20
- }
21
- function agentRequestProposalFromDecision(decision, proposal) {
22
- return {
23
- kind: "proposal",
24
- ...proposal,
25
- effectRunId: decision.effectRunId,
26
- agentRunId: decision.agentRunId,
27
- sourceDecisionId: decision.decisionId,
28
- evidenceRefs: proposal.evidenceRefs ?? decision.evidenceRefs
29
- };
30
- }
31
- function admitAgentRequestProposal(proposal, opts) {
32
- return {
33
- kind: "admitted",
34
- proposalId: proposal.proposalId,
35
- requestId: opts.requestId,
36
- operationId: opts.operationId,
37
- effectRunId: proposal.effectRunId,
38
- agentRunId: proposal.agentRunId,
39
- admittedAtMs: opts.admittedAtMs,
40
- reason: opts.reason,
41
- sourceRefs: opts.sourceRefs,
42
- metadata: opts.metadata
43
- };
44
- }
45
- function issueAgentRequest(proposal, admission, opts = {}) {
46
- return {
47
- kind: "issued",
48
- requestId: admission.requestId,
49
- operationId: admission.operationId,
50
- effectRunId: admission.effectRunId,
51
- agentRunId: admission.agentRunId,
52
- proposalId: proposal.proposalId,
53
- parentRequestId: proposal.parentRequestId,
54
- requestKind: proposal.requestKind,
55
- required: proposal.required ?? true,
56
- input: proposal.input,
57
- payload: proposal.payload,
58
- issuedAtMs: opts.issuedAtMs,
59
- sourceRefs: opts.sourceRefs ?? admission.sourceRefs,
60
- metadata: proposal.metadata
61
- };
62
- }
63
- function agentRequestLedgerViews(graph, facts, opts = {}) {
64
- const name = opts.name ?? "agentRequests";
65
- const views = graph.node(
66
- [facts],
67
- (ctx) => {
68
- const prev = ctx.state.get() ?? emptyAgentRequestViewsState();
69
- const next = cloneAgentRequestViewsState(prev);
70
- for (const raw of depBatch(ctx, 0) ?? []) {
71
- const fact = raw;
72
- reduceAgentRequestViews(next, fact);
73
- }
74
- ctx.state.set(next);
75
- ctx.down([["DATA", freezeAgentRequestViews(next)]]);
76
- },
77
- { name: `${name}/views`, factory: "agentRequestLedgerViews" }
78
- );
79
- const issues = graph.node(
80
- [facts],
81
- (ctx) => {
82
- for (const raw of depBatch(ctx, 0) ?? []) {
83
- const fact = raw;
84
- if (fact.kind === "rejected") ctx.down([["DATA", fact.issue]]);
85
- if (fact.kind === "status") {
86
- for (const issue of fact.issues ?? []) ctx.down([["DATA", issue]]);
87
- }
88
- }
89
- },
90
- { name: `${name}/issues`, factory: "agentRequestLedgerIssues" }
91
- );
92
- const audit = graph.node(
93
- [facts],
94
- (ctx) => {
95
- let seq = ctx.state.get() ?? 0;
96
- for (const raw of depBatch(ctx, 0) ?? []) {
97
- seq += 1;
98
- const fact = raw;
99
- ctx.down([
100
- [
101
- "DATA",
102
- {
103
- id: `${name}:ledger:${seq}`,
104
- kind: `agent-request-${fact.kind}`,
105
- subjectId: "requestId" in fact ? fact.requestId : fact.proposalId
106
- }
107
- ]
108
- ]);
109
- }
110
- ctx.state.set(seq);
111
- },
112
- { name: `${name}/audit`, factory: "agentRequestLedgerAudit" }
113
- );
114
- return { views, issues, audit };
115
- }
116
- function requestSatisfactionProjector(graph, opts) {
117
- const name = opts.name ?? "requestSatisfaction";
118
- const profileDeps = opts.executorProfiles ?? [];
119
- const routeDeps = opts.executorRoutes ?? [];
120
- const outcomeDeps = opts.executorOutcomes ?? [];
121
- const contextDeps = opts.contextContributions ?? [];
122
- const promptDeps = opts.promptBundles ?? [];
123
- const deps = [
124
- opts.requestFacts,
125
- ...profileDeps,
126
- ...routeDeps,
127
- ...outcomeDeps,
128
- ...contextDeps,
129
- ...promptDeps
130
- ];
131
- const profileStart = 1;
132
- const routeStart = profileStart + profileDeps.length;
133
- const outcomeStart = routeStart + routeDeps.length;
134
- const contextStart = outcomeStart + outcomeDeps.length;
135
- const promptStart = contextStart + contextDeps.length;
136
- const runtime = graph.node(
137
- deps,
138
- (ctx) => {
139
- const state = ctx.state.get() ?? {
140
- requests: /* @__PURE__ */ new Map(),
141
- profiles: /* @__PURE__ */ new Map(),
142
- routes: /* @__PURE__ */ new Map(),
143
- outcomes: /* @__PURE__ */ new Map(),
144
- contexts: /* @__PURE__ */ new Map(),
145
- prompts: /* @__PURE__ */ new Map(),
146
- compatibleRoutesByRouteId: /* @__PURE__ */ new Map(),
147
- terminalRequests: /* @__PURE__ */ new Set(),
148
- acceptedTerminalFactIds: /* @__PURE__ */ new Set(),
149
- issueKeys: /* @__PURE__ */ new Set(),
150
- statusKeys: /* @__PURE__ */ new Set(),
151
- issueSeq: 0,
152
- auditSeq: 0
153
- };
154
- for (const fact of depBatch(ctx, 0) ?? []) {
155
- if (fact.kind === "issued") {
156
- const request = fact;
157
- state.requests.set(request.requestId, request);
158
- emitStatus(ctx, state, request, initialRequestStatus(request), [
159
- ref("agent-request", request.requestId)
160
- ]);
161
- }
162
- }
163
- forEachDepBatch(ctx, profileStart, profileDeps.length, (raw) => {
164
- const profile = raw;
165
- state.profiles.set(profile.profileId, profile);
166
- });
167
- forEachDepBatch(ctx, routeStart, routeDeps.length, (raw) => {
168
- const route = raw;
169
- state.routes.set(route.routeId, route);
170
- });
171
- forEachDepBatch(ctx, outcomeStart, outcomeDeps.length, (raw) => {
172
- const outcome = raw;
173
- state.outcomes.set(outcome.outcomeId, outcome);
174
- });
175
- forEachDepBatch(ctx, contextStart, contextDeps.length, (raw) => {
176
- const contribution = raw;
177
- state.contexts.set(contribution.contributionId, contribution);
178
- });
179
- forEachDepBatch(ctx, promptStart, promptDeps.length, (raw) => {
180
- const prompt = raw;
181
- state.prompts.set(prompt.promptId, prompt);
182
- });
183
- evaluateRequestSatisfaction(ctx, state);
184
- ctx.state.set(state);
185
- },
186
- { name: `${name}/runtime`, factory: "requestSatisfactionProjector" }
187
- );
188
- const status = graph.node(
189
- [runtime],
190
- (ctx) => {
191
- for (const fact of depBatch(ctx, 0) ?? []) {
192
- const typed = fact;
193
- if (typed.kind === "status") ctx.down([["DATA", typed.status]]);
194
- }
195
- },
196
- { name: `${name}/status`, factory: "requestSatisfactionStatus" }
197
- );
198
- const issues = graph.node(
199
- [runtime],
200
- (ctx) => {
201
- for (const fact of depBatch(ctx, 0) ?? []) {
202
- const typed = fact;
203
- if (typed.kind === "issue") ctx.down([["DATA", typed.issue]]);
204
- }
205
- },
206
- { name: `${name}/issues`, factory: "requestSatisfactionIssues" }
207
- );
208
- const audit = graph.node(
209
- [runtime],
210
- (ctx) => {
211
- for (const fact of depBatch(ctx, 0) ?? []) {
212
- const typed = fact;
213
- if (typed.kind === "audit") ctx.down([["DATA", typed.audit]]);
214
- }
215
- },
216
- { name: `${name}/audit`, factory: "requestSatisfactionAudit" }
217
- );
218
- return { status, issues, audit };
219
- }
220
- function localBuiltinToolProviderCatalog(opts = {}) {
221
- const providerId = opts.providerId ?? "local-builtin";
222
- const executorId = opts.executorId ?? `${providerId}:tool-executor`;
223
- const profileId = opts.profileId ?? `${providerId}:tool-profile`;
224
- const tools = opts.tools ?? [
225
- { toolName: "document/read-doc", operation: "read" },
226
- { toolName: "file.read", operation: "read" },
227
- { toolName: "file.edit/apply-patch", operation: "edit" },
228
- { toolName: "bash.run", operation: "run" },
229
- { toolName: "url.fetch", operation: "fetch" },
230
- { toolName: "date.now", operation: "read" },
231
- { toolName: "weather.fetch", operation: "fetch" },
232
- { toolName: "calculator/eval", operation: "eval" }
233
- ];
234
- const toolEntries = tools.map(
235
- (tool) => Object.freeze({
236
- kind: "tool-catalog-entry",
237
- providerId,
238
- inputKind: "tool-call",
239
- profileId,
240
- executorId,
241
- ...tool
242
- })
243
- );
244
- return Object.freeze({
245
- kind: "tool-provider-catalog",
246
- providerId,
247
- providerKind: "local-builtin",
248
- status: "ready",
249
- profiles: Object.freeze([
250
- Object.freeze({
251
- profileId,
252
- executorId,
253
- kind: "tool",
254
- acceptedInputKinds: Object.freeze(["tool-call"]),
255
- acceptedResultKinds: Object.freeze(
256
- Array.from(new Set(toolEntries.flatMap((tool) => tool.resultKinds ?? [])))
257
- ),
258
- capabilities: Object.freeze({
259
- toolNames: Object.freeze(toolEntries.map((tool) => tool.toolName)),
260
- ...opts.capabilities ?? {}
261
- }),
262
- limits: opts.limits,
263
- metadata: opts.metadata
264
- })
265
- ]),
266
- tools: Object.freeze(toolEntries),
267
- metadata: opts.metadata
268
- });
269
- }
270
- function executorOutcomeViewProjector(graph, opts) {
271
- const name = opts.name ?? "executorOutcomeViews";
272
- const policy = {
273
- audience: opts.policy?.audience ?? "agent-observation",
274
- maxSummaryChars: opts.policy?.maxSummaryChars ?? 512,
275
- includeIssues: opts.policy?.includeIssues ?? true,
276
- includeUsage: opts.policy?.includeUsage ?? false,
277
- includeMetadata: opts.policy?.includeMetadata ?? false
278
- };
279
- const runtime = graph.node(
280
- [opts.outcomes],
281
- (ctx) => {
282
- for (const raw of depBatch(ctx, 0) ?? []) {
283
- const outcome = raw;
284
- const projection = executorOutcomeViewProjectionFromOutcome(outcome, policy);
285
- ctx.down([
286
- ["DATA", { kind: "view", view: projection.view }],
287
- [
288
- "DATA",
289
- {
290
- kind: "audit",
291
- audit: {
292
- id: `${outcome.outcomeId}:outcome-view:${policy.audience}`,
293
- kind: "executor-outcome-view-projected",
294
- subjectId: outcome.requestId,
295
- sourceRefs: [ref("executor-outcome", outcome.outcomeId)],
296
- metadata: { audience: policy.audience, status: outcome.kind }
297
- }
298
- }
299
- ]
300
- ]);
301
- for (const issue of projection.issues) {
302
- ctx.down([["DATA", { kind: "issue", issue }]]);
303
- }
304
- }
305
- },
306
- { name: `${name}/runtime`, factory: "executorOutcomeViewProjector" }
307
- );
308
- return {
309
- views: projectRuntimeFact(
310
- graph,
311
- runtime,
312
- `${name}/views`,
313
- "executorOutcomeViews",
314
- (fact) => fact.kind === "view" ? fact.view : void 0
315
- ),
316
- issues: projectRuntimeFact(
317
- graph,
318
- runtime,
319
- `${name}/issues`,
320
- "executorOutcomeViewIssues",
321
- (fact) => fact.kind === "issue" ? fact.issue : void 0
322
- ),
323
- audit: projectRuntimeFact(
324
- graph,
325
- runtime,
326
- `${name}/audit`,
327
- "executorOutcomeViewAudit",
328
- (fact) => fact.kind === "audit" ? fact.audit : void 0
329
- )
330
- };
331
- }
332
- function structuredAgentDecisionInterpreter(graph, outcomes, opts = {}) {
333
- const name = opts.name ?? "structuredAgentDecisionInterpreter";
334
- const requestFacts = opts.requestFacts ?? [];
335
- const runtime = graph.node(
336
- [outcomes, ...requestFacts],
337
- (ctx) => {
338
- const state = ctx.state.get() ?? {
339
- requests: /* @__PURE__ */ new Map(),
340
- issueSeq: 0
341
- };
342
- forEachDepBatch(ctx, 1, requestFacts.length, (raw) => {
343
- const fact = raw;
344
- if (fact.kind === "issued") state.requests.set(fact.requestId, fact);
345
- });
346
- for (const raw of depBatch(ctx, 0) ?? []) {
347
- const outcome = raw;
348
- if (outcome.kind !== "result") {
349
- state.issueSeq += 1;
350
- emitInterpreterIssue(
351
- ctx,
352
- state.issueSeq,
353
- outcome,
354
- "non-result-outcome",
355
- "Only result outcomes can carry AgentDecision envelopes"
356
- );
357
- continue;
358
- }
359
- const value = outcome.result.value;
360
- if (!isRecord(value)) {
361
- state.issueSeq += 1;
362
- emitInterpreterIssue(
363
- ctx,
364
- state.issueSeq,
365
- outcome,
366
- "malformed-agent-decision",
367
- "ExecutorOutcome result must carry a structured agent-decision envelope"
368
- );
369
- continue;
370
- }
371
- const envelope = value;
372
- if (envelope.kind !== "agent-decision" || !isRecord(envelope.decision)) {
373
- state.issueSeq += 1;
374
- emitInterpreterIssue(
375
- ctx,
376
- state.issueSeq,
377
- outcome,
378
- "malformed-agent-decision",
379
- "Structured agent-decision envelope is missing kind or decision"
380
- );
381
- continue;
382
- }
383
- if (typeof envelope.schemaRef !== "string" || envelope.schemaRef.length === 0) {
384
- state.issueSeq += 1;
385
- emitInterpreterIssue(
386
- ctx,
387
- state.issueSeq,
388
- outcome,
389
- "missing-agent-decision-schema",
390
- "Structured agent-decision envelope must carry schemaRef evidence"
391
- );
392
- continue;
393
- }
394
- if (opts.schemaRef !== void 0 && envelope.schemaRef !== opts.schemaRef) {
395
- state.issueSeq += 1;
396
- emitInterpreterIssue(
397
- ctx,
398
- state.issueSeq,
399
- outcome,
400
- "agent-decision-schema-mismatch",
401
- "Structured agent-decision envelope schemaRef did not match"
402
- );
403
- continue;
404
- }
405
- const decision = validateAgentDecision(envelope.decision, outcome);
406
- if (typeof decision === "string") {
407
- state.issueSeq += 1;
408
- emitInterpreterIssue(ctx, state.issueSeq, outcome, "malformed-agent-decision", decision);
409
- continue;
410
- }
411
- const request = state.requests.get(decision.source.requestId);
412
- if (request === void 0) {
413
- state.issueSeq += 1;
414
- emitInterpreterIssue(
415
- ctx,
416
- state.issueSeq,
417
- outcome,
418
- "missing-agent-decision-request",
419
- "AgentDecision source request must be present in the request ledger"
420
- );
421
- continue;
422
- }
423
- if (request.effectRunId !== decision.effectRunId || request.operationId !== decision.source.operationId) {
424
- state.issueSeq += 1;
425
- emitInterpreterIssue(
426
- ctx,
427
- state.issueSeq,
428
- outcome,
429
- "stale-agent-decision-source",
430
- "AgentDecision source request/effectRun/operation identity did not match the request ledger"
431
- );
432
- continue;
433
- }
434
- ctx.down([
435
- ["DATA", { kind: "decision", decision }],
436
- [
437
- "DATA",
438
- {
439
- kind: "audit",
440
- audit: {
441
- id: `${outcome.outcomeId}:agent-decision-interpreted`,
442
- kind: "agent-decision-interpreted",
443
- subjectId: decision.effectRunId,
444
- sourceRefs: [ref("executor-outcome", outcome.outcomeId)]
445
- }
446
- }
447
- ]
448
- ]);
449
- }
450
- ctx.state.set(state);
451
- },
452
- { name: `${name}/runtime`, factory: "structuredAgentDecisionInterpreter" }
453
- );
454
- return {
455
- decisions: projectRuntimeFact(
456
- graph,
457
- runtime,
458
- `${name}/decisions`,
459
- "structuredAgentDecisions",
460
- (fact) => fact.kind === "decision" ? fact.decision : void 0
461
- ),
462
- issues: projectRuntimeFact(
463
- graph,
464
- runtime,
465
- `${name}/issues`,
466
- "structuredAgentDecisionIssues",
467
- (fact) => fact.kind === "issue" ? fact.issue : void 0
468
- ),
469
- audit: projectRuntimeFact(
470
- graph,
471
- runtime,
472
- `${name}/audit`,
473
- "structuredAgentDecisionAudit",
474
- (fact) => fact.kind === "audit" ? fact.audit : void 0
475
- )
476
- };
477
- }
478
- function effectRunCompletionProjector(graph, opts) {
479
- const name = opts.name ?? "effectRunCompletion";
480
- const decisions = opts.decisions ?? [];
481
- const requestStatuses = opts.requestStatuses ?? [];
482
- const requestFacts = opts.requestFacts ?? [];
483
- const resultCandidates = opts.resultCandidates ?? [];
484
- const deps = [
485
- opts.effectRuns,
486
- ...decisions,
487
- ...requestStatuses,
488
- ...requestFacts,
489
- ...resultCandidates
490
- ];
491
- const decisionStart = 1;
492
- const requestStatusStart = decisionStart + decisions.length;
493
- const requestFactStart = requestStatusStart + requestStatuses.length;
494
- const resultCandidateStart = requestFactStart + requestFacts.length;
495
- const now = opts.now ?? Date.now;
496
- const runtime = graph.node(
497
- deps,
498
- (ctx) => {
499
- const state = ctx.state.get() ?? emptyEffectRunCompletionState();
500
- const touchedEffectRunIds = /* @__PURE__ */ new Set();
501
- for (const raw of depBatch(ctx, 0) ?? []) {
502
- const run = raw;
503
- state.runs.set(run.effectRunId, run);
504
- touchedEffectRunIds.add(run.effectRunId);
505
- }
506
- forEachDepBatch(ctx, requestFactStart, requestFacts.length, (raw) => {
507
- const fact = raw;
508
- if (fact.kind === "issued") {
509
- state.requests.set(fact.requestId, fact);
510
- touchedEffectRunIds.add(fact.effectRunId);
511
- const existingStatus = state.statusByRequest.get(fact.requestId);
512
- if (existingStatus !== void 0 && !statusMatchesRequest(existingStatus, fact)) {
513
- emitEffectRunIssue(
514
- ctx,
515
- state,
516
- "stale-request-status",
517
- `AgentRequest status for '${fact.requestId}' did not match its issued effectRun/operation identity`,
518
- fact.effectRunId,
519
- [ref("agent-request", fact.requestId)]
520
- );
521
- }
522
- const result = state.resultsByEffectRun.get(fact.effectRunId);
523
- if (result !== void 0 && fact.required) {
524
- state.issueSeq += 1;
525
- const issue = dataIssue(
526
- "late-required-request-after-effect-run-result",
527
- `Required request '${fact.requestId}' arrived after EffectRun '${fact.effectRunId}' already had a terminal result`,
528
- {
529
- subjectId: fact.effectRunId,
530
- refs: [
531
- ref("agent-request", fact.requestId),
532
- ref("effect-run-result", result.resultId)
533
- ]
534
- }
535
- );
536
- ctx.down([
537
- ["DATA", { kind: "issue", issue }],
538
- [
539
- "DATA",
540
- {
541
- kind: "audit",
542
- audit: {
543
- id: `${fact.effectRunId}:late-required-request:${state.issueSeq}`,
544
- kind: "late-required-request-after-effect-run-result",
545
- subjectId: fact.effectRunId,
546
- issueCode: issue.code,
547
- sourceRefs: [
548
- ref("agent-request", fact.requestId),
549
- ref("effect-run-result", result.resultId)
550
- ]
551
- }
552
- }
553
- ]
554
- ]);
555
- }
556
- } else if (fact.kind === "status") {
557
- acceptRequestStatus(ctx, state, fact);
558
- touchedEffectRunIds.add(fact.effectRunId);
559
- }
560
- });
561
- forEachDepBatch(ctx, requestStatusStart, requestStatuses.length, (raw) => {
562
- const status = raw;
563
- acceptRequestStatus(ctx, state, status);
564
- touchedEffectRunIds.add(status.effectRunId);
565
- });
566
- forEachDepBatch(ctx, resultCandidateStart, resultCandidates.length, (raw) => {
567
- acceptEffectRunResultCandidate(ctx, state, raw);
568
- });
569
- forEachDepBatch(ctx, decisionStart, decisions.length, (raw) => {
570
- const decision = raw;
571
- state.decisions.set(decision.decisionId, decision);
572
- touchedEffectRunIds.add(decision.effectRunId);
573
- });
574
- for (const decision of state.decisions.values()) {
575
- if (state.resultsByEffectRun.has(decision.effectRunId)) continue;
576
- const candidate = candidateFromDecision(decision, state, now());
577
- if (candidate === void 0) continue;
578
- acceptEffectRunResultCandidate(ctx, state, candidate);
579
- }
580
- for (const effectRunId of touchedEffectRunIds) {
581
- if (!state.resultsByEffectRun.has(effectRunId)) {
582
- emitEffectRunStatus(
583
- ctx,
584
- effectRunId,
585
- "pending",
586
- requiredPendingRequests(effectRunId, state),
587
- requiredTerminalRequests(effectRunId, state)
588
- );
589
- }
590
- }
591
- ctx.state.set(state);
592
- },
593
- { name: `${name}/runtime`, factory: "effectRunCompletionProjector" }
594
- );
595
- return {
596
- results: projectRuntimeFact(
597
- graph,
598
- runtime,
599
- `${name}/results`,
600
- "effectRunCompletionResults",
601
- (fact) => fact.kind === "result" ? fact.result : void 0
602
- ),
603
- status: projectRuntimeFact(
604
- graph,
605
- runtime,
606
- `${name}/status`,
607
- "effectRunCompletionStatus",
608
- (fact) => fact.kind === "status" ? fact.status : void 0
609
- ),
610
- issues: projectRuntimeFact(
611
- graph,
612
- runtime,
613
- `${name}/issues`,
614
- "effectRunCompletionIssues",
615
- (fact) => fact.kind === "issue" ? fact.issue : void 0
616
- ),
617
- audit: projectRuntimeFact(
618
- graph,
619
- runtime,
620
- `${name}/audit`,
621
- "effectRunCompletionAudit",
622
- (fact) => fact.kind === "audit" ? fact.audit : void 0
623
- )
624
- };
625
- }
626
- function fakeExecutorResult(opts) {
627
- return { kind: "result", ...opts };
628
- }
629
- function fakeExecutorFailure(opts) {
630
- return { kind: "failure", ...opts };
631
- }
632
- function fakeExecutorBlocked(opts) {
633
- return { kind: "blocked", ...opts };
634
- }
635
- function fakeExecutorTimeout(opts) {
636
- return { kind: "timeout", ...opts };
637
- }
638
- function fakeExecutorCanceled(opts) {
639
- return { kind: "canceled", ...opts };
640
- }
641
- function initialRequestStatus(request) {
642
- if (request.requestKind === "context") return "awaiting-context";
643
- if (request.requestKind === "prompt") return "awaiting-prompt";
644
- return "awaiting-route";
645
- }
646
- function evaluateRequestSatisfaction(ctx, state) {
647
- for (const route of state.routes.values()) handleRoute(ctx, state, route);
648
- for (const contribution of state.contexts.values())
649
- handleContextContribution(ctx, state, contribution);
650
- for (const prompt of state.prompts.values()) handlePromptBundle(ctx, state, prompt);
651
- for (const outcome of state.outcomes.values()) handleExecutorOutcome(ctx, state, outcome);
652
- }
653
- function handleRoute(ctx, state, route) {
654
- const request = state.requests.get(route.requestId);
655
- if (request === void 0) {
656
- return;
657
- }
658
- if (state.terminalRequests.has(request.requestId)) {
659
- if (state.compatibleRoutesByRouteId.get(route.routeId)?.requestId !== request.requestId) {
660
- emitIssueOnce(
661
- ctx,
662
- state,
663
- `late-route:${route.routeId}`,
664
- "late-route-after-terminal",
665
- `ExecutorRoute '${route.routeId}' arrived after request '${request.requestId}' was already terminal`,
666
- request.requestId,
667
- [ref("executor-route", route.routeId), ref("agent-request", request.requestId)]
668
- );
669
- }
670
- return;
671
- }
672
- if (request.operationId !== route.operationId) {
673
- emitIssueOnce(
674
- ctx,
675
- state,
676
- `stale-route:${route.routeId}`,
677
- "stale-route-operation",
678
- `ExecutorRoute '${route.routeId}' operationId does not match request '${request.requestId}'`,
679
- request.requestId,
680
- [ref("executor-route", route.routeId), ref("agent-request", request.requestId)]
681
- );
682
- return;
683
- }
684
- const profile = state.profiles.get(route.profileId);
685
- if (profile === void 0) {
686
- return;
687
- }
688
- const compatibilityIssue = routeCompatibilityIssue(request, route, profile);
689
- if (compatibilityIssue !== void 0) {
690
- emitIssueOnce(
691
- ctx,
692
- state,
693
- `route-incompatible:${route.routeId}:${compatibilityIssue}`,
694
- compatibilityIssue,
695
- `ExecutorRoute '${route.routeId}' is incompatible with request '${request.requestId}'`,
696
- request.requestId,
697
- [
698
- ref("executor-route", route.routeId),
699
- ref("executor-profile", profile.profileId),
700
- ref("agent-request", request.requestId)
701
- ]
702
- );
703
- return;
704
- }
705
- state.compatibleRoutesByRouteId.set(route.routeId, route);
706
- emitStatusOnce(
707
- ctx,
708
- state,
709
- `route:${route.routeId}:awaiting-provider`,
710
- request,
711
- "awaiting-provider",
712
- [
713
- ref("executor-route", route.routeId),
714
- ref("executor-profile", profile.profileId),
715
- ref("agent-request", request.requestId)
716
- ]
717
- );
718
- }
719
- function handleExecutorOutcome(ctx, state, outcome) {
720
- const request = state.requests.get(outcome.requestId);
721
- if (request === void 0) {
722
- return;
723
- }
724
- if (request.operationId !== outcome.operationId) {
725
- emitIssueOnce(
726
- ctx,
727
- state,
728
- `stale-outcome:${outcome.outcomeId}`,
729
- "stale-outcome-operation",
730
- `ExecutorOutcome '${outcome.outcomeId}' operationId does not match request '${request.requestId}'`,
731
- request.requestId,
732
- [ref("executor-outcome", outcome.outcomeId), ref("agent-request", request.requestId)]
733
- );
734
- return;
735
- }
736
- const route = state.compatibleRoutesByRouteId.get(outcome.routeId);
737
- if (route === void 0 || route.requestId !== request.requestId) {
738
- emitIssueOnce(
739
- ctx,
740
- state,
741
- `missing-route:${outcome.outcomeId}`,
742
- "missing-compatible-route",
743
- `ExecutorOutcome '${outcome.outcomeId}' has no compatible route for request '${request.requestId}'`,
744
- request.requestId,
745
- [ref("executor-outcome", outcome.outcomeId), ref("agent-request", request.requestId)]
746
- );
747
- return;
748
- }
749
- const outcomeIssue = outcomeCompatibilityIssue(request, route, outcome);
750
- if (outcomeIssue !== void 0) {
751
- emitIssueOnce(
752
- ctx,
753
- state,
754
- `outcome-incompatible:${outcome.outcomeId}:${outcomeIssue}`,
755
- outcomeIssue,
756
- `ExecutorOutcome '${outcome.outcomeId}' is incompatible with route '${route.routeId}' for request '${request.requestId}'`,
757
- request.requestId,
758
- [
759
- ref("executor-outcome", outcome.outcomeId),
760
- ref("executor-route", route.routeId),
761
- ref("agent-request", request.requestId)
762
- ]
763
- );
764
- return;
765
- }
766
- if (state.terminalRequests.has(request.requestId)) {
767
- if (state.acceptedTerminalFactIds.has(`outcome:${outcome.outcomeId}`)) return;
768
- emitIssueOnce(
769
- ctx,
770
- state,
771
- `duplicate-outcome:${outcome.outcomeId}`,
772
- "duplicate-terminal-outcome",
773
- `ExecutorOutcome '${outcome.outcomeId}' arrived after request '${request.requestId}' was already terminal`,
774
- request.requestId,
775
- [ref("executor-outcome", outcome.outcomeId), ref("agent-request", request.requestId)]
776
- );
777
- return;
778
- }
779
- state.terminalRequests.add(request.requestId);
780
- state.acceptedTerminalFactIds.add(`outcome:${outcome.outcomeId}`);
781
- const status = outcomeStatus(outcome);
782
- emitStatus(ctx, state, request, status, [
783
- ref("executor-outcome", outcome.outcomeId),
784
- ref("executor-route", route.routeId),
785
- ref("agent-request", request.requestId)
786
- ]);
787
- }
788
- function handleContextContribution(ctx, state, contribution) {
789
- const request = state.requests.get(contribution.requestId);
790
- if (request === void 0) return;
791
- if (request.operationId !== contribution.operationId) {
792
- emitIssueOnce(
793
- ctx,
794
- state,
795
- `stale-context:${contribution.contributionId}`,
796
- "stale-context-operation",
797
- `ContextContribution '${contribution.contributionId}' operationId does not match request '${request.requestId}'`,
798
- request.requestId,
799
- [ref("context-contribution", contribution.contributionId)]
800
- );
801
- return;
802
- }
803
- if (request.requestKind !== "context") {
804
- emitIssueOnce(
805
- ctx,
806
- state,
807
- `wrong-context-kind:${contribution.contributionId}`,
808
- "wrong-kind-context-satisfaction",
809
- `ContextContribution '${contribution.contributionId}' cannot satisfy ${request.requestKind} request '${request.requestId}'`,
810
- request.requestId,
811
- [ref("context-contribution", contribution.contributionId)]
812
- );
813
- return;
814
- }
815
- if (state.terminalRequests.has(request.requestId)) {
816
- if (state.acceptedTerminalFactIds.has(`context:${contribution.contributionId}`) || state.statusKeys.has(`context:${contribution.contributionId}:awaiting-context`)) {
817
- return;
818
- }
819
- emitIssueOnce(
820
- ctx,
821
- state,
822
- `duplicate-context:${contribution.contributionId}`,
823
- "duplicate-terminal-context",
824
- `ContextContribution '${contribution.contributionId}' arrived after request '${request.requestId}' was already terminal`,
825
- request.requestId,
826
- [
827
- ref("context-contribution", contribution.contributionId),
828
- ref("agent-request", request.requestId)
829
- ]
830
- );
831
- return;
832
- }
833
- if (contribution.status === "pending")
834
- emitStatusOnce(
835
- ctx,
836
- state,
837
- `context:${contribution.contributionId}:awaiting-context`,
838
- request,
839
- "awaiting-context",
840
- [ref("context-contribution", contribution.contributionId)]
841
- );
842
- else {
843
- state.terminalRequests.add(request.requestId);
844
- state.acceptedTerminalFactIds.add(`context:${contribution.contributionId}`);
845
- emitStatus(
846
- ctx,
847
- state,
848
- request,
849
- contribution.status === "ready" ? "completed" : "failed",
850
- [ref("context-contribution", contribution.contributionId)],
851
- contribution.issues
852
- );
853
- }
854
- }
855
- function handlePromptBundle(ctx, state, prompt) {
856
- const request = state.requests.get(prompt.requestId);
857
- if (request === void 0) return;
858
- if (request.operationId !== prompt.operationId) {
859
- emitIssueOnce(
860
- ctx,
861
- state,
862
- `stale-prompt:${prompt.promptId}`,
863
- "stale-prompt-operation",
864
- `PromptBundle '${prompt.promptId}' operationId does not match request '${request.requestId}'`,
865
- request.requestId,
866
- [ref("prompt-bundle", prompt.promptId)]
867
- );
868
- return;
869
- }
870
- if (request.requestKind !== "prompt") {
871
- emitIssueOnce(
872
- ctx,
873
- state,
874
- `wrong-prompt-kind:${prompt.promptId}`,
875
- "wrong-kind-prompt-satisfaction",
876
- `PromptBundle '${prompt.promptId}' cannot satisfy ${request.requestKind} request '${request.requestId}'`,
877
- request.requestId,
878
- [ref("prompt-bundle", prompt.promptId)]
879
- );
880
- return;
881
- }
882
- if (state.terminalRequests.has(request.requestId)) {
883
- if (state.acceptedTerminalFactIds.has(`prompt:${prompt.promptId}`) || state.statusKeys.has(`prompt:${prompt.promptId}:awaiting-prompt`)) {
884
- return;
885
- }
886
- emitIssueOnce(
887
- ctx,
888
- state,
889
- `duplicate-prompt:${prompt.promptId}`,
890
- "duplicate-terminal-prompt",
891
- `PromptBundle '${prompt.promptId}' arrived after request '${request.requestId}' was already terminal`,
892
- request.requestId,
893
- [ref("prompt-bundle", prompt.promptId), ref("agent-request", request.requestId)]
894
- );
895
- return;
896
- }
897
- if (prompt.status === "ready") {
898
- state.terminalRequests.add(request.requestId);
899
- state.acceptedTerminalFactIds.add(`prompt:${prompt.promptId}`);
900
- emitStatus(ctx, state, request, "completed", [ref("prompt-bundle", prompt.promptId)]);
901
- } else if (prompt.status === "issue") {
902
- state.terminalRequests.add(request.requestId);
903
- state.acceptedTerminalFactIds.add(`prompt:${prompt.promptId}`);
904
- emitStatus(
905
- ctx,
906
- state,
907
- request,
908
- "failed",
909
- [ref("prompt-bundle", prompt.promptId)],
910
- prompt.issues
911
- );
912
- } else {
913
- emitStatusOnce(
914
- ctx,
915
- state,
916
- `prompt:${prompt.promptId}:awaiting-prompt`,
917
- request,
918
- "awaiting-prompt",
919
- [ref("prompt-bundle", prompt.promptId)],
920
- prompt.issues
921
- );
922
- }
923
- }
924
- function routeCompatibilityIssue(request, route, profile) {
925
- if (request.requestKind !== "executor") return "route-for-non-executor-request";
926
- if (route.executorId !== profile.executorId) return "route-profile-executor-mismatch";
927
- if (request.input?.inputId !== void 0 && route.inputId !== void 0 && request.input.inputId !== route.inputId) {
928
- return "route-input-mismatch";
929
- }
930
- if (request.input?.inputKind !== void 0 && route.inputKind !== void 0 && request.input.inputKind !== route.inputKind) {
931
- return "route-input-kind-mismatch";
932
- }
933
- const inputKind = request.input?.inputKind ?? route.inputKind;
934
- if (inputKind !== void 0 && !profileKindAcceptsInput(profile.kind, inputKind))
935
- return "profile-kind-input-incompatible";
936
- if (inputKind !== void 0 && profile.acceptedInputKinds !== void 0 && !profile.acceptedInputKinds.includes(inputKind)) {
937
- return "profile-rejects-input-kind";
938
- }
939
- if (request.input?.schemaRef !== void 0 && profile.acceptedSchemaRefs !== void 0 && !profile.acceptedSchemaRefs.includes(request.input.schemaRef)) {
940
- return "profile-rejects-schema";
941
- }
942
- return void 0;
943
- }
944
- function outcomeCompatibilityIssue(request, route, outcome) {
945
- if (outcome.executorId !== route.executorId) return "outcome-route-executor-mismatch";
946
- if (outcome.profileId !== route.profileId) return "outcome-route-profile-mismatch";
947
- if (route.inputId !== void 0 && (outcome.inputId === void 0 || outcome.inputId !== route.inputId)) {
948
- return "outcome-route-input-mismatch";
949
- }
950
- if (request.input?.inputId !== void 0 && outcome.inputId !== void 0 && outcome.inputId !== request.input.inputId) {
951
- return "outcome-request-input-mismatch";
952
- }
953
- if (route.inputKind !== void 0 && (outcome.inputKind === void 0 || outcome.inputKind !== route.inputKind)) {
954
- return "outcome-route-input-kind-mismatch";
955
- }
956
- if (request.input?.inputKind !== void 0 && outcome.inputKind !== void 0 && outcome.inputKind !== request.input.inputKind) {
957
- return "outcome-request-input-kind-mismatch";
958
- }
959
- return void 0;
960
- }
961
- function profileKindAcceptsInput(kind, inputKind) {
962
- if (kind === "llm") return inputKind === "llm-call";
963
- if (kind === "tool") return inputKind === "tool-call";
964
- if (kind === "human") return inputKind === "human-task";
965
- return inputKind === "agent-task";
966
- }
967
- function outcomeStatus(outcome) {
968
- if (outcome.kind === "result") return "completed";
969
- if (outcome.kind === "failure") return "failed";
970
- if (outcome.kind === "timeout") return "timeout";
971
- if (outcome.kind === "canceled") return "canceled";
972
- return "blocked";
973
- }
974
- function executorOutcomeViewProjectionFromOutcome(outcome, policy) {
975
- const sourceRefs = uniqueSourceRefs([
976
- ref("executor-outcome", outcome.outcomeId),
977
- ...outcome.evidenceRefs ?? []
978
- ]);
979
- const summary = projectOutcomeSummary(outcome, policy.maxSummaryChars);
980
- const issues = Object.freeze([
981
- ...outcomeIssues(outcome),
982
- ...summary.truncated ? [outcomeSummaryTruncationIssue(outcome, summary, policy)] : []
983
- ]);
984
- const view = Object.freeze({
985
- kind: "executor-outcome-view",
986
- viewId: `${outcome.outcomeId}:${policy.audience}`,
987
- audience: policy.audience,
988
- outcomeId: outcome.outcomeId,
989
- requestId: outcome.requestId,
990
- operationId: outcome.operationId,
991
- routeId: outcome.routeId,
992
- executorId: outcome.executorId,
993
- profileId: outcome.profileId,
994
- status: outcome.kind,
995
- summary: summary.summary,
996
- summaryTruncated: summary.truncated,
997
- summaryChars: summary.originalChars,
998
- summaryLimitChars: summary.limitChars,
999
- errorKind: outcomeErrorKind(outcome),
1000
- retryable: outcomeRetryable(outcome),
1001
- nextActions: outcomeNextActions(outcome),
1002
- sourceRefs,
1003
- materialRefs: outcomeMaterialRefs(outcome),
1004
- issues: policy.includeIssues && issues.length > 0 ? issues : void 0,
1005
- usage: policy.includeUsage ? outcome.usage : void 0,
1006
- metadata: policy.includeMetadata ? outcome.metadata : void 0
1007
- });
1008
- return Object.freeze({ view, issues });
1009
- }
1010
- function projectOutcomeSummary(outcome, maxChars) {
1011
- const summary = outcomeSummary(outcome);
1012
- const limitChars = Math.max(0, maxChars);
1013
- if (summary.length <= limitChars) {
1014
- return Object.freeze({
1015
- summary,
1016
- truncated: false,
1017
- originalChars: summary.length,
1018
- limitChars
1019
- });
1020
- }
1021
- const bounded = limitChars <= 1 ? summary.slice(0, limitChars) : limitChars <= 3 ? summary.slice(0, limitChars) : `${summary.slice(0, limitChars - 3)}...`;
1022
- return Object.freeze({
1023
- summary: bounded,
1024
- truncated: true,
1025
- originalChars: summary.length,
1026
- limitChars
1027
- });
1028
- }
1029
- function outcomeSummaryTruncationIssue(outcome, summary, policy) {
1030
- return dataIssue(
1031
- "executor-outcome-view-summary-truncated",
1032
- "ExecutorOutcome view summary was truncated; inspect material refs or the source outcome for full detail",
1033
- {
1034
- subjectId: outcome.requestId,
1035
- refs: [ref("executor-outcome", outcome.outcomeId)],
1036
- severity: "warning",
1037
- details: {
1038
- audience: policy.audience,
1039
- outcomeId: outcome.outcomeId,
1040
- originalChars: summary.originalChars,
1041
- limitChars: summary.limitChars
1042
- }
1043
- }
1044
- );
1045
- }
1046
- function outcomeSummary(outcome) {
1047
- if (outcome.kind === "result") {
1048
- if (outcome.result.summary !== void 0 && outcome.result.summary.length > 0)
1049
- return outcome.result.summary;
1050
- return `Executor result '${outcome.result.kind}' is available via source refs`;
1051
- }
1052
- if (outcome.kind === "failure") return outcome.error.message;
1053
- if (outcome.kind === "blocked") {
1054
- const needKinds = outcome.needs.map((need) => need.kind).join(", ");
1055
- return needKinds.length > 0 ? `Executor blocked: ${needKinds}` : "Executor blocked";
1056
- }
1057
- if (outcome.kind === "timeout") {
1058
- return outcome.timeoutMs === void 0 ? "Executor timed out" : `Executor timed out after ${outcome.timeoutMs}ms`;
1059
- }
1060
- return outcome.reason ?? "Executor canceled";
1061
- }
1062
- function outcomeErrorKind(outcome) {
1063
- if (outcome.kind === "failure") return outcome.error.code;
1064
- if (outcome.kind === "timeout") return "timeout";
1065
- if (outcome.kind === "blocked") return outcome.needs[0]?.kind ?? "blocked";
1066
- if (outcome.kind === "canceled") return "canceled";
1067
- return void 0;
1068
- }
1069
- function outcomeRetryable(outcome) {
1070
- if (outcome.kind === "failure" || outcome.kind === "timeout") return outcome.retryable;
1071
- return void 0;
1072
- }
1073
- function outcomeIssues(outcome) {
1074
- if (outcome.kind === "failure") return Object.freeze([outcome.error, ...outcome.issues ?? []]);
1075
- return outcome.issues ?? [];
1076
- }
1077
- function outcomeNextActions(outcome) {
1078
- if (outcome.kind === "blocked") return Object.freeze(outcome.needs.map((need) => need.kind));
1079
- if ((outcome.kind === "failure" || outcome.kind === "timeout") && outcome.retryable === true) {
1080
- return Object.freeze(["retry-or-route"]);
1081
- }
1082
- return void 0;
1083
- }
1084
- function outcomeMaterialRefs(outcome) {
1085
- const refs = outcome.kind === "result" ? [...outcome.result.refs ?? []] : outcome.kind === "blocked" ? outcome.needs.flatMap((need) => [...need.refs ?? []]) : [];
1086
- return refs.length === 0 ? void 0 : uniqueSourceRefs(refs);
1087
- }
1088
- function uniqueSourceRefs(sourceRefs) {
1089
- const seen = /* @__PURE__ */ new Set();
1090
- const unique = [];
1091
- for (const sourceRef of sourceRefs) {
1092
- const key = `${sourceRef.kind}:${sourceRef.id}:${JSON.stringify(sourceRef.metadata ?? {})}`;
1093
- if (seen.has(key)) continue;
1094
- seen.add(key);
1095
- unique.push(sourceRef);
1096
- }
1097
- return Object.freeze(unique);
1098
- }
1099
- function emitStatus(ctx, state, request, status, sourceRefs, issues) {
1100
- const fact = {
1101
- kind: "status",
1102
- requestId: request.requestId,
1103
- operationId: request.operationId,
1104
- effectRunId: request.effectRunId,
1105
- status,
1106
- sourceRefs,
1107
- issues
1108
- };
1109
- state.auditSeq += 1;
1110
- ctx.down([
1111
- ["DATA", { kind: "status", status: fact }],
1112
- [
1113
- "DATA",
1114
- {
1115
- kind: "audit",
1116
- audit: {
1117
- id: `${request.requestId}:status:${state.auditSeq}`,
1118
- kind: "agent-request-status",
1119
- subjectId: request.requestId,
1120
- sourceRefs,
1121
- metadata: { status }
1122
- }
1123
- }
1124
- ]
1125
- ]);
1126
- }
1127
- function emitStatusOnce(ctx, state, key, request, status, sourceRefs, issues) {
1128
- if (state.statusKeys.has(key)) return;
1129
- state.statusKeys.add(key);
1130
- emitStatus(ctx, state, request, status, sourceRefs, issues);
1131
- }
1132
- function emitIssue(ctx, state, code, message, subjectId, refs) {
1133
- state.issueSeq += 1;
1134
- const issue = dataIssue(code, message, { subjectId, refs });
1135
- state.auditSeq += 1;
1136
- ctx.down([
1137
- ["DATA", { kind: "issue", issue }],
1138
- [
1139
- "DATA",
1140
- {
1141
- kind: "audit",
1142
- audit: {
1143
- id: `${subjectId ?? "request"}:issue:${state.auditSeq}`,
1144
- kind: "agent-request-issue",
1145
- subjectId,
1146
- issueCode: code,
1147
- message,
1148
- sourceRefs: refs
1149
- }
1150
- }
1151
- ]
1152
- ]);
1153
- }
1154
- function emitIssueOnce(ctx, state, key, code, message, subjectId, refs) {
1155
- if (state.issueKeys.has(key)) return;
1156
- state.issueKeys.add(key);
1157
- emitIssue(ctx, state, code, message, subjectId, refs);
1158
- }
1159
- function emitInterpreterIssue(ctx, seq, outcome, code, message) {
1160
- const issue = dataIssue(code, message, {
1161
- subjectId: outcome.requestId,
1162
- refs: [ref("executor-outcome", outcome.outcomeId)]
1163
- });
1164
- ctx.down([
1165
- ["DATA", { kind: "issue", issue }],
1166
- [
1167
- "DATA",
1168
- {
1169
- kind: "audit",
1170
- audit: {
1171
- id: `${outcome.outcomeId}:agent-decision-issue:${seq}`,
1172
- kind: "agent-decision-issue",
1173
- subjectId: outcome.requestId,
1174
- issueCode: code,
1175
- message,
1176
- sourceRefs: [ref("executor-outcome", outcome.outcomeId)]
1177
- }
1178
- }
1179
- ]
1180
- ]);
1181
- }
1182
- function validateAgentDecision(raw, outcome) {
1183
- if (!isRecord(raw)) return "AgentDecision must be an object";
1184
- const kind = raw.kind;
1185
- if (kind !== "continue" && kind !== "final" && kind !== "blocked") {
1186
- return "AgentDecision kind must be continue, final, or blocked";
1187
- }
1188
- if (typeof raw.decisionId !== "string" || raw.decisionId.length === 0)
1189
- return "AgentDecision decisionId must be a non-empty string";
1190
- if (raw.effectRunId === void 0 || typeof raw.effectRunId !== "string" || raw.effectRunId.length === 0)
1191
- return "AgentDecision effectRunId must be a non-empty string";
1192
- if (typeof raw.agentRunId !== "string" || raw.agentRunId.length === 0)
1193
- return "AgentDecision agentRunId must be a non-empty string";
1194
- const source = raw.source;
1195
- if (!isRecord(source) || source.requestId !== outcome.requestId || source.operationId !== outcome.operationId || source.outcomeId !== outcome.outcomeId) {
1196
- return "AgentDecision source must match the ExecutorOutcome requestId, operationId, and outcomeId";
1197
- }
1198
- if (kind === "continue") {
1199
- if (!Array.isArray(raw.next)) return "AgentDecision.continue next must be an array";
1200
- for (const proposal of raw.next) {
1201
- if (!isAgentRequestProposalLike(proposal, raw.effectRunId)) {
1202
- return "AgentDecision.continue next entries must be AgentRequestProposal-like objects";
1203
- }
1204
- }
1205
- return raw;
1206
- }
1207
- if (kind === "final") {
1208
- if (!isRecord(raw.output) || typeof raw.output.kind !== "string")
1209
- return "AgentDecision.final output must be an envelope with kind";
1210
- return raw;
1211
- }
1212
- if (!Array.isArray(raw.needs)) return "AgentDecision.blocked needs must be an array";
1213
- for (const need of raw.needs) {
1214
- if (!isAgentNeedLike(need))
1215
- return "AgentDecision.blocked needs entries must be AgentNeed-like objects";
1216
- }
1217
- return raw;
1218
- }
1219
- function isAgentRequestProposalLike(value, effectRunId) {
1220
- if (!isRecord(value)) return false;
1221
- if (value.kind !== "proposal") return false;
1222
- if (typeof value.proposalId !== "string" || value.proposalId.length === 0) return false;
1223
- if (value.effectRunId !== effectRunId) return false;
1224
- return value.requestKind === "context" || value.requestKind === "prompt" || value.requestKind === "executor";
1225
- }
1226
- function isAgentNeedLike(value) {
1227
- return isRecord(value) && typeof value.kind === "string" && value.kind.length > 0;
1228
- }
1229
- function candidateFromDecision(decision, state, completedAtMs) {
1230
- const run = state.runs.get(decision.effectRunId);
1231
- if (run === void 0) return void 0;
1232
- if (!decisionSourceRequestTerminal(decision, state)) return void 0;
1233
- const requiredPending = requiredPendingRequests(decision.effectRunId, state);
1234
- if (decision.kind === "final") {
1235
- if (requiredPending.length > 0) {
1236
- return void 0;
1237
- }
1238
- return {
1239
- kind: "effect-run-result",
1240
- resultId: `${decision.effectRunId}:result`,
1241
- status: "completed",
1242
- effectRunId: decision.effectRunId,
1243
- subjectRefs: run.subjectRefs,
1244
- operationId: decision.source.operationId,
1245
- sourceRefs: [
1246
- ref("agent-decision", decision.decisionId),
1247
- ref("executor-outcome", decision.source.outcomeId)
1248
- ],
1249
- completedAtMs,
1250
- output: decision.output
1251
- };
1252
- }
1253
- if (decision.kind === "blocked" && requiredPending.length === 0) {
1254
- return {
1255
- kind: "effect-run-result",
1256
- resultId: `${decision.effectRunId}:result`,
1257
- status: "blocked",
1258
- effectRunId: decision.effectRunId,
1259
- subjectRefs: run.subjectRefs,
1260
- operationId: decision.source.operationId,
1261
- sourceRefs: [
1262
- ref("agent-decision", decision.decisionId),
1263
- ref("executor-outcome", decision.source.outcomeId)
1264
- ],
1265
- completedAtMs,
1266
- needs: decision.needs
1267
- };
1268
- }
1269
- return void 0;
1270
- }
1271
- function acceptEffectRunResultCandidate(ctx, state, candidate) {
1272
- if (!state.runs.has(candidate.effectRunId)) {
1273
- emitEffectRunIssue(
1274
- ctx,
1275
- state,
1276
- "unknown-effect-run-result-candidate",
1277
- `EffectRunResult candidate '${candidate.resultId}' references unknown EffectRun '${candidate.effectRunId}'`,
1278
- candidate.effectRunId,
1279
- candidate.sourceRefs
1280
- );
1281
- return;
1282
- }
1283
- const existing = state.resultsByEffectRun.get(candidate.effectRunId);
1284
- if (existing !== void 0) {
1285
- state.issueSeq += 1;
1286
- const duplicate = sameTerminalResult(existing, candidate);
1287
- const code = duplicate ? "duplicate-effect-run-result" : "conflicting-effect-run-result";
1288
- const issue = dataIssue(
1289
- code,
1290
- `EffectRun '${candidate.effectRunId}' already has a terminal result`,
1291
- {
1292
- subjectId: candidate.effectRunId,
1293
- refs: candidate.sourceRefs
1294
- }
1295
- );
1296
- ctx.down([
1297
- ["DATA", { kind: "issue", issue }],
1298
- [
1299
- "DATA",
1300
- {
1301
- kind: "audit",
1302
- audit: {
1303
- id: `${candidate.effectRunId}:${code}:${state.issueSeq}`,
1304
- kind: duplicate ? "effect-run-result-duplicate" : "effect-run-result-conflict",
1305
- subjectId: candidate.effectRunId,
1306
- issueCode: issue.code,
1307
- sourceRefs: candidate.sourceRefs
1308
- }
1309
- }
1310
- ]
1311
- ]);
1312
- return;
1313
- }
1314
- state.resultsByEffectRun.set(candidate.effectRunId, candidate);
1315
- ctx.down([
1316
- ["DATA", { kind: "result", result: candidate }],
1317
- [
1318
- "DATA",
1319
- {
1320
- kind: "status",
1321
- status: {
1322
- effectRunId: candidate.effectRunId,
1323
- state: candidate.status,
1324
- requiredPending: [],
1325
- requiredTerminal: requiredTerminalRequests(candidate.effectRunId, state),
1326
- sourceRefs: candidate.sourceRefs
1327
- }
1328
- }
1329
- ],
1330
- [
1331
- "DATA",
1332
- {
1333
- kind: "audit",
1334
- audit: {
1335
- id: `${candidate.effectRunId}:terminal-result`,
1336
- kind: "effect-run-terminal-result",
1337
- subjectId: candidate.effectRunId,
1338
- sourceRefs: candidate.sourceRefs,
1339
- metadata: { status: candidate.status }
1340
- }
1341
- }
1342
- ]
1343
- ]);
1344
- }
1345
- function emitEffectRunStatus(ctx, effectRunId, state, requiredPending, requiredTerminal) {
1346
- ctx.down([
1347
- [
1348
- "DATA",
1349
- {
1350
- kind: "status",
1351
- status: { effectRunId, state, requiredPending, requiredTerminal }
1352
- }
1353
- ]
1354
- ]);
1355
- }
1356
- function requiredPendingRequests(effectRunId, state) {
1357
- const pending = [];
1358
- for (const request of state.requests.values()) {
1359
- if (request.effectRunId !== effectRunId || !request.required) continue;
1360
- const statusFact = matchingStatusForRequest(state, request);
1361
- const status = statusFact?.status;
1362
- if (status === void 0 || !isTerminalRequestStatus(status)) pending.push(request.requestId);
1363
- }
1364
- return pending;
1365
- }
1366
- function requiredTerminalRequests(effectRunId, state) {
1367
- const terminal = [];
1368
- for (const request of state.requests.values()) {
1369
- if (request.effectRunId !== effectRunId || !request.required) continue;
1370
- const statusFact = matchingStatusForRequest(state, request);
1371
- const status = statusFact?.status;
1372
- if (status !== void 0 && isTerminalRequestStatus(status)) terminal.push(request.requestId);
1373
- }
1374
- return terminal;
1375
- }
1376
- function isTerminalRequestStatus(status) {
1377
- return status === "completed" || status === "failed" || status === "blocked" || status === "canceled" || status === "timeout" || status === "waived" || status === "retry-exhausted";
1378
- }
1379
- function decisionSourceRequestTerminal(decision, state) {
1380
- const request = state.requests.get(decision.source.requestId);
1381
- if (request === void 0) return false;
1382
- if (request.effectRunId !== decision.effectRunId || request.operationId !== decision.source.operationId) {
1383
- return false;
1384
- }
1385
- const status = matchingStatusForRequest(state, request)?.status;
1386
- return status !== void 0 && isTerminalRequestStatus(status);
1387
- }
1388
- function acceptRequestStatus(ctx, state, status) {
1389
- const request = state.requests.get(status.requestId);
1390
- if (request !== void 0 && !statusMatchesRequest(status, request)) {
1391
- emitEffectRunIssue(
1392
- ctx,
1393
- state,
1394
- "stale-request-status",
1395
- `AgentRequest status for '${status.requestId}' did not match its issued effectRun/operation identity`,
1396
- request.effectRunId,
1397
- [ref("agent-request", status.requestId)]
1398
- );
1399
- return;
1400
- }
1401
- state.statusByRequest.set(status.requestId, status);
1402
- }
1403
- function matchingStatusForRequest(state, request) {
1404
- const status = state.statusByRequest.get(request.requestId);
1405
- if (status === void 0) return void 0;
1406
- return statusMatchesRequest(status, request) ? status : void 0;
1407
- }
1408
- function statusMatchesRequest(status, request) {
1409
- return status.effectRunId === request.effectRunId && (status.operationId === void 0 || status.operationId === request.operationId);
1410
- }
1411
- function emitEffectRunIssue(ctx, state, code, message, subjectId, sourceRefs) {
1412
- state.issueSeq += 1;
1413
- const issue = dataIssue(code, message, { subjectId, refs: sourceRefs });
1414
- ctx.down([
1415
- ["DATA", { kind: "issue", issue }],
1416
- [
1417
- "DATA",
1418
- {
1419
- kind: "audit",
1420
- audit: {
1421
- id: `${subjectId ?? "effect-run"}:${code}:${state.issueSeq}`,
1422
- kind: "effect-run-issue",
1423
- subjectId,
1424
- issueCode: code,
1425
- message,
1426
- sourceRefs
1427
- }
1428
- }
1429
- ]
1430
- ]);
1431
- }
1432
- function sameTerminalResult(a, b) {
1433
- return a.status === b.status && a.resultId === b.resultId && JSON.stringify(a) === JSON.stringify(b);
1434
- }
1435
- function emptyEffectRunCompletionState() {
1436
- return {
1437
- runs: /* @__PURE__ */ new Map(),
1438
- requests: /* @__PURE__ */ new Map(),
1439
- statusByRequest: /* @__PURE__ */ new Map(),
1440
- decisions: /* @__PURE__ */ new Map(),
1441
- resultsByEffectRun: /* @__PURE__ */ new Map(),
1442
- issueSeq: 0
1443
- };
1444
- }
1445
- function emptyAgentRequestViewsState() {
1446
- return {
1447
- requestsById: /* @__PURE__ */ new Map(),
1448
- requestsByEffectRun: /* @__PURE__ */ new Map(),
1449
- statusByRequest: /* @__PURE__ */ new Map(),
1450
- issues: [],
1451
- audit: [],
1452
- auditSeq: 0
1453
- };
1454
- }
1455
- function cloneAgentRequestViewsState(state) {
1456
- return {
1457
- requestsById: new Map(state.requestsById),
1458
- requestsByEffectRun: new Map(Array.from(state.requestsByEffectRun, ([k, v]) => [k, [...v]])),
1459
- statusByRequest: new Map(state.statusByRequest),
1460
- issues: [...state.issues],
1461
- audit: [...state.audit],
1462
- auditSeq: state.auditSeq
1463
- };
1464
- }
1465
- function reduceAgentRequestViews(state, fact) {
1466
- state.auditSeq += 1;
1467
- if (fact.kind === "issued") {
1468
- state.requestsById.set(fact.requestId, fact);
1469
- const requestIds = state.requestsByEffectRun.get(fact.effectRunId) ?? [];
1470
- if (!requestIds.includes(fact.requestId)) requestIds.push(fact.requestId);
1471
- state.requestsByEffectRun.set(fact.effectRunId, requestIds);
1472
- state.statusByRequest.set(fact.requestId, {
1473
- kind: "status",
1474
- requestId: fact.requestId,
1475
- operationId: fact.operationId,
1476
- effectRunId: fact.effectRunId,
1477
- status: "issued",
1478
- sourceRefs: [ref("agent-request", fact.requestId)]
1479
- });
1480
- } else if (fact.kind === "status") {
1481
- state.statusByRequest.set(fact.requestId, fact);
1482
- if (fact.issues !== void 0) state.issues.push(...fact.issues);
1483
- } else if (fact.kind === "rejected") {
1484
- state.issues.push(fact.issue);
1485
- }
1486
- state.audit.push({
1487
- id: `agent-request-ledger:${state.auditSeq}`,
1488
- kind: `agent-request-${fact.kind}`,
1489
- subjectId: "requestId" in fact ? fact.requestId : fact.proposalId
1490
- });
1491
- }
1492
- function freezeAgentRequestViews(state) {
1493
- const pending = Array.from(state.requestsById.values()).filter((request) => {
1494
- const status = state.statusByRequest.get(request.requestId)?.status;
1495
- return status === void 0 || !isTerminalRequestStatus(status);
1496
- });
1497
- const awaitingProvider = pending.filter(
1498
- (request) => state.statusByRequest.get(request.requestId)?.status === "awaiting-provider"
1499
- );
1500
- return {
1501
- requestsById: new Map(state.requestsById),
1502
- requestsByEffectRun: new Map(
1503
- Array.from(state.requestsByEffectRun, ([key, value]) => [key, Object.freeze([...value])])
1504
- ),
1505
- statusByRequest: new Map(state.statusByRequest),
1506
- pending: Object.freeze(pending),
1507
- awaitingProvider: Object.freeze(awaitingProvider),
1508
- issues: Object.freeze([...state.issues]),
1509
- audit: Object.freeze([...state.audit])
1510
- };
1511
- }
1512
- function projectRuntimeFact(graph, runtime, name, factory, pick) {
1513
- return graph.node(
1514
- [runtime],
1515
- (ctx) => {
1516
- for (const fact of depBatch(ctx, 0) ?? []) {
1517
- const typed = fact;
1518
- const value = pick(typed);
1519
- if (value !== void 0) ctx.down([["DATA", value]]);
1520
- }
1521
- },
1522
- { name, factory }
1523
- );
1524
- }
1525
- function forEachDepBatch(ctx, start, count, fn) {
1526
- for (let i = 0; i < count; i += 1) {
1527
- for (const value of depBatch(ctx, start + i) ?? []) fn(value);
1528
- }
1529
- }
1530
- function dataIssue(code, message, opts = {}) {
1531
- return {
1532
- kind: "issue",
1533
- code,
1534
- message,
1535
- severity: opts.severity ?? "error",
1536
- subjectId: opts.subjectId,
1537
- refs: opts.refs?.map((r) => `${r.kind}:${r.id}`),
1538
- details: opts.details
1539
- };
1540
- }
1541
- function ref(kind, id) {
1542
- return { kind, id };
1543
- }
1544
- function isRecord(value) {
1545
- return typeof value === "object" && value !== null && !Array.isArray(value);
1546
- }
1547
-
1548
- // src/orchestration/work-item-runtime.ts
1549
- function workItemEffectRunProjector(graph, opts) {
1550
- const name = opts.name ?? "workItemEffectRuns";
1551
- const runtime = graph.node(
1552
- [opts.workItems, opts.effectRequests],
1553
- (ctx) => {
1554
- const state = ctx.state.get() ?? emptyWorkItemEffectRunState();
1555
- for (const raw of depBatch(ctx, 0) ?? []) {
1556
- const workItem = raw;
1557
- state.workItems.set(workItem.workItemId, workItem);
1558
- }
1559
- for (const raw of depBatch(ctx, 1) ?? []) {
1560
- const request = raw;
1561
- state.requests.set(request.requestId, request);
1562
- const requestRefs = workItemEffectRequestRefs(request);
1563
- state.statusSeq += 1;
1564
- state.auditSeq += 1;
1565
- ctx.down([
1566
- [
1567
- "DATA",
1568
- {
1569
- kind: "status",
1570
- status: {
1571
- kind: "work-item-status",
1572
- statusId: `${request.workItemId}:effect-request-pending:${state.statusSeq}`,
1573
- workItemId: request.workItemId,
1574
- effectRunId: request.effectRunId,
1575
- requestId: request.requestId,
1576
- state: "effect-request-pending",
1577
- sourceRefs: requestRefs,
1578
- metadata: { effectKind: request.effectKind }
1579
- }
1580
- }
1581
- ],
1582
- [
1583
- "DATA",
1584
- {
1585
- kind: "audit",
1586
- audit: {
1587
- id: `${request.workItemId}:effect-request-pending:${state.auditSeq}`,
1588
- kind: "work-item-effect-request-pending",
1589
- subjectId: request.workItemId,
1590
- sourceRefs: requestRefs,
1591
- metadata: { effectRunId: request.effectRunId, effectKind: request.effectKind }
1592
- }
1593
- }
1594
- ]
1595
- ]);
1596
- const workItem = state.workItems.get(request.workItemId);
1597
- if (workItem === void 0) {
1598
- emitWorkItemEffectRunIssue(
1599
- ctx,
1600
- state,
1601
- `unknown-work-item:${request.requestId}`,
1602
- "unknown-work-item-effect-request",
1603
- `WorkItemEffectRequested '${request.requestId}' references unknown WorkItem '${request.workItemId}'`,
1604
- request.workItemId,
1605
- requestRefs
1606
- );
1607
- continue;
1608
- }
1609
- const existingEffectRunId = state.effectRunsByRequest.get(request.requestId);
1610
- if (existingEffectRunId !== void 0) {
1611
- emitWorkItemEffectRunIssue(
1612
- ctx,
1613
- state,
1614
- `duplicate-effect-request:${request.requestId}`,
1615
- "duplicate-work-item-effect-request",
1616
- `WorkItemEffectRequested '${request.requestId}' was already mapped to EffectRun '${existingEffectRunId}'`,
1617
- request.workItemId,
1618
- requestRefs
1619
- );
1620
- continue;
1621
- }
1622
- if (state.seededEffectRunIds.has(request.effectRunId)) {
1623
- emitWorkItemEffectRunIssue(
1624
- ctx,
1625
- state,
1626
- `duplicate-effect-run:${request.effectRunId}:${request.requestId}`,
1627
- "duplicate-work-item-effect-run",
1628
- `EffectRun '${request.effectRunId}' was already seeded from another WorkItemEffectRequested fact`,
1629
- request.workItemId,
1630
- requestRefs
1631
- );
1632
- continue;
1633
- }
1634
- state.effectRunsByRequest.set(request.requestId, request.effectRunId);
1635
- state.seededEffectRunIds.add(request.effectRunId);
1636
- const run = effectRun({
1637
- effectRunId: request.effectRunId,
1638
- agentRunId: request.agentRunId,
1639
- subjectRefs: [ref2("work-item", request.workItemId)],
1640
- goal: request.goal,
1641
- sourceRefs: [
1642
- ref2("work-item", request.workItemId),
1643
- ref2("work-item-effect-request", request.requestId),
1644
- ...request.sourceRefs ?? []
1645
- ],
1646
- policyRefs: request.policyRefs,
1647
- limits: request.limits,
1648
- createdBy: request.createdBy,
1649
- createdAtMs: request.createdAtMs,
1650
- metadata: {
1651
- ...request.metadata ?? {},
1652
- effectKind: request.effectKind,
1653
- idempotencyKey: request.idempotencyKey
1654
- }
1655
- });
1656
- state.statusSeq += 1;
1657
- state.auditSeq += 1;
1658
- ctx.down([
1659
- ["DATA", { kind: "effect-run", effectRun: run }],
1660
- [
1661
- "DATA",
1662
- {
1663
- kind: "status",
1664
- status: {
1665
- kind: "work-item-status",
1666
- statusId: `${request.workItemId}:effect-run-seeded:${state.statusSeq}`,
1667
- workItemId: request.workItemId,
1668
- effectRunId: request.effectRunId,
1669
- requestId: request.requestId,
1670
- state: "effect-run-seeded",
1671
- sourceRefs: run.sourceRefs
1672
- }
1673
- }
1674
- ],
1675
- [
1676
- "DATA",
1677
- {
1678
- kind: "audit",
1679
- audit: {
1680
- id: `${request.workItemId}:effect-run-seeded:${state.auditSeq}`,
1681
- kind: "work-item-effect-run-seeded",
1682
- subjectId: request.workItemId,
1683
- sourceRefs: run.sourceRefs,
1684
- metadata: { effectRunId: request.effectRunId, effectKind: request.effectKind }
1685
- }
1686
- }
1687
- ]
1688
- ]);
1689
- }
1690
- ctx.state.set(state);
1691
- },
1692
- { name: `${name}/runtime`, factory: "workItemEffectRunProjector" }
1693
- );
1694
- return {
1695
- effectRuns: projectRuntimeFact2(
1696
- graph,
1697
- runtime,
1698
- `${name}/effectRuns`,
1699
- "workItemEffectRuns",
1700
- (fact) => fact.kind === "effect-run" ? fact.effectRun : void 0
1701
- ),
1702
- status: projectRuntimeFact2(
1703
- graph,
1704
- runtime,
1705
- `${name}/status`,
1706
- "workItemEffectRunStatus",
1707
- (fact) => fact.kind === "status" ? fact.status : void 0
1708
- ),
1709
- issues: projectRuntimeFact2(
1710
- graph,
1711
- runtime,
1712
- `${name}/issues`,
1713
- "workItemEffectRunIssues",
1714
- (fact) => fact.kind === "issue" ? fact.issue : void 0
1715
- ),
1716
- audit: projectRuntimeFact2(
1717
- graph,
1718
- runtime,
1719
- `${name}/audit`,
1720
- "workItemEffectRunAudit",
1721
- (fact) => fact.kind === "audit" ? fact.audit : void 0
1722
- ),
1723
- views: graph.node(
1724
- [opts.effectRequests, runtime],
1725
- (ctx) => {
1726
- const state = ctx.state.get() ?? {
1727
- pendingEffectRequests: /* @__PURE__ */ new Map(),
1728
- settledRequestIds: /* @__PURE__ */ new Set(),
1729
- issues: [],
1730
- audit: []
1731
- };
1732
- for (const raw of depBatch(ctx, 0) ?? []) {
1733
- const request = raw;
1734
- if (!state.settledRequestIds.has(request.requestId))
1735
- state.pendingEffectRequests.set(request.requestId, request);
1736
- }
1737
- for (const raw of depBatch(ctx, 1) ?? []) {
1738
- const fact = raw;
1739
- if (fact.kind === "effect-run") {
1740
- for (const request of state.pendingEffectRequests.values()) {
1741
- if (request.effectRunId === fact.effectRun.effectRunId) {
1742
- state.pendingEffectRequests.delete(request.requestId);
1743
- state.settledRequestIds.add(request.requestId);
1744
- break;
1745
- }
1746
- }
1747
- } else if (fact.kind === "issue") {
1748
- deletePendingWorkItemEffectRequest(state, fact.issue.refs);
1749
- state.issues.push(fact.issue);
1750
- } else if (fact.kind === "audit") state.audit.push(fact.audit);
1751
- }
1752
- ctx.state.set(state);
1753
- ctx.down([["DATA", freezeWorkItemEffectRequestViews(state)]]);
1754
- },
1755
- { name: `${name}/views`, factory: "workItemEffectRequestViews" }
1756
- )
1757
- };
1758
- }
1759
- function workItemEffectResultMapper(graph, opts) {
1760
- const name = opts.name ?? "workItemEffectResultMapper";
1761
- const policyDeps = opts.mappingPolicies ?? [];
1762
- const deps = [
1763
- opts.workItems,
1764
- opts.effectRuns,
1765
- opts.effectRunResults,
1766
- ...opts.effectRequests === void 0 ? [] : [opts.effectRequests],
1767
- ...policyDeps
1768
- ];
1769
- const effectRequestIndex = 3;
1770
- const policyStart = effectRequestIndex + (opts.effectRequests === void 0 ? 0 : 1);
1771
- const now = opts.now ?? Date.now;
1772
- const runtime = graph.node(
1773
- deps,
1774
- (ctx) => {
1775
- const state = ctx.state.get() ?? emptyWorkItemEvidenceState();
1776
- for (const raw of depBatch(ctx, 0) ?? []) {
1777
- const workItem = raw;
1778
- state.workItems.set(workItem.workItemId, workItem);
1779
- }
1780
- for (const raw of depBatch(ctx, 1) ?? []) {
1781
- const run = raw;
1782
- state.effectRuns.set(run.effectRunId, run);
1783
- const workItemRef = singleWorkItemRef([
1784
- ...run.subjectRefs ?? [],
1785
- ...run.sourceRefs ?? []
1786
- ]);
1787
- if (workItemRef !== void 0)
1788
- state.effectRunWorkItems.set(run.effectRunId, workItemRef.id);
1789
- }
1790
- if (opts.effectRequests !== void 0) {
1791
- for (const raw of depBatch(ctx, effectRequestIndex) ?? []) {
1792
- const request = raw;
1793
- state.pendingEffectRequests.set(request.requestId, request);
1794
- const existing = state.requestsByEffectRun.get(request.effectRunId);
1795
- if (existing !== void 0 && existing.requestId !== request.requestId) {
1796
- const ambiguous = state.ambiguousRequestsByEffectRun.get(request.effectRunId) ?? [
1797
- existing
1798
- ];
1799
- if (!ambiguous.some((item) => item.requestId === request.requestId))
1800
- ambiguous.push(request);
1801
- state.ambiguousRequestsByEffectRun.set(request.effectRunId, ambiguous);
1802
- emitWorkItemEvidenceIssue(
1803
- ctx,
1804
- state,
1805
- `duplicate-effect-request:${request.effectRunId}:${request.requestId}`,
1806
- "duplicate-work-item-effect-request",
1807
- `EffectRun '${request.effectRunId}' has multiple WorkItemEffectRequested facts`,
1808
- request.workItemId,
1809
- uniqueSourceRefs2(ambiguous.flatMap(workItemEffectRequestRefs))
1810
- );
1811
- } else {
1812
- state.requestsByEffectRun.set(request.effectRunId, request);
1813
- }
1814
- }
1815
- }
1816
- forEachPolicyDepBatch(ctx, policyStart, policyDeps.length, (raw) => {
1817
- const policy = raw;
1818
- state.policies.set(policy.policyId, policy);
1819
- });
1820
- for (const raw of depBatch(ctx, 2) ?? []) {
1821
- const result = raw;
1822
- mapEffectRunResultToWorkItemEvidence(ctx, state, result, now());
1823
- }
1824
- ctx.state.set(state);
1825
- },
1826
- { name: `${name}/runtime`, factory: "workItemEffectResultMapper" }
1827
- );
1828
- return {
1829
- evidence: projectRuntimeFact2(
1830
- graph,
1831
- runtime,
1832
- `${name}/evidence`,
1833
- "workItemEvidenceRecorded",
1834
- (fact) => fact.kind === "evidence" ? fact.evidence : void 0
1835
- ),
1836
- status: projectRuntimeFact2(
1837
- graph,
1838
- runtime,
1839
- `${name}/status`,
1840
- "workItemEvidenceStatus",
1841
- (fact) => fact.kind === "status" ? fact.status : void 0
1842
- ),
1843
- issues: projectRuntimeFact2(
1844
- graph,
1845
- runtime,
1846
- `${name}/issues`,
1847
- "workItemEvidenceIssues",
1848
- (fact) => fact.kind === "issue" ? fact.issue : void 0
1849
- ),
1850
- audit: projectRuntimeFact2(
1851
- graph,
1852
- runtime,
1853
- `${name}/audit`,
1854
- "workItemEvidenceAudit",
1855
- (fact) => fact.kind === "audit" ? fact.audit : void 0
1856
- ),
1857
- views: graph.node(
1858
- [...opts.effectRequests === void 0 ? [] : [opts.effectRequests], runtime],
1859
- (ctx) => {
1860
- const state = ctx.state.get() ?? {
1861
- evidenceByWorkItem: /* @__PURE__ */ new Map(),
1862
- latestEvidenceByEffectRun: /* @__PURE__ */ new Map(),
1863
- pendingEffectRequests: /* @__PURE__ */ new Map(),
1864
- settledEffectRunIds: /* @__PURE__ */ new Set(),
1865
- settledRequestIds: /* @__PURE__ */ new Set(),
1866
- issues: [],
1867
- audit: []
1868
- };
1869
- if (opts.effectRequests !== void 0) {
1870
- for (const raw of depBatch(ctx, 0) ?? []) {
1871
- const request = raw;
1872
- if (!state.settledRequestIds.has(request.requestId) && !state.settledEffectRunIds.has(request.effectRunId))
1873
- state.pendingEffectRequests.set(request.requestId, request);
1874
- }
1875
- }
1876
- const runtimeIndex = opts.effectRequests === void 0 ? 0 : 1;
1877
- for (const raw of depBatch(ctx, runtimeIndex) ?? []) {
1878
- const fact = raw;
1879
- if (fact.kind === "evidence") {
1880
- const evidence = fact.evidence;
1881
- const byWorkItem = state.evidenceByWorkItem.get(evidence.workItemId) ?? [];
1882
- byWorkItem.push(evidence);
1883
- state.evidenceByWorkItem.set(evidence.workItemId, byWorkItem);
1884
- state.latestEvidenceByEffectRun.set(evidence.effectRunId, evidence);
1885
- for (const request of state.pendingEffectRequests.values()) {
1886
- if (request.effectRunId === evidence.effectRunId) {
1887
- state.pendingEffectRequests.delete(request.requestId);
1888
- state.settledRequestIds.add(request.requestId);
1889
- }
1890
- }
1891
- state.settledEffectRunIds.add(evidence.effectRunId);
1892
- } else if (fact.kind === "issue") {
1893
- deletePendingWorkItemEffectRequest(state, fact.issue.refs);
1894
- state.issues.push(fact.issue);
1895
- } else if (fact.kind === "audit") state.audit.push(fact.audit);
1896
- }
1897
- ctx.state.set(state);
1898
- ctx.down([["DATA", freezeWorkItemEvidenceViews(state)]]);
1899
- },
1900
- { name: `${name}/views`, factory: "workItemEvidenceViews" }
1901
- )
1902
- };
1903
- }
1904
- function workItemDomainActionProposalProjector(graph, opts) {
1905
- const name = opts.name ?? "workItemDomainActionProposals";
1906
- const now = opts.now ?? Date.now;
1907
- const policyStart = 3;
1908
- const runtime = graph.node(
1909
- [opts.workItems, opts.evidence, opts.effectRunResults, ...opts.mappingPolicies],
1910
- (ctx) => {
1911
- const state = ctx.state.get() ?? emptyWorkItemDomainActionProposalState();
1912
- for (const raw of depBatch(ctx, 0) ?? []) {
1913
- const workItem = raw;
1914
- state.workItems.set(workItem.workItemId, workItem);
1915
- }
1916
- for (const raw of depBatch(ctx, 1) ?? []) {
1917
- const evidence = raw;
1918
- if (state.evidence.has(evidence.evidenceId)) {
1919
- emitWorkItemActionProposalIssue(
1920
- ctx,
1921
- state,
1922
- `duplicate-action-proposal-evidence:${evidence.evidenceId}`,
1923
- "duplicate-work-item-action-proposal-evidence",
1924
- `WorkItemEvidenceRecorded '${evidence.evidenceId}' was already seen by the action proposal projector`,
1925
- evidence.workItemId,
1926
- workItemEvidenceOnlyRefs(evidence)
1927
- );
1928
- continue;
1929
- }
1930
- state.evidence.set(evidence.evidenceId, evidence);
1931
- }
1932
- for (const raw of depBatch(ctx, 2) ?? []) {
1933
- const result = raw;
1934
- if (state.results.has(result.resultId)) {
1935
- emitWorkItemActionProposalIssue(
1936
- ctx,
1937
- state,
1938
- `duplicate-action-proposal-result:${result.resultId}`,
1939
- "duplicate-work-item-action-proposal-result",
1940
- `EffectRunResult '${result.resultId}' was already seen by the action proposal projector`,
1941
- workItemIdForEffectRunResult(state, result),
1942
- workItemResultRefs(result)
1943
- );
1944
- continue;
1945
- }
1946
- state.results.set(result.resultId, result);
1947
- }
1948
- forEachPolicyDepBatch(ctx, policyStart, opts.mappingPolicies.length, (raw) => {
1949
- const policy = raw;
1950
- state.policies.set(policy.policyId, policy);
1951
- });
1952
- evaluateWorkItemDomainActionProposals(ctx, state, now());
1953
- ctx.state.set(state);
1954
- },
1955
- { name: `${name}/runtime`, factory: "workItemDomainActionProposalProjector", partial: true }
1956
- );
1957
- return {
1958
- proposals: projectRuntimeFact2(
1959
- graph,
1960
- runtime,
1961
- `${name}/proposals`,
1962
- "workItemDomainActionProposals",
1963
- (fact) => fact.kind === "proposal" ? fact.proposal : void 0
1964
- ),
1965
- status: projectRuntimeFact2(
1966
- graph,
1967
- runtime,
1968
- `${name}/status`,
1969
- "workItemDomainActionProposalStatus",
1970
- (fact) => fact.kind === "status" ? fact.status : void 0
1971
- ),
1972
- issues: projectRuntimeFact2(
1973
- graph,
1974
- runtime,
1975
- `${name}/issues`,
1976
- "workItemDomainActionProposalIssues",
1977
- (fact) => fact.kind === "issue" ? fact.issue : void 0
1978
- ),
1979
- audit: projectRuntimeFact2(
1980
- graph,
1981
- runtime,
1982
- `${name}/audit`,
1983
- "workItemDomainActionProposalAudit",
1984
- (fact) => fact.kind === "audit" ? fact.audit : void 0
1985
- ),
1986
- views: graph.node(
1987
- [runtime],
1988
- (ctx) => {
1989
- const state = ctx.state.get() ?? {
1990
- proposalsByWorkItem: /* @__PURE__ */ new Map(),
1991
- proposalsByEvidence: /* @__PURE__ */ new Map(),
1992
- issues: [],
1993
- audit: []
1994
- };
1995
- for (const raw of depBatch(ctx, 0) ?? []) {
1996
- const fact = raw;
1997
- if (fact.kind === "proposal") {
1998
- const proposal = fact.proposal;
1999
- const byWorkItem = state.proposalsByWorkItem.get(proposal.workItemId) ?? [];
2000
- byWorkItem.push(proposal);
2001
- state.proposalsByWorkItem.set(proposal.workItemId, byWorkItem);
2002
- const byEvidence = state.proposalsByEvidence.get(proposal.evidenceId) ?? [];
2003
- byEvidence.push(proposal);
2004
- state.proposalsByEvidence.set(proposal.evidenceId, byEvidence);
2005
- } else if (fact.kind === "issue") state.issues.push(fact.issue);
2006
- else if (fact.kind === "audit") state.audit.push(fact.audit);
2007
- }
2008
- ctx.state.set(state);
2009
- ctx.down([["DATA", freezeWorkItemDomainActionProposalViews(state)]]);
2010
- },
2011
- { name: `${name}/views`, factory: "workItemDomainActionProposalViews" }
2012
- )
2013
- };
2014
- }
2015
- function workItemDomainActionAdmissionProjector(graph, opts) {
2016
- const name = opts.name ?? "workItemDomainActionAdmissions";
2017
- const policyDeps = opts.admissionPolicies ?? [];
2018
- const policyStart = 2;
2019
- const now = opts.now ?? Date.now;
2020
- const runtime = graph.node(
2021
- [opts.proposals, opts.decisions, ...policyDeps],
2022
- (ctx) => {
2023
- const state = ctx.state.get() ?? emptyWorkItemDomainActionAdmissionState();
2024
- for (const raw of depBatch(ctx, 0) ?? []) {
2025
- const proposal = raw;
2026
- if (state.proposals.has(proposal.proposalId)) {
2027
- emitWorkItemAdmissionIssue(
2028
- ctx,
2029
- state,
2030
- `duplicate-admission-proposal:${proposal.proposalId}`,
2031
- "duplicate-work-item-domain-action-proposal",
2032
- `WorkItemDomainActionProposal '${proposal.proposalId}' was already seen by the admission projector`,
2033
- proposal.workItemId,
2034
- workItemAdmissionProposalRefs(proposal)
2035
- );
2036
- continue;
2037
- }
2038
- state.proposals.set(proposal.proposalId, proposal);
2039
- }
2040
- forEachPolicyDepBatch(ctx, policyStart, policyDeps.length, (raw) => {
2041
- const policy = raw;
2042
- state.policies.set(policy.policyId, policy);
2043
- });
2044
- for (const raw of depBatch(ctx, 1) ?? []) {
2045
- const decision = raw;
2046
- if (state.decisions.has(decision.decisionId)) {
2047
- emitWorkItemAdmissionIssue(
2048
- ctx,
2049
- state,
2050
- `duplicate-admission-decision:${decision.decisionId}`,
2051
- "duplicate-work-item-domain-action-admission-decision",
2052
- `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' was already seen by the admission projector`,
2053
- decision.proposalId,
2054
- workItemAdmissionDecisionRefs(decision)
2055
- );
2056
- continue;
2057
- }
2058
- state.decisions.set(decision.decisionId, decision);
2059
- }
2060
- evaluateWorkItemDomainActionAdmissions(ctx, state, now());
2061
- ctx.state.set(state);
2062
- },
2063
- { name: `${name}/runtime`, factory: "workItemDomainActionAdmissionProjector", partial: true }
2064
- );
2065
- return {
2066
- admissions: projectRuntimeFact2(
2067
- graph,
2068
- runtime,
2069
- `${name}/admissions`,
2070
- "workItemDomainActionAdmissions",
2071
- (fact) => fact.kind === "admission" ? fact.admission : void 0
2072
- ),
2073
- status: projectRuntimeFact2(
2074
- graph,
2075
- runtime,
2076
- `${name}/status`,
2077
- "workItemDomainActionAdmissionStatus",
2078
- (fact) => fact.kind === "status" ? fact.status : void 0
2079
- ),
2080
- issues: projectRuntimeFact2(
2081
- graph,
2082
- runtime,
2083
- `${name}/issues`,
2084
- "workItemDomainActionAdmissionIssues",
2085
- (fact) => fact.kind === "issue" ? fact.issue : void 0
2086
- ),
2087
- audit: projectRuntimeFact2(
2088
- graph,
2089
- runtime,
2090
- `${name}/audit`,
2091
- "workItemDomainActionAdmissionAudit",
2092
- (fact) => fact.kind === "audit" ? fact.audit : void 0
2093
- ),
2094
- views: graph.node(
2095
- [runtime],
2096
- (ctx) => {
2097
- const state = ctx.state.get() ?? {
2098
- admissionsByProposal: /* @__PURE__ */ new Map(),
2099
- admissionsByWorkItem: /* @__PURE__ */ new Map(),
2100
- issues: [],
2101
- audit: []
2102
- };
2103
- for (const raw of depBatch(ctx, 0) ?? []) {
2104
- const fact = raw;
2105
- if (fact.kind === "admission") {
2106
- const admission = fact.admission;
2107
- state.admissionsByProposal.set(admission.proposalId, admission);
2108
- const byWorkItem = state.admissionsByWorkItem.get(admission.workItemId) ?? [];
2109
- byWorkItem.push(admission);
2110
- state.admissionsByWorkItem.set(admission.workItemId, byWorkItem);
2111
- } else if (fact.kind === "issue") state.issues.push(fact.issue);
2112
- else if (fact.kind === "audit") state.audit.push(fact.audit);
2113
- }
2114
- ctx.state.set(state);
2115
- ctx.down([["DATA", freezeWorkItemDomainActionAdmissionViews(state)]]);
2116
- },
2117
- { name: `${name}/views`, factory: "workItemDomainActionAdmissionViews" }
2118
- )
2119
- };
2120
- }
2121
- function mapEffectRunResultToWorkItemEvidence(ctx, state, result, recordedAtMs) {
2122
- const run = state.effectRuns.get(result.effectRunId);
2123
- if (run === void 0) {
2124
- emitWorkItemEvidenceIssue(
2125
- ctx,
2126
- state,
2127
- `unknown-effect-run:${result.resultId}`,
2128
- "unknown-effect-run-result",
2129
- `EffectRunResult '${result.resultId}' references unknown EffectRun '${result.effectRunId}'`,
2130
- result.effectRunId,
2131
- result.sourceRefs
2132
- );
2133
- return;
2134
- }
2135
- const staleEffectRunRef = (result.sourceRefs ?? []).find(
2136
- (sourceRef) => sourceRef.kind === "effect-run" && sourceRef.id !== result.effectRunId
2137
- );
2138
- if (staleEffectRunRef !== void 0) {
2139
- emitWorkItemEvidenceIssue(
2140
- ctx,
2141
- state,
2142
- `stale-effect-run-ref:${result.resultId}`,
2143
- "stale-effect-run-source-ref",
2144
- `EffectRunResult '${result.resultId}' carries a stale EffectRun source ref '${staleEffectRunRef.id}'`,
2145
- result.effectRunId,
2146
- result.sourceRefs
2147
- );
2148
- return;
2149
- }
2150
- const runWorkItemRef = singleWorkItemRef([...run.subjectRefs ?? [], ...run.sourceRefs ?? []]);
2151
- const resultWorkItemRefs = distinctWorkItemRefs([
2152
- ...result.subjectRefs ?? [],
2153
- ...result.sourceRefs ?? []
2154
- ]);
2155
- if (resultWorkItemRefs.length > 1) {
2156
- emitWorkItemEvidenceIssue(
2157
- ctx,
2158
- state,
2159
- `ambiguous-work-item-ref:${result.resultId}`,
2160
- "stale-work-item-source-ref",
2161
- `EffectRunResult '${result.resultId}' carries multiple WorkItem refs`,
2162
- resultWorkItemRefs[0]?.id,
2163
- workItemResultRefs(result)
2164
- );
2165
- return;
2166
- }
2167
- const resultWorkItemRef = resultWorkItemRefs[0];
2168
- if (runWorkItemRef !== void 0 && resultWorkItemRef !== void 0 && runWorkItemRef.id !== resultWorkItemRef.id) {
2169
- emitWorkItemEvidenceIssue(
2170
- ctx,
2171
- state,
2172
- `stale-work-item-ref:${result.resultId}`,
2173
- "stale-work-item-source-ref",
2174
- `EffectRunResult '${result.resultId}' WorkItem ref '${resultWorkItemRef.id}' does not match EffectRun '${result.effectRunId}'`,
2175
- resultWorkItemRef.id,
2176
- workItemResultRefs(result)
2177
- );
2178
- return;
2179
- }
2180
- const workItemId = resultWorkItemRef?.id ?? runWorkItemRef?.id ?? state.effectRunWorkItems.get(result.effectRunId);
2181
- if (workItemId === void 0) {
2182
- emitWorkItemEvidenceIssue(
2183
- ctx,
2184
- state,
2185
- `missing-work-item-ref:${result.resultId}`,
2186
- "missing-work-item-source-ref",
2187
- `EffectRunResult '${result.resultId}' cannot be mapped without a WorkItem source ref`,
2188
- result.effectRunId,
2189
- workItemResultRefs(result)
2190
- );
2191
- return;
2192
- }
2193
- if (!state.workItems.has(workItemId)) {
2194
- emitWorkItemEvidenceIssue(
2195
- ctx,
2196
- state,
2197
- `unknown-work-item:${result.resultId}`,
2198
- "unknown-work-item-evidence-target",
2199
- `EffectRunResult '${result.resultId}' references unseeded WorkItem '${workItemId}'`,
2200
- workItemId,
2201
- workItemResultRefs(result)
2202
- );
2203
- return;
2204
- }
2205
- const request = state.requestsByEffectRun.get(result.effectRunId);
2206
- const ambiguousRequests = state.ambiguousRequestsByEffectRun.get(result.effectRunId);
2207
- if (ambiguousRequests !== void 0) {
2208
- const refs2 = uniqueSourceRefs2([
2209
- ...workItemResultRefs(result),
2210
- ...ambiguousRequests.flatMap(workItemEffectRequestRefs)
2211
- ]);
2212
- emitWorkItemEvidenceIssue(
2213
- ctx,
2214
- state,
2215
- `ambiguous-effect-request:${result.effectRunId}:${result.resultId}`,
2216
- "duplicate-work-item-effect-request",
2217
- `EffectRun '${result.effectRunId}' has ambiguous WorkItemEffectRequested facts`,
2218
- workItemId,
2219
- refs2
2220
- );
2221
- clearPendingWorkItemEffectRequestsForRun(state, result.effectRunId);
2222
- return;
2223
- }
2224
- const policyIssue = workItemMappingPolicyIssue(state, request, run);
2225
- if (policyIssue !== void 0) {
2226
- emitWorkItemEvidenceIssue(
2227
- ctx,
2228
- state,
2229
- `${policyIssue.code}:${result.resultId}`,
2230
- policyIssue.code,
2231
- policyIssue.message,
2232
- workItemId,
2233
- workItemMappingPolicyIssueRefs(result, run, request)
2234
- );
2235
- clearPendingWorkItemEffectRequestsForRun(state, result.effectRunId);
2236
- return;
2237
- }
2238
- if (state.latestEvidenceByEffectRun.has(result.effectRunId)) {
2239
- emitWorkItemEvidenceIssue(
2240
- ctx,
2241
- state,
2242
- `duplicate-evidence:${result.effectRunId}:${result.resultId}`,
2243
- "duplicate-work-item-evidence",
2244
- `EffectRun '${result.effectRunId}' already recorded WorkItem evidence`,
2245
- workItemId,
2246
- workItemResultRefs(result)
2247
- );
2248
- return;
2249
- }
2250
- const evidence = workItemEvidenceFromResult(result, run, workItemId, request, recordedAtMs);
2251
- const byWorkItem = state.evidenceByWorkItem.get(workItemId) ?? [];
2252
- byWorkItem.push(evidence);
2253
- state.evidenceByWorkItem.set(workItemId, byWorkItem);
2254
- state.latestEvidenceByEffectRun.set(result.effectRunId, evidence);
2255
- clearPendingWorkItemEffectRequestsForRun(state, result.effectRunId);
2256
- state.statusSeq += 1;
2257
- state.auditSeq += 1;
2258
- const refs = evidence.sourceRefs;
2259
- const status = {
2260
- kind: "work-item-status",
2261
- statusId: `${workItemId}:evidence-recorded:${state.statusSeq}`,
2262
- workItemId,
2263
- state: "evidence-recorded",
2264
- sourceRefs: refs,
2265
- effectRunId: result.effectRunId,
2266
- evidenceId: evidence.evidenceId,
2267
- issues: result.issues,
2268
- metadata: { resultStatus: result.status }
2269
- };
2270
- const audit = {
2271
- id: `${workItemId}:evidence-recorded:${state.auditSeq}`,
2272
- kind: "work-item-evidence-recorded",
2273
- subjectId: workItemId,
2274
- sourceRefs: refs,
2275
- metadata: {
2276
- effectRunId: result.effectRunId,
2277
- effectRunResultId: result.resultId,
2278
- resultStatus: result.status
2279
- }
2280
- };
2281
- state.audit.push(audit);
2282
- ctx.down([
2283
- ["DATA", { kind: "evidence", evidence }],
2284
- ["DATA", { kind: "status", status }],
2285
- ["DATA", { kind: "audit", audit }]
2286
- ]);
2287
- }
2288
- function evaluateWorkItemDomainActionProposals(ctx, state, proposedAtMs) {
2289
- for (const evidence of state.evidence.values()) {
2290
- const result = state.results.get(evidence.effectRunResultId);
2291
- if (result === void 0) {
2292
- emitWorkItemActionProposalIssue(
2293
- ctx,
2294
- state,
2295
- `missing-action-proposal-result:${evidence.evidenceId}:${evidence.effectRunResultId}`,
2296
- "missing-work-item-action-proposal-result",
2297
- `WorkItemEvidenceRecorded '${evidence.evidenceId}' references missing EffectRunResult '${evidence.effectRunResultId}'`,
2298
- evidence.workItemId,
2299
- workItemEvidenceOnlyRefs(evidence)
2300
- );
2301
- continue;
2302
- }
2303
- if (result.effectRunId !== evidence.effectRunId || result.status !== evidence.status) {
2304
- emitWorkItemActionProposalIssue(
2305
- ctx,
2306
- state,
2307
- `stale-action-proposal-result:${evidence.evidenceId}:${result.resultId}`,
2308
- "stale-work-item-action-proposal-result",
2309
- `WorkItemEvidenceRecorded '${evidence.evidenceId}' does not match EffectRunResult '${result.resultId}'`,
2310
- evidence.workItemId,
2311
- workItemActionProposalRefs(evidence, result)
2312
- );
2313
- continue;
2314
- }
2315
- if (!state.workItems.has(evidence.workItemId)) {
2316
- emitWorkItemActionProposalIssue(
2317
- ctx,
2318
- state,
2319
- `unknown-action-proposal-work-item:${evidence.evidenceId}`,
2320
- "unknown-work-item-action-proposal-target",
2321
- `WorkItemEvidenceRecorded '${evidence.evidenceId}' references unseeded WorkItem '${evidence.workItemId}'`,
2322
- evidence.workItemId,
2323
- workItemActionProposalRefs(evidence, result)
2324
- );
2325
- continue;
2326
- }
2327
- const policyIds = referencedWorkItemMappingPolicyIds(evidence);
2328
- for (const policyId of policyIds) {
2329
- const policy = state.policies.get(policyId);
2330
- if (policy === void 0) {
2331
- emitWorkItemActionProposalIssue(
2332
- ctx,
2333
- state,
2334
- `missing-action-proposal-policy:${evidence.evidenceId}:${policyId}`,
2335
- "missing-work-item-action-proposal-policy",
2336
- `WorkItemEffectMappingPolicy '${policyId}' was referenced for WorkItem action proposals but not present`,
2337
- evidence.workItemId,
2338
- workItemActionProposalRefs(evidence, result)
2339
- );
2340
- continue;
2341
- }
2342
- const effectKind = effectKindFromMetadata(evidence.metadata) ?? effectKindFromMetadata(result.metadata);
2343
- if (!policyAppliesToRequest(policy, effectKind)) {
2344
- emitWorkItemActionProposalIssue(
2345
- ctx,
2346
- state,
2347
- `action-proposal-policy-mismatch:${evidence.evidenceId}:${policy.policyId}`,
2348
- "work-item-action-proposal-policy-mismatch",
2349
- `WorkItemEffectMappingPolicy '${policy.policyId}' does not apply to effectKind '${effectKind ?? "unknown"}'`,
2350
- evidence.workItemId,
2351
- workItemActionProposalRefs(evidence, result, policy)
2352
- );
2353
- continue;
2354
- }
2355
- for (const [index, spec] of (policy.actionProposals ?? []).entries()) {
2356
- emitWorkItemDomainActionProposal(
2357
- ctx,
2358
- state,
2359
- evidence,
2360
- result,
2361
- policy,
2362
- spec,
2363
- index,
2364
- proposedAtMs
2365
- );
2366
- }
2367
- }
2368
- }
2369
- }
2370
- function emitWorkItemDomainActionProposal(ctx, state, evidence, result, policy, spec, index, proposedAtMs) {
2371
- const key = `${evidence.evidenceId}:${policy.policyId}:${index}:${spec.actionKind}`;
2372
- if (state.proposedKeys.has(key)) return;
2373
- if (spec.behavior !== void 0 && spec.behavior !== "propose") {
2374
- emitWorkItemActionProposalIssue(
2375
- ctx,
2376
- state,
2377
- `unsupported-action-proposal-behavior:${key}`,
2378
- "unsupported-work-item-action-proposal-behavior",
2379
- `WorkItemEffectMappingPolicy '${policy.policyId}' uses unsupported action proposal behavior '${spec.behavior}'`,
2380
- evidence.workItemId,
2381
- workItemActionProposalRefs(evidence, result, policy)
2382
- );
2383
- return;
2384
- }
2385
- if (spec.actionKind.length === 0) {
2386
- emitWorkItemActionProposalIssue(
2387
- ctx,
2388
- state,
2389
- `malformed-action-proposal:${key}`,
2390
- "malformed-work-item-action-proposal",
2391
- `WorkItemEffectMappingPolicy '${policy.policyId}' has an empty actionKind`,
2392
- evidence.workItemId,
2393
- workItemActionProposalRefs(evidence, result, policy)
2394
- );
2395
- return;
2396
- }
2397
- if (spec.statuses !== void 0 && !spec.statuses.includes(evidence.status)) return;
2398
- const outputKind = evidence.output?.kind;
2399
- if (spec.outputKinds !== void 0 && (outputKind === void 0 || !spec.outputKinds.includes(outputKind)))
2400
- return;
2401
- state.proposedKeys.add(key);
2402
- state.statusSeq += 1;
2403
- state.auditSeq += 1;
2404
- const proposal = {
2405
- kind: "work-item-domain-action-proposal",
2406
- proposalId: `${evidence.workItemId}:${evidence.effectRunId}:${evidence.effectRunResultId}:${policy.policyId}:${index}:${spec.actionKind}`,
2407
- workItemId: evidence.workItemId,
2408
- actionKind: spec.actionKind,
2409
- effectRunId: evidence.effectRunId,
2410
- effectRunResultId: evidence.effectRunResultId,
2411
- evidenceId: evidence.evidenceId,
2412
- policyId: policy.policyId,
2413
- payload: workItemActionProposalPayload(spec, evidence, result),
2414
- reason: spec.reason ?? evidence.reason ?? resultReason(result),
2415
- sourceRefs: workItemActionProposalRefs(evidence, result, policy),
2416
- proposedAtMs,
2417
- metadata: {
2418
- ...policy.metadata ?? {},
2419
- ...spec.metadata ?? {},
2420
- resultStatus: evidence.status
2421
- }
2422
- };
2423
- const status = {
2424
- kind: "work-item-status",
2425
- statusId: `${evidence.workItemId}:domain-action-proposed:${state.statusSeq}`,
2426
- workItemId: evidence.workItemId,
2427
- state: "domain-action-proposed",
2428
- sourceRefs: proposal.sourceRefs,
2429
- effectRunId: evidence.effectRunId,
2430
- evidenceId: evidence.evidenceId,
2431
- proposalId: proposal.proposalId,
2432
- metadata: { actionKind: spec.actionKind, policyId: policy.policyId }
2433
- };
2434
- const audit = {
2435
- id: `${evidence.workItemId}:domain-action-proposed:${state.auditSeq}`,
2436
- kind: "work-item-domain-action-proposed",
2437
- subjectId: evidence.workItemId,
2438
- sourceRefs: proposal.sourceRefs,
2439
- metadata: {
2440
- actionKind: spec.actionKind,
2441
- effectRunId: evidence.effectRunId,
2442
- effectRunResultId: evidence.effectRunResultId,
2443
- evidenceId: evidence.evidenceId,
2444
- policyId: policy.policyId,
2445
- proposalId: proposal.proposalId
2446
- }
2447
- };
2448
- ctx.down([
2449
- ["DATA", { kind: "proposal", proposal }],
2450
- ["DATA", { kind: "status", status }],
2451
- ["DATA", { kind: "audit", audit }]
2452
- ]);
2453
- }
2454
- function evaluateWorkItemDomainActionAdmissions(ctx, state, admittedAtMs) {
2455
- let emitted = true;
2456
- let passes = 0;
2457
- while (emitted && passes <= state.decisions.size) {
2458
- emitted = false;
2459
- passes += 1;
2460
- for (const decision of state.decisions.values()) {
2461
- if (state.terminalDecisionIds.has(decision.decisionId)) continue;
2462
- emitted = evaluateWorkItemDomainActionAdmission(ctx, state, decision, admittedAtMs) || emitted;
2463
- }
2464
- }
2465
- }
2466
- function evaluateWorkItemDomainActionAdmission(ctx, state, decision, admittedAtMs) {
2467
- const proposal = state.proposals.get(decision.proposalId);
2468
- const proposalRefs = workItemAdmissionDecisionRefs(decision, proposal);
2469
- const subjectId = proposal?.workItemId ?? decision.proposalId;
2470
- if (proposal === void 0) {
2471
- emitWorkItemAdmissionIssue(
2472
- ctx,
2473
- state,
2474
- `missing-admission-proposal:${decision.decisionId}:${decision.proposalId}`,
2475
- "missing-work-item-domain-action-admission-proposal",
2476
- `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' references missing proposal '${decision.proposalId}'`,
2477
- subjectId,
2478
- proposalRefs
2479
- );
2480
- return false;
2481
- }
2482
- const staleProposalRef = (decision.sourceRefs ?? []).find(
2483
- (sourceRef) => sourceRef.kind === "work-item-domain-action-proposal" && sourceRef.id !== decision.proposalId && sourceRef.id !== decision.targetProposalId
2484
- );
2485
- if (staleProposalRef !== void 0) {
2486
- emitWorkItemAdmissionIssue(
2487
- ctx,
2488
- state,
2489
- `stale-admission-proposal-ref:${decision.decisionId}:${staleProposalRef.id}`,
2490
- "stale-work-item-domain-action-admission-proposal-ref",
2491
- `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' carries stale proposal ref '${staleProposalRef.id}'`,
2492
- proposal.workItemId,
2493
- proposalRefs
2494
- );
2495
- state.terminalDecisionIds.add(decision.decisionId);
2496
- return false;
2497
- }
2498
- const policy = admissionPolicyForDecision(state, decision);
2499
- if (typeof policy === "string") {
2500
- emitWorkItemAdmissionIssue(
2501
- ctx,
2502
- state,
2503
- `${policy}:${decision.decisionId}:${decision.policyId ?? "missing"}`,
2504
- policy,
2505
- admissionPolicyIssueMessage(policy, decision),
2506
- proposal.workItemId,
2507
- proposalRefs
2508
- );
2509
- if (policy === "stale-work-item-domain-action-admission-policy-ref")
2510
- state.terminalDecisionIds.add(decision.decisionId);
2511
- return false;
2512
- }
2513
- if (policy !== void 0) {
2514
- const policyIssue = validateWorkItemAdmissionPolicy(policy, decision, proposal);
2515
- if (policyIssue !== void 0) {
2516
- emitWorkItemAdmissionIssue(
2517
- ctx,
2518
- state,
2519
- `${policyIssue.code}:${decision.decisionId}:${policy.policyId}`,
2520
- policyIssue.code,
2521
- policyIssue.message,
2522
- proposal.workItemId,
2523
- workItemAdmissionDecisionRefs(decision, proposal, policy)
2524
- );
2525
- return false;
2526
- }
2527
- }
2528
- const mergeIssue = validateWorkItemAdmissionMergeTarget(state, decision);
2529
- if (mergeIssue !== void 0) {
2530
- emitWorkItemAdmissionIssue(
2531
- ctx,
2532
- state,
2533
- `${mergeIssue.code}:${decision.decisionId}:${decision.targetProposalId ?? ""}:${decision.targetAdmissionId ?? ""}`,
2534
- mergeIssue.code,
2535
- mergeIssue.message,
2536
- proposal.workItemId,
2537
- proposalRefs
2538
- );
2539
- if (mergeIssue.code !== "unknown-work-item-domain-action-admission-merge-target")
2540
- state.terminalDecisionIds.add(decision.decisionId);
2541
- return false;
2542
- }
2543
- if (state.admissionsById.has(decision.admissionId)) {
2544
- emitWorkItemAdmissionIssue(
2545
- ctx,
2546
- state,
2547
- `duplicate-admission-id:${decision.admissionId}`,
2548
- "duplicate-work-item-domain-action-admission",
2549
- `WorkItemDomainActionAdmission '${decision.admissionId}' was already emitted`,
2550
- proposal.workItemId,
2551
- proposalRefs
2552
- );
2553
- state.terminalDecisionIds.add(decision.decisionId);
2554
- return false;
2555
- }
2556
- if (state.admissionsByProposal.has(decision.proposalId)) {
2557
- emitWorkItemAdmissionIssue(
2558
- ctx,
2559
- state,
2560
- `duplicate-admission-proposal-decision:${decision.proposalId}:${decision.decisionId}`,
2561
- "duplicate-work-item-domain-action-admission-proposal",
2562
- `WorkItemDomainActionProposal '${decision.proposalId}' already has an admission decision`,
2563
- proposal.workItemId,
2564
- proposalRefs
2565
- );
2566
- state.terminalDecisionIds.add(decision.decisionId);
2567
- return false;
2568
- }
2569
- const admissionState = admissionStateForOutcome(decision.outcome);
2570
- if (admissionState === void 0) {
2571
- emitWorkItemAdmissionIssue(
2572
- ctx,
2573
- state,
2574
- `unsupported-admission-outcome:${decision.decisionId}:${String(decision.outcome)}`,
2575
- "unsupported-work-item-domain-action-admission-outcome",
2576
- `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' uses unsupported outcome '${String(decision.outcome)}'`,
2577
- proposal.workItemId,
2578
- proposalRefs
2579
- );
2580
- state.terminalDecisionIds.add(decision.decisionId);
2581
- return false;
2582
- }
2583
- const admission = {
2584
- kind: "work-item-domain-action-admission",
2585
- admissionId: decision.admissionId,
2586
- proposalId: proposal.proposalId,
2587
- workItemId: proposal.workItemId,
2588
- actionKind: proposal.actionKind,
2589
- state: admissionState,
2590
- decisionId: decision.decisionId,
2591
- policyId: decision.policyId,
2592
- reason: decision.reason,
2593
- targetProposalId: decision.targetProposalId,
2594
- targetAdmissionId: decision.targetAdmissionId,
2595
- sourceRefs: workItemAdmissionDecisionRefs(decision, proposal, policy),
2596
- admittedAtMs: decision.decidedAtMs ?? admittedAtMs,
2597
- metadata: {
2598
- ...proposal.metadata ?? {},
2599
- ...policy?.metadata ?? {},
2600
- ...decision.metadata ?? {}
2601
- }
2602
- };
2603
- state.admissionsById.set(admission.admissionId, admission);
2604
- state.admissionsByProposal.set(admission.proposalId, admission);
2605
- state.terminalDecisionIds.add(decision.decisionId);
2606
- state.statusSeq += 1;
2607
- state.auditSeq += 1;
2608
- const statusState = workItemAdmissionStatusState(admission.state);
2609
- const status = {
2610
- kind: "work-item-status",
2611
- statusId: `${proposal.workItemId}:${statusState}:${state.statusSeq}`,
2612
- workItemId: proposal.workItemId,
2613
- state: statusState,
2614
- sourceRefs: admission.sourceRefs,
2615
- effectRunId: proposal.effectRunId,
2616
- evidenceId: proposal.evidenceId,
2617
- proposalId: proposal.proposalId,
2618
- metadata: {
2619
- actionKind: proposal.actionKind,
2620
- admissionId: admission.admissionId,
2621
- decisionId: decision.decisionId,
2622
- policyId: decision.policyId
2623
- }
2624
- };
2625
- const audit = {
2626
- id: `${proposal.workItemId}:${statusState}:${state.auditSeq}`,
2627
- kind: `work-item-domain-action-${admission.state}`,
2628
- subjectId: proposal.workItemId,
2629
- sourceRefs: admission.sourceRefs,
2630
- metadata: {
2631
- actionKind: proposal.actionKind,
2632
- admissionId: admission.admissionId,
2633
- decisionId: decision.decisionId,
2634
- policyId: decision.policyId,
2635
- proposalId: proposal.proposalId
2636
- }
2637
- };
2638
- ctx.down([
2639
- ["DATA", { kind: "admission", admission }],
2640
- ["DATA", { kind: "status", status }],
2641
- ["DATA", { kind: "audit", audit }]
2642
- ]);
2643
- return true;
2644
- }
2645
- function workItemEvidenceFromResult(result, run, workItemId, request, recordedAtMs) {
2646
- const base = {
2647
- kind: "work-item-evidence-recorded",
2648
- evidenceId: `${workItemId}:${result.effectRunId}:${result.resultId}`,
2649
- workItemId,
2650
- requestId: request?.requestId,
2651
- effectRunId: result.effectRunId,
2652
- effectRunResultId: result.resultId,
2653
- executionInputRevision: request?.executionInputRevision,
2654
- planId: request?.planId,
2655
- planMemberId: request?.planMemberId,
2656
- status: result.status,
2657
- sourceRefs: uniqueSourceRefs2([
2658
- ref2("work-item", workItemId),
2659
- ref2("effect-run", result.effectRunId),
2660
- ref2("effect-run-result", result.resultId),
2661
- ...run.sourceRefs ?? [],
2662
- ...run.subjectRefs ?? [],
2663
- ...run.policyRefs ?? [],
2664
- ...result.sourceRefs ?? [],
2665
- ...result.subjectRefs ?? []
2666
- ]),
2667
- issues: result.issues,
2668
- auditRefs: result.auditRefs,
2669
- recordedAtMs,
2670
- metadata: {
2671
- ...result.metadata ?? {},
2672
- ...request?.requestId === void 0 ? {} : { requestId: request.requestId },
2673
- ...request?.executionInputRevision === void 0 ? {} : { executionInputRevision: request.executionInputRevision },
2674
- ...request?.planId === void 0 ? {} : { planId: request.planId },
2675
- ...request?.planMemberId === void 0 ? {} : { planMemberId: request.planMemberId }
2676
- }
2677
- };
2678
- if (result.status === "completed") return { ...base, output: result.output };
2679
- if (result.status === "failed") return { ...base, error: result.error };
2680
- if (result.status === "blocked") return { ...base, needs: result.needs };
2681
- if (result.status === "timeout") return { ...base, timeoutMs: result.timeoutMs };
2682
- if (result.status === "canceled" || result.status === "waived")
2683
- return { ...base, reason: result.reason };
2684
- return base;
2685
- }
2686
- function workItemMappingPolicyIssue(state, request, run) {
2687
- const context = workItemMappingPolicyContext(request, run);
2688
- const referencedPolicyIds = context.policyRefs.filter((sourceRef) => sourceRef.kind === "work-item-effect-mapping-policy").map((sourceRef) => sourceRef.id);
2689
- for (const policyId of referencedPolicyIds) {
2690
- const policy = state.policies.get(policyId);
2691
- if (policy === void 0) {
2692
- return {
2693
- code: "missing-work-item-effect-mapping-policy",
2694
- message: `WorkItemEffectMappingPolicy '${policyId}' was required but not present`
2695
- };
2696
- }
2697
- const issue = validateWorkItemMappingPolicy(policy, context.effectKind);
2698
- if (issue !== void 0) return issue;
2699
- }
2700
- return void 0;
2701
- }
2702
- function validateWorkItemMappingPolicy(policy, effectKind) {
2703
- if (!policyAppliesToRequest(policy, effectKind)) {
2704
- return {
2705
- code: "work-item-effect-mapping-policy-mismatch",
2706
- message: `WorkItemEffectMappingPolicy '${policy.policyId}' does not apply to effectKind '${effectKind ?? "unknown"}'`
2707
- };
2708
- }
2709
- const behavior = policy.evidence?.behavior ?? "record";
2710
- if (behavior !== "record") {
2711
- return {
2712
- code: "unsupported-work-item-evidence-behavior",
2713
- message: `WorkItemEffectMappingPolicy '${policy.policyId}' uses unsupported evidence behavior '${behavior}'`
2714
- };
2715
- }
2716
- return void 0;
2717
- }
2718
- function admissionPolicyForDecision(state, decision) {
2719
- if (decision.policyId === void 0) return void 0;
2720
- const stalePolicyRef = (decision.sourceRefs ?? []).find(
2721
- (sourceRef) => sourceRef.kind === "work-item-domain-action-admission-policy" && sourceRef.id !== decision.policyId
2722
- );
2723
- if (stalePolicyRef !== void 0) return "stale-work-item-domain-action-admission-policy-ref";
2724
- return state.policies.get(decision.policyId) ?? "missing-work-item-domain-action-admission-policy";
2725
- }
2726
- function admissionPolicyIssueMessage(code, decision) {
2727
- if (code === "missing-work-item-domain-action-admission-policy") {
2728
- return `WorkItemDomainActionAdmissionPolicy '${decision.policyId}' was referenced for WorkItem action admission but not present`;
2729
- }
2730
- return `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' carries a stale admission policy source ref`;
2731
- }
2732
- function validateWorkItemAdmissionPolicy(policy, decision, proposal) {
2733
- if (policy.actionKinds !== void 0 && !policy.actionKinds.includes(proposal.actionKind)) {
2734
- return {
2735
- code: "work-item-domain-action-admission-policy-mismatch",
2736
- message: `WorkItemDomainActionAdmissionPolicy '${policy.policyId}' does not apply to actionKind '${proposal.actionKind}'`
2737
- };
2738
- }
2739
- if (policy.allowedOutcomes !== void 0 && !policy.allowedOutcomes.includes(decision.outcome)) {
2740
- return {
2741
- code: "unsupported-work-item-domain-action-admission-outcome",
2742
- message: `WorkItemDomainActionAdmissionPolicy '${policy.policyId}' does not allow outcome '${decision.outcome}'`
2743
- };
2744
- }
2745
- return void 0;
2746
- }
2747
- function validateWorkItemAdmissionMergeTarget(state, decision) {
2748
- const hasTargetProposal = decision.targetProposalId !== void 0;
2749
- const hasTargetAdmission = decision.targetAdmissionId !== void 0;
2750
- if (decision.outcome !== "merge") {
2751
- if (hasTargetProposal || hasTargetAdmission) {
2752
- return {
2753
- code: "ambiguous-work-item-domain-action-admission-merge-target",
2754
- message: `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' carries a merge target for non-merge outcome '${decision.outcome}'`
2755
- };
2756
- }
2757
- return void 0;
2758
- }
2759
- if (hasTargetProposal === hasTargetAdmission) {
2760
- return {
2761
- code: "ambiguous-work-item-domain-action-admission-merge-target",
2762
- message: `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' must reference exactly one merge target`
2763
- };
2764
- }
2765
- if (decision.targetProposalId === decision.proposalId) {
2766
- return {
2767
- code: "ambiguous-work-item-domain-action-admission-merge-target",
2768
- message: `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' cannot merge a proposal into itself`
2769
- };
2770
- }
2771
- if (decision.targetProposalId !== void 0 && !state.proposals.has(decision.targetProposalId)) {
2772
- return {
2773
- code: "unknown-work-item-domain-action-admission-merge-target",
2774
- message: `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' references unknown target proposal '${decision.targetProposalId}'`
2775
- };
2776
- }
2777
- if (decision.targetAdmissionId !== void 0 && !state.admissionsById.has(decision.targetAdmissionId)) {
2778
- return {
2779
- code: "unknown-work-item-domain-action-admission-merge-target",
2780
- message: `WorkItemDomainActionAdmissionDecision '${decision.decisionId}' references unknown target admission '${decision.targetAdmissionId}'`
2781
- };
2782
- }
2783
- return void 0;
2784
- }
2785
- function admissionStateForOutcome(outcome) {
2786
- if (outcome === "admit") return "admitted";
2787
- if (outcome === "reject") return "rejected";
2788
- if (outcome === "defer") return "deferred";
2789
- if (outcome === "merge") return "merged";
2790
- return void 0;
2791
- }
2792
- function workItemAdmissionStatusState(state) {
2793
- if (state === "admitted") return "domain-action-admitted";
2794
- if (state === "rejected") return "domain-action-rejected";
2795
- if (state === "deferred") return "domain-action-deferred";
2796
- return "domain-action-merged";
2797
- }
2798
- function policyAppliesToRequest(policy, effectKind) {
2799
- return policy.effectKinds === void 0 || effectKind !== void 0 && policy.effectKinds.includes(effectKind);
2800
- }
2801
- function workItemMappingPolicyContext(request, run) {
2802
- return {
2803
- policyRefs: request?.policyRefs ?? run.policyRefs ?? [],
2804
- effectKind: request?.effectKind ?? effectKindFromRun(run)
2805
- };
2806
- }
2807
- function effectKindFromRun(run) {
2808
- const effectKind = run.metadata?.effectKind;
2809
- return typeof effectKind === "string" ? effectKind : void 0;
2810
- }
2811
- function workItemMappingPolicyIssueRefs(result, run, request) {
2812
- return uniqueSourceRefs2([
2813
- ...workItemResultRefs(result),
2814
- ...request === void 0 ? [...run.sourceRefs ?? [], ...run.subjectRefs ?? [], ...run.policyRefs ?? []] : workItemEffectRequestRefs(request)
2815
- ]);
2816
- }
2817
- function clearPendingWorkItemEffectRequestsForRun(state, effectRunId) {
2818
- for (const pendingRequest of state.pendingEffectRequests.values()) {
2819
- if (pendingRequest.effectRunId === effectRunId)
2820
- state.pendingEffectRequests.delete(pendingRequest.requestId);
2821
- }
2822
- }
2823
- function emitWorkItemEffectRunIssue(ctx, state, key, code, message, subjectId, sourceRefs) {
2824
- if (state.issueKeys.has(key)) return;
2825
- state.issueKeys.add(key);
2826
- state.issueSeq += 1;
2827
- state.statusSeq += 1;
2828
- state.auditSeq += 1;
2829
- const issue = dataIssue2(code, message, { subjectId, refs: sourceRefs });
2830
- const status = {
2831
- kind: "work-item-status",
2832
- statusId: `${subjectId ?? "work-item"}:mapping-issue:${state.statusSeq}`,
2833
- workItemId: subjectId ?? "unknown",
2834
- state: "mapping-issue",
2835
- sourceRefs,
2836
- issues: [issue]
2837
- };
2838
- const audit = {
2839
- id: `${subjectId ?? "work-item"}:${code}:${state.auditSeq}`,
2840
- kind: "work-item-effect-run-issue",
2841
- subjectId,
2842
- issueCode: code,
2843
- message,
2844
- sourceRefs
2845
- };
2846
- state.issues.push(issue);
2847
- state.audit.push(audit);
2848
- ctx.down([
2849
- ["DATA", { kind: "issue", issue }],
2850
- ["DATA", { kind: "status", status }],
2851
- ["DATA", { kind: "audit", audit }]
2852
- ]);
2853
- }
2854
- function emitWorkItemEvidenceIssue(ctx, state, key, code, message, subjectId, sourceRefs) {
2855
- if (state.issueKeys.has(key)) return;
2856
- state.issueKeys.add(key);
2857
- state.issueSeq += 1;
2858
- state.statusSeq += 1;
2859
- state.auditSeq += 1;
2860
- const issue = dataIssue2(code, message, { subjectId, refs: sourceRefs });
2861
- const status = {
2862
- kind: "work-item-status",
2863
- statusId: `${subjectId ?? "work-item"}:mapping-issue:${state.statusSeq}`,
2864
- workItemId: subjectId ?? "unknown",
2865
- state: "mapping-issue",
2866
- sourceRefs,
2867
- issues: [issue]
2868
- };
2869
- const audit = {
2870
- id: `${subjectId ?? "work-item"}:${code}:${state.auditSeq}`,
2871
- kind: "work-item-evidence-mapping-issue",
2872
- subjectId,
2873
- issueCode: code,
2874
- message,
2875
- sourceRefs
2876
- };
2877
- state.issues.push(issue);
2878
- state.audit.push(audit);
2879
- ctx.down([
2880
- ["DATA", { kind: "issue", issue }],
2881
- ["DATA", { kind: "status", status }],
2882
- ["DATA", { kind: "audit", audit }]
2883
- ]);
2884
- }
2885
- function emitWorkItemActionProposalIssue(ctx, state, key, code, message, subjectId, sourceRefs) {
2886
- if (state.issueKeys.has(key)) return;
2887
- state.issueKeys.add(key);
2888
- state.issueSeq += 1;
2889
- state.statusSeq += 1;
2890
- state.auditSeq += 1;
2891
- const issue = dataIssue2(code, message, { subjectId, refs: sourceRefs });
2892
- const status = {
2893
- kind: "work-item-status",
2894
- statusId: `${subjectId ?? "work-item"}:mapping-issue:${state.statusSeq}`,
2895
- workItemId: subjectId ?? "unknown",
2896
- state: "mapping-issue",
2897
- sourceRefs,
2898
- issues: [issue]
2899
- };
2900
- const audit = {
2901
- id: `${subjectId ?? "work-item"}:${code}:${state.auditSeq}`,
2902
- kind: "work-item-action-proposal-issue",
2903
- subjectId,
2904
- issueCode: code,
2905
- message,
2906
- sourceRefs
2907
- };
2908
- ctx.down([
2909
- ["DATA", { kind: "issue", issue }],
2910
- ["DATA", { kind: "status", status }],
2911
- ["DATA", { kind: "audit", audit }]
2912
- ]);
2913
- }
2914
- function emitWorkItemAdmissionIssue(ctx, state, key, code, message, subjectId, sourceRefs) {
2915
- if (state.issueKeys.has(key)) return;
2916
- state.issueKeys.add(key);
2917
- state.issueSeq += 1;
2918
- state.statusSeq += 1;
2919
- state.auditSeq += 1;
2920
- const issue = dataIssue2(code, message, { subjectId, refs: sourceRefs });
2921
- const status = {
2922
- kind: "work-item-status",
2923
- statusId: `${subjectId ?? "work-item"}:mapping-issue:${state.statusSeq}`,
2924
- workItemId: subjectId ?? "unknown",
2925
- state: "mapping-issue",
2926
- sourceRefs,
2927
- issues: [issue]
2928
- };
2929
- const audit = {
2930
- id: `${subjectId ?? "work-item"}:${code}:${state.auditSeq}`,
2931
- kind: "work-item-domain-action-admission-issue",
2932
- subjectId,
2933
- issueCode: code,
2934
- message,
2935
- sourceRefs
2936
- };
2937
- ctx.down([
2938
- ["DATA", { kind: "issue", issue }],
2939
- ["DATA", { kind: "status", status }],
2940
- ["DATA", { kind: "audit", audit }]
2941
- ]);
2942
- }
2943
- function emptyWorkItemEffectRunState() {
2944
- return {
2945
- workItems: /* @__PURE__ */ new Map(),
2946
- requests: /* @__PURE__ */ new Map(),
2947
- effectRunsByRequest: /* @__PURE__ */ new Map(),
2948
- seededEffectRunIds: /* @__PURE__ */ new Set(),
2949
- issues: [],
2950
- audit: [],
2951
- issueKeys: /* @__PURE__ */ new Set(),
2952
- statusSeq: 0,
2953
- issueSeq: 0,
2954
- auditSeq: 0
2955
- };
2956
- }
2957
- function emptyWorkItemEvidenceState() {
2958
- return {
2959
- workItems: /* @__PURE__ */ new Map(),
2960
- effectRuns: /* @__PURE__ */ new Map(),
2961
- effectRunWorkItems: /* @__PURE__ */ new Map(),
2962
- evidenceByWorkItem: /* @__PURE__ */ new Map(),
2963
- latestEvidenceByEffectRun: /* @__PURE__ */ new Map(),
2964
- pendingEffectRequests: /* @__PURE__ */ new Map(),
2965
- requestsByEffectRun: /* @__PURE__ */ new Map(),
2966
- ambiguousRequestsByEffectRun: /* @__PURE__ */ new Map(),
2967
- policies: /* @__PURE__ */ new Map(),
2968
- issues: [],
2969
- audit: [],
2970
- issueKeys: /* @__PURE__ */ new Set(),
2971
- statusSeq: 0,
2972
- issueSeq: 0,
2973
- auditSeq: 0
2974
- };
2975
- }
2976
- function emptyWorkItemDomainActionProposalState() {
2977
- return {
2978
- workItems: /* @__PURE__ */ new Map(),
2979
- evidence: /* @__PURE__ */ new Map(),
2980
- results: /* @__PURE__ */ new Map(),
2981
- policies: /* @__PURE__ */ new Map(),
2982
- proposedKeys: /* @__PURE__ */ new Set(),
2983
- issueKeys: /* @__PURE__ */ new Set(),
2984
- statusSeq: 0,
2985
- issueSeq: 0,
2986
- auditSeq: 0
2987
- };
2988
- }
2989
- function emptyWorkItemDomainActionAdmissionState() {
2990
- return {
2991
- proposals: /* @__PURE__ */ new Map(),
2992
- policies: /* @__PURE__ */ new Map(),
2993
- decisions: /* @__PURE__ */ new Map(),
2994
- admissionsById: /* @__PURE__ */ new Map(),
2995
- admissionsByProposal: /* @__PURE__ */ new Map(),
2996
- terminalDecisionIds: /* @__PURE__ */ new Set(),
2997
- issueKeys: /* @__PURE__ */ new Set(),
2998
- statusSeq: 0,
2999
- issueSeq: 0,
3000
- auditSeq: 0
3001
- };
3002
- }
3003
- function freezeWorkItemEffectRequestViews(state) {
3004
- return {
3005
- pendingEffectRequests: Object.freeze(Array.from(state.pendingEffectRequests.values())),
3006
- issues: Object.freeze([...state.issues]),
3007
- audit: Object.freeze([...state.audit])
3008
- };
3009
- }
3010
- function freezeWorkItemEvidenceViews(state) {
3011
- return {
3012
- evidenceByWorkItem: new Map(
3013
- Array.from(state.evidenceByWorkItem, ([key, value]) => [key, Object.freeze([...value])])
3014
- ),
3015
- latestEvidenceByEffectRun: new Map(state.latestEvidenceByEffectRun),
3016
- issues: Object.freeze([...state.issues]),
3017
- audit: Object.freeze([...state.audit]),
3018
- pendingEffectRequests: Object.freeze(Array.from(state.pendingEffectRequests.values()))
3019
- };
3020
- }
3021
- function freezeWorkItemDomainActionProposalViews(state) {
3022
- return {
3023
- proposalsByWorkItem: new Map(
3024
- Array.from(state.proposalsByWorkItem, ([key, value]) => [key, Object.freeze([...value])])
3025
- ),
3026
- proposalsByEvidence: new Map(
3027
- Array.from(state.proposalsByEvidence, ([key, value]) => [key, Object.freeze([...value])])
3028
- ),
3029
- issues: Object.freeze([...state.issues]),
3030
- audit: Object.freeze([...state.audit])
3031
- };
3032
- }
3033
- function freezeWorkItemDomainActionAdmissionViews(state) {
3034
- return {
3035
- admissionsByProposal: new Map(state.admissionsByProposal),
3036
- admissionsByWorkItem: new Map(
3037
- Array.from(state.admissionsByWorkItem, ([key, value]) => [key, Object.freeze([...value])])
3038
- ),
3039
- issues: Object.freeze([...state.issues]),
3040
- audit: Object.freeze([...state.audit])
3041
- };
3042
- }
3043
- function deletePendingWorkItemEffectRequest(state, refs) {
3044
- for (const requestRef of refs?.filter((value) => value.startsWith("work-item-effect-request:")) ?? []) {
3045
- const requestId = requestRef.slice("work-item-effect-request:".length);
3046
- state.pendingEffectRequests.delete(requestId);
3047
- state.settledRequestIds.add(requestId);
3048
- }
3049
- }
3050
- function workItemEffectRequestRefs(request) {
3051
- return [
3052
- ref2("work-item", request.workItemId),
3053
- ref2("work-item-effect-request", request.requestId),
3054
- ...request.sourceRefs ?? []
3055
- ];
3056
- }
3057
- function workItemResultRefs(result) {
3058
- return [
3059
- ref2("effect-run", result.effectRunId),
3060
- ref2("effect-run-result", result.resultId),
3061
- ...result.sourceRefs ?? [],
3062
- ...result.subjectRefs ?? []
3063
- ];
3064
- }
3065
- function workItemActionProposalRefs(evidence, result, policy) {
3066
- return uniqueSourceRefs2([
3067
- ref2("work-item", evidence.workItemId),
3068
- ref2("effect-run", evidence.effectRunId),
3069
- ref2("effect-run-result", evidence.effectRunResultId),
3070
- ref2("work-item-evidence", evidence.evidenceId),
3071
- ...policy === void 0 ? [] : [ref2("work-item-effect-mapping-policy", policy.policyId)],
3072
- ...evidence.sourceRefs ?? [],
3073
- ...result.sourceRefs ?? [],
3074
- ...result.subjectRefs ?? []
3075
- ]);
3076
- }
3077
- function workItemAdmissionProposalRefs(proposal) {
3078
- return uniqueSourceRefs2([
3079
- ref2("work-item", proposal.workItemId),
3080
- ref2("work-item-domain-action-proposal", proposal.proposalId),
3081
- ref2("effect-run", proposal.effectRunId),
3082
- ref2("effect-run-result", proposal.effectRunResultId),
3083
- ref2("work-item-evidence", proposal.evidenceId),
3084
- ref2("work-item-effect-mapping-policy", proposal.policyId),
3085
- ...proposal.sourceRefs ?? []
3086
- ]);
3087
- }
3088
- function workItemAdmissionDecisionRefs(decision, proposal, policy) {
3089
- return uniqueSourceRefs2([
3090
- ...proposal === void 0 ? [] : workItemAdmissionProposalRefs(proposal),
3091
- ref2("work-item-domain-action-admission-decision", decision.decisionId),
3092
- ref2("work-item-domain-action-admission", decision.admissionId),
3093
- ref2("work-item-domain-action-proposal", decision.proposalId),
3094
- ...decision.policyId === void 0 ? [] : [ref2("work-item-domain-action-admission-policy", decision.policyId)],
3095
- ...policy === void 0 ? [] : [ref2("work-item-domain-action-admission-policy", policy.policyId)],
3096
- ...decision.targetProposalId === void 0 ? [] : [ref2("work-item-domain-action-proposal", decision.targetProposalId)],
3097
- ...decision.targetAdmissionId === void 0 ? [] : [ref2("work-item-domain-action-admission", decision.targetAdmissionId)],
3098
- ...decision.sourceRefs ?? []
3099
- ]);
3100
- }
3101
- function workItemEvidenceOnlyRefs(evidence) {
3102
- return uniqueSourceRefs2([
3103
- ref2("work-item", evidence.workItemId),
3104
- ref2("effect-run", evidence.effectRunId),
3105
- ref2("effect-run-result", evidence.effectRunResultId),
3106
- ref2("work-item-evidence", evidence.evidenceId),
3107
- ...evidence.sourceRefs ?? []
3108
- ]);
3109
- }
3110
- function referencedWorkItemMappingPolicyIds(evidence) {
3111
- const refs = uniqueSourceRefs2([...evidence.sourceRefs ?? []]);
3112
- return refs.filter((sourceRef) => sourceRef.kind === "work-item-effect-mapping-policy").map((sourceRef) => sourceRef.id);
3113
- }
3114
- function effectKindFromMetadata(metadata) {
3115
- const effectKind = metadata?.effectKind;
3116
- return typeof effectKind === "string" ? effectKind : void 0;
3117
- }
3118
- function workItemActionProposalPayload(spec, evidence, result) {
3119
- if (spec.payload !== void 0) return spec.payload;
3120
- const payloadFrom = spec.payloadFrom;
3121
- if (payloadFrom === void 0) return void 0;
3122
- if (payloadFrom === "effect-run-result")
3123
- return { kind: "effect-run-result-ref", resultId: result.resultId };
3124
- if (payloadFrom === "output") return evidence.output;
3125
- return { kind: "work-item-evidence-ref", evidenceId: evidence.evidenceId };
3126
- }
3127
- function resultReason(result) {
3128
- if (result.status === "canceled" || result.status === "waived") return result.reason;
3129
- return void 0;
3130
- }
3131
- function workItemIdForEffectRunResult(state, result) {
3132
- for (const evidence of state.evidence.values()) {
3133
- if (evidence.effectRunResultId === result.resultId && evidence.effectRunId === result.effectRunId)
3134
- return evidence.workItemId;
3135
- }
3136
- return void 0;
3137
- }
3138
- function uniqueSourceRefs2(sourceRefs) {
3139
- const seen = /* @__PURE__ */ new Set();
3140
- const unique = [];
3141
- for (const sourceRef of sourceRefs) {
3142
- const key = sourceRefKey(sourceRef);
3143
- if (seen.has(key)) continue;
3144
- seen.add(key);
3145
- unique.push(sourceRef);
3146
- }
3147
- return unique;
3148
- }
3149
- function sourceRefKey(sourceRef) {
3150
- return `${sourceRef.kind}:${sourceRef.id}:${JSON.stringify(sourceRef.metadata ?? {})}`;
3151
- }
3152
- function distinctWorkItemRefs(sourceRefs) {
3153
- const refs = /* @__PURE__ */ new Map();
3154
- for (const sourceRef of sourceRefs ?? []) {
3155
- if (sourceRef.kind === "work-item") refs.set(sourceRef.id, sourceRef);
3156
- }
3157
- return Array.from(refs.values());
3158
- }
3159
- function singleWorkItemRef(sourceRefs) {
3160
- const matches = distinctWorkItemRefs(sourceRefs);
3161
- return matches.length === 1 ? matches[0] : void 0;
3162
- }
3163
- function projectRuntimeFact2(graph, runtime, name, factory, pick) {
3164
- return graph.node(
3165
- [runtime],
3166
- (ctx) => {
3167
- for (const fact of depBatch(ctx, 0) ?? []) {
3168
- const typed = fact;
3169
- const value = pick(typed);
3170
- if (value !== void 0) ctx.down([["DATA", value]]);
3171
- }
3172
- },
3173
- { name, factory }
3174
- );
3175
- }
3176
- function forEachPolicyDepBatch(ctx, start, count, fn) {
3177
- for (let i = 0; i < count; i += 1) {
3178
- for (const value of depBatch(ctx, start + i) ?? []) fn(value);
3179
- }
3180
- }
3181
- function dataIssue2(code, message, opts = {}) {
3182
- return {
3183
- kind: "issue",
3184
- code,
3185
- message,
3186
- severity: opts.severity ?? "error",
3187
- subjectId: opts.subjectId,
3188
- refs: opts.refs?.map((r) => `${r.kind}:${r.id}`),
3189
- details: opts.details
3190
- };
3191
- }
3192
- function ref2(kind, id) {
3193
- return { kind, id };
3194
- }
3195
-
3196
- export {
3197
- effectRun,
3198
- agentRequestProposalFromDecision,
3199
- admitAgentRequestProposal,
3200
- issueAgentRequest,
3201
- agentRequestLedgerViews,
3202
- requestSatisfactionProjector,
3203
- localBuiltinToolProviderCatalog,
3204
- executorOutcomeViewProjector,
3205
- structuredAgentDecisionInterpreter,
3206
- effectRunCompletionProjector,
3207
- fakeExecutorResult,
3208
- fakeExecutorFailure,
3209
- fakeExecutorBlocked,
3210
- fakeExecutorTimeout,
3211
- fakeExecutorCanceled,
3212
- workItemEffectRunProjector,
3213
- workItemEffectResultMapper,
3214
- workItemDomainActionProposalProjector,
3215
- workItemDomainActionAdmissionProjector
3216
- };
3217
- //# sourceMappingURL=chunk-PC3BTTBE.js.map