@graphrefly/ts 0.0.0 → 0.0.1

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 (307) hide show
  1. package/README.md +135 -0
  2. package/dist/adapters/index.cjs +105 -66
  3. package/dist/adapters/index.cjs.map +1 -1
  4. package/dist/adapters/index.d.cts +11 -136
  5. package/dist/adapters/index.d.ts +11 -136
  6. package/dist/adapters/index.js +27 -225
  7. package/dist/adapters/index.js.map +1 -1
  8. package/dist/adapters/observe-storage.d.cts +4 -4
  9. package/dist/adapters/observe-storage.d.ts +4 -4
  10. package/dist/adapters/observe-storage.js +1 -0
  11. package/dist/adapters/observe-storage.js.map +1 -1
  12. package/dist/adapters/react.cjs +166 -0
  13. package/dist/adapters/react.cjs.map +1 -0
  14. package/dist/adapters/react.d.cts +31 -0
  15. package/dist/adapters/react.d.ts +31 -0
  16. package/dist/adapters/react.js +51 -0
  17. package/dist/adapters/react.js.map +1 -0
  18. package/dist/adapters/solid.cjs +157 -0
  19. package/dist/adapters/solid.cjs.map +1 -0
  20. package/dist/adapters/solid.d.cts +26 -0
  21. package/dist/adapters/solid.d.ts +26 -0
  22. package/dist/adapters/solid.js +48 -0
  23. package/dist/adapters/solid.js.map +1 -0
  24. package/dist/adapters/svelte.cjs +148 -0
  25. package/dist/adapters/svelte.cjs.map +1 -0
  26. package/dist/adapters/svelte.d.cts +31 -0
  27. package/dist/adapters/svelte.d.ts +31 -0
  28. package/dist/adapters/svelte.js +46 -0
  29. package/dist/adapters/svelte.js.map +1 -0
  30. package/dist/adapters/vue.cjs +155 -0
  31. package/dist/adapters/vue.cjs.map +1 -0
  32. package/dist/adapters/vue.d.cts +26 -0
  33. package/dist/adapters/vue.d.ts +26 -0
  34. package/dist/adapters/vue.js +46 -0
  35. package/dist/adapters/vue.js.map +1 -0
  36. package/dist/agent-runtime-BesGDZcB.d.ts +555 -0
  37. package/dist/agent-runtime-DZTJ3C-p.d.cts +555 -0
  38. package/dist/agentic-memory-BmRCvh0d.d.ts +517 -0
  39. package/dist/agentic-memory-DfuVZ-lY.d.cts +517 -0
  40. package/dist/capability-admission-B0BzqAm5.d.cts +102 -0
  41. package/dist/capability-admission-g0mn9hpq.d.ts +102 -0
  42. package/dist/{chunk-JR4IKCR2.js → chunk-2747WN4Y.js} +5 -5
  43. package/dist/{chunk-2ILL7HQI.js → chunk-3JR3EDB2.js} +17 -17
  44. package/dist/{chunk-2ILL7HQI.js.map → chunk-3JR3EDB2.js.map} +1 -1
  45. package/dist/{chunk-GDL26N2T.js → chunk-3KN7NJDR.js} +2 -2
  46. package/dist/{chunk-DJC4CHLQ.js → chunk-43BKLFZU.js} +9 -9
  47. package/dist/chunk-6XAIOL3X.js +2407 -0
  48. package/dist/chunk-6XAIOL3X.js.map +1 -0
  49. package/dist/{chunk-SCRFRCGR.js → chunk-BSQGE5PS.js} +1 -1
  50. package/dist/{chunk-Y3ZLRGHC.js → chunk-CZNV3VXM.js} +16 -16
  51. package/dist/chunk-DGUM43GV.js +11 -0
  52. package/dist/chunk-DGUM43GV.js.map +1 -0
  53. package/dist/{chunk-JIMUDQN3.js → chunk-FBUU43PM.js} +2 -2
  54. package/dist/chunk-H75VXTGT.js +219 -0
  55. package/dist/chunk-H75VXTGT.js.map +1 -0
  56. package/dist/{chunk-RIIOUTGM.js → chunk-HKK2JD7Z.js} +12 -9
  57. package/dist/chunk-HKK2JD7Z.js.map +1 -0
  58. package/dist/{chunk-D6BG7U6A.js → chunk-IXZBUWSP.js} +3 -3
  59. package/dist/chunk-PC3BTTBE.js +3217 -0
  60. package/dist/chunk-PC3BTTBE.js.map +1 -0
  61. package/dist/chunk-QFY4AFY4.js +879 -0
  62. package/dist/chunk-QFY4AFY4.js.map +1 -0
  63. package/dist/{chunk-DK554R7P.js → chunk-S6HXABGL.js} +2 -1
  64. package/dist/chunk-S6HXABGL.js.map +1 -0
  65. package/dist/{chunk-PKVBHGBM.js → chunk-SS2A464I.js} +7 -7
  66. package/dist/chunk-UT3MHJCW.js +49 -0
  67. package/dist/chunk-UT3MHJCW.js.map +1 -0
  68. package/dist/{chunk-G4M3NHRJ.js → chunk-V7CIJE4B.js} +3 -3
  69. package/dist/{chunk-TEW47IVR.js → chunk-VPEFSDME.js} +2 -2
  70. package/dist/chunk-VTHLCFN4.js +368 -0
  71. package/dist/chunk-VTHLCFN4.js.map +1 -0
  72. package/dist/{chunk-SWTLEQL6.js → chunk-WQIA3GFB.js} +2 -2
  73. package/dist/chunk-WQIA3GFB.js.map +1 -0
  74. package/dist/{chunk-I3IHOHCJ.js → chunk-XKXWK2KP.js} +108 -64
  75. package/dist/chunk-XKXWK2KP.js.map +1 -0
  76. package/dist/{chunk-COHO25CZ.js → chunk-YDSIVHRR.js} +553 -7
  77. package/dist/chunk-YDSIVHRR.js.map +1 -0
  78. package/dist/chunk-YXMZ2N6J.js +1884 -0
  79. package/dist/chunk-YXMZ2N6J.js.map +1 -0
  80. package/dist/composition/index.cjs +102 -57
  81. package/dist/composition/index.cjs.map +1 -1
  82. package/dist/composition/index.d.cts +4 -4
  83. package/dist/composition/index.d.ts +4 -4
  84. package/dist/composition/index.js +6 -5
  85. package/dist/core/index.cjs +102 -57
  86. package/dist/core/index.cjs.map +1 -1
  87. package/dist/core/index.d.cts +2 -2
  88. package/dist/core/index.d.ts +2 -2
  89. package/dist/core/index.js +5 -4
  90. package/dist/cqrs/index.cjs.map +1 -1
  91. package/dist/cqrs/index.d.cts +4 -4
  92. package/dist/cqrs/index.d.ts +4 -4
  93. package/dist/cqrs/index.js +3 -2
  94. package/dist/cqrs/index.js.map +1 -1
  95. package/dist/cqrs/messaging.cjs +312 -0
  96. package/dist/cqrs/messaging.cjs.map +1 -0
  97. package/dist/cqrs/messaging.d.cts +57 -0
  98. package/dist/cqrs/messaging.d.ts +57 -0
  99. package/dist/cqrs/messaging.js +274 -0
  100. package/dist/cqrs/messaging.js.map +1 -0
  101. package/dist/cqrs/work-queue.cjs +329 -0
  102. package/dist/cqrs/work-queue.cjs.map +1 -0
  103. package/dist/cqrs/work-queue.d.cts +90 -0
  104. package/dist/cqrs/work-queue.d.ts +90 -0
  105. package/dist/cqrs/work-queue.js +292 -0
  106. package/dist/cqrs/work-queue.js.map +1 -0
  107. package/dist/data/index.cjs +19 -0
  108. package/dist/data/index.cjs.map +1 -0
  109. package/dist/data/index.d.cts +36 -0
  110. package/dist/data/index.d.ts +36 -0
  111. package/dist/data/index.js +1 -0
  112. package/dist/data/index.js.map +1 -0
  113. package/dist/data-structures/index.cjs +105 -57
  114. package/dist/data-structures/index.cjs.map +1 -1
  115. package/dist/data-structures/index.d.cts +8 -8
  116. package/dist/data-structures/index.d.ts +8 -8
  117. package/dist/data-structures/index.js +7 -6
  118. package/dist/{describe-BZb7AS2y.d.ts → describe-BpyJuWkw.d.ts} +1 -1
  119. package/dist/{describe-Ciu8SUnN.d.cts → describe-DYMw_l1C.d.cts} +1 -1
  120. package/dist/executors/work-queue.cjs +342 -0
  121. package/dist/executors/work-queue.cjs.map +1 -0
  122. package/dist/executors/work-queue.d.cts +90 -0
  123. package/dist/executors/work-queue.d.ts +90 -0
  124. package/dist/executors/work-queue.js +306 -0
  125. package/dist/executors/work-queue.js.map +1 -0
  126. package/dist/graph/index.cjs +112 -58
  127. package/dist/graph/index.cjs.map +1 -1
  128. package/dist/graph/index.d.cts +9 -9
  129. package/dist/graph/index.d.ts +9 -9
  130. package/dist/graph/index.js +18 -17
  131. package/dist/{graph-DfdF9zy4.d.ts → graph-D-1-SQeC.d.ts} +3 -3
  132. package/dist/{graph-s23RbbFO.d.cts → graph-DCEWh4T2.d.cts} +3 -3
  133. package/dist/{index-CAEmLCYF.d.cts → index-72VZC0-E.d.cts} +2 -2
  134. package/dist/{index-SnzZu3x7.d.ts → index-Bmxeu0nK.d.ts} +2 -2
  135. package/dist/index.cjs +112 -58
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.cts +11 -10
  138. package/dist/index.d.ts +11 -10
  139. package/dist/index.js +118 -113
  140. package/dist/inspection/boundary.cjs +98 -0
  141. package/dist/inspection/boundary.cjs.map +1 -0
  142. package/dist/inspection/boundary.d.cts +61 -0
  143. package/dist/inspection/boundary.d.ts +61 -0
  144. package/dist/inspection/boundary.js +75 -0
  145. package/dist/inspection/boundary.js.map +1 -0
  146. package/dist/{messages-BZqrGGm1.d.ts → messages-CAzUPPJM.d.cts} +10 -5
  147. package/dist/{messages-BZqrGGm1.d.cts → messages-CAzUPPJM.d.ts} +10 -5
  148. package/dist/messaging/index.cjs +744 -613
  149. package/dist/messaging/index.cjs.map +1 -1
  150. package/dist/messaging/index.d.cts +216 -160
  151. package/dist/messaging/index.d.ts +216 -160
  152. package/dist/messaging/index.js +19 -749
  153. package/dist/messaging/index.js.map +1 -1
  154. package/dist/operators/index.cjs +102 -57
  155. package/dist/operators/index.cjs.map +1 -1
  156. package/dist/operators/index.d.cts +6 -6
  157. package/dist/operators/index.d.ts +6 -6
  158. package/dist/operators/index.js +8 -7
  159. package/dist/orchestration/index.cjs +3333 -59
  160. package/dist/orchestration/index.cjs.map +1 -1
  161. package/dist/orchestration/index.d.cts +7 -4
  162. package/dist/orchestration/index.d.ts +7 -4
  163. package/dist/orchestration/index.js +49 -8
  164. package/dist/orchestration/index.js.map +1 -1
  165. package/dist/orchestration/messaging.cjs +314 -0
  166. package/dist/orchestration/messaging.cjs.map +1 -0
  167. package/dist/orchestration/messaging.d.cts +59 -0
  168. package/dist/orchestration/messaging.d.ts +59 -0
  169. package/dist/orchestration/messaging.js +276 -0
  170. package/dist/orchestration/messaging.js.map +1 -0
  171. package/dist/orchestration/work-queue.cjs +262 -0
  172. package/dist/orchestration/work-queue.cjs.map +1 -0
  173. package/dist/orchestration/work-queue.d.cts +85 -0
  174. package/dist/orchestration/work-queue.d.ts +85 -0
  175. package/dist/orchestration/work-queue.js +226 -0
  176. package/dist/orchestration/work-queue.js.map +1 -0
  177. package/dist/patterns/event-flow.cjs +447 -0
  178. package/dist/patterns/event-flow.cjs.map +1 -0
  179. package/dist/patterns/event-flow.d.cts +115 -0
  180. package/dist/patterns/event-flow.d.ts +115 -0
  181. package/dist/patterns/event-flow.js +14 -0
  182. package/dist/patterns/event-flow.js.map +1 -0
  183. package/dist/patterns/index.cjs +423 -18
  184. package/dist/patterns/index.cjs.map +1 -1
  185. package/dist/patterns/index.d.cts +8 -5
  186. package/dist/patterns/index.d.ts +8 -5
  187. package/dist/patterns/index.js +13 -4
  188. package/dist/{reactive-collection-Cb1II1Fi.d.ts → reactive-collection-BAmfrGjd.d.ts} +9 -9
  189. package/dist/{reactive-collection-BxBqtIOE.d.cts → reactive-collection-DNV0-gFi.d.cts} +9 -9
  190. package/dist/{reactive-collection-storage-D-KmjE0J.d.cts → reactive-collection-storage-BNEldDyi.d.cts} +5 -5
  191. package/dist/{reactive-collection-storage-BNiEc-Gd.d.ts → reactive-collection-storage-YZsAQsWK.d.ts} +5 -5
  192. package/dist/{reactive-map-D-g3dv8I.d.cts → reactive-map-DRD1LJ2H.d.cts} +6 -6
  193. package/dist/{reactive-map-BcB4KsQR.d.ts → reactive-map-EsDiCmJk.d.ts} +6 -6
  194. package/dist/render/index.d.cts +3 -3
  195. package/dist/render/index.d.ts +3 -3
  196. package/dist/render/index.js +1 -0
  197. package/dist/{semantic-memory-graph-BYoIlP35.d.cts → semantic-memory-graph-DKuNzuWw.d.cts} +2 -2
  198. package/dist/{semantic-memory-graph-CxyXLms3.d.ts → semantic-memory-graph-uwbwJdhe.d.ts} +2 -2
  199. package/dist/solutions/index.cjs +4478 -2
  200. package/dist/solutions/index.cjs.map +1 -1
  201. package/dist/solutions/index.d.cts +13 -519
  202. package/dist/solutions/index.d.ts +13 -519
  203. package/dist/solutions/index.js +90 -6
  204. package/dist/solutions/reactive-layout/browser/index.cjs +449 -0
  205. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -0
  206. package/dist/solutions/reactive-layout/browser/index.d.cts +44 -0
  207. package/dist/solutions/reactive-layout/browser/index.d.ts +44 -0
  208. package/dist/solutions/reactive-layout/browser/index.js +69 -0
  209. package/dist/solutions/reactive-layout/browser/index.js.map +1 -0
  210. package/dist/solutions/reactive-layout/index.cjs +4266 -0
  211. package/dist/solutions/reactive-layout/index.cjs.map +1 -0
  212. package/dist/solutions/reactive-layout/index.d.cts +581 -0
  213. package/dist/solutions/reactive-layout/index.d.ts +581 -0
  214. package/dist/solutions/reactive-layout/index.js +86 -0
  215. package/dist/solutions/reactive-layout/index.js.map +1 -0
  216. package/dist/solutions/reactive-layout/node-canvas/index.cjs +545 -0
  217. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -0
  218. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +54 -0
  219. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +54 -0
  220. package/dist/solutions/reactive-layout/node-canvas/index.js +131 -0
  221. package/dist/solutions/reactive-layout/node-canvas/index.js.map +1 -0
  222. package/dist/solutions/reactive-layout/react-native/index.cjs +494 -0
  223. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -0
  224. package/dist/solutions/reactive-layout/react-native/index.d.cts +51 -0
  225. package/dist/solutions/reactive-layout/react-native/index.d.ts +51 -0
  226. package/dist/solutions/reactive-layout/react-native/index.js +77 -0
  227. package/dist/solutions/reactive-layout/react-native/index.js.map +1 -0
  228. package/dist/solutions/reactive-layout/skia/index.cjs +547 -0
  229. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -0
  230. package/dist/solutions/reactive-layout/skia/index.d.cts +64 -0
  231. package/dist/solutions/reactive-layout/skia/index.d.ts +64 -0
  232. package/dist/solutions/reactive-layout/skia/index.js +70 -0
  233. package/dist/solutions/reactive-layout/skia/index.js.map +1 -0
  234. package/dist/solutions/work-item/actions.cjs +2164 -0
  235. package/dist/solutions/work-item/actions.cjs.map +1 -0
  236. package/dist/solutions/work-item/actions.d.cts +201 -0
  237. package/dist/solutions/work-item/actions.d.ts +201 -0
  238. package/dist/solutions/work-item/actions.js +1454 -0
  239. package/dist/solutions/work-item/actions.js.map +1 -0
  240. package/dist/solutions/work-item/scheduling.cjs +2454 -0
  241. package/dist/solutions/work-item/scheduling.cjs.map +1 -0
  242. package/dist/solutions/work-item/scheduling.d.cts +433 -0
  243. package/dist/solutions/work-item/scheduling.d.ts +433 -0
  244. package/dist/solutions/work-item/scheduling.js +32 -0
  245. package/dist/solutions/work-item/scheduling.js.map +1 -0
  246. package/dist/solutions/work-item/work-queue.cjs +306 -0
  247. package/dist/solutions/work-item/work-queue.cjs.map +1 -0
  248. package/dist/solutions/work-item/work-queue.d.cts +71 -0
  249. package/dist/solutions/work-item/work-queue.d.ts +71 -0
  250. package/dist/solutions/work-item/work-queue.js +270 -0
  251. package/dist/solutions/work-item/work-queue.js.map +1 -0
  252. package/dist/sources/browser.cjs +169 -57
  253. package/dist/sources/browser.cjs.map +1 -1
  254. package/dist/sources/browser.d.cts +33 -6
  255. package/dist/sources/browser.d.ts +33 -6
  256. package/dist/sources/browser.js +73 -6
  257. package/dist/sources/browser.js.map +1 -1
  258. package/dist/sources/index.cjs +102 -57
  259. package/dist/sources/index.cjs.map +1 -1
  260. package/dist/sources/index.d.cts +5 -5
  261. package/dist/sources/index.d.ts +5 -5
  262. package/dist/sources/index.js +6 -5
  263. package/dist/sources/node.cjs.map +1 -1
  264. package/dist/sources/node.d.cts +4 -4
  265. package/dist/sources/node.d.ts +4 -4
  266. package/dist/sources/node.js +2 -1
  267. package/dist/sources/node.js.map +1 -1
  268. package/dist/storage/browser.js +1 -0
  269. package/dist/storage/browser.js.map +1 -1
  270. package/dist/storage/index.d.cts +5 -5
  271. package/dist/storage/index.d.ts +5 -5
  272. package/dist/storage/index.js +5 -4
  273. package/dist/storage/node.js +1 -0
  274. package/dist/storage/node.js.map +1 -1
  275. package/dist/store-C-joM4gh.d.ts +123 -0
  276. package/dist/store-CNJwmT-h.d.cts +123 -0
  277. package/dist/testing/index.cjs +1 -0
  278. package/dist/testing/index.cjs.map +1 -1
  279. package/dist/testing/index.d.cts +1 -1
  280. package/dist/testing/index.d.ts +1 -1
  281. package/dist/testing/index.js +3 -2
  282. package/dist/{types-h12mNYbq.d.ts → types-BsJvElYZ.d.ts} +31 -31
  283. package/dist/{types-bNMSWKqF.d.cts → types-CcPIn7sy.d.cts} +31 -31
  284. package/dist/work-item-runtime-C3M79vE9.d.ts +228 -0
  285. package/dist/work-item-runtime-qaVgsL0T.d.cts +228 -0
  286. package/dist/work-queue/index.cjs +1132 -0
  287. package/dist/work-queue/index.cjs.map +1 -0
  288. package/dist/work-queue/index.d.cts +369 -0
  289. package/dist/work-queue/index.d.ts +369 -0
  290. package/dist/work-queue/index.js +1078 -0
  291. package/dist/work-queue/index.js.map +1 -0
  292. package/package.json +266 -2
  293. package/dist/chunk-COHO25CZ.js.map +0 -1
  294. package/dist/chunk-DK554R7P.js.map +0 -1
  295. package/dist/chunk-I3IHOHCJ.js.map +0 -1
  296. package/dist/chunk-RIIOUTGM.js.map +0 -1
  297. package/dist/chunk-SWTLEQL6.js.map +0 -1
  298. /package/dist/{chunk-JR4IKCR2.js.map → chunk-2747WN4Y.js.map} +0 -0
  299. /package/dist/{chunk-GDL26N2T.js.map → chunk-3KN7NJDR.js.map} +0 -0
  300. /package/dist/{chunk-DJC4CHLQ.js.map → chunk-43BKLFZU.js.map} +0 -0
  301. /package/dist/{chunk-SCRFRCGR.js.map → chunk-BSQGE5PS.js.map} +0 -0
  302. /package/dist/{chunk-Y3ZLRGHC.js.map → chunk-CZNV3VXM.js.map} +0 -0
  303. /package/dist/{chunk-JIMUDQN3.js.map → chunk-FBUU43PM.js.map} +0 -0
  304. /package/dist/{chunk-D6BG7U6A.js.map → chunk-IXZBUWSP.js.map} +0 -0
  305. /package/dist/{chunk-PKVBHGBM.js.map → chunk-SS2A464I.js.map} +0 -0
  306. /package/dist/{chunk-G4M3NHRJ.js.map → chunk-V7CIJE4B.js.map} +0 -0
  307. /package/dist/{chunk-TEW47IVR.js.map → chunk-VPEFSDME.js.map} +0 -0
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  memoryRetrievalBundle,
3
3
  validateMemoryFragment
