@graphrefly/graphrefly 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. package/README.md +22 -19
  2. package/dist/_internal-B23BagFd.d.cts +33 -0
  3. package/dist/_internal-B23BagFd.d.ts +33 -0
  4. package/dist/adaptive-rate-limiter-Dch_xYIi.d.cts +111 -0
  5. package/dist/adaptive-rate-limiter-Dch_xYIi.d.ts +111 -0
  6. package/dist/agents-C0Ji9ldU.d.cts +629 -0
  7. package/dist/agents-C9zexT7I.d.ts +629 -0
  8. package/dist/audit-BAXb3VOg.d.ts +246 -0
  9. package/dist/audit-C_bPfkqS.d.cts +246 -0
  10. package/dist/backoff-7KIK3WQW.js +24 -0
  11. package/dist/backoff-7KIK3WQW.js.map +1 -0
  12. package/dist/backoff-Bnb9OoPh.d.cts +6 -0
  13. package/dist/backoff-Bnb9OoPh.d.ts +6 -0
  14. package/dist/base/composition/index.cjs +811 -0
  15. package/dist/base/composition/index.cjs.map +1 -0
  16. package/dist/base/composition/index.d.cts +469 -0
  17. package/dist/base/composition/index.d.ts +469 -0
  18. package/dist/base/composition/index.js +40 -0
  19. package/dist/base/composition/index.js.map +1 -0
  20. package/dist/base/index.cjs +6336 -0
  21. package/dist/base/index.cjs.map +1 -0
  22. package/dist/base/index.d.cts +22 -0
  23. package/dist/base/index.d.ts +22 -0
  24. package/dist/base/index.js +259 -0
  25. package/dist/base/index.js.map +1 -0
  26. package/dist/base/io/index.cjs +3270 -0
  27. package/dist/base/io/index.cjs.map +1 -0
  28. package/dist/base/io/index.d.cts +2245 -0
  29. package/dist/base/io/index.d.ts +2245 -0
  30. package/dist/base/io/index.js +117 -0
  31. package/dist/base/io/index.js.map +1 -0
  32. package/dist/base/meta/index.cjs +43 -0
  33. package/dist/base/meta/index.cjs.map +1 -0
  34. package/dist/base/meta/index.d.cts +45 -0
  35. package/dist/base/meta/index.d.ts +45 -0
  36. package/dist/base/meta/index.js +13 -0
  37. package/dist/base/meta/index.js.map +1 -0
  38. package/dist/base/mutation/index.cjs +200 -0
  39. package/dist/base/mutation/index.cjs.map +1 -0
  40. package/dist/base/mutation/index.d.cts +177 -0
  41. package/dist/base/mutation/index.d.ts +177 -0
  42. package/dist/base/mutation/index.js +22 -0
  43. package/dist/base/mutation/index.js.map +1 -0
  44. package/dist/base/render/index.cjs +1120 -0
  45. package/dist/base/render/index.cjs.map +1 -0
  46. package/dist/{extra/render/index.d.ts → base/render/index.d.cts} +75 -31
  47. package/dist/{extra/render/index.d.cts → base/render/index.d.ts} +75 -31
  48. package/dist/base/render/index.js +24 -0
  49. package/dist/base/render/index.js.map +1 -0
  50. package/dist/base/sources/browser/index.cjs +172 -0
  51. package/dist/base/sources/browser/index.cjs.map +1 -0
  52. package/dist/base/sources/browser/index.d.cts +84 -0
  53. package/dist/base/sources/browser/index.d.ts +84 -0
  54. package/dist/base/sources/browser/index.js +151 -0
  55. package/dist/base/sources/browser/index.js.map +1 -0
  56. package/dist/base/sources/event/index.cjs +98 -0
  57. package/dist/base/sources/event/index.cjs.map +1 -0
  58. package/dist/base/sources/event/index.d.cts +91 -0
  59. package/dist/base/sources/event/index.d.ts +91 -0
  60. package/dist/base/sources/event/index.js +13 -0
  61. package/dist/base/sources/event/index.js.map +1 -0
  62. package/dist/base/sources/index.cjs +755 -0
  63. package/dist/base/sources/index.cjs.map +1 -0
  64. package/dist/{extra/sources.d.ts → base/sources/index.d.cts} +74 -301
  65. package/dist/{extra/sources.d.cts → base/sources/index.d.ts} +74 -301
  66. package/dist/base/sources/index.js +42 -0
  67. package/dist/base/sources/index.js.map +1 -0
  68. package/dist/base/sources/node/index.cjs +320 -0
  69. package/dist/base/sources/node/index.cjs.map +1 -0
  70. package/dist/{extra/node.d.ts → base/sources/node/index.d.cts} +35 -37
  71. package/dist/{extra/node.d.cts → base/sources/node/index.d.ts} +35 -37
  72. package/dist/base/sources/node/index.js +306 -0
  73. package/dist/base/sources/node/index.js.map +1 -0
  74. package/dist/base/utils/index.cjs +37 -0
  75. package/dist/base/utils/index.cjs.map +1 -0
  76. package/dist/base/utils/index.d.cts +37 -0
  77. package/dist/base/utils/index.d.ts +37 -0
  78. package/dist/base/utils/index.js +11 -0
  79. package/dist/base/utils/index.js.map +1 -0
  80. package/dist/base/worker/index.cjs +548 -0
  81. package/dist/base/worker/index.cjs.map +1 -0
  82. package/dist/base/worker/index.d.cts +207 -0
  83. package/dist/base/worker/index.d.ts +207 -0
  84. package/dist/base/worker/index.js +20 -0
  85. package/dist/base/worker/index.js.map +1 -0
  86. package/dist/breaker-C9skL3d8.d.ts +175 -0
  87. package/dist/breaker-ugSdq54q.d.cts +175 -0
  88. package/dist/{cascading-BglDkMdX.d.cts → cascading-CSSbKGrJ.d.ts} +3 -3
  89. package/dist/{cascading-MFgxu7Yo.d.ts → cascading-baGkiihI.d.cts} +3 -3
  90. package/dist/chunk-255UCBG4.js +58 -0
  91. package/dist/chunk-255UCBG4.js.map +1 -0
  92. package/dist/chunk-2LO3EL4W.js +1 -0
  93. package/dist/chunk-2LO3EL4W.js.map +1 -0
  94. package/dist/chunk-2OB3CEJS.js +1065 -0
  95. package/dist/chunk-2OB3CEJS.js.map +1 -0
  96. package/dist/chunk-36NMM65U.js +144 -0
  97. package/dist/chunk-36NMM65U.js.map +1 -0
  98. package/dist/chunk-3CEXCBN6.js +1 -0
  99. package/dist/chunk-3CEXCBN6.js.map +1 -0
  100. package/dist/chunk-3MUSLI6E.js +105 -0
  101. package/dist/chunk-3MUSLI6E.js.map +1 -0
  102. package/dist/chunk-3PSLNJDU.js +884 -0
  103. package/dist/chunk-3PSLNJDU.js.map +1 -0
  104. package/dist/chunk-3QZY5BI7.js +92 -0
  105. package/dist/chunk-3QZY5BI7.js.map +1 -0
  106. package/dist/chunk-42FQ27MQ.js +594 -0
  107. package/dist/chunk-42FQ27MQ.js.map +1 -0
  108. package/dist/chunk-4GYMCUDZ.js +1085 -0
  109. package/dist/chunk-4GYMCUDZ.js.map +1 -0
  110. package/dist/chunk-4S53H2KR.js +382 -0
  111. package/dist/chunk-4S53H2KR.js.map +1 -0
  112. package/dist/chunk-4XCHZRUJ.js +128 -0
  113. package/dist/chunk-4XCHZRUJ.js.map +1 -0
  114. package/dist/chunk-5THCXDWY.js +725 -0
  115. package/dist/chunk-5THCXDWY.js.map +1 -0
  116. package/dist/chunk-6XZYT4SW.js +256 -0
  117. package/dist/chunk-6XZYT4SW.js.map +1 -0
  118. package/dist/chunk-7EGRP2VX.js +76 -0
  119. package/dist/chunk-7EGRP2VX.js.map +1 -0
  120. package/dist/chunk-A7KV5UK4.js +150 -0
  121. package/dist/chunk-A7KV5UK4.js.map +1 -0
  122. package/dist/chunk-APY2SS5X.js +156 -0
  123. package/dist/chunk-APY2SS5X.js.map +1 -0
  124. package/dist/chunk-AZDQPQ3V.js +66 -0
  125. package/dist/chunk-AZDQPQ3V.js.map +1 -0
  126. package/dist/chunk-BU3SEFA5.js +90 -0
  127. package/dist/chunk-BU3SEFA5.js.map +1 -0
  128. package/dist/chunk-BXGZFGZ4.js +189 -0
  129. package/dist/chunk-BXGZFGZ4.js.map +1 -0
  130. package/dist/chunk-CGHORL6G.js +579 -0
  131. package/dist/chunk-CGHORL6G.js.map +1 -0
  132. package/dist/chunk-CXANAIZU.js +530 -0
  133. package/dist/chunk-CXANAIZU.js.map +1 -0
  134. package/dist/chunk-CZQHCKKG.js +1 -0
  135. package/dist/chunk-CZQHCKKG.js.map +1 -0
  136. package/dist/chunk-DKNHAICT.js +133 -0
  137. package/dist/chunk-DKNHAICT.js.map +1 -0
  138. package/dist/chunk-DM4OMPWK.js +584 -0
  139. package/dist/chunk-DM4OMPWK.js.map +1 -0
  140. package/dist/chunk-DMSNO6ZB.js +452 -0
  141. package/dist/chunk-DMSNO6ZB.js.map +1 -0
  142. package/dist/chunk-E5OZPDIW.js +229 -0
  143. package/dist/chunk-E5OZPDIW.js.map +1 -0
  144. package/dist/chunk-EVYY4X5A.js +509 -0
  145. package/dist/chunk-EVYY4X5A.js.map +1 -0
  146. package/dist/chunk-FDFD67UO.js +1 -0
  147. package/dist/chunk-FDFD67UO.js.map +1 -0
  148. package/dist/chunk-FMPF42Q4.js +13 -0
  149. package/dist/chunk-FMPF42Q4.js.map +1 -0
  150. package/dist/chunk-FR6RGA3B.js +1277 -0
  151. package/dist/chunk-FR6RGA3B.js.map +1 -0
  152. package/dist/chunk-FW23JYNQ.js +454 -0
  153. package/dist/chunk-FW23JYNQ.js.map +1 -0
  154. package/dist/chunk-GBCENOLN.js +1575 -0
  155. package/dist/chunk-GBCENOLN.js.map +1 -0
  156. package/dist/chunk-HL7HUJIX.js +1 -0
  157. package/dist/chunk-HL7HUJIX.js.map +1 -0
  158. package/dist/chunk-HULCUY35.js +2508 -0
  159. package/dist/chunk-HULCUY35.js.map +1 -0
  160. package/dist/chunk-IHTWQEDR.js +169 -0
  161. package/dist/chunk-IHTWQEDR.js.map +1 -0
  162. package/dist/chunk-IJRR6YAI.js +128 -0
  163. package/dist/chunk-IJRR6YAI.js.map +1 -0
  164. package/dist/chunk-JGFRAFDL.js +221 -0
  165. package/dist/chunk-JGFRAFDL.js.map +1 -0
  166. package/dist/chunk-KIIXR252.js +211 -0
  167. package/dist/chunk-KIIXR252.js.map +1 -0
  168. package/dist/chunk-KN3H5CNT.js +11 -0
  169. package/dist/chunk-KN3H5CNT.js.map +1 -0
  170. package/dist/chunk-KPG3DGLA.js +1 -0
  171. package/dist/chunk-KPG3DGLA.js.map +1 -0
  172. package/dist/chunk-KRNQ6RGQ.js +1 -0
  173. package/dist/chunk-KRNQ6RGQ.js.map +1 -0
  174. package/dist/chunk-LBAJK24K.js +1071 -0
  175. package/dist/chunk-LBAJK24K.js.map +1 -0
  176. package/dist/chunk-MLTPJMH6.js +417 -0
  177. package/dist/chunk-MLTPJMH6.js.map +1 -0
  178. package/dist/chunk-N3SZ7BMH.js +95 -0
  179. package/dist/chunk-N3SZ7BMH.js.map +1 -0
  180. package/dist/chunk-NDUD3IMO.js +540 -0
  181. package/dist/chunk-NDUD3IMO.js.map +1 -0
  182. package/dist/chunk-NY2PYHNC.js +873 -0
  183. package/dist/chunk-NY2PYHNC.js.map +1 -0
  184. package/dist/chunk-O3MT7DYI.js +225 -0
  185. package/dist/chunk-O3MT7DYI.js.map +1 -0
  186. package/dist/chunk-OCUDSN63.js +2386 -0
  187. package/dist/chunk-OCUDSN63.js.map +1 -0
  188. package/dist/chunk-OIWU3NYV.js +199 -0
  189. package/dist/chunk-OIWU3NYV.js.map +1 -0
  190. package/dist/chunk-OO5BM6CJ.js +1153 -0
  191. package/dist/chunk-OO5BM6CJ.js.map +1 -0
  192. package/dist/chunk-OQUIJT7A.js +1 -0
  193. package/dist/chunk-OQUIJT7A.js.map +1 -0
  194. package/dist/chunk-P5LBT622.js +105 -0
  195. package/dist/chunk-P5LBT622.js.map +1 -0
  196. package/dist/chunk-PKGQG5QQ.js +519 -0
  197. package/dist/chunk-PKGQG5QQ.js.map +1 -0
  198. package/dist/chunk-PKPO3JTZ.js +561 -0
  199. package/dist/chunk-PKPO3JTZ.js.map +1 -0
  200. package/dist/chunk-PL5UDIQ5.js +118 -0
  201. package/dist/chunk-PL5UDIQ5.js.map +1 -0
  202. package/dist/chunk-PZWISPIQ.js +432 -0
  203. package/dist/chunk-PZWISPIQ.js.map +1 -0
  204. package/dist/chunk-Q3EYOCZB.js +510 -0
  205. package/dist/chunk-Q3EYOCZB.js.map +1 -0
  206. package/dist/chunk-QMBYUVRL.js +15 -0
  207. package/dist/chunk-QMBYUVRL.js.map +1 -0
  208. package/dist/chunk-RAGGHLCV.js +200 -0
  209. package/dist/chunk-RAGGHLCV.js.map +1 -0
  210. package/dist/chunk-RGL53X5G.js +574 -0
  211. package/dist/chunk-RGL53X5G.js.map +1 -0
  212. package/dist/chunk-RJOG4IJU.js +1039 -0
  213. package/dist/chunk-RJOG4IJU.js.map +1 -0
  214. package/dist/chunk-SOOKUYVM.js +403 -0
  215. package/dist/chunk-SOOKUYVM.js.map +1 -0
  216. package/dist/chunk-T5BN5KG7.js +1 -0
  217. package/dist/chunk-T5BN5KG7.js.map +1 -0
  218. package/dist/chunk-TP7244Y6.js +207 -0
  219. package/dist/chunk-TP7244Y6.js.map +1 -0
  220. package/dist/chunk-TSBFTJKM.js +57 -0
  221. package/dist/chunk-TSBFTJKM.js.map +1 -0
  222. package/dist/chunk-URQ2CBBF.js +143 -0
  223. package/dist/chunk-URQ2CBBF.js.map +1 -0
  224. package/dist/chunk-W2BOPXTI.js +1 -0
  225. package/dist/chunk-W2BOPXTI.js.map +1 -0
  226. package/dist/chunk-WKSWLSCX.js +207 -0
  227. package/dist/chunk-WKSWLSCX.js.map +1 -0
  228. package/dist/chunk-Y52CS6YA.js +88 -0
  229. package/dist/chunk-Y52CS6YA.js.map +1 -0
  230. package/dist/chunk-YCBUWK77.js +92 -0
  231. package/dist/chunk-YCBUWK77.js.map +1 -0
  232. package/dist/chunk-YJ4U2D2C.js +314 -0
  233. package/dist/chunk-YJ4U2D2C.js.map +1 -0
  234. package/dist/chunk-Z4YXAUDN.js +239 -0
  235. package/dist/chunk-Z4YXAUDN.js.map +1 -0
  236. package/dist/chunk-Z6EGP5D7.js +92 -0
  237. package/dist/chunk-Z6EGP5D7.js.map +1 -0
  238. package/dist/compat/index.cjs +3100 -9
  239. package/dist/compat/index.cjs.map +1 -0
  240. package/dist/compat/index.d.cts +112 -18
  241. package/dist/compat/index.d.ts +112 -18
  242. package/dist/compat/index.js +176 -1
  243. package/dist/compat/index.js.map +1 -0
  244. package/dist/compat/jotai/index.cjs +149 -1
  245. package/dist/compat/jotai/index.cjs.map +1 -0
  246. package/dist/compat/jotai/index.d.cts +2 -2
  247. package/dist/compat/jotai/index.d.ts +2 -2
  248. package/dist/compat/jotai/index.js +8 -1
  249. package/dist/compat/jotai/index.js.map +1 -0
  250. package/dist/compat/nanostores/index.cjs +205 -1
  251. package/dist/compat/nanostores/index.cjs.map +1 -0
  252. package/dist/compat/nanostores/index.d.cts +2 -2
  253. package/dist/compat/nanostores/index.d.ts +2 -2
  254. package/dist/compat/nanostores/index.js +22 -1
  255. package/dist/compat/nanostores/index.js.map +1 -0
  256. package/dist/compat/nestjs/index.cjs +2241 -9
  257. package/dist/compat/nestjs/index.cjs.map +1 -0
  258. package/dist/compat/nestjs/index.d.cts +7 -10
  259. package/dist/compat/nestjs/index.d.ts +7 -10
  260. package/dist/compat/nestjs/index.js +78 -1
  261. package/dist/compat/nestjs/index.js.map +1 -0
  262. package/dist/compat/react/index.cjs +114 -1
  263. package/dist/compat/react/index.cjs.map +1 -0
  264. package/dist/compat/react/index.d.cts +2 -2
  265. package/dist/compat/react/index.d.ts +2 -2
  266. package/dist/compat/react/index.js +12 -1
  267. package/dist/compat/react/index.js.map +1 -0
  268. package/dist/compat/solid/index.cjs +101 -1
  269. package/dist/compat/solid/index.cjs.map +1 -0
  270. package/dist/compat/solid/index.d.cts +2 -2
  271. package/dist/compat/solid/index.d.ts +2 -2
  272. package/dist/compat/solid/index.js +12 -1
  273. package/dist/compat/solid/index.js.map +1 -0
  274. package/dist/compat/svelte/index.cjs +104 -1
  275. package/dist/compat/svelte/index.cjs.map +1 -0
  276. package/dist/compat/svelte/index.d.cts +2 -2
  277. package/dist/compat/svelte/index.d.ts +2 -2
  278. package/dist/compat/svelte/index.js +12 -1
  279. package/dist/compat/svelte/index.js.map +1 -0
  280. package/dist/compat/vue/index.cjs +119 -1
  281. package/dist/compat/vue/index.cjs.map +1 -0
  282. package/dist/compat/vue/index.d.cts +2 -2
  283. package/dist/compat/vue/index.d.ts +2 -2
  284. package/dist/compat/vue/index.js +12 -1
  285. package/dist/compat/vue/index.js.map +1 -0
  286. package/dist/compat/zustand/index.cjs +69 -3
  287. package/dist/compat/zustand/index.cjs.map +1 -0
  288. package/dist/compat/zustand/index.d.cts +2 -6
  289. package/dist/compat/zustand/index.d.ts +2 -6
  290. package/dist/compat/zustand/index.js +8 -1
  291. package/dist/compat/zustand/index.js.map +1 -0
  292. package/dist/distill-De6Rnn15.d.cts +48 -0
  293. package/dist/distill-De6Rnn15.d.ts +48 -0
  294. package/dist/external-register-CWyroXb_.d.cts +138 -0
  295. package/dist/external-register-CWyroXb_.d.ts +138 -0
  296. package/dist/{fallback-74oxi34l.d.cts → fallback-Bx46zqky.d.cts} +3 -10
  297. package/dist/{fallback-DUyyBTBK.d.ts → fallback-pIWW8A2d.d.ts} +3 -10
  298. package/dist/guarded-execution-BcdtxeBk.d.ts +207 -0
  299. package/dist/guarded-execution-C-3hnP6A.d.cts +207 -0
  300. package/dist/{index-CBGUK09R.d.ts → index-5SU_O78r.d.cts} +5 -5
  301. package/dist/{index-BmZXHqkE.d.ts → index-B6pxYJzO.d.cts} +1 -1
  302. package/dist/{index-hcDJ8PSI.d.cts → index-B6pxYJzO.d.ts} +1 -1
  303. package/dist/{index-C5stwKcw.d.cts → index-BFsng6v1.d.cts} +1 -1
  304. package/dist/{index-CdAlHFEt.d.ts → index-BFsng6v1.d.ts} +1 -1
  305. package/dist/{index-_6ODbuOu.d.cts → index-Bg-LwEt-.d.cts} +1 -1
  306. package/dist/{index-CviRnE4K.d.ts → index-Bg-LwEt-.d.ts} +1 -1
  307. package/dist/{index-CBBLl_rc.d.ts → index-Brp888t0.d.cts} +1 -1
  308. package/dist/{index-BQSKmbuG.d.cts → index-Brp888t0.d.ts} +1 -1
  309. package/dist/{index-sqkqlb1p.d.ts → index-CDfk6jHN.d.cts} +1 -1
  310. package/dist/{index-ZVQhLa2i.d.cts → index-CDfk6jHN.d.ts} +1 -1
  311. package/dist/{index-Climxqsu.d.cts → index-CEXCtYYJ.d.ts} +5 -5
  312. package/dist/index-DLAxYaN5.d.cts +169 -0
  313. package/dist/index-DLAxYaN5.d.ts +169 -0
  314. package/dist/{index-CK29LV56.d.cts → index-DeWbQzMe.d.cts} +1 -1
  315. package/dist/{index-CPQlGA29.d.ts → index-DeWbQzMe.d.ts} +1 -1
  316. package/dist/{index-BrPrLl4e.d.cts → index-dX9IzPqj.d.cts} +1 -1
  317. package/dist/{index-Dgl1HpPn.d.ts → index-dX9IzPqj.d.ts} +1 -1
  318. package/dist/index.cjs +25934 -191
  319. package/dist/index.cjs.map +1 -0
  320. package/dist/index.d.cts +58 -94
  321. package/dist/index.d.ts +58 -94
  322. package/dist/index.js +852 -1
  323. package/dist/index.js.map +1 -0
  324. package/dist/layout-types-B5aiHYgk.d.cts +72 -0
  325. package/dist/layout-types-B5aiHYgk.d.ts +72 -0
  326. package/dist/memory-composers-BryDrRBX.d.cts +529 -0
  327. package/dist/memory-composers-CVQqPYEV.d.ts +529 -0
  328. package/dist/{observable-DWjNfLvC.d.ts → observable-BXQoW1P-.d.cts} +1 -1
  329. package/dist/{observable-e3eiPPFy.d.cts → observable-BXQoW1P-.d.ts} +1 -1
  330. package/dist/{pipeline-graph-Sgj0gCwn.d.ts → pipeline-graph-Ce47CB6Y.d.cts} +13 -10
  331. package/dist/{pipeline-graph-CIKhynsF.d.cts → pipeline-graph-DXCwY9vG.d.ts} +13 -10
  332. package/dist/presets/ai/index.cjs +4377 -0
  333. package/dist/presets/ai/index.cjs.map +1 -0
  334. package/dist/presets/ai/index.d.cts +98 -0
  335. package/dist/presets/ai/index.d.ts +98 -0
  336. package/dist/presets/ai/index.js +54 -0
  337. package/dist/presets/ai/index.js.map +1 -0
  338. package/dist/presets/harness/index.cjs +5929 -0
  339. package/dist/presets/harness/index.cjs.map +1 -0
  340. package/dist/presets/harness/index.d.cts +566 -0
  341. package/dist/presets/harness/index.d.ts +566 -0
  342. package/dist/presets/harness/index.js +71 -0
  343. package/dist/presets/harness/index.js.map +1 -0
  344. package/dist/presets/index.cjs +9782 -0
  345. package/dist/presets/index.cjs.map +1 -0
  346. package/dist/presets/index.d.cts +28 -0
  347. package/dist/presets/index.d.ts +28 -0
  348. package/dist/presets/index.js +129 -0
  349. package/dist/presets/index.js.map +1 -0
  350. package/dist/presets/inspect/index.cjs +1087 -0
  351. package/dist/presets/inspect/index.cjs.map +1 -0
  352. package/dist/presets/inspect/index.d.cts +172 -0
  353. package/dist/presets/inspect/index.d.ts +172 -0
  354. package/dist/presets/inspect/index.js +21 -0
  355. package/dist/presets/inspect/index.js.map +1 -0
  356. package/dist/presets/resilience/index.cjs +1593 -0
  357. package/dist/presets/resilience/index.cjs.map +1 -0
  358. package/dist/presets/resilience/index.d.cts +205 -0
  359. package/dist/presets/resilience/index.d.ts +205 -0
  360. package/dist/presets/resilience/index.js +18 -0
  361. package/dist/presets/resilience/index.js.map +1 -0
  362. package/dist/rate-limiter-CEALq4N1.d.ts +559 -0
  363. package/dist/rate-limiter-DpVbSYdH.d.cts +559 -0
  364. package/dist/{reactive-layout-DOTs9P3X.d.ts → reactive-layout-fswlBUvX.d.cts} +19 -7
  365. package/dist/{reactive-layout-DgctbqZo.d.cts → reactive-layout-fswlBUvX.d.ts} +19 -7
  366. package/dist/retry-BDbRZ_gx.d.ts +125 -0
  367. package/dist/retry-DWuhjvsA.d.cts +125 -0
  368. package/dist/solutions/index.cjs +8200 -0
  369. package/dist/solutions/index.cjs.map +1 -0
  370. package/dist/solutions/index.d.cts +23 -0
  371. package/dist/solutions/index.d.ts +23 -0
  372. package/dist/solutions/index.js +55 -0
  373. package/dist/solutions/index.js.map +1 -0
  374. package/dist/spawnable-5mDY501F.d.cts +746 -0
  375. package/dist/spawnable-D3lR0oQu.d.ts +746 -0
  376. package/dist/status-U-rUI79b.d.cts +84 -0
  377. package/dist/status-U-rUI79b.d.ts +84 -0
  378. package/dist/timeout-U5O4ESK3.js +12 -0
  379. package/dist/timeout-U5O4ESK3.js.map +1 -0
  380. package/dist/{types-CWFysE9E.d.ts → types-BB5Lw-pB.d.cts} +3 -3
  381. package/dist/{types-C0_yquda.d.cts → types-BB5Lw-pB.d.ts} +3 -3
  382. package/dist/types-CJWIMJiZ.d.ts +548 -0
  383. package/dist/types-vCq7ShIm.d.cts +548 -0
  384. package/dist/utils/ai/browser.cjs +2169 -0
  385. package/dist/utils/ai/browser.cjs.map +1 -0
  386. package/dist/{patterns → utils}/ai/browser.d.cts +7 -5
  387. package/dist/{patterns → utils}/ai/browser.d.ts +7 -5
  388. package/dist/utils/ai/browser.js +255 -0
  389. package/dist/utils/ai/browser.js.map +1 -0
  390. package/dist/utils/ai/index.cjs +8468 -0
  391. package/dist/utils/ai/index.cjs.map +1 -0
  392. package/dist/{index-CR8QpwX8.d.ts → utils/ai/index.d.cts} +73 -976
  393. package/dist/{index-UPSiS-X7.d.cts → utils/ai/index.d.ts} +73 -976
  394. package/dist/utils/ai/index.js +173 -0
  395. package/dist/utils/ai/index.js.map +1 -0
  396. package/dist/utils/ai/node.cjs +648 -0
  397. package/dist/utils/ai/node.cjs.map +1 -0
  398. package/dist/{patterns → utils}/ai/node.d.cts +5 -7
  399. package/dist/{patterns → utils}/ai/node.d.ts +5 -7
  400. package/dist/utils/ai/node.js +84 -0
  401. package/dist/utils/ai/node.js.map +1 -0
  402. package/dist/utils/cqrs/index.cjs +1036 -0
  403. package/dist/utils/cqrs/index.cjs.map +1 -0
  404. package/dist/{index-CeFiHtAg.d.ts → utils/cqrs/index.d.cts} +7 -37
  405. package/dist/{index-B-_tFaqV.d.cts → utils/cqrs/index.d.ts} +7 -37
  406. package/dist/utils/cqrs/index.js +18 -0
  407. package/dist/utils/cqrs/index.js.map +1 -0
  408. package/dist/utils/demo-shell/index.cjs +865 -0
  409. package/dist/utils/demo-shell/index.cjs.map +1 -0
  410. package/dist/{index-B8YnZpIR.d.ts → utils/demo-shell/index.d.cts} +4 -16
  411. package/dist/{index-Cwv0KWcU.d.cts → utils/demo-shell/index.d.ts} +4 -16
  412. package/dist/utils/demo-shell/index.js +13 -0
  413. package/dist/utils/demo-shell/index.js.map +1 -0
  414. package/dist/utils/domain-templates/index.cjs +732 -0
  415. package/dist/utils/domain-templates/index.cjs.map +1 -0
  416. package/dist/{index-CzLVrjxn.d.ts → utils/domain-templates/index.d.cts} +3 -20
  417. package/dist/{index-BaQaY_IQ.d.cts → utils/domain-templates/index.d.ts} +3 -20
  418. package/dist/utils/domain-templates/index.js +17 -0
  419. package/dist/utils/domain-templates/index.js.map +1 -0
  420. package/dist/utils/graphspec/index.cjs +1174 -0
  421. package/dist/utils/graphspec/index.cjs.map +1 -0
  422. package/dist/{index-CMh5Rz1y.d.ts → utils/graphspec/index.d.cts} +106 -42
  423. package/dist/{index-CS0LTlB8.d.cts → utils/graphspec/index.d.ts} +106 -42
  424. package/dist/utils/graphspec/index.js +35 -0
  425. package/dist/utils/graphspec/index.js.map +1 -0
  426. package/dist/utils/harness/index.cjs +656 -0
  427. package/dist/utils/harness/index.cjs.map +1 -0
  428. package/dist/utils/harness/index.d.cts +542 -0
  429. package/dist/utils/harness/index.d.ts +542 -0
  430. package/dist/utils/harness/index.js +56 -0
  431. package/dist/utils/harness/index.js.map +1 -0
  432. package/dist/utils/index.cjs +17609 -0
  433. package/dist/utils/index.cjs.map +1 -0
  434. package/dist/utils/index.d.cts +96 -0
  435. package/dist/utils/index.d.ts +96 -0
  436. package/dist/utils/index.js +514 -0
  437. package/dist/utils/index.js.map +1 -0
  438. package/dist/utils/inspect/index.cjs +807 -0
  439. package/dist/utils/inspect/index.cjs.map +1 -0
  440. package/dist/utils/inspect/index.d.cts +123 -0
  441. package/dist/utils/inspect/index.d.ts +123 -0
  442. package/dist/utils/inspect/index.js +30 -0
  443. package/dist/utils/inspect/index.js.map +1 -0
  444. package/dist/utils/job-queue/index.cjs +717 -0
  445. package/dist/utils/job-queue/index.cjs.map +1 -0
  446. package/dist/{index-DisjX8a-.d.ts → utils/job-queue/index.d.cts} +5 -26
  447. package/dist/{index-DV_1YuVk.d.cts → utils/job-queue/index.d.ts} +5 -26
  448. package/dist/utils/job-queue/index.js +18 -0
  449. package/dist/utils/job-queue/index.js.map +1 -0
  450. package/dist/utils/memory/index.cjs +1451 -0
  451. package/dist/utils/memory/index.cjs.map +1 -0
  452. package/dist/{index-CZ3r5Rxp.d.ts → utils/memory/index.d.cts} +242 -34
  453. package/dist/{index-B17QddL1.d.cts → utils/memory/index.d.ts} +242 -34
  454. package/dist/utils/memory/index.js +19 -0
  455. package/dist/utils/memory/index.js.map +1 -0
  456. package/dist/utils/messaging/index.cjs +666 -0
  457. package/dist/utils/messaging/index.cjs.map +1 -0
  458. package/dist/utils/messaging/index.d.cts +562 -0
  459. package/dist/utils/messaging/index.d.ts +562 -0
  460. package/dist/utils/messaging/index.js +50 -0
  461. package/dist/utils/messaging/index.js.map +1 -0
  462. package/dist/utils/orchestration/index.cjs +876 -0
  463. package/dist/utils/orchestration/index.cjs.map +1 -0
  464. package/dist/utils/orchestration/index.d.cts +233 -0
  465. package/dist/utils/orchestration/index.d.ts +233 -0
  466. package/dist/utils/orchestration/index.js +19 -0
  467. package/dist/utils/orchestration/index.js.map +1 -0
  468. package/dist/utils/process/index.cjs +743 -0
  469. package/dist/utils/process/index.cjs.map +1 -0
  470. package/dist/{index-p09KSrTN.d.ts → utils/process/index.d.cts} +97 -44
  471. package/dist/{index-CasX6Pfq.d.cts → utils/process/index.d.ts} +97 -44
  472. package/dist/utils/process/index.js +14 -0
  473. package/dist/utils/process/index.js.map +1 -0
  474. package/dist/utils/reactive-layout/index.cjs +1607 -0
  475. package/dist/utils/reactive-layout/index.cjs.map +1 -0
  476. package/dist/{index-B5S8ULbU.d.ts → utils/reactive-layout/index.d.cts} +58 -81
  477. package/dist/{index-Dc4AYqrJ.d.cts → utils/reactive-layout/index.d.ts} +58 -81
  478. package/dist/utils/reactive-layout/index.js +52 -0
  479. package/dist/utils/reactive-layout/index.js.map +1 -0
  480. package/dist/utils/reduction/index.cjs +203 -0
  481. package/dist/utils/reduction/index.cjs.map +1 -0
  482. package/dist/{index-Byu-OpX_.d.ts → utils/reduction/index.d.cts} +6 -17
  483. package/dist/{index-tRCxuAXF.d.cts → utils/reduction/index.d.ts} +6 -17
  484. package/dist/utils/reduction/index.js +14 -0
  485. package/dist/utils/reduction/index.js.map +1 -0
  486. package/dist/utils/resilience/index.cjs +1617 -0
  487. package/dist/utils/resilience/index.cjs.map +1 -0
  488. package/dist/utils/resilience/index.d.cts +9 -0
  489. package/dist/utils/resilience/index.d.ts +9 -0
  490. package/dist/utils/resilience/index.js +44 -0
  491. package/dist/utils/resilience/index.js.map +1 -0
  492. package/dist/utils/surface/index.cjs +1070 -0
  493. package/dist/utils/surface/index.cjs.map +1 -0
  494. package/dist/{index-CYq8vAyV.d.ts → utils/surface/index.d.cts} +7 -58
  495. package/dist/{index-CSOmP7xT.d.cts → utils/surface/index.d.ts} +7 -58
  496. package/dist/utils/surface/index.js +30 -0
  497. package/dist/utils/surface/index.js.map +1 -0
  498. package/dist/utils/topology-view/index.cjs +620 -0
  499. package/dist/utils/topology-view/index.cjs.map +1 -0
  500. package/dist/utils/topology-view/index.d.cts +68 -0
  501. package/dist/utils/topology-view/index.d.ts +68 -0
  502. package/dist/utils/topology-view/index.js +11 -0
  503. package/dist/utils/topology-view/index.js.map +1 -0
  504. package/package.json +664 -584
  505. package/dist/backoff-HPZMEZNF.js +0 -1
  506. package/dist/chunk-2T7U5EU6.js +0 -1
  507. package/dist/chunk-3G5U5QNE.js +0 -5
  508. package/dist/chunk-4VVTGLXJ.js +0 -1
  509. package/dist/chunk-5M4CCMMD.js +0 -45
  510. package/dist/chunk-5QDBSZBV.js +0 -1
  511. package/dist/chunk-5XJ6B66J.js +0 -1
  512. package/dist/chunk-6QZNQS5B.js +0 -1
  513. package/dist/chunk-6X7AFUJV.js +0 -9
  514. package/dist/chunk-7K6PWTDQ.js +0 -1
  515. package/dist/chunk-7LIAPXJB.js +0 -1
  516. package/dist/chunk-7WPU3UHQ.js +0 -1
  517. package/dist/chunk-A5WCQ5NO.js +0 -1
  518. package/dist/chunk-APPIWSGD.js +0 -84
  519. package/dist/chunk-BEZWM2SY.js +0 -1
  520. package/dist/chunk-C72GO4IZ.js +0 -1
  521. package/dist/chunk-CB676TKJ.js +0 -1
  522. package/dist/chunk-CE6TI2TL.js +0 -1
  523. package/dist/chunk-CE72X3WO.js +0 -1
  524. package/dist/chunk-CK2E7BTU.js +0 -1
  525. package/dist/chunk-CLVB32RD.js +0 -1
  526. package/dist/chunk-CRVT7D2P.js +0 -1
  527. package/dist/chunk-D5RFJOZ2.js +0 -1
  528. package/dist/chunk-D7GPHKFH.js +0 -1
  529. package/dist/chunk-DHRX7JX4.js +0 -2
  530. package/dist/chunk-ESMPEKEV.js +0 -1
  531. package/dist/chunk-F672GV32.js +0 -1
  532. package/dist/chunk-FZMYDOWV.js +0 -1
  533. package/dist/chunk-GHBWHMRZ.js +0 -1
  534. package/dist/chunk-GLERH466.js +0 -1
  535. package/dist/chunk-GPW2V3RE.js +0 -1
  536. package/dist/chunk-HIDYF36O.js +0 -1
  537. package/dist/chunk-HITNVN6B.js +0 -3
  538. package/dist/chunk-HY4DJBA7.js +0 -5
  539. package/dist/chunk-KZIEYVXN.js +0 -1
  540. package/dist/chunk-L6NSJVJZ.js +0 -1
  541. package/dist/chunk-N4MQX6JU.js +0 -18
  542. package/dist/chunk-N7FHEL4D.js +0 -1
  543. package/dist/chunk-NTEURFZH.js +0 -1
  544. package/dist/chunk-OIVP6KFV.js +0 -1
  545. package/dist/chunk-OPHBU3LG.js +0 -1
  546. package/dist/chunk-OYQOZP2F.js +0 -5
  547. package/dist/chunk-PTZK576G.js +0 -1
  548. package/dist/chunk-QYADASLV.js +0 -1
  549. package/dist/chunk-ST7UXLWR.js +0 -1
  550. package/dist/chunk-SVY7VUYU.js +0 -1
  551. package/dist/chunk-TK3NWWD4.js +0 -1
  552. package/dist/chunk-TSOYJ743.js +0 -1
  553. package/dist/chunk-UNGSTR4X.js +0 -61
  554. package/dist/chunk-VIMF6LGM.js +0 -1
  555. package/dist/chunk-VJLMUKOI.js +0 -1
  556. package/dist/chunk-VN6RDSK2.js +0 -1
  557. package/dist/chunk-VV4N5P64.js +0 -1
  558. package/dist/chunk-W3I423PS.js +0 -1
  559. package/dist/chunk-WJR24TAG.js +0 -1
  560. package/dist/chunk-XTGKMHSW.js +0 -1
  561. package/dist/chunk-YBB7ZGTY.js +0 -1
  562. package/dist/chunk-Z4NPUARF.js +0 -1
  563. package/dist/chunk-ZGNQRPDT.js +0 -1
  564. package/dist/chunk-ZKPSFFKU.js +0 -1
  565. package/dist/chunk-ZLV5SQSX.js +0 -1
  566. package/dist/content-addressed-storage-4-ST1tYk.d.cts +0 -124
  567. package/dist/content-addressed-storage-DuYMjV7o.d.ts +0 -124
  568. package/dist/core/index.cjs +0 -1
  569. package/dist/core/index.d.cts +0 -3
  570. package/dist/core/index.d.ts +0 -3
  571. package/dist/core/index.js +0 -1
  572. package/dist/decay-BvOWTZ00.d.ts +0 -112
  573. package/dist/decay-CFlLvXUT.d.cts +0 -112
  574. package/dist/extra/browser.cjs +0 -1
  575. package/dist/extra/browser.d.cts +0 -4
  576. package/dist/extra/browser.d.ts +0 -4
  577. package/dist/extra/browser.js +0 -1
  578. package/dist/extra/index.cjs +0 -20
  579. package/dist/extra/index.d.cts +0 -17
  580. package/dist/extra/index.d.ts +0 -17
  581. package/dist/extra/index.js +0 -1
  582. package/dist/extra/node.cjs +0 -2
  583. package/dist/extra/node.js +0 -2
  584. package/dist/extra/operators.cjs +0 -1
  585. package/dist/extra/operators.d.cts +0 -958
  586. package/dist/extra/operators.d.ts +0 -958
  587. package/dist/extra/operators.js +0 -1
  588. package/dist/extra/reactive.cjs +0 -1
  589. package/dist/extra/reactive.d.cts +0 -353
  590. package/dist/extra/reactive.d.ts +0 -353
  591. package/dist/extra/reactive.js +0 -1
  592. package/dist/extra/render/index.cjs +0 -5
  593. package/dist/extra/render/index.js +0 -1
  594. package/dist/extra/sources.cjs +0 -3
  595. package/dist/extra/sources.js +0 -1
  596. package/dist/extra/storage-browser.cjs +0 -1
  597. package/dist/extra/storage-browser.d.cts +0 -37
  598. package/dist/extra/storage-browser.d.ts +0 -37
  599. package/dist/extra/storage-browser.js +0 -1
  600. package/dist/extra/storage-core.cjs +0 -1
  601. package/dist/extra/storage-core.d.cts +0 -28
  602. package/dist/extra/storage-core.d.ts +0 -28
  603. package/dist/extra/storage-core.js +0 -1
  604. package/dist/extra/storage-node.cjs +0 -1
  605. package/dist/extra/storage-node.d.cts +0 -2
  606. package/dist/extra/storage-node.d.ts +0 -2
  607. package/dist/extra/storage-node.js +0 -0
  608. package/dist/extra/storage-tiers-browser.cjs +0 -1
  609. package/dist/extra/storage-tiers-browser.d.cts +0 -120
  610. package/dist/extra/storage-tiers-browser.d.ts +0 -120
  611. package/dist/extra/storage-tiers-browser.js +0 -1
  612. package/dist/extra/storage-tiers-node.cjs +0 -1
  613. package/dist/extra/storage-tiers-node.d.cts +0 -210
  614. package/dist/extra/storage-tiers-node.d.ts +0 -210
  615. package/dist/extra/storage-tiers-node.js +0 -1
  616. package/dist/extra/storage-tiers.cjs +0 -1
  617. package/dist/extra/storage-tiers.d.cts +0 -412
  618. package/dist/extra/storage-tiers.d.ts +0 -412
  619. package/dist/extra/storage-tiers.js +0 -1
  620. package/dist/graph/index.cjs +0 -7
  621. package/dist/graph/index.d.cts +0 -7
  622. package/dist/graph/index.d.ts +0 -7
  623. package/dist/graph/index.js +0 -1
  624. package/dist/graph-CWvEUQAq.d.cts +0 -1861
  625. package/dist/graph-D9LFnda9.d.ts +0 -1861
  626. package/dist/index-5k1T6jl0.d.cts +0 -121
  627. package/dist/index-9770hRuQ.d.cts +0 -779
  628. package/dist/index-B1F8Enjf.d.ts +0 -704
  629. package/dist/index-BHskSB8v.d.ts +0 -3413
  630. package/dist/index-BIYAkbAi.d.cts +0 -26
  631. package/dist/index-BoJ5JHxI.d.ts +0 -557
  632. package/dist/index-BocU7pqs.d.ts +0 -779
  633. package/dist/index-BxNs2HB9.d.cts +0 -1858
  634. package/dist/index-C1T3d7V-.d.cts +0 -704
  635. package/dist/index-C5ri2Axc.d.cts +0 -301
  636. package/dist/index-C9l6OEBL.d.ts +0 -26
  637. package/dist/index-CC-AvFTy.d.cts +0 -557
  638. package/dist/index-CJF1URuX.d.ts +0 -121
  639. package/dist/index-CdTelp1M.d.ts +0 -202
  640. package/dist/index-Cj3WohTd.d.cts +0 -202
  641. package/dist/index-Co7uli2l.d.cts +0 -3413
  642. package/dist/index-D0aciIex.d.cts +0 -209
  643. package/dist/index-DHen9Klo.d.ts +0 -1858
  644. package/dist/index-Yq60JP3s.d.ts +0 -209
  645. package/dist/index-nozs3fFC.d.ts +0 -301
  646. package/dist/node-kK3CvTrR.d.cts +0 -1347
  647. package/dist/node-kK3CvTrR.d.ts +0 -1347
  648. package/dist/patterns/ai/browser.cjs +0 -8
  649. package/dist/patterns/ai/browser.js +0 -3
  650. package/dist/patterns/ai/index.cjs +0 -74
  651. package/dist/patterns/ai/index.d.cts +0 -20
  652. package/dist/patterns/ai/index.d.ts +0 -20
  653. package/dist/patterns/ai/index.js +0 -1
  654. package/dist/patterns/ai/node.cjs +0 -1
  655. package/dist/patterns/ai/node.js +0 -1
  656. package/dist/patterns/cqrs/index.cjs +0 -3
  657. package/dist/patterns/cqrs/index.d.cts +0 -8
  658. package/dist/patterns/cqrs/index.d.ts +0 -8
  659. package/dist/patterns/cqrs/index.js +0 -1
  660. package/dist/patterns/demo-shell/index.cjs +0 -5
  661. package/dist/patterns/demo-shell/index.d.cts +0 -7
  662. package/dist/patterns/demo-shell/index.d.ts +0 -7
  663. package/dist/patterns/demo-shell/index.js +0 -1
  664. package/dist/patterns/domain-templates/index.cjs +0 -3
  665. package/dist/patterns/domain-templates/index.d.cts +0 -6
  666. package/dist/patterns/domain-templates/index.d.ts +0 -6
  667. package/dist/patterns/domain-templates/index.js +0 -1
  668. package/dist/patterns/graphspec/index.cjs +0 -86
  669. package/dist/patterns/graphspec/index.d.cts +0 -8
  670. package/dist/patterns/graphspec/index.d.ts +0 -8
  671. package/dist/patterns/graphspec/index.js +0 -1
  672. package/dist/patterns/harness/index.cjs +0 -48
  673. package/dist/patterns/harness/index.d.cts +0 -13
  674. package/dist/patterns/harness/index.d.ts +0 -13
  675. package/dist/patterns/harness/index.js +0 -1
  676. package/dist/patterns/inspect/index.cjs +0 -3
  677. package/dist/patterns/inspect/index.d.cts +0 -9
  678. package/dist/patterns/inspect/index.d.ts +0 -9
  679. package/dist/patterns/inspect/index.js +0 -1
  680. package/dist/patterns/job-queue/index.cjs +0 -3
  681. package/dist/patterns/job-queue/index.d.cts +0 -9
  682. package/dist/patterns/job-queue/index.d.ts +0 -9
  683. package/dist/patterns/job-queue/index.js +0 -1
  684. package/dist/patterns/memory/index.cjs +0 -3
  685. package/dist/patterns/memory/index.d.cts +0 -8
  686. package/dist/patterns/memory/index.d.ts +0 -8
  687. package/dist/patterns/memory/index.js +0 -1
  688. package/dist/patterns/messaging/index.cjs +0 -3
  689. package/dist/patterns/messaging/index.d.cts +0 -7
  690. package/dist/patterns/messaging/index.d.ts +0 -7
  691. package/dist/patterns/messaging/index.js +0 -1
  692. package/dist/patterns/orchestration/index.cjs +0 -3
  693. package/dist/patterns/orchestration/index.d.cts +0 -8
  694. package/dist/patterns/orchestration/index.d.ts +0 -8
  695. package/dist/patterns/orchestration/index.js +0 -1
  696. package/dist/patterns/process/index.cjs +0 -3
  697. package/dist/patterns/process/index.d.cts +0 -10
  698. package/dist/patterns/process/index.d.ts +0 -10
  699. package/dist/patterns/process/index.js +0 -1
  700. package/dist/patterns/reactive-layout/index.cjs +0 -4
  701. package/dist/patterns/reactive-layout/index.d.cts +0 -7
  702. package/dist/patterns/reactive-layout/index.d.ts +0 -7
  703. package/dist/patterns/reactive-layout/index.js +0 -1
  704. package/dist/patterns/reduction/index.cjs +0 -3
  705. package/dist/patterns/reduction/index.d.cts +0 -6
  706. package/dist/patterns/reduction/index.d.ts +0 -6
  707. package/dist/patterns/reduction/index.js +0 -1
  708. package/dist/patterns/surface/index.cjs +0 -13
  709. package/dist/patterns/surface/index.d.cts +0 -9
  710. package/dist/patterns/surface/index.d.ts +0 -9
  711. package/dist/patterns/surface/index.js +0 -1
  712. package/dist/reactive-log-BKALbfal.d.ts +0 -223
  713. package/dist/reactive-log-DIGdYqQ6.d.cts +0 -223
  714. package/dist/reactive-map-CEFGp8TK.d.cts +0 -296
  715. package/dist/reactive-map-DS_SIAxv.d.ts +0 -296
  716. package/dist/resilience-6LYQJAC5.js +0 -1
  717. package/dist/sugar-DQjFmVqb.d.cts +0 -399
  718. package/dist/sugar-fhLIE7TT.d.ts +0 -399
  719. package/dist/topology-tree-Bcz27hpF.d.cts +0 -25
  720. package/dist/topology-tree-xvaD0fOX.d.ts +0 -25
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/domain-templates/index.ts"],"sourcesContent":["/**\n * Domain templates (roadmap §8.2).\n *\n * Opinionated Graph factories for common \"info → action\" domains.\n * Each template wires up §8.1 reduction primitives (stratify, funnel, feedback,\n * budgetGate, scorer) with domain-specific stages. Users fork/extend by\n * accessing named nodes and swapping stages.\n *\n * **Source injection (option B):** templates accept a `source` node, not a\n * hardcoded adapter. Pass `fromOTel(...)`, `fromGitHook(...)`, or a test\n * `state()` — the topology is the same.\n *\n * @module\n */\n\nimport { batch, type Node, node } from \"@graphrefly/pure-ts/core\";\nimport { reactiveLog, type StratifyRule, stratify } from \"@graphrefly/pure-ts/extra\";\nimport { Graph, type GraphOptions } from \"@graphrefly/pure-ts/graph\";\nimport { feedback, scorer } from \"../reduction/index.js\";\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nimport { keepalive } from \"@graphrefly/pure-ts/extra\";\nimport { domainMeta } from \"../../base/meta/domain-meta.js\";\n\nfunction baseMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn domainMeta(\"domain_template\", kind, extra);\n}\n\n// ---------------------------------------------------------------------------\n// 1. observabilityGraph\n// ---------------------------------------------------------------------------\n\n/** Stratification branch config for observability signals. */\nexport type ObservabilityBranch = {\n\tname: string;\n\tclassify: (value: unknown) => boolean;\n};\n\n/** Options for {@link observabilityGraph}. */\nexport type ObservabilityGraphOptions = GraphOptions & {\n\t/** Ingested signal source (e.g. fromOTel(...) or test state). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification rules for signal stratification.\n\t * Default: errors / traces / metrics branches.\n\t */\n\tbranches?: ObservabilityBranch[];\n\n\t/**\n\t * Correlation function: receives stratified branch values and produces\n\t * correlated insights. Default: identity pass-through.\n\t */\n\tcorrelate?: (values: unknown[]) => unknown;\n\n\t/**\n\t * SLO verification function: returns a verification result for a\n\t * correlated insight. Default: always passes.\n\t */\n\tsloCheck?: (value: unknown) => unknown;\n\n\t/**\n\t * Scorer weights for alert prioritization. One per branch.\n\t * Default: equal weights [1, 1, 1].\n\t */\n\tweights?: number[];\n\n\t/** Max feedback iterations for false-positive learning. Default: 5. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * OTel ingest → stratified reduction → correlation → SLO verification →\n * alert prioritization → output.\n *\n * Well-known node names:\n * - `\"source\"` — injected signal source\n * - `\"stratify::branch/<name>\"` — per-branch classification\n * - `\"correlate\"` — cross-branch correlation\n * - `\"slo_value\"`, `\"slo_verified\"` — SLO verification pair\n * - `\"alerts\"` — scored, prioritized output\n * - `\"output\"` — final output (alias for alerts)\n *\n * @category patterns\n */\nexport function observabilityGraph(name: string, opts: ObservabilityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(opts.source, { name: \"source\" });\n\n\t// --- Stratify ---\n\tconst defaultBranches: ObservabilityBranch[] = [\n\t\t{ name: \"errors\", classify: (v) => isTagged(v, \"error\") },\n\t\t{ name: \"traces\", classify: (v) => isTagged(v, \"trace\") },\n\t\t{ name: \"metrics\", classify: (v) => isTagged(v, \"metric\") },\n\t];\n\tconst branches = opts.branches ?? defaultBranches;\n\tconst rules: StratifyRule<unknown>[] = branches.map((b) => ({\n\t\tname: b.name,\n\t\tclassify: b.classify,\n\t}));\n\tconst strat = stratify(\"stratify\", opts.source, rules);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Correlate ---\n\t// Collect latest value from each branch, produce correlated output.\n\t// Wrap each branch in a derived with `initial: null` so every branch has\n\t// a seed value at subscribe time — this lets the correlate wave reach its\n\t// first-run gate even when the classifier only routes to one branch.\n\tconst branchNodes = branches.map((b) => {\n\t\ttry {\n\t\t\tconst raw = g.resolve(`stratify::branch/${b.name}`);\n\t\t\treturn node(\n\t\t\t\t[raw as Node],\n\t\t\t\t(batchData, actions, ctx) => {\n\t\t\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t\t\t);\n\t\t\t\t\tactions.emit(data[0]);\n\t\t\t\t},\n\t\t\t\t{ initial: null, describeKind: \"derived\" },\n\t\t\t);\n\t\t} catch {\n\t\t\treturn node<unknown>([], { initial: null });\n\t\t}\n\t});\n\tconst correlateFn = opts.correlate ?? ((vals: unknown[]) => vals);\n\tconst correlateNode = node<unknown>(\n\t\tbranchNodes as Node[],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(correlateFn(vals as unknown[]));\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"correlate\" }),\n\t\t},\n\t);\n\tg.add(correlateNode, { name: \"correlate\" });\n\n\t// --- SLO verification ---\n\tconst sloCheckFn = opts.sloCheck ?? (() => ({ pass: true }));\n\tconst sloValue = node<unknown>(\n\t\t[correlateNode],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(data[0]);\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"slo_value\" }),\n\t\t},\n\t);\n\tconst sloVerified = node<unknown>(\n\t\t[sloValue],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(sloCheckFn(data[0]));\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"slo_verified\" }),\n\t\t},\n\t);\n\tg.add(sloValue, { name: \"slo_value\" });\n\tg.add(sloVerified, { name: \"slo_verified\" });\n\n\t// --- Alert scorer ---\n\tconst weightValues = opts.weights ?? branches.map(() => 1);\n\tconst signalNodes = branchNodes.map((bn) =>\n\t\tnode<number>(\n\t\t\t[bn],\n\t\t\t(batchData, actions, ctx) => {\n\t\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t\t);\n\t\t\t\tactions.emit(data[0] != null ? 1 : 0);\n\t\t\t},\n\t\t\t{ describeKind: \"derived\" },\n\t\t),\n\t);\n\tconst weightNodes = weightValues.map((w) => node<number>([], { initial: w }));\n\tfor (let i = 0; i < signalNodes.length; i++) {\n\t\tg.add(signalNodes[i] as Node<unknown>, { name: `__signal_${i}` });\n\t\tg.add(weightNodes[i] as Node<unknown>, { name: `__weight_${i}` });\n\t}\n\tconst alerts = scorer(\n\t\tsignalNodes as ReadonlyArray<Node<number>>,\n\t\tweightNodes as ReadonlyArray<Node<number>>,\n\t);\n\tg.add(alerts as Node<unknown>, { name: \"alerts\" });\n\n\t// --- Output alias ---\n\tconst output = node<unknown>(\n\t\t[alerts as Node, sloVerified],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit({\n\t\t\t\tscored: vals[0],\n\t\t\t\tslo: vals[1],\n\t\t\t});\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"output\" }),\n\t\t},\n\t);\n\tg.add(output, { name: \"output\" });\n\n\t// --- Feedback (false-positive learning) ---\n\t// SLO failures feed back to re-check with updated context.\n\tconst fbReentry = node<unknown>([], {\n\t\tinitial: null,\n\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(fbReentry, { name: \"feedback_reentry\" });\n\tconst fbCondition = node<unknown>(\n\t\t[sloVerified],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst result = data[0] as Record<string, unknown> | null;\n\t\t\tactions.emit(result && result.pass === false ? result : null);\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(fbCondition as Node<unknown>, { name: \"feedback_condition\" });\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 2. issueTrackerGraph\n// ---------------------------------------------------------------------------\n\n/** A structured issue extracted from raw findings. */\nexport type ExtractedIssue = {\n\tid: string;\n\ttitle: string;\n\tseverity: number;\n\tsource: string;\n\traw: unknown;\n};\n\n/** Options for {@link issueTrackerGraph}. */\nexport type IssueTrackerGraphOptions = GraphOptions & {\n\t/** Findings source (e.g. fromGitHook(...), fromFSWatch(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Extract structured issues from raw findings.\n\t * Default: wraps raw value as a single issue.\n\t */\n\textract?: (raw: unknown) => ExtractedIssue;\n\n\t/**\n\t * Verify an extracted issue (assertion check).\n\t * Default: always valid.\n\t */\n\tverify?: (issue: ExtractedIssue) => unknown;\n\n\t/**\n\t * Detect regression by comparing against known patterns.\n\t * Receives (current issue, known patterns).\n\t * Default: no regression detected.\n\t */\n\tdetectRegression?: (issue: ExtractedIssue, known: unknown) => unknown;\n\n\t/** Max feedback iterations for re-scanning. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Findings ingest → extraction → verification → regression detection →\n * distillation → prioritized queue.\n *\n * Well-known node names:\n * - `\"source\"` — injected findings source\n * - `\"extract\"` — structured issue extraction\n * - `\"verify\"` — issue verification\n * - `\"known_patterns\"` — accumulated known issue patterns (state)\n * - `\"regression\"` — regression detection\n * - `\"priority\"` — severity-based prioritization\n * - `\"output\"` — final prioritized output\n *\n * @category patterns\n */\nexport function issueTrackerGraph(name: string, opts: IssueTrackerGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(opts.source, { name: \"source\" });\n\n\t// --- Extract ---\n\tlet _issueCounter = 0;\n\tconst defaultExtract = (raw: unknown): ExtractedIssue => ({\n\t\tid: `issue-${++_issueCounter}`,\n\t\ttitle: String(raw),\n\t\tseverity: 1,\n\t\tsource: \"unknown\",\n\t\traw,\n\t});\n\tconst extractFn = opts.extract ?? defaultExtract;\n\tconst extractNode = node<ExtractedIssue>(\n\t\t[opts.source],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(extractFn(data[0]));\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"extract\" }),\n\t\t},\n\t);\n\tg.add(extractNode as Node<unknown>, { name: \"extract\" });\n\n\t// --- Verify ---\n\tconst verifyFn = opts.verify ?? (() => ({ valid: true }));\n\tconst verifyNode = node<unknown>(\n\t\t[extractNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst issue = data[0] as ExtractedIssue;\n\t\t\tactions.emit({ issue, verification: verifyFn(issue) });\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"verify\" }),\n\t\t},\n\t);\n\tg.add(verifyNode, { name: \"verify\" });\n\n\t// --- Known patterns (memory / distillation state) ---\n\tconst knownPatterns = node<unknown[]>([], {\n\t\tinitial: [],\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"known_patterns\" }),\n\t});\n\tg.add(knownPatterns as Node<unknown>, { name: \"known_patterns\" });\n\n\t// --- Regression detection ---\n\tconst detectFn = opts.detectRegression ?? (() => ({ regression: false }));\n\tconst regressionNode = node<unknown>(\n\t\t[extractNode as Node, knownPatterns as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst issue = data[0] as ExtractedIssue;\n\t\t\tconst known = data[1];\n\t\t\tactions.emit({ issue, regression: detectFn(issue, known) });\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"issue_tracker\", { stage: \"regression\" }) },\n\t);\n\tg.add(regressionNode, { name: \"regression\" });\n\n\t// --- Priority scoring ---\n\tconst severitySignal = node<number>(\n\t\t[extractNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst issue = data[0] as ExtractedIssue;\n\t\t\tactions.emit(issue?.severity ?? 0);\n\t\t},\n\t\t{ describeKind: \"derived\" },\n\t);\n\tconst regressionSignal = node<number>(\n\t\t[regressionNode],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst r = data[0] as Record<string, unknown> | null;\n\t\t\tactions.emit(r?.regression ? 2 : 0);\n\t\t},\n\t\t{ describeKind: \"derived\" },\n\t);\n\tg.add(severitySignal as Node<unknown>, { name: \"__severity_signal\" });\n\tg.add(regressionSignal as Node<unknown>, { name: \"__regression_signal\" });\n\n\tconst severityWeight = node<number>([], { initial: 1 });\n\tconst regressionWeight = node<number>([], { initial: 1.5 });\n\tg.add(severityWeight as Node<unknown>, { name: \"__severity_weight\" });\n\tg.add(regressionWeight as Node<unknown>, { name: \"__regression_weight\" });\n\n\tconst priority = scorer([severitySignal, regressionSignal], [severityWeight, regressionWeight]);\n\tg.add(priority as Node<unknown>, { name: \"priority\" });\n\n\t// --- Output ---\n\tconst output = node<unknown>(\n\t\t[verifyNode, regressionNode, priority as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit({\n\t\t\t\tverified: vals[0],\n\t\t\t\tregression: vals[1],\n\t\t\t\tpriority: vals[2],\n\t\t\t});\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"issue_tracker\", { stage: \"output\" }) },\n\t);\n\tg.add(output, { name: \"output\" });\n\n\t// --- Feedback (re-scan on verification failure) ---\n\tconst fbReentry = node<unknown>([], {\n\t\tinitial: null,\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(fbReentry, { name: \"feedback_reentry\" });\n\tconst fbCondition = node<unknown>(\n\t\t[verifyNode],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst result = data[0] as Record<string, unknown> | null;\n\t\t\tif (result) {\n\t\t\t\tconst v = result.verification as Record<string, unknown> | null;\n\t\t\t\tif (v && v.valid === false) {\n\t\t\t\t\tactions.emit(result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tactions.emit(null);\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(fbCondition as Node<unknown>, { name: \"feedback_condition\" });\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 3. contentModerationGraph\n// ---------------------------------------------------------------------------\n\n/** Classification result from LLM moderation. */\nexport type ModerationResult = {\n\tlabel: \"safe\" | \"review\" | \"block\";\n\tconfidence: number;\n\treason?: string;\n\toriginal: unknown;\n};\n\n/** Options for {@link contentModerationGraph}. */\nexport type ContentModerationGraphOptions = GraphOptions & {\n\t/** Content source (text/multimedia ingest). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification function: returns a ModerationResult.\n\t * Default: labels everything \"review\" with confidence 0.5.\n\t */\n\tclassify?: (content: unknown) => ModerationResult;\n\n\t/** System prompt for LLM classification. */\n\tsystemPrompt?: string;\n\n\t/** Scorer weights: [safe, review, block]. Default: [0.1, 1, 2]. */\n\tweights?: [number, number, number];\n\n\t/** Max feedback iterations for policy refinement. Default: 5. */\n\tmaxFeedbackIterations?: number;\n\n\t/** Max review queue size. When set, oldest entries are trimmed on overflow. */\n\tmaxQueueSize?: number;\n};\n\n/**\n * Content ingest → LLM/rule classification → stratified routing (safe/review/block) →\n * human review queue → scorer → feedback (false positives → policy refinement) → output.\n *\n * Well-known node names:\n * - `\"source\"` — content ingest\n * - `\"classify\"` — LLM or rule-based classification\n * - `\"stratify::branch/safe\"`, `\"stratify::branch/review\"`, `\"stratify::branch/block\"` — routed branches\n * - `\"review_queue\"` — state node for human review items\n * - `\"priority\"` — scored priority output\n * - `\"policy\"` — writable state for policy refinement\n * - `\"output\"` — final moderation output\n *\n * @category patterns\n */\nexport function contentModerationGraph(name: string, opts: ContentModerationGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(opts.source, { name: \"source\" });\n\n\t// --- Classify ---\n\tconst defaultClassify = (content: unknown): ModerationResult => ({\n\t\tlabel: \"review\",\n\t\tconfidence: 0.5,\n\t\toriginal: content,\n\t});\n\tconst classifyFn = opts.classify ?? defaultClassify;\n\tconst classifyNode = node<ModerationResult>(\n\t\t[opts.source],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(classifyFn(data[0]));\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"content_moderation\", { stage: \"classify\" }),\n\t\t},\n\t);\n\tg.add(classifyNode as Node<unknown>, { name: \"classify\" });\n\n\t// --- Stratify (safe / review / block) ---\n\tconst strat = stratify<ModerationResult>(\"stratify\", classifyNode, [\n\t\t{ name: \"safe\", classify: (v) => v.label === \"safe\" },\n\t\t{ name: \"review\", classify: (v) => v.label === \"review\" },\n\t\t{ name: \"block\", classify: (v) => v.label === \"block\" },\n\t]);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Review queue (reactiveLog — O(1) append, bounded) ---\n\tconst reviewLog = reactiveLog<ModerationResult>([], {\n\t\tname: \"review_queue\",\n\t\tmaxSize: opts.maxQueueSize,\n\t});\n\tg.add(reviewLog.entries as Node<unknown>, { name: \"review_queue\" });\n\n\t// Bridge review branch → review queue accumulator\n\tlet reviewBranch: Node<unknown>;\n\ttry {\n\t\treviewBranch = g.resolve(\"stratify::branch/review\");\n\t} catch {\n\t\treviewBranch = node<unknown>([], { initial: null });\n\t\tg.add(reviewBranch, { name: \"__review_fallback\" });\n\t}\n\tconst reviewAccumulator = node(\n\t\t[reviewBranch],\n\t\t(batchData, _actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst item = data[0] as ModerationResult | null;\n\t\t\tif (item) {\n\t\t\t\treviewLog.append(item);\n\t\t\t}\n\t\t},\n\t\t{ describeKind: \"effect\" },\n\t);\n\tg.add(reviewAccumulator as Node<unknown>, { name: \"__review_accumulator\" });\n\tg.addDisposer(keepalive(reviewAccumulator as Node<unknown>));\n\ttry {\n\t} catch {\n\t\t// fallback branch — no stratify edge to register\n\t}\n\n\t// --- Policy state (human/LLM writable) ---\n\tconst policy = node<Record<string, unknown>>([], {\n\t\tinitial: {},\n\t\tmeta: baseMeta(\"content_moderation\", {\n\t\t\tstage: \"policy\",\n\t\t\taccess: \"both\",\n\t\t\tdescription: \"Moderation policy rules — updated via feedback\",\n\t\t}),\n\t});\n\tg.add(policy as Node<unknown>, { name: \"policy\" });\n\n\t// --- Priority scorer ---\n\tconst weights = opts.weights ?? [0.1, 1, 2];\n\tconst confidenceSignal = node<number>(\n\t\t[classifyNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst r = data[0] as ModerationResult | null;\n\t\t\tactions.emit(r?.confidence ?? 0);\n\t\t},\n\t\t{ describeKind: \"derived\" },\n\t);\n\tconst severitySignal = node<number>(\n\t\t[classifyNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst r = data[0] as ModerationResult | null;\n\t\t\tif (!r) {\n\t\t\t\tactions.emit(0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactions.emit(\n\t\t\t\tr.label === \"block\" ? weights[2] : r.label === \"review\" ? weights[1] : weights[0],\n\t\t\t);\n\t\t},\n\t\t{ describeKind: \"derived\" },\n\t);\n\tg.add(confidenceSignal as Node<unknown>, { name: \"__confidence_signal\" });\n\tg.add(severitySignal as Node<unknown>, { name: \"__severity_signal\" });\n\n\tconst wConfidence = node<number>([], { initial: 1 });\n\tconst wSeverity = node<number>([], { initial: 1 });\n\tg.add(wConfidence as Node<unknown>, { name: \"__w_confidence\" });\n\tg.add(wSeverity as Node<unknown>, { name: \"__w_severity\" });\n\n\tconst priority = scorer([confidenceSignal, severitySignal], [wConfidence, wSeverity]);\n\tg.add(priority as Node<unknown>, { name: \"priority\" });\n\n\t// --- Output ---\n\tconst output = node<unknown>(\n\t\t[classifyNode as Node, priority as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit({\n\t\t\t\tclassification: vals[0],\n\t\t\t\tpriority: vals[1],\n\t\t\t});\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"content_moderation\", { stage: \"output\" }) },\n\t);\n\tg.add(output, { name: \"output\" });\n\n\t// --- Feedback (false positive → policy refinement) ---\n\t// Feedback condition: human marks a review item as false positive.\n\t// When review_queue changes and policy exists, signal for update.\n\tconst fbCondition = node<unknown>(\n\t\t[reviewLog.entries as Node, policy as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst entries = vals[0] as readonly ModerationResult[] | null;\n\t\t\tif (entries && entries.length > 0) {\n\t\t\t\tconst latest = entries[entries.length - 1];\n\t\t\t\t// Items explicitly marked as false positive feed back\n\t\t\t\tif (latest && (latest as unknown as Record<string, unknown>).falsePositive) {\n\t\t\t\t\tactions.emit(latest);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tactions.emit(null);\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"content_moderation\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(fbCondition as Node<unknown>, { name: \"feedback_condition\" });\n\tfeedback(g, \"feedback_condition\", \"policy\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 4. dataQualityGraph\n// ---------------------------------------------------------------------------\n\n/** Schema validation result. */\nexport type ValidationResult = {\n\tvalid: boolean;\n\terrors: string[];\n\trecord: unknown;\n};\n\n/** Anomaly detection result. */\nexport type AnomalyResult = {\n\tanomaly: boolean;\n\tscore: number;\n\tdetail?: string;\n\trecord: unknown;\n};\n\n/** Options for {@link dataQualityGraph}. */\nexport type DataQualityGraphOptions = GraphOptions & {\n\t/** Data source (e.g. fromPrisma(...), fromKysely(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Schema validation function.\n\t * Default: always valid.\n\t */\n\tvalidate?: (record: unknown) => ValidationResult;\n\n\t/**\n\t * Anomaly detection function.\n\t * Default: no anomaly.\n\t */\n\tdetectAnomaly?: (record: unknown) => AnomalyResult;\n\n\t/**\n\t * Drift detection: compares current record against baseline.\n\t * Default: no drift.\n\t */\n\tdetectDrift?: (record: unknown, baseline: unknown) => unknown;\n\n\t/**\n\t * Remediation suggestion function.\n\t * Default: no suggestion.\n\t */\n\tsuggest?: (result: { validation: ValidationResult; anomaly: AnomalyResult }) => unknown;\n\n\t/** Max feedback iterations for rule refinement. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Data ingest → schema validation → anomaly detection → drift alerting →\n * auto-remediation suggestions → output.\n *\n * Well-known node names:\n * - `\"source\"` — data ingest\n * - `\"validate\"` — schema validation\n * - `\"anomaly\"` — anomaly detection\n * - `\"baseline\"` — rolling baseline state\n * - `\"drift\"` — drift detection\n * - `\"remediate\"` — auto-remediation suggestions\n * - `\"output\"` — combined quality report\n *\n * @category patterns\n */\nexport function dataQualityGraph(name: string, opts: DataQualityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(opts.source, { name: \"source\" });\n\n\t// --- Schema validation ---\n\tconst validateFn =\n\t\topts.validate ??\n\t\t((record: unknown): ValidationResult => ({\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\trecord,\n\t\t}));\n\tconst validateNode = node<ValidationResult | undefined>(\n\t\t[opts.source],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(data[0] != null ? validateFn(data[0]) : undefined);\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"data_quality\", { stage: \"validate\" }) },\n\t);\n\tg.add(validateNode as Node<unknown>, { name: \"validate\" });\n\n\t// --- Anomaly detection ---\n\tconst detectAnomalyFn =\n\t\topts.detectAnomaly ??\n\t\t((record: unknown): AnomalyResult => ({\n\t\t\tanomaly: false,\n\t\t\tscore: 0,\n\t\t\trecord,\n\t\t}));\n\tconst anomalyNode = node<AnomalyResult | undefined>(\n\t\t[opts.source],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(data[0] != null ? detectAnomalyFn(data[0]) : undefined);\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"data_quality\", { stage: \"anomaly\" }) },\n\t);\n\tg.add(anomalyNode as Node<unknown>, { name: \"anomaly\" });\n\n\t// --- Baseline (rolling state) ---\n\tconst baseline = node<unknown>([], {\n\t\tinitial: null,\n\t\tmeta: baseMeta(\"data_quality\", {\n\t\t\tstage: \"baseline\",\n\t\t\tdescription: \"Rolling baseline for drift detection\",\n\t\t}),\n\t});\n\tg.add(baseline, { name: \"baseline\" });\n\n\t// Update baseline on valid records\n\tconst baselineUpdater = node(\n\t\t[validateNode as Node],\n\t\t(batchData, _actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst result = data[0] as ValidationResult;\n\t\t\tif (result?.valid) {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tbaseline.emit(result.record);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t{ describeKind: \"effect\" },\n\t);\n\tg.add(baselineUpdater as Node<unknown>, { name: \"__baseline_updater\" });\n\tkeepalive(baselineUpdater as Node<unknown>);\n\n\t// --- Drift detection ---\n\tconst detectDriftFn = opts.detectDrift ?? (() => ({ drift: false }));\n\tconst driftNode = node<unknown>(\n\t\t[opts.source, baseline],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(detectDriftFn(data[0], data[1]));\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"data_quality\", { stage: \"drift\" }) },\n\t);\n\tg.add(driftNode, { name: \"drift\" });\n\n\t// --- Remediation suggestions ---\n\tconst suggestFn = opts.suggest ?? (() => null);\n\tconst remediateNode = node<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit(\n\t\t\t\tsuggestFn({\n\t\t\t\t\tvalidation: data[0] as ValidationResult,\n\t\t\t\t\tanomaly: data[1] as AnomalyResult,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"data_quality\", { stage: \"remediate\" }) },\n\t);\n\tg.add(remediateNode, { name: \"remediate\" });\n\n\t// --- Output ---\n\tconst output = node<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node, driftNode, remediateNode],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst vals = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tactions.emit({\n\t\t\t\tvalidation: vals[0],\n\t\t\t\tanomaly: vals[1],\n\t\t\t\tdrift: vals[2],\n\t\t\t\tremediation: vals[3],\n\t\t\t});\n\t\t},\n\t\t{ describeKind: \"derived\", meta: baseMeta(\"data_quality\", { stage: \"output\" }) },\n\t);\n\tg.add(output, { name: \"output\" });\n\n\t// --- Feedback (anomaly → validation rule refinement) ---\n\tconst validationRules = node<unknown[]>([], {\n\t\tinitial: [],\n\t\tmeta: baseMeta(\"data_quality\", { stage: \"validation_rules\" }),\n\t});\n\tg.add(validationRules as Node<unknown>, { name: \"validation_rules\" });\n\n\tconst fbCondition = node<unknown>(\n\t\t[anomalyNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst data = batchData.map((batch, i) =>\n\t\t\t\tbatch != null && batch.length > 0 ? batch.at(-1) : ctx.prevData[i],\n\t\t\t);\n\t\t\tconst a = data[0] as AnomalyResult | null;\n\t\t\tactions.emit(a?.anomaly ? a : null);\n\t\t},\n\t\t{\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"data_quality\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(fbCondition as Node<unknown>, { name: \"feedback_condition\" });\n\tfeedback(g, \"feedback_condition\", \"validation_rules\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if a value has a `type` or `kind` tag matching the given label. */\nfunction isTagged(value: unknown, tag: string): boolean {\n\tif (value == null || typeof value !== \"object\") return false;\n\tconst v = value as Record<string, unknown>;\n\treturn v.type === tag || v.kind === tag;\n}\n"],"mappings":"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","names":["batch"]}
@@ -0,0 +1,452 @@
1
+ // src/base/render/_layout-sugiyama.ts
2
+ function sugiyamaLayout(input) {
3
+ const state = buildInitial(input);
4
+ assignLayers(state);
5
+ insertVirtualNodes(state);
6
+ minimizeCrossings(state);
7
+ assignCoordinates(state, input);
8
+ const edges = routeEdges(state, input);
9
+ const { width, height } = boundingBox(state);
10
+ const boxes = [];
11
+ for (const layer of state.layers) {
12
+ for (const n of layer) {
13
+ if (n.isVirtual) continue;
14
+ boxes.push({
15
+ id: n.id,
16
+ layer: n.layer,
17
+ order: n.order,
18
+ x: n.x,
19
+ y: n.y,
20
+ w: n.w,
21
+ h: n.h
22
+ });
23
+ }
24
+ }
25
+ return { boxes, edges, width, height };
26
+ }
27
+ function buildInitial(input) {
28
+ const nodes = /* @__PURE__ */ new Map();
29
+ for (const id of input.nodes) {
30
+ nodes.set(id, {
31
+ id,
32
+ isVirtual: false,
33
+ layer: -1,
34
+ order: 0,
35
+ x: 0,
36
+ y: 0,
37
+ w: input.widthCells(id),
38
+ h: input.heightCells(id),
39
+ in: [],
40
+ out: []
41
+ });
42
+ }
43
+ const hops = [];
44
+ let chainId = 0;
45
+ for (const e of input.edges) {
46
+ if (e.from === e.to) continue;
47
+ const f = nodes.get(e.from);
48
+ const t = nodes.get(e.to);
49
+ if (!f || !t) continue;
50
+ const hop = {
51
+ chainId: chainId++,
52
+ chainFrom: e.from,
53
+ chainTo: e.to,
54
+ fromId: e.from,
55
+ toId: e.to,
56
+ hopIndex: 0,
57
+ chainLen: 1
58
+ };
59
+ f.out.push(hop);
60
+ t.in.push(hop);
61
+ hops.push(hop);
62
+ }
63
+ return { nodes, layers: [], hops };
64
+ }
65
+ function assignLayers(state) {
66
+ const indeg = /* @__PURE__ */ new Map();
67
+ for (const n of state.nodes.values()) indeg.set(n.id, n.in.length);
68
+ const queue = [];
69
+ for (const n of state.nodes.values()) {
70
+ if ((indeg.get(n.id) ?? 0) === 0) {
71
+ n.layer = 0;
72
+ queue.push(n);
73
+ }
74
+ }
75
+ const visited = /* @__PURE__ */ new Set();
76
+ let head = 0;
77
+ while (head < queue.length) {
78
+ const n = queue[head++];
79
+ if (visited.has(n.id)) continue;
80
+ visited.add(n.id);
81
+ for (const hop of n.out) {
82
+ const t = state.nodes.get(hop.toId);
83
+ t.layer = Math.max(t.layer, n.layer + 1);
84
+ const d = (indeg.get(t.id) ?? 0) - 1;
85
+ indeg.set(t.id, d);
86
+ if (d <= 0) queue.push(t);
87
+ }
88
+ }
89
+ for (const n of state.nodes.values()) if (n.layer < 0) n.layer = 0;
90
+ }
91
+ function insertVirtualNodes(state) {
92
+ const maxLayer = Math.max(0, ...Array.from(state.nodes.values(), (n) => n.layer));
93
+ const layers = Array.from({ length: maxLayer + 1 }, () => []);
94
+ for (const n of state.nodes.values()) layers[n.layer].push(n);
95
+ const newHops = [];
96
+ let virtCounter = 0;
97
+ for (const hop of state.hops) {
98
+ const f = state.nodes.get(hop.fromId);
99
+ const t = state.nodes.get(hop.toId);
100
+ const span = t.layer - f.layer;
101
+ if (span <= 0) {
102
+ f.out = f.out.filter((h) => h !== hop);
103
+ t.in = t.in.filter((h) => h !== hop);
104
+ continue;
105
+ }
106
+ if (span === 1) {
107
+ hop.hopIndex = 0;
108
+ hop.chainLen = 1;
109
+ newHops.push(hop);
110
+ continue;
111
+ }
112
+ f.out = f.out.filter((h) => h !== hop);
113
+ t.in = t.in.filter((h) => h !== hop);
114
+ let prev = f;
115
+ for (let i = 1; i < span; i += 1) {
116
+ const vid = `__virt_${virtCounter++}__`;
117
+ const v = {
118
+ id: vid,
119
+ isVirtual: true,
120
+ layer: f.layer + i,
121
+ order: 0,
122
+ x: 0,
123
+ y: 0,
124
+ w: 0,
125
+ h: 1,
126
+ in: [],
127
+ out: []
128
+ };
129
+ state.nodes.set(vid, v);
130
+ layers[v.layer].push(v);
131
+ const h = {
132
+ chainId: hop.chainId,
133
+ chainFrom: hop.chainFrom,
134
+ chainTo: hop.chainTo,
135
+ fromId: prev.id,
136
+ toId: vid,
137
+ hopIndex: i - 1,
138
+ chainLen: span
139
+ };
140
+ prev.out.push(h);
141
+ v.in.push(h);
142
+ newHops.push(h);
143
+ prev = v;
144
+ }
145
+ const finalHop = {
146
+ chainId: hop.chainId,
147
+ chainFrom: hop.chainFrom,
148
+ chainTo: hop.chainTo,
149
+ fromId: prev.id,
150
+ toId: t.id,
151
+ hopIndex: span - 1,
152
+ chainLen: span
153
+ };
154
+ prev.out.push(finalHop);
155
+ t.in.push(finalHop);
156
+ newHops.push(finalHop);
157
+ }
158
+ for (const layer of layers) {
159
+ for (let i = 0; i < layer.length; i += 1) layer[i].order = i;
160
+ }
161
+ state.layers = layers;
162
+ state.hops = newHops;
163
+ }
164
+ function minimizeCrossings(state) {
165
+ const SWEEPS = 4;
166
+ for (let sweep = 0; sweep < SWEEPS; sweep += 1) {
167
+ for (let li = 1; li < state.layers.length; li += 1) {
168
+ sortByBarycenter(state, state.layers[li], "in");
169
+ reindex(state.layers[li]);
170
+ }
171
+ for (let li = state.layers.length - 2; li >= 0; li -= 1) {
172
+ sortByBarycenter(state, state.layers[li], "out");
173
+ reindex(state.layers[li]);
174
+ }
175
+ }
176
+ for (let iter = 0; iter < 2; iter += 1) {
177
+ let improved = false;
178
+ for (let li = 1; li < state.layers.length; li += 1) {
179
+ const layer = state.layers[li];
180
+ for (let i = 0; i + 1 < layer.length; i += 1) {
181
+ const before = pairCrossings(state, layer[i], layer[i + 1], "in");
182
+ [layer[i], layer[i + 1]] = [layer[i + 1], layer[i]];
183
+ reindex(layer);
184
+ const after = pairCrossings(state, layer[i], layer[i + 1], "in");
185
+ if (after < before) {
186
+ improved = true;
187
+ } else {
188
+ [layer[i], layer[i + 1]] = [layer[i + 1], layer[i]];
189
+ reindex(layer);
190
+ }
191
+ }
192
+ }
193
+ if (!improved) break;
194
+ }
195
+ }
196
+ function sortByBarycenter(state, layer, direction) {
197
+ const bary = /* @__PURE__ */ new Map();
198
+ for (const n of layer) {
199
+ const neighbors = direction === "in" ? n.in : n.out;
200
+ if (neighbors.length === 0) {
201
+ bary.set(n.id, n.order);
202
+ continue;
203
+ }
204
+ let sum = 0;
205
+ let count = 0;
206
+ for (const h of neighbors) {
207
+ const other = state.nodes.get(direction === "in" ? h.fromId : h.toId);
208
+ if (!other) continue;
209
+ sum += other.order;
210
+ count += 1;
211
+ }
212
+ bary.set(n.id, count === 0 ? n.order : sum / count);
213
+ }
214
+ layer.sort((a, b) => {
215
+ const ba = bary.get(a.id);
216
+ const bb = bary.get(b.id);
217
+ if (ba !== bb) return ba - bb;
218
+ return a.order - b.order;
219
+ });
220
+ }
221
+ function reindex(layer) {
222
+ for (let i = 0; i < layer.length; i += 1) layer[i].order = i;
223
+ }
224
+ function pairCrossings(state, a, b, direction) {
225
+ const aEdges = direction === "in" ? a.in : a.out;
226
+ const bEdges = direction === "in" ? b.in : b.out;
227
+ let crossings = 0;
228
+ for (const ea of aEdges) {
229
+ for (const eb of bEdges) {
230
+ const oa = state.nodes.get(direction === "in" ? ea.fromId : ea.toId)?.order ?? 0;
231
+ const ob = state.nodes.get(direction === "in" ? eb.fromId : eb.toId)?.order ?? 0;
232
+ if (a.order < b.order && oa > ob || a.order > b.order && oa < ob) {
233
+ crossings += 1;
234
+ }
235
+ }
236
+ }
237
+ return crossings;
238
+ }
239
+ function assignCoordinates(state, input) {
240
+ if (input.direction === "LR") assignCoordinatesLR(state, input);
241
+ else assignCoordinatesTD(state, input);
242
+ }
243
+ function assignCoordinatesLR(state, input) {
244
+ const layerX = [];
245
+ let cursorX = 0;
246
+ for (let li = 0; li < state.layers.length; li += 1) {
247
+ layerX.push(cursorX);
248
+ let maxW = 0;
249
+ for (const n of state.layers[li]) maxW = Math.max(maxW, n.w);
250
+ cursorX += maxW + input.layerGap;
251
+ }
252
+ for (let li = 0; li < state.layers.length; li += 1) {
253
+ for (const n of state.layers[li]) n.x = layerX[li];
254
+ }
255
+ for (const layer of state.layers) {
256
+ let y = 0;
257
+ for (const n of layer) {
258
+ n.y = y;
259
+ y += n.h + input.nodeGap;
260
+ }
261
+ }
262
+ runMedianPasses(state, input, "y");
263
+ }
264
+ function assignCoordinatesTD(state, input) {
265
+ const layerY = [];
266
+ let cursorY = 0;
267
+ for (let li = 0; li < state.layers.length; li += 1) {
268
+ layerY.push(cursorY);
269
+ let maxH = 0;
270
+ for (const n of state.layers[li]) maxH = Math.max(maxH, n.h);
271
+ cursorY += maxH + input.layerGap;
272
+ }
273
+ for (let li = 0; li < state.layers.length; li += 1) {
274
+ for (const n of state.layers[li]) n.y = layerY[li];
275
+ }
276
+ for (const layer of state.layers) {
277
+ let x = 0;
278
+ for (const n of layer) {
279
+ n.x = x;
280
+ x += n.w + input.nodeGap;
281
+ }
282
+ }
283
+ runMedianPasses(state, input, "x");
284
+ }
285
+ function runMedianPasses(state, input, axis) {
286
+ const sizeOf = (n) => axis === "y" ? n.h : n.w;
287
+ const gap = input.nodeGap;
288
+ for (let pass = 0; pass < 2; pass += 1) {
289
+ const walk = pass === 0 ? state.layers.slice(1) : state.layers.slice(0, -1).reverse();
290
+ for (const layer of walk) {
291
+ const preferred = /* @__PURE__ */ new Map();
292
+ for (const n of layer) {
293
+ const neighbors = pass === 0 ? n.in : n.out;
294
+ if (neighbors.length === 0) continue;
295
+ const centers = [];
296
+ for (const h of neighbors) {
297
+ const other = state.nodes.get(pass === 0 ? h.fromId : h.toId);
298
+ if (!other) continue;
299
+ const base = axis === "y" ? other.y : other.x;
300
+ centers.push(base + Math.floor(sizeOf(other) / 2));
301
+ }
302
+ if (centers.length === 0) continue;
303
+ centers.sort((a, b) => a - b);
304
+ const mid = centers[Math.floor(centers.length / 2)];
305
+ preferred.set(n.id, mid - Math.floor(sizeOf(n) / 2));
306
+ }
307
+ let floor = 0;
308
+ for (const n of layer) {
309
+ const p = preferred.get(n.id);
310
+ const current = axis === "y" ? n.y : n.x;
311
+ const target = p ?? current;
312
+ const clamped = Math.max(target, floor);
313
+ if (axis === "y") n.y = clamped;
314
+ else n.x = clamped;
315
+ floor = clamped + sizeOf(n) + gap;
316
+ }
317
+ }
318
+ }
319
+ }
320
+ function routeEdges(state, input) {
321
+ const byChain = /* @__PURE__ */ new Map();
322
+ for (const h of state.hops) {
323
+ const arr = byChain.get(h.chainId);
324
+ if (arr) arr.push(h);
325
+ else byChain.set(h.chainId, [h]);
326
+ }
327
+ for (const arr of byChain.values()) arr.sort((a, b) => a.hopIndex - b.hopIndex);
328
+ const isLR = input.direction === "LR";
329
+ const primary = (n) => isLR ? n.x : n.y;
330
+ const primarySize = (n) => isLR ? n.w : n.h;
331
+ const crossCenter = (n) => isLR ? n.y + Math.floor(n.h / 2) : n.x + Math.floor(n.w / 2);
332
+ const hopTrackCross = /* @__PURE__ */ new Map();
333
+ for (let g = 0; g + 1 < state.layers.length; g += 1) {
334
+ const srcLayer = state.layers[g];
335
+ const dstLayer = state.layers[g + 1];
336
+ let gutterStart = 0;
337
+ for (const n of srcLayer) gutterStart = Math.max(gutterStart, primary(n) + primarySize(n));
338
+ let gutterEnd = Number.POSITIVE_INFINITY;
339
+ for (const n of dstLayer) gutterEnd = Math.min(gutterEnd, primary(n));
340
+ const gEnd = Number.isFinite(gutterEnd) ? gutterEnd - 1 : gutterStart;
341
+ const gutterWidth = Math.max(1, gEnd - gutterStart + 1);
342
+ const gutterHops = [];
343
+ for (const n of srcLayer) for (const h of n.out) gutterHops.push(h);
344
+ gutterHops.sort((a, b) => {
345
+ const sa = crossCenter(state.nodes.get(a.fromId));
346
+ const sb = crossCenter(state.nodes.get(b.fromId));
347
+ if (sa !== sb) return sa - sb;
348
+ const da = crossCenter(state.nodes.get(a.toId));
349
+ const db = crossCenter(state.nodes.get(b.toId));
350
+ return da - db;
351
+ });
352
+ const tracks = [];
353
+ const hopToTrackIdx = /* @__PURE__ */ new Map();
354
+ for (const h of gutterHops) {
355
+ const sc = crossCenter(state.nodes.get(h.fromId));
356
+ const dc = crossCenter(state.nodes.get(h.toId));
357
+ const lo = Math.min(sc, dc);
358
+ const hi = Math.max(sc, dc);
359
+ let idx = -1;
360
+ for (let t = 0; t < tracks.length; t += 1) {
361
+ const intervals = tracks[t];
362
+ let fits = true;
363
+ for (const iv of intervals) {
364
+ if (iv.lo <= hi && lo <= iv.hi) {
365
+ fits = false;
366
+ break;
367
+ }
368
+ }
369
+ if (fits) {
370
+ intervals.push({ lo, hi });
371
+ idx = t;
372
+ break;
373
+ }
374
+ }
375
+ if (idx < 0) {
376
+ tracks.push([{ lo, hi }]);
377
+ idx = tracks.length - 1;
378
+ }
379
+ hopToTrackIdx.set(h, idx);
380
+ }
381
+ const count = tracks.length;
382
+ const hasMargin = gutterWidth >= Math.max(3, count + 2);
383
+ const usableStart = hasMargin ? gutterStart + 1 : gutterStart;
384
+ const usableEnd = hasMargin ? gEnd - 1 : gEnd;
385
+ const usableWidth = Math.max(1, usableEnd - usableStart + 1);
386
+ for (const h of gutterHops) {
387
+ const idx = hopToTrackIdx.get(h);
388
+ let trackPrimary;
389
+ if (count <= 1) {
390
+ trackPrimary = usableStart + Math.floor(usableWidth / 2);
391
+ } else {
392
+ const step = (usableWidth - 1) / (count - 1);
393
+ trackPrimary = usableStart + Math.floor(idx * step);
394
+ }
395
+ hopTrackCross.set(h, Math.max(gutterStart, Math.min(gEnd, trackPrimary)));
396
+ }
397
+ }
398
+ const out = [];
399
+ for (const [, hops] of byChain) {
400
+ const points = [];
401
+ for (let i = 0; i < hops.length; i += 1) {
402
+ const h = hops[i];
403
+ const src = state.nodes.get(h.fromId);
404
+ const dst = state.nodes.get(h.toId);
405
+ const track = hopTrackCross.get(h);
406
+ const srcPrimary = src.isVirtual ? primary(src) : primary(src) + primarySize(src);
407
+ const dstPrimary = dst.isVirtual ? primary(dst) : primary(dst) - 1;
408
+ const sc = crossCenter(src);
409
+ const dc = crossCenter(dst);
410
+ if (i === 0) pushPoint(points, isLR, srcPrimary, sc);
411
+ if (sc !== dc) {
412
+ pushPoint(points, isLR, track, sc);
413
+ pushPoint(points, isLR, track, dc);
414
+ }
415
+ pushPoint(points, isLR, dstPrimary, dc);
416
+ }
417
+ const chain = hops[0];
418
+ out.push({
419
+ from: chain.chainFrom,
420
+ to: chain.chainTo,
421
+ points: dedupWaypoints(points)
422
+ });
423
+ }
424
+ return out;
425
+ }
426
+ function pushPoint(acc, isLR, primary, cross) {
427
+ acc.push(isLR ? { x: primary, y: cross } : { x: cross, y: primary });
428
+ }
429
+ function dedupWaypoints(points) {
430
+ const out = [];
431
+ for (const p of points) {
432
+ const last = out[out.length - 1];
433
+ if (!last || last.x !== p.x || last.y !== p.y) out.push(p);
434
+ }
435
+ return out;
436
+ }
437
+ function boundingBox(state) {
438
+ let w = 0;
439
+ let h = 0;
440
+ for (const layer of state.layers) {
441
+ for (const n of layer) {
442
+ w = Math.max(w, n.x + n.w);
443
+ h = Math.max(h, n.y + n.h);
444
+ }
445
+ }
446
+ return { width: w, height: h };
447
+ }
448
+
449
+ export {
450
+ sugiyamaLayout
451
+ };
452
+ //# sourceMappingURL=chunk-DMSNO6ZB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base/render/_layout-sugiyama.ts"],"sourcesContent":["/**\n * Sugiyama-style layered DAG layout on an integer grid.\n *\n * Pipeline:\n * 1. Longest-path layer assignment (sources at layer 0).\n * 2. Virtual-node splitting — every edge spanning more than one layer\n * becomes a chain of synthetic nodes on intermediate layers. Downstream\n * passes treat real and virtual nodes identically; crossing\n * minimization therefore works on wide + deep DAGs, not only\n * adjacent-layer cases.\n * 3. Crossing minimization — barycenter heuristic with alternating up /\n * down sweeps plus an adjacent-transposition polish pass.\n * 4. Coordinate assignment — greedy median-aligned packing with collision\n * resolution. Straightens vertical runs of virtual nodes so long edges\n * become straight lines where topology allows.\n * 5. Orthogonal edge routing — per-gutter x-track assignment; horizontal\n * segments sit at endpoint centerlines, vertical segments pack into the\n * gutter column range without overlap. Remaining crossings are\n * topologically unavoidable and will render as `┼` at draw time.\n *\n * Output coordinates are cell-grid integers (LR direction). TD rendering\n * swaps axes at draw time — the layout is direction-agnostic by\n * construction.\n *\n * Used only by [graph-spec-to-ascii.ts](./graph-spec-to-ascii.ts); not part of the public\n * `extra/render/index.ts` surface (underscore-prefixed).\n */\n\nexport type LayoutDirection = \"LR\" | \"TD\";\n\nexport type LayoutInput = {\n\t/** Node ids in stable iteration order. Determines initial tie-break. */\n\treadonly nodes: readonly string[];\n\t/** Edges by (from, to) path. Endpoints must be present in `nodes`. */\n\treadonly edges: ReadonlyArray<{ from: string; to: string }>;\n\t/** Label width in cells for each node (independent of direction). */\n\treadonly widthCells: (id: string) => number;\n\t/** Label height in cells for each node (independent of direction). */\n\treadonly heightCells: (id: string) => number;\n\t/**\n\t * Gap between layer \"columns\" (LR) or \"rows\" (TD), in cells.\n\t * Must allow enough room for per-gutter edge tracks.\n\t */\n\treadonly layerGap: number;\n\t/**\n\t * Gap between neighboring nodes *within* a layer, in cells.\n\t * LR: vertical gap; TD: horizontal gap.\n\t */\n\treadonly nodeGap: number;\n\t/**\n\t * Axis orientation. LR: layers = columns (x grows), order = rows (y grows).\n\t * TD: layers = rows (y grows), order = columns (x grows).\n\t */\n\treadonly direction: LayoutDirection;\n};\n\nexport type LayoutBox = {\n\treadonly id: string;\n\treadonly layer: number;\n\treadonly order: number;\n\treadonly x: number;\n\treadonly y: number;\n\treadonly w: number;\n\treadonly h: number;\n};\n\nexport type LayoutEdgePoint = { readonly x: number; readonly y: number };\n\nexport type LayoutEdge = {\n\treadonly from: string;\n\treadonly to: string;\n\t/** Polyline of waypoints (start → corners → end). Minimum 2 entries. */\n\treadonly points: readonly LayoutEdgePoint[];\n};\n\nexport type LayoutResult = {\n\treadonly boxes: readonly LayoutBox[];\n\treadonly edges: readonly LayoutEdge[];\n\treadonly width: number;\n\treadonly height: number;\n};\n\n// ---------------------------------------------------------------------------\n// Internal types — carried through the pipeline\n// ---------------------------------------------------------------------------\n\ntype Hop = {\n\tchainId: number;\n\tchainFrom: string;\n\tchainTo: string;\n\tfromId: string;\n\ttoId: string;\n\t/** 0-based hop index along the chain. */\n\thopIndex: number;\n\t/** Total hops in the chain (1 = direct, 2+ = spans virtuals). */\n\tchainLen: number;\n};\n\ntype InternalNode = {\n\tid: string;\n\tisVirtual: boolean;\n\tlayer: number;\n\torder: number;\n\tx: number;\n\ty: number;\n\tw: number;\n\th: number;\n\tin: Hop[];\n\tout: Hop[];\n};\n\ntype Layer = InternalNode[];\n\ntype PipelineState = {\n\tnodes: Map<string, InternalNode>;\n\tlayers: Layer[];\n\thops: Hop[];\n};\n\n// ---------------------------------------------------------------------------\n// Pipeline entry\n// ---------------------------------------------------------------------------\n\nexport function sugiyamaLayout(input: LayoutInput): LayoutResult {\n\tconst state = buildInitial(input);\n\tassignLayers(state);\n\tinsertVirtualNodes(state);\n\tminimizeCrossings(state);\n\tassignCoordinates(state, input);\n\tconst edges = routeEdges(state, input);\n\tconst { width, height } = boundingBox(state);\n\tconst boxes: LayoutBox[] = [];\n\tfor (const layer of state.layers) {\n\t\tfor (const n of layer) {\n\t\t\tif (n.isVirtual) continue;\n\t\t\tboxes.push({\n\t\t\t\tid: n.id,\n\t\t\t\tlayer: n.layer,\n\t\t\t\torder: n.order,\n\t\t\t\tx: n.x,\n\t\t\t\ty: n.y,\n\t\t\t\tw: n.w,\n\t\t\t\th: n.h,\n\t\t\t});\n\t\t}\n\t}\n\treturn { boxes, edges, width, height };\n}\n\n// ---------------------------------------------------------------------------\n// 1. Build internal graph\n// ---------------------------------------------------------------------------\n\nfunction buildInitial(input: LayoutInput): PipelineState {\n\tconst nodes = new Map<string, InternalNode>();\n\tfor (const id of input.nodes) {\n\t\tnodes.set(id, {\n\t\t\tid,\n\t\t\tisVirtual: false,\n\t\t\tlayer: -1,\n\t\t\torder: 0,\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tw: input.widthCells(id),\n\t\t\th: input.heightCells(id),\n\t\t\tin: [],\n\t\t\tout: [],\n\t\t});\n\t}\n\tconst hops: Hop[] = [];\n\tlet chainId = 0;\n\tfor (const e of input.edges) {\n\t\tif (e.from === e.to) continue; // drop self-loops\n\t\tconst f = nodes.get(e.from);\n\t\tconst t = nodes.get(e.to);\n\t\tif (!f || !t) continue; // drop dangling endpoints\n\t\tconst hop: Hop = {\n\t\t\tchainId: chainId++,\n\t\t\tchainFrom: e.from,\n\t\t\tchainTo: e.to,\n\t\t\tfromId: e.from,\n\t\t\ttoId: e.to,\n\t\t\thopIndex: 0,\n\t\t\tchainLen: 1,\n\t\t};\n\t\tf.out.push(hop);\n\t\tt.in.push(hop);\n\t\thops.push(hop);\n\t}\n\treturn { nodes, layers: [], hops };\n}\n\n// ---------------------------------------------------------------------------\n// 2. Longest-path layer assignment (Kahn's algorithm)\n// ---------------------------------------------------------------------------\n\nfunction assignLayers(state: PipelineState): void {\n\tconst indeg = new Map<string, number>();\n\tfor (const n of state.nodes.values()) indeg.set(n.id, n.in.length);\n\n\tconst queue: InternalNode[] = [];\n\tfor (const n of state.nodes.values()) {\n\t\tif ((indeg.get(n.id) ?? 0) === 0) {\n\t\t\tn.layer = 0;\n\t\t\tqueue.push(n);\n\t\t}\n\t}\n\n\t// Cursor-based BFS — `Array.prototype.shift` is O(n), so the naive form\n\t// is O(n²) and degrades past ~1000 nodes. Cursor keeps it linear.\n\tconst visited = new Set<string>();\n\tlet head = 0;\n\twhile (head < queue.length) {\n\t\tconst n = queue[head++]!;\n\t\tif (visited.has(n.id)) continue;\n\t\tvisited.add(n.id);\n\t\tfor (const hop of n.out) {\n\t\t\tconst t = state.nodes.get(hop.toId)!;\n\t\t\tt.layer = Math.max(t.layer, n.layer + 1);\n\t\t\tconst d = (indeg.get(t.id) ?? 0) - 1;\n\t\t\tindeg.set(t.id, d);\n\t\t\tif (d <= 0) queue.push(t);\n\t\t}\n\t}\n\t// Nodes trapped in a cycle default to layer 0. The edges that would\n\t// close the cycle are dropped in `insertVirtualNodes` (any hop whose\n\t// span is not a positive integer). GraphReFly graphs are DAGs by spec;\n\t// this path is defensive against malformed describe snapshots.\n\tfor (const n of state.nodes.values()) if (n.layer < 0) n.layer = 0;\n}\n\n// ---------------------------------------------------------------------------\n// 3. Virtual-node insertion — critical for scaling past adjacent-layer edges\n// ---------------------------------------------------------------------------\n\nfunction insertVirtualNodes(state: PipelineState): void {\n\tconst maxLayer = Math.max(0, ...Array.from(state.nodes.values(), (n) => n.layer));\n\tconst layers: Layer[] = Array.from({ length: maxLayer + 1 }, () => []);\n\tfor (const n of state.nodes.values()) layers[n.layer]!.push(n);\n\n\tconst newHops: Hop[] = [];\n\tlet virtCounter = 0;\n\tfor (const hop of state.hops) {\n\t\tconst f = state.nodes.get(hop.fromId)!;\n\t\tconst t = state.nodes.get(hop.toId)!;\n\t\tconst span = t.layer - f.layer;\n\t\tif (span <= 0) {\n\t\t\t// Same-layer or back-edge — the input violated the DAG invariant\n\t\t\t// (self-loop was already dropped in `buildInitial`; this catches\n\t\t\t// cycles whose nodes collapsed to layer 0 in `assignLayers`).\n\t\t\t// Drop from both endpoints so routing never sees the hop; same\n\t\t\t// render-best-effort policy as the self-loop / dangling-endpoint\n\t\t\t// filters in `buildInitial`.\n\t\t\tf.out = f.out.filter((h) => h !== hop);\n\t\t\tt.in = t.in.filter((h) => h !== hop);\n\t\t\tcontinue;\n\t\t}\n\t\tif (span === 1) {\n\t\t\thop.hopIndex = 0;\n\t\t\thop.chainLen = 1;\n\t\t\tnewHops.push(hop);\n\t\t\tcontinue;\n\t\t}\n\t\t// Multi-hop: f → v1 → v2 → ... → t\n\t\t// Detach the original edge from f.out / t.in; we rewrite as chain.\n\t\tf.out = f.out.filter((h) => h !== hop);\n\t\tt.in = t.in.filter((h) => h !== hop);\n\n\t\tlet prev = f;\n\t\tfor (let i = 1; i < span; i += 1) {\n\t\t\tconst vid = `__virt_${virtCounter++}__`;\n\t\t\tconst v: InternalNode = {\n\t\t\t\tid: vid,\n\t\t\t\tisVirtual: true,\n\t\t\t\tlayer: f.layer + i,\n\t\t\t\torder: 0,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\tw: 0,\n\t\t\t\th: 1,\n\t\t\t\tin: [],\n\t\t\t\tout: [],\n\t\t\t};\n\t\t\tstate.nodes.set(vid, v);\n\t\t\tlayers[v.layer]!.push(v);\n\t\t\tconst h: Hop = {\n\t\t\t\tchainId: hop.chainId,\n\t\t\t\tchainFrom: hop.chainFrom,\n\t\t\t\tchainTo: hop.chainTo,\n\t\t\t\tfromId: prev.id,\n\t\t\t\ttoId: vid,\n\t\t\t\thopIndex: i - 1,\n\t\t\t\tchainLen: span,\n\t\t\t};\n\t\t\tprev.out.push(h);\n\t\t\tv.in.push(h);\n\t\t\tnewHops.push(h);\n\t\t\tprev = v;\n\t\t}\n\t\tconst finalHop: Hop = {\n\t\t\tchainId: hop.chainId,\n\t\t\tchainFrom: hop.chainFrom,\n\t\t\tchainTo: hop.chainTo,\n\t\t\tfromId: prev.id,\n\t\t\ttoId: t.id,\n\t\t\thopIndex: span - 1,\n\t\t\tchainLen: span,\n\t\t};\n\t\tprev.out.push(finalHop);\n\t\tt.in.push(finalHop);\n\t\tnewHops.push(finalHop);\n\t}\n\n\t// Stable initial order within each layer.\n\tfor (const layer of layers) {\n\t\tfor (let i = 0; i < layer.length; i += 1) layer[i]!.order = i;\n\t}\n\tstate.layers = layers;\n\tstate.hops = newHops;\n}\n\n// ---------------------------------------------------------------------------\n// 4. Crossing minimization\n// ---------------------------------------------------------------------------\n\nfunction minimizeCrossings(state: PipelineState): void {\n\tconst SWEEPS = 4;\n\tfor (let sweep = 0; sweep < SWEEPS; sweep += 1) {\n\t\t// Down-sweep\n\t\tfor (let li = 1; li < state.layers.length; li += 1) {\n\t\t\tsortByBarycenter(state, state.layers[li]!, \"in\");\n\t\t\treindex(state.layers[li]!);\n\t\t}\n\t\t// Up-sweep\n\t\tfor (let li = state.layers.length - 2; li >= 0; li -= 1) {\n\t\t\tsortByBarycenter(state, state.layers[li]!, \"out\");\n\t\t\treindex(state.layers[li]!);\n\t\t}\n\t}\n\t// Polish — adjacent-transposition pass, bounded iterations.\n\tfor (let iter = 0; iter < 2; iter += 1) {\n\t\tlet improved = false;\n\t\tfor (let li = 1; li < state.layers.length; li += 1) {\n\t\t\tconst layer = state.layers[li]!;\n\t\t\tfor (let i = 0; i + 1 < layer.length; i += 1) {\n\t\t\t\tconst before = pairCrossings(state, layer[i]!, layer[i + 1]!, \"in\");\n\t\t\t\t[layer[i], layer[i + 1]] = [layer[i + 1]!, layer[i]!];\n\t\t\t\treindex(layer);\n\t\t\t\tconst after = pairCrossings(state, layer[i]!, layer[i + 1]!, \"in\");\n\t\t\t\tif (after < before) {\n\t\t\t\t\timproved = true;\n\t\t\t\t} else {\n\t\t\t\t\t[layer[i], layer[i + 1]] = [layer[i + 1]!, layer[i]!];\n\t\t\t\t\treindex(layer);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!improved) break;\n\t}\n}\n\nfunction sortByBarycenter(state: PipelineState, layer: Layer, direction: \"in\" | \"out\"): void {\n\tconst bary = new Map<string, number>();\n\tfor (const n of layer) {\n\t\tconst neighbors = direction === \"in\" ? n.in : n.out;\n\t\tif (neighbors.length === 0) {\n\t\t\tbary.set(n.id, n.order);\n\t\t\tcontinue;\n\t\t}\n\t\tlet sum = 0;\n\t\tlet count = 0;\n\t\tfor (const h of neighbors) {\n\t\t\tconst other = state.nodes.get(direction === \"in\" ? h.fromId : h.toId);\n\t\t\tif (!other) continue;\n\t\t\tsum += other.order;\n\t\t\tcount += 1;\n\t\t}\n\t\tbary.set(n.id, count === 0 ? n.order : sum / count);\n\t}\n\tlayer.sort((a, b) => {\n\t\tconst ba = bary.get(a.id)!;\n\t\tconst bb = bary.get(b.id)!;\n\t\tif (ba !== bb) return ba - bb;\n\t\treturn a.order - b.order;\n\t});\n}\n\nfunction reindex(layer: Layer): void {\n\tfor (let i = 0; i < layer.length; i += 1) layer[i]!.order = i;\n}\n\nfunction pairCrossings(\n\tstate: PipelineState,\n\ta: InternalNode,\n\tb: InternalNode,\n\tdirection: \"in\" | \"out\",\n): number {\n\tconst aEdges = direction === \"in\" ? a.in : a.out;\n\tconst bEdges = direction === \"in\" ? b.in : b.out;\n\tlet crossings = 0;\n\tfor (const ea of aEdges) {\n\t\tfor (const eb of bEdges) {\n\t\t\tconst oa = state.nodes.get(direction === \"in\" ? ea.fromId : ea.toId)?.order ?? 0;\n\t\t\tconst ob = state.nodes.get(direction === \"in\" ? eb.fromId : eb.toId)?.order ?? 0;\n\t\t\tif ((a.order < b.order && oa > ob) || (a.order > b.order && oa < ob)) {\n\t\t\t\tcrossings += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn crossings;\n}\n\n// ---------------------------------------------------------------------------\n// 5. Coordinate assignment (direction-aware)\n// ---------------------------------------------------------------------------\n\nfunction assignCoordinates(state: PipelineState, input: LayoutInput): void {\n\tif (input.direction === \"LR\") assignCoordinatesLR(state, input);\n\telse assignCoordinatesTD(state, input);\n}\n\nfunction assignCoordinatesLR(state: PipelineState, input: LayoutInput): void {\n\t// x: per-layer column based on cumulative max width.\n\tconst layerX: number[] = [];\n\tlet cursorX = 0;\n\tfor (let li = 0; li < state.layers.length; li += 1) {\n\t\tlayerX.push(cursorX);\n\t\tlet maxW = 0;\n\t\tfor (const n of state.layers[li]!) maxW = Math.max(maxW, n.w);\n\t\tcursorX += maxW + input.layerGap;\n\t}\n\tfor (let li = 0; li < state.layers.length; li += 1) {\n\t\tfor (const n of state.layers[li]!) n.x = layerX[li]!;\n\t}\n\t// y: greedy pack per layer.\n\tfor (const layer of state.layers) {\n\t\tlet y = 0;\n\t\tfor (const n of layer) {\n\t\t\tn.y = y;\n\t\t\ty += n.h + input.nodeGap;\n\t\t}\n\t}\n\t// Median alignment — straightens chains through virtuals.\n\trunMedianPasses(state, input, \"y\");\n}\n\nfunction assignCoordinatesTD(state: PipelineState, input: LayoutInput): void {\n\t// y: per-layer row based on cumulative max height.\n\tconst layerY: number[] = [];\n\tlet cursorY = 0;\n\tfor (let li = 0; li < state.layers.length; li += 1) {\n\t\tlayerY.push(cursorY);\n\t\tlet maxH = 0;\n\t\tfor (const n of state.layers[li]!) maxH = Math.max(maxH, n.h);\n\t\tcursorY += maxH + input.layerGap;\n\t}\n\tfor (let li = 0; li < state.layers.length; li += 1) {\n\t\tfor (const n of state.layers[li]!) n.y = layerY[li]!;\n\t}\n\t// x: greedy pack per layer.\n\tfor (const layer of state.layers) {\n\t\tlet x = 0;\n\t\tfor (const n of layer) {\n\t\t\tn.x = x;\n\t\t\tx += n.w + input.nodeGap;\n\t\t}\n\t}\n\trunMedianPasses(state, input, \"x\");\n}\n\n/**\n * Median alignment passes — pulls each node toward the median position of\n * its in-layer neighbors along the private axis (\"y\" for LR, \"x\" for TD),\n * then resolves collisions greedily while preserving layer order.\n */\nfunction runMedianPasses(state: PipelineState, input: LayoutInput, axis: \"x\" | \"y\"): void {\n\tconst sizeOf = (n: InternalNode) => (axis === \"y\" ? n.h : n.w);\n\tconst gap = input.nodeGap;\n\tfor (let pass = 0; pass < 2; pass += 1) {\n\t\tconst walk = pass === 0 ? state.layers.slice(1) : state.layers.slice(0, -1).reverse();\n\t\tfor (const layer of walk) {\n\t\t\tconst preferred = new Map<string, number>();\n\t\t\tfor (const n of layer) {\n\t\t\t\tconst neighbors = pass === 0 ? n.in : n.out;\n\t\t\t\tif (neighbors.length === 0) continue;\n\t\t\t\tconst centers: number[] = [];\n\t\t\t\tfor (const h of neighbors) {\n\t\t\t\t\tconst other = state.nodes.get(pass === 0 ? h.fromId : h.toId);\n\t\t\t\t\tif (!other) continue;\n\t\t\t\t\tconst base = axis === \"y\" ? other.y : other.x;\n\t\t\t\t\tcenters.push(base + Math.floor(sizeOf(other) / 2));\n\t\t\t\t}\n\t\t\t\tif (centers.length === 0) continue;\n\t\t\t\tcenters.sort((a, b) => a - b);\n\t\t\t\tconst mid = centers[Math.floor(centers.length / 2)]!;\n\t\t\t\tpreferred.set(n.id, mid - Math.floor(sizeOf(n) / 2));\n\t\t\t}\n\t\t\tlet floor = 0;\n\t\t\tfor (const n of layer) {\n\t\t\t\tconst p = preferred.get(n.id);\n\t\t\t\tconst current = axis === \"y\" ? n.y : n.x;\n\t\t\t\tconst target = p ?? current;\n\t\t\t\tconst clamped = Math.max(target, floor);\n\t\t\t\tif (axis === \"y\") n.y = clamped;\n\t\t\t\telse n.x = clamped;\n\t\t\t\tfloor = clamped + sizeOf(n) + gap;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// 6. Orthogonal edge routing (direction-aware)\n//\n// For both LR and TD the algorithm is symmetric — it just operates on a\n// different pair of \"primary\" vs \"cross\" axes:\n//\n// LR: primary = x (layer axis); cross = y. Gutters are vertical strips\n// between columns; tracks within a gutter are distinct x-values.\n// TD: primary = y (layer axis); cross = x. Gutters are horizontal strips\n// between rows; tracks within a gutter are distinct y-values.\n// ---------------------------------------------------------------------------\n\nfunction routeEdges(state: PipelineState, input: LayoutInput): LayoutEdge[] {\n\t// Group hops by chainId → one LayoutEdge per user-facing edge.\n\tconst byChain = new Map<number, Hop[]>();\n\tfor (const h of state.hops) {\n\t\tconst arr = byChain.get(h.chainId);\n\t\tif (arr) arr.push(h);\n\t\telse byChain.set(h.chainId, [h]);\n\t}\n\tfor (const arr of byChain.values()) arr.sort((a, b) => a.hopIndex - b.hopIndex);\n\n\tconst isLR = input.direction === \"LR\";\n\tconst primary = (n: InternalNode): number => (isLR ? n.x : n.y);\n\tconst primarySize = (n: InternalNode): number => (isLR ? n.w : n.h);\n\tconst crossCenter = (n: InternalNode): number =>\n\t\tisLR ? n.y + Math.floor(n.h / 2) : n.x + Math.floor(n.w / 2);\n\n\t// Per-gutter cross-axis track assignment. Two passes:\n\t// 1. Assign each hop to a track INDEX using disjoint-interval packing\n\t// (an existing track may host multiple hops as long as their\n\t// cross-axis ranges don't overlap pairwise).\n\t// 2. Map each track index to a primary-axis position using the final\n\t// track count so the distribution is uniform across the gutter —\n\t// per-hop recomputation (old behavior) collapsed late tracks onto\n\t// `gEnd`, producing bundled overlaps in dense gutters.\n\tconst hopTrackCross = new Map<Hop, number>();\n\tfor (let g = 0; g + 1 < state.layers.length; g += 1) {\n\t\tconst srcLayer = state.layers[g]!;\n\t\tconst dstLayer = state.layers[g + 1]!;\n\n\t\tlet gutterStart = 0;\n\t\tfor (const n of srcLayer) gutterStart = Math.max(gutterStart, primary(n) + primarySize(n));\n\t\tlet gutterEnd = Number.POSITIVE_INFINITY;\n\t\tfor (const n of dstLayer) gutterEnd = Math.min(gutterEnd, primary(n));\n\t\tconst gEnd = Number.isFinite(gutterEnd) ? (gutterEnd as number) - 1 : gutterStart;\n\t\tconst gutterWidth = Math.max(1, gEnd - gutterStart + 1);\n\n\t\tconst gutterHops: Hop[] = [];\n\t\tfor (const n of srcLayer) for (const h of n.out) gutterHops.push(h);\n\t\tgutterHops.sort((a, b) => {\n\t\t\tconst sa = crossCenter(state.nodes.get(a.fromId)!);\n\t\t\tconst sb = crossCenter(state.nodes.get(b.fromId)!);\n\t\t\tif (sa !== sb) return sa - sb;\n\t\t\tconst da = crossCenter(state.nodes.get(a.toId)!);\n\t\t\tconst db = crossCenter(state.nodes.get(b.toId)!);\n\t\t\treturn da - db;\n\t\t});\n\n\t\t// Pass 1: assign track indexes. Each track is an ARRAY of disjoint\n\t\t// intervals — two hops share a track iff their cross-axis ranges\n\t\t// don't overlap any existing interval on that track.\n\t\tconst tracks: Array<Array<{ lo: number; hi: number }>> = [];\n\t\tconst hopToTrackIdx = new Map<Hop, number>();\n\t\tfor (const h of gutterHops) {\n\t\t\tconst sc = crossCenter(state.nodes.get(h.fromId)!);\n\t\t\tconst dc = crossCenter(state.nodes.get(h.toId)!);\n\t\t\tconst lo = Math.min(sc, dc);\n\t\t\tconst hi = Math.max(sc, dc);\n\t\t\tlet idx = -1;\n\t\t\tfor (let t = 0; t < tracks.length; t += 1) {\n\t\t\t\tconst intervals = tracks[t]!;\n\t\t\t\tlet fits = true;\n\t\t\t\tfor (const iv of intervals) {\n\t\t\t\t\tif (iv.lo <= hi && lo <= iv.hi) {\n\t\t\t\t\t\tfits = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (fits) {\n\t\t\t\t\tintervals.push({ lo, hi });\n\t\t\t\t\tidx = t;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (idx < 0) {\n\t\t\t\ttracks.push([{ lo, hi }]);\n\t\t\t\tidx = tracks.length - 1;\n\t\t\t}\n\t\t\thopToTrackIdx.set(h, idx);\n\t\t}\n\n\t\t// Pass 2: distribute track indexes uniformly across the gutter's\n\t\t// **interior** (reserve 1-cell margin from each boundary when the\n\t\t// gutter is wide enough). A track placed exactly at `gutterStart`\n\t\t// or `gEnd` collapses the final turn-segment into the adjacent\n\t\t// node's border row, producing a visually misleading arrow; the\n\t\t// margin avoids that whenever geometry allows.\n\t\tconst count = tracks.length;\n\t\tconst hasMargin = gutterWidth >= Math.max(3, count + 2);\n\t\tconst usableStart = hasMargin ? gutterStart + 1 : gutterStart;\n\t\tconst usableEnd = hasMargin ? gEnd - 1 : gEnd;\n\t\tconst usableWidth = Math.max(1, usableEnd - usableStart + 1);\n\t\tfor (const h of gutterHops) {\n\t\t\tconst idx = hopToTrackIdx.get(h)!;\n\t\t\tlet trackPrimary: number;\n\t\t\tif (count <= 1) {\n\t\t\t\ttrackPrimary = usableStart + Math.floor(usableWidth / 2);\n\t\t\t} else {\n\t\t\t\tconst step = (usableWidth - 1) / (count - 1);\n\t\t\t\ttrackPrimary = usableStart + Math.floor(idx * step);\n\t\t\t}\n\t\t\thopTrackCross.set(h, Math.max(gutterStart, Math.min(gEnd, trackPrimary)));\n\t\t}\n\t}\n\n\t// Build polylines.\n\tconst out: LayoutEdge[] = [];\n\tfor (const [, hops] of byChain) {\n\t\tconst points: LayoutEdgePoint[] = [];\n\t\tfor (let i = 0; i < hops.length; i += 1) {\n\t\t\tconst h = hops[i]!;\n\t\t\tconst src = state.nodes.get(h.fromId)!;\n\t\t\tconst dst = state.nodes.get(h.toId)!;\n\t\t\tconst track = hopTrackCross.get(h)!;\n\t\t\t// Endpoints in (primary, cross) space.\n\t\t\tconst srcPrimary = src.isVirtual ? primary(src) : primary(src) + primarySize(src);\n\t\t\tconst dstPrimary = dst.isVirtual ? primary(dst) : primary(dst) - 1;\n\t\t\tconst sc = crossCenter(src);\n\t\t\tconst dc = crossCenter(dst);\n\t\t\tif (i === 0) pushPoint(points, isLR, srcPrimary, sc);\n\t\t\tif (sc !== dc) {\n\t\t\t\tpushPoint(points, isLR, track, sc);\n\t\t\t\tpushPoint(points, isLR, track, dc);\n\t\t\t}\n\t\t\tpushPoint(points, isLR, dstPrimary, dc);\n\t\t}\n\t\tconst chain = hops[0]!;\n\t\tout.push({\n\t\t\tfrom: chain.chainFrom,\n\t\t\tto: chain.chainTo,\n\t\t\tpoints: dedupWaypoints(points),\n\t\t});\n\t}\n\treturn out;\n}\n\nfunction pushPoint(acc: LayoutEdgePoint[], isLR: boolean, primary: number, cross: number): void {\n\tacc.push(isLR ? { x: primary, y: cross } : { x: cross, y: primary });\n}\n\nfunction dedupWaypoints(points: readonly LayoutEdgePoint[]): LayoutEdgePoint[] {\n\tconst out: LayoutEdgePoint[] = [];\n\tfor (const p of points) {\n\t\tconst last = out[out.length - 1];\n\t\tif (!last || last.x !== p.x || last.y !== p.y) out.push(p);\n\t}\n\treturn out;\n}\n\n// ---------------------------------------------------------------------------\n// Bounding box\n// ---------------------------------------------------------------------------\n\nfunction boundingBox(state: PipelineState): { width: number; height: number } {\n\tlet w = 0;\n\tlet h = 0;\n\tfor (const layer of state.layers) {\n\t\tfor (const n of layer) {\n\t\t\tw = Math.max(w, n.x + n.w);\n\t\t\th = Math.max(h, n.y + n.h);\n\t\t}\n\t}\n\treturn { width: w, height: h };\n}\n"],"mappings":"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","names":[]}