4
- } from "./chunk-JIMUDQN3.js";
5
- import {
6
- strictJsonCodec
7
- } from "./chunk-4VLAQHZI.js";
4
+ } from "./chunk-FBUU43PM.js";
8
5
  import {
9
6
  depBatch,
10
7
  depLatest
11
- } from "./chunk-SWTLEQL6.js";
8
+ } from "./chunk-WQIA3GFB.js";
9
+ import {
10
+ strictJsonCodec
11
+ } from "./chunk-4VLAQHZI.js";
12
12
 
13
13
  // src/solutions/agentic-memory.ts
14
14
  var AGENTIC_MEMORY_RECORD_FRAME_FORMAT = "graphrefly.agenticMemoryRecord";
@@ -2433,6 +2433,550 @@ function errorMessage(error) {
2433
2433
  return error instanceof Error ? error.message : String(error);
2434
2434
  }
2435
2435
 
2436
+ // src/solutions/capability-admission.ts
2437
+ function capabilityAdmissionProposal(opts) {
2438
+ return { kind: "capability-admission-proposal", ...opts };
2439
+ }
2440
+ function capabilityAdmissionProjector(graph, opts) {
2441
+ const name = opts.name ?? "capabilityAdmissions";
2442
+ const policyDeps = opts.admissionPolicies ?? [];
2443
+ const now = opts.now ?? Date.now;
2444
+ const runtime = graph.node(
2445
+ [opts.proposals, opts.decisions, ...policyDeps],
2446
+ (ctx) => {
2447
+ const state = ctx.state.get() ?? emptyCapabilityAdmissionState();
2448
+ for (const raw of depBatch(ctx, 0) ?? []) {
2449
+ const proposal = raw;
2450
+ const issue = capabilityAdmissionProposalIssue(proposal);
2451
+ if (issue !== void 0) {
2452
+ emitIssue(
2453
+ ctx,
2454
+ state,
2455
+ nextMalformedIssueKey(state, "proposal", proposalKeyFallback(proposal)),
2456
+ issue
2457
+ );
2458
+ continue;
2459
+ }
2460
+ if (state.proposals.has(proposal.proposalId)) {
2461
+ emitIssue(
2462
+ ctx,
2463
+ state,
2464
+ `duplicate-proposal:${proposal.proposalId}`,
2465
+ dataIssue(
2466
+ "duplicate-capability-admission-proposal",
2467
+ `CapabilityAdmissionProposal '${proposal.proposalId}' was already seen`,
2468
+ { subjectId: proposal.subjectId, refs: capabilityProposalRefs(proposal) }
2469
+ )
2470
+ );
2471
+ continue;
2472
+ }
2473
+ state.proposals.set(proposal.proposalId, proposal);
2474
+ }
2475
+ forEachPolicyDepBatch(ctx, 2, policyDeps.length, (raw) => {
2476
+ const policy = raw;
2477
+ const issue = capabilityAdmissionPolicyIssue(policy);
2478
+ if (issue !== void 0) {
2479
+ emitIssue(
2480
+ ctx,
2481
+ state,
2482
+ nextMalformedIssueKey(state, "policy", policyKeyFallback(policy)),
2483
+ issue
2484
+ );
2485
+ return;
2486
+ }
2487
+ if (state.policies.has(policy.policyId)) {
2488
+ emitIssue(
2489
+ ctx,
2490
+ state,
2491
+ `duplicate-policy:${policy.policyId}`,
2492
+ dataIssue(
2493
+ "duplicate-capability-admission-policy",
2494
+ `CapabilityAdmissionPolicy '${policy.policyId}' was already seen`,
2495
+ { refs: [ref("capability-admission-policy", policy.policyId)] }
2496
+ )
2497
+ );
2498
+ return;
2499
+ }
2500
+ state.policies.set(policy.policyId, policy);
2501
+ });
2502
+ for (const raw of depBatch(ctx, 1) ?? []) {
2503
+ const decision = raw;
2504
+ const issue = capabilityAdmissionDecisionIssue(decision);
2505
+ if (issue !== void 0) {
2506
+ emitIssue(
2507
+ ctx,
2508
+ state,
2509
+ nextMalformedIssueKey(state, "decision", decisionKeyFallback(decision)),
2510
+ issue
2511
+ );
2512
+ continue;
2513
+ }
2514
+ if (state.decisions.has(decision.decisionId)) {
2515
+ emitIssue(
2516
+ ctx,
2517
+ state,
2518
+ `duplicate-decision:${decision.decisionId}`,
2519
+ dataIssue(
2520
+ "duplicate-capability-admission-decision",
2521
+ `CapabilityAdmissionDecision '${decision.decisionId}' was already seen`,
2522
+ { refs: capabilityDecisionRefs(decision) }
2523
+ )
2524
+ );
2525
+ continue;
2526
+ }
2527
+ state.decisions.set(decision.decisionId, decision);
2528
+ }
2529
+ evaluateCapabilityAdmissions(ctx, state, now());
2530
+ ctx.state.set(state);
2531
+ },
2532
+ { name: `${name}/runtime`, factory: "capabilityAdmissionProjector", partial: true }
2533
+ );
2534
+ return {
2535
+ admissions: projectRuntimeFact(
2536
+ graph,
2537
+ runtime,
2538
+ `${name}/admissions`,
2539
+ "capabilityAdmissions",
2540
+ (fact) => fact.kind === "admission" ? fact.admission : void 0
2541
+ ),
2542
+ status: projectRuntimeFact(
2543
+ graph,
2544
+ runtime,
2545
+ `${name}/status`,
2546
+ "capabilityAdmissionStatus",
2547
+ (fact) => fact.kind === "status" ? fact.status : void 0
2548
+ ),
2549
+ issues: projectRuntimeFact(
2550
+ graph,
2551
+ runtime,
2552
+ `${name}/issues`,
2553
+ "capabilityAdmissionIssues",
2554
+ (fact) => fact.kind === "issue" ? fact.issue : void 0
2555
+ ),
2556
+ audit: projectRuntimeFact(
2557
+ graph,
2558
+ runtime,
2559
+ `${name}/audit`,
2560
+ "capabilityAdmissionAudit",
2561
+ (fact) => fact.kind === "audit" ? fact.audit : void 0
2562
+ ),
2563
+ views: capabilityAdmissionViews(graph, runtime, `${name}/views`)
2564
+ };
2565
+ }
2566
+ function evaluateCapabilityAdmissions(ctx, state, admittedAtMs) {
2567
+ for (const decision of state.decisions.values()) {
2568
+ if (state.terminalDecisionIds.has(decision.decisionId)) continue;
2569
+ evaluateCapabilityAdmission(ctx, state, decision, admittedAtMs);
2570
+ }
2571
+ }
2572
+ function evaluateCapabilityAdmission(ctx, state, decision, admittedAtMs) {
2573
+ const proposal = state.proposals.get(decision.proposalId);
2574
+ if (proposal === void 0) {
2575
+ emitIssue(
2576
+ ctx,
2577
+ state,
2578
+ `missing-proposal:${decision.decisionId}:${decision.proposalId}`,
2579
+ dataIssue(
2580
+ "missing-capability-admission-proposal",
2581
+ `CapabilityAdmissionDecision '${decision.decisionId}' references missing proposal '${decision.proposalId}'`,
2582
+ { subjectId: decision.proposalId, refs: capabilityDecisionRefs(decision) }
2583
+ )
2584
+ );
2585
+ return;
2586
+ }
2587
+ const policy = capabilityPolicyForDecision(state, decision);
2588
+ if (typeof policy === "string") {
2589
+ emitIssue(
2590
+ ctx,
2591
+ state,
2592
+ `${policy}:${decision.decisionId}:${decision.policyId ?? "missing"}`,
2593
+ dataIssue(policy, capabilityPolicyIssueMessage(policy, decision), {
2594
+ subjectId: proposal.subjectId,
2595
+ refs: capabilityDecisionRefs(decision, proposal)
2596
+ })
2597
+ );
2598
+ if (policy === "stale-capability-admission-policy-ref")
2599
+ state.terminalDecisionIds.add(decision.decisionId);
2600
+ return;
2601
+ }
2602
+ if (policy !== void 0) {
2603
+ const policyIssue = validateCapabilityAdmissionPolicy(policy, decision, proposal);
2604
+ if (policyIssue !== void 0) {
2605
+ emitIssue(
2606
+ ctx,
2607
+ state,
2608
+ `${policyIssue.code}:${decision.decisionId}:${policy.policyId}`,
2609
+ dataIssue(policyIssue.code, policyIssue.message, {
2610
+ subjectId: proposal.subjectId,
2611
+ refs: capabilityDecisionRefs(decision, proposal, policy)
2612
+ })
2613
+ );
2614
+ return;
2615
+ }
2616
+ }
2617
+ if (state.admissionsById.has(decision.admissionId)) {
2618
+ emitIssue(
2619
+ ctx,
2620
+ state,
2621
+ `duplicate-admission-id:${decision.admissionId}`,
2622
+ dataIssue(
2623
+ "duplicate-capability-admission",
2624
+ `CapabilityAdmission '${decision.admissionId}' was already emitted`,
2625
+ { subjectId: proposal.subjectId, refs: capabilityDecisionRefs(decision, proposal, policy) }
2626
+ )
2627
+ );
2628
+ state.terminalDecisionIds.add(decision.decisionId);
2629
+ return;
2630
+ }
2631
+ if (state.admissionsByProposal.has(decision.proposalId)) {
2632
+ emitIssue(
2633
+ ctx,
2634
+ state,
2635
+ `duplicate-admission-proposal:${decision.proposalId}:${decision.decisionId}`,
2636
+ dataIssue(
2637
+ "duplicate-capability-admission-proposal",
2638
+ `CapabilityAdmissionProposal '${decision.proposalId}' already has an admission decision`,
2639
+ { subjectId: proposal.subjectId, refs: capabilityDecisionRefs(decision, proposal, policy) }
2640
+ )
2641
+ );
2642
+ state.terminalDecisionIds.add(decision.decisionId);
2643
+ return;
2644
+ }
2645
+ const admissionState = admissionStateForOutcome(decision.outcome);
2646
+ if (admissionState === void 0) {
2647
+ emitIssue(
2648
+ ctx,
2649
+ state,
2650
+ `unsupported-outcome:${decision.decisionId}:${String(decision.outcome)}`,
2651
+ dataIssue(
2652
+ "unsupported-capability-admission-outcome",
2653
+ `CapabilityAdmissionDecision '${decision.decisionId}' uses unsupported outcome '${String(decision.outcome)}'`,
2654
+ { subjectId: proposal.subjectId, refs: capabilityDecisionRefs(decision, proposal, policy) }
2655
+ )
2656
+ );
2657
+ state.terminalDecisionIds.add(decision.decisionId);
2658
+ return;
2659
+ }
2660
+ const admission = {
2661
+ kind: "capability-admission",
2662
+ admissionId: decision.admissionId,
2663
+ proposalId: proposal.proposalId,
2664
+ subjectId: proposal.subjectId,
2665
+ capability: cloneCapabilityRef(proposal.capability),
2666
+ state: admissionState,
2667
+ decisionId: decision.decisionId,
2668
+ boundaryName: proposal.boundaryName,
2669
+ role: proposal.role,
2670
+ policyId: decision.policyId,
2671
+ reason: decision.reason ?? proposal.reason,
2672
+ sourceRefs: capabilityDecisionRefs(decision, proposal, policy),
2673
+ admittedAtMs: decision.decidedAtMs ?? admittedAtMs,
2674
+ metadata: {
2675
+ ...proposal.metadata ?? {},
2676
+ ...policy?.metadata ?? {},
2677
+ ...decision.metadata ?? {}
2678
+ }
2679
+ };
2680
+ state.admissionsById.set(admission.admissionId, admission);
2681
+ state.admissionsByProposal.set(admission.proposalId, admission);
2682
+ state.terminalDecisionIds.add(decision.decisionId);
2683
+ emitAdmission(ctx, state, admission);
2684
+ }
2685
+ function capabilityAdmissionViews(graph, runtime, name) {
2686
+ return graph.node(
2687
+ [runtime],
2688
+ (ctx) => {
2689
+ const state = ctx.state.get() ?? {
2690
+ admissionsByProposal: /* @__PURE__ */ new Map(),
2691
+ admissionsBySubject: /* @__PURE__ */ new Map(),
2692
+ issues: [],
2693
+ audit: []
2694
+ };
2695
+ for (const raw of depBatch(ctx, 0) ?? []) {
2696
+ const fact = raw;
2697
+ if (fact.kind === "admission") {
2698
+ const admission = fact.admission;
2699
+ state.admissionsByProposal.set(admission.proposalId, admission);
2700
+ const bySubject = state.admissionsBySubject.get(admission.subjectId) ?? [];
2701
+ bySubject.push(admission);
2702
+ state.admissionsBySubject.set(admission.subjectId, bySubject);
2703
+ }
2704
+ if (fact.kind === "issue") state.issues.push(fact.issue);
2705
+ if (fact.kind === "audit") state.audit.push(fact.audit);
2706
+ }
2707
+ ctx.state.set(state);
2708
+ ctx.down([["DATA", freezeCapabilityAdmissionViews(state)]]);
2709
+ },
2710
+ { name, factory: "capabilityAdmissionViews" }
2711
+ );
2712
+ }
2713
+ function emitAdmission(ctx, state, admission) {
2714
+ state.statusSeq += 1;
2715
+ state.auditSeq += 1;
2716
+ const statusState = capabilityAdmissionStatusState(admission.state);
2717
+ const status = {
2718
+ kind: "capability-admission-status",
2719
+ statusId: `${admission.subjectId}:${statusState}:${state.statusSeq}`,
2720
+ state: statusState,
2721
+ proposalId: admission.proposalId,
2722
+ admissionId: admission.admissionId,
2723
+ subjectId: admission.subjectId,
2724
+ capabilityId: admission.capability.id,
2725
+ capabilityKind: admission.capability.kind,
2726
+ policyId: admission.policyId,
2727
+ sourceRefs: admission.sourceRefs
2728
+ };
2729
+ const audit = {
2730
+ id: `${admission.subjectId}:${statusState}:${state.auditSeq}`,
2731
+ kind: `capability-admission-${admission.state}`,
2732
+ subjectId: admission.subjectId,
2733
+ sourceRefs: admission.sourceRefs,
2734
+ metadata: {
2735
+ admissionId: admission.admissionId,
2736
+ capabilityId: admission.capability.id,
2737
+ capabilityKind: admission.capability.kind,
2738
+ policyId: admission.policyId,
2739
+ proposalId: admission.proposalId
2740
+ }
2741
+ };
2742
+ ctx.down([
2743
+ ["DATA", { kind: "admission", admission }],
2744
+ ["DATA", { kind: "status", status }],
2745
+ ["DATA", { kind: "audit", audit }]
2746
+ ]);
2747
+ }
2748
+ function emitIssue(ctx, state, key, issue) {
2749
+ if (state.issueKeys.has(key)) return;
2750
+ state.issueKeys.add(key);
2751
+ state.statusSeq += 1;
2752
+ state.auditSeq += 1;
2753
+ const status = {
2754
+ kind: "capability-admission-status",
2755
+ statusId: `capability-admission-issue:${state.statusSeq}`,
2756
+ state: "capability-admission-issue",
2757
+ subjectId: issue.subjectId,
2758
+ issues: [issue]
2759
+ };
2760
+ const audit = {
2761
+ id: `capability-admission-issue:${state.auditSeq}`,
2762
+ kind: "capability-admission-issue",
2763
+ subjectId: issue.subjectId,
2764
+ message: issue.message,
2765
+ issueCode: issue.code
2766
+ };
2767
+ ctx.down([
2768
+ ["DATA", { kind: "issue", issue }],
2769
+ ["DATA", { kind: "status", status }],
2770
+ ["DATA", { kind: "audit", audit }]
2771
+ ]);
2772
+ }
2773
+ function capabilityAdmissionProposalIssue(proposal) {
2774
+ if (proposal.kind !== "capability-admission-proposal" || typeof proposal.proposalId !== "string" || proposal.proposalId.length === 0 || typeof proposal.subjectId !== "string" || proposal.subjectId.length === 0 || !isBoundaryCapabilityRef(proposal.capability)) {
2775
+ return dataIssue(
2776
+ "malformed-capability-admission-proposal",
2777
+ "CapabilityAdmissionProposal requires proposalId, subjectId, and a D348 BoundaryCapabilityRef",
2778
+ { subjectId: typeof proposal.subjectId === "string" ? proposal.subjectId : void 0 }
2779
+ );
2780
+ }
2781
+ return void 0;
2782
+ }
2783
+ function capabilityAdmissionPolicyIssue(policy) {
2784
+ if (policy.kind !== "capability-admission-policy" || typeof policy.policyId !== "string" || policy.policyId.length === 0 || policy.capabilityIds !== void 0 && (!Array.isArray(policy.capabilityIds) || !policy.capabilityIds.every((id) => typeof id === "string" && id.length > 0)) || policy.capabilityKinds !== void 0 && (!Array.isArray(policy.capabilityKinds) || !policy.capabilityKinds.every(isBoundaryCapabilityKind)) || policy.requiredOnly !== void 0 && typeof policy.requiredOnly !== "boolean" || policy.allowedOutcomes !== void 0 && (!Array.isArray(policy.allowedOutcomes) || !policy.allowedOutcomes.every(isCapabilityAdmissionOutcome))) {
2785
+ return dataIssue(
2786
+ "malformed-capability-admission-policy",
2787
+ "CapabilityAdmissionPolicy requires a policyId and D348 capability/outcome filters",
2788
+ { subjectId: typeof policy.policyId === "string" ? policy.policyId : void 0 }
2789
+ );
2790
+ }
2791
+ return void 0;
2792
+ }
2793
+ function capabilityAdmissionDecisionIssue(decision) {
2794
+ if (decision.kind !== "capability-admission-decision" || typeof decision.decisionId !== "string" || decision.decisionId.length === 0 || typeof decision.admissionId !== "string" || decision.admissionId.length === 0 || typeof decision.proposalId !== "string" || decision.proposalId.length === 0 || !isCapabilityAdmissionOutcome(decision.outcome) || decision.policyId !== void 0 && (typeof decision.policyId !== "string" || decision.policyId.length === 0)) {
2795
+ return dataIssue(
2796
+ "malformed-capability-admission-decision",
2797
+ "CapabilityAdmissionDecision requires decisionId, admissionId, proposalId, and allow/block/defer outcome",
2798
+ { subjectId: typeof decision.proposalId === "string" ? decision.proposalId : void 0 }
2799
+ );
2800
+ }
2801
+ return void 0;
2802
+ }
2803
+ function validateCapabilityAdmissionPolicy(policy, decision, proposal) {
2804
+ if (policy.capabilityIds !== void 0 && !policy.capabilityIds.includes(proposal.capability.id)) {
2805
+ return {
2806
+ code: "capability-admission-policy-mismatch",
2807
+ message: `CapabilityAdmissionPolicy '${policy.policyId}' does not apply to capability '${proposal.capability.id}'`
2808
+ };
2809
+ }
2810
+ if (policy.capabilityKinds !== void 0 && !policy.capabilityKinds.includes(proposal.capability.kind)) {
2811
+ return {
2812
+ code: "capability-admission-policy-mismatch",
2813
+ message: `CapabilityAdmissionPolicy '${policy.policyId}' does not apply to capability kind '${proposal.capability.kind}'`
2814
+ };
2815
+ }
2816
+ if (policy.requiredOnly === true && !proposal.capability.required) {
2817
+ return {
2818
+ code: "capability-admission-policy-mismatch",
2819
+ message: `CapabilityAdmissionPolicy '${policy.policyId}' applies only to required capabilities`
2820
+ };
2821
+ }
2822
+ if (policy.allowedOutcomes !== void 0 && !policy.allowedOutcomes.includes(decision.outcome)) {
2823
+ return {
2824
+ code: "unsupported-capability-admission-outcome",
2825
+ message: `CapabilityAdmissionPolicy '${policy.policyId}' does not allow outcome '${decision.outcome}'`
2826
+ };
2827
+ }
2828
+ return void 0;
2829
+ }
2830
+ function capabilityPolicyForDecision(state, decision) {
2831
+ if (decision.policyId === void 0) return void 0;
2832
+ const stalePolicyRef = (decision.sourceRefs ?? []).find(
2833
+ (sourceRef) => sourceRef.kind === "capability-admission-policy" && sourceRef.id !== decision.policyId
2834
+ );
2835
+ if (stalePolicyRef !== void 0) return "stale-capability-admission-policy-ref";
2836
+ return state.policies.get(decision.policyId) ?? "missing-capability-admission-policy";
2837
+ }
2838
+ function capabilityPolicyIssueMessage(code, decision) {
2839
+ if (code === "missing-capability-admission-policy") {
2840
+ return `CapabilityAdmissionPolicy '${decision.policyId}' was referenced but not present`;
2841
+ }
2842
+ return `CapabilityAdmissionDecision '${decision.decisionId}' carries a stale admission policy source ref`;
2843
+ }
2844
+ function admissionStateForOutcome(outcome) {
2845
+ if (outcome === "allow") return "allowed";
2846
+ if (outcome === "block") return "blocked";
2847
+ if (outcome === "defer") return "deferred";
2848
+ return void 0;
2849
+ }
2850
+ function capabilityAdmissionStatusState(state) {
2851
+ if (state === "allowed") return "capability-admission-allowed";
2852
+ if (state === "blocked") return "capability-admission-blocked";
2853
+ return "capability-admission-deferred";
2854
+ }
2855
+ function cloneCapabilityRef(ref2) {
2856
+ return {
2857
+ id: ref2.id,
2858
+ kind: ref2.kind,
2859
+ required: ref2.required,
2860
+ ...ref2.sourceRefs === void 0 ? {} : { sourceRefs: [...ref2.sourceRefs] }
2861
+ };
2862
+ }
2863
+ function isBoundaryCapabilityRef(value) {
2864
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
2865
+ const record = value;
2866
+ return typeof record.id === "string" && record.id.length > 0 && isBoundaryCapabilityKind(record.kind) && typeof record.required === "boolean" && (record.sourceRefs === void 0 || Array.isArray(record.sourceRefs) && record.sourceRefs.every((sourceRef) => typeof sourceRef === "string"));
2867
+ }
2868
+ function isBoundaryCapabilityKind(value) {
2869
+ return value === "auth" || value === "permission" || value === "config" || value === "resource";
2870
+ }
2871
+ function isCapabilityAdmissionOutcome(value) {
2872
+ return value === "allow" || value === "block" || value === "defer";
2873
+ }
2874
+ function proposalKeyFallback(proposal) {
2875
+ return typeof proposal.proposalId === "string" && proposal.proposalId.length > 0 ? proposal.proposalId : `${stringValue(proposal.subjectId) ?? "unknown"}:${capabilityKeyFallback(proposal.capability)}`;
2876
+ }
2877
+ function policyKeyFallback(policy) {
2878
+ return typeof policy.policyId === "string" && policy.policyId.length > 0 ? policy.policyId : "unknown";
2879
+ }
2880
+ function decisionKeyFallback(decision) {
2881
+ return typeof decision.decisionId === "string" && decision.decisionId.length > 0 ? decision.decisionId : `${stringValue(decision.proposalId) ?? "unknown"}:${stringValue(decision.admissionId) ?? "unknown"}`;
2882
+ }
2883
+ function capabilityKeyFallback(value) {
2884
+ if (!isBoundaryCapabilityRef(value)) return "unknown-capability";
2885
+ return `${value.kind}:${value.id}`;
2886
+ }
2887
+ function nextMalformedIssueKey(state, kind, fallback) {
2888
+ state.issueSeq += 1;
2889
+ return `malformed-${kind}:${state.issueSeq}:${fallback}`;
2890
+ }
2891
+ function stringValue(value) {
2892
+ return typeof value === "string" && value.length > 0 ? value : void 0;
2893
+ }
2894
+ function capabilityProposalRefs(proposal) {
2895
+ return uniqueSourceRefs([
2896
+ ref("capability-admission-proposal", proposal.proposalId),
2897
+ ref("boundary-capability", `${proposal.capability.kind}:${proposal.capability.id}`),
2898
+ ...proposal.sourceRefs ?? []
2899
+ ]);
2900
+ }
2901
+ function capabilityDecisionRefs(decision, proposal, policy) {
2902
+ return uniqueSourceRefs([
2903
+ ref("capability-admission-decision", decision.decisionId),
2904
+ ref("capability-admission", decision.admissionId),
2905
+ ref("capability-admission-proposal", decision.proposalId),
2906
+ ...proposal === void 0 ? [] : capabilityProposalRefs(proposal),
2907
+ ...decision.policyId === void 0 ? [] : [ref("capability-admission-policy", decision.policyId)],
2908
+ ...policy === void 0 ? [] : [ref("capability-admission-policy", policy.policyId)],
2909
+ ...decision.sourceRefs ?? []
2910
+ ]);
2911
+ }
2912
+ function forEachPolicyDepBatch(ctx, start, count, fn) {
2913
+ for (let i = 0; i < count; i += 1) {
2914
+ for (const value of depBatch(ctx, start + i) ?? []) fn(value);
2915
+ }
2916
+ }
2917
+ function projectRuntimeFact(graph, runtime, name, factory, pick) {
2918
+ return graph.node(
2919
+ [runtime],
2920
+ (ctx) => {
2921
+ for (const fact of depBatch(ctx, 0) ?? []) {
2922
+ const typed = fact;
2923
+ const value = pick(typed);
2924
+ if (value !== void 0) ctx.down([["DATA", value]]);
2925
+ }
2926
+ },
2927
+ { name, factory }
2928
+ );
2929
+ }
2930
+ function freezeCapabilityAdmissionViews(state) {
2931
+ return {
2932
+ admissionsByProposal: new Map(state.admissionsByProposal),
2933
+ admissionsBySubject: new Map(
2934
+ Array.from(state.admissionsBySubject, ([key, value]) => [key, Object.freeze([...value])])
2935
+ ),
2936
+ issues: Object.freeze([...state.issues]),
2937
+ audit: Object.freeze([...state.audit])
2938
+ };
2939
+ }
2940
+ function emptyCapabilityAdmissionState() {
2941
+ return {
2942
+ proposals: /* @__PURE__ */ new Map(),
2943
+ policies: /* @__PURE__ */ new Map(),
2944
+ decisions: /* @__PURE__ */ new Map(),
2945
+ admissionsById: /* @__PURE__ */ new Map(),
2946
+ admissionsByProposal: /* @__PURE__ */ new Map(),
2947
+ terminalDecisionIds: /* @__PURE__ */ new Set(),
2948
+ issueKeys: /* @__PURE__ */ new Set(),
2949
+ issueSeq: 0,
2950
+ statusSeq: 0,
2951
+ auditSeq: 0
2952
+ };
2953
+ }
2954
+ function dataIssue(code, message, opts = {}) {
2955
+ return {
2956
+ kind: "issue",
2957
+ code,
2958
+ message,
2959
+ severity: "error",
2960
+ subjectId: opts.subjectId,
2961
+ refs: opts.refs?.map((sourceRef) => `${sourceRef.kind}:${sourceRef.id}`),
2962
+ details: opts.details
2963
+ };
2964
+ }
2965
+ function uniqueSourceRefs(sourceRefs) {
2966
+ const seen = /* @__PURE__ */ new Set();
2967
+ const out = [];
2968
+ for (const sourceRef of sourceRefs) {
2969
+ const key = `${sourceRef.kind}:${sourceRef.id}:${JSON.stringify(sourceRef.metadata ?? {})}`;
2970
+ if (seen.has(key)) continue;
2971
+ seen.add(key);
2972
+ out.push(sourceRef);
2973
+ }
2974
+ return out;
2975
+ }
2976
+ function ref(kind, id) {
2977
+ return { kind, id };
2978
+ }
2979
+
2436
2980
  export {
2437
2981
  AGENTIC_MEMORY_RECORD_FRAME_FORMAT,
2438
2982
  AGENTIC_MEMORY_RECORD_FRAME_VERSION,
@@ -2444,6 +2988,8 @@ export {
2444
2988
  agenticMemoryRecordCodec,
2445
2989
  agenticMemoryRetentionBundle,
2446
2990
  agenticMemoryConsolidationBundle,
2447
- agenticMemoryContextPackingBundle
2991
+ agenticMemoryContextPackingBundle,
2992
+ capabilityAdmissionProposal,
2993
+ capabilityAdmissionProjector
2448
2994
  };
2449
- //# sourceMappingURL=chunk-COHO25CZ.js.map
2995
+ //# sourceMappingURL=chunk-YDSIVHRR.js.map