@graphrefly/graphrefly 0.45.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.
- package/README.md +1 -2
- package/dist/_internal-B23BagFd.d.cts +33 -0
- package/dist/_internal-B23BagFd.d.ts +33 -0
- package/dist/adaptive-rate-limiter-Dch_xYIi.d.cts +111 -0
- package/dist/adaptive-rate-limiter-Dch_xYIi.d.ts +111 -0
- package/dist/agents-C0Ji9ldU.d.cts +629 -0
- package/dist/agents-C9zexT7I.d.ts +629 -0
- package/dist/audit-BAXb3VOg.d.ts +246 -0
- package/dist/audit-C_bPfkqS.d.cts +246 -0
- package/dist/backoff-7KIK3WQW.js +24 -0
- package/dist/backoff-7KIK3WQW.js.map +1 -0
- package/dist/backoff-Bnb9OoPh.d.cts +6 -0
- package/dist/backoff-Bnb9OoPh.d.ts +6 -0
- package/dist/base/composition/index.cjs +811 -0
- package/dist/base/composition/index.cjs.map +1 -0
- package/dist/base/composition/index.d.cts +469 -0
- package/dist/base/composition/index.d.ts +469 -0
- package/dist/base/composition/index.js +40 -0
- package/dist/base/composition/index.js.map +1 -0
- package/dist/base/index.cjs +6336 -0
- package/dist/base/index.cjs.map +1 -0
- package/dist/base/index.d.cts +22 -0
- package/dist/base/index.d.ts +22 -0
- package/dist/base/index.js +259 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/io/index.cjs +3270 -0
- package/dist/base/io/index.cjs.map +1 -0
- package/dist/base/io/index.d.cts +2245 -0
- package/dist/base/io/index.d.ts +2245 -0
- package/dist/base/io/index.js +117 -0
- package/dist/base/io/index.js.map +1 -0
- package/dist/base/meta/index.cjs +43 -0
- package/dist/base/meta/index.cjs.map +1 -0
- package/dist/base/meta/index.d.cts +45 -0
- package/dist/base/meta/index.d.ts +45 -0
- package/dist/base/meta/index.js +13 -0
- package/dist/base/meta/index.js.map +1 -0
- package/dist/base/mutation/index.cjs +200 -0
- package/dist/base/mutation/index.cjs.map +1 -0
- package/dist/base/mutation/index.d.cts +177 -0
- package/dist/base/mutation/index.d.ts +177 -0
- package/dist/base/mutation/index.js +22 -0
- package/dist/base/mutation/index.js.map +1 -0
- package/dist/base/render/index.cjs +1120 -0
- package/dist/base/render/index.cjs.map +1 -0
- package/dist/base/render/index.d.cts +227 -0
- package/dist/base/render/index.d.ts +227 -0
- package/dist/base/render/index.js +24 -0
- package/dist/base/render/index.js.map +1 -0
- package/dist/base/sources/browser/index.cjs +172 -0
- package/dist/base/sources/browser/index.cjs.map +1 -0
- package/dist/base/sources/browser/index.d.cts +84 -0
- package/dist/base/sources/browser/index.d.ts +84 -0
- package/dist/base/sources/browser/index.js +151 -0
- package/dist/base/sources/browser/index.js.map +1 -0
- package/dist/base/sources/event/index.cjs +98 -0
- package/dist/base/sources/event/index.cjs.map +1 -0
- package/dist/base/sources/event/index.d.cts +91 -0
- package/dist/base/sources/event/index.d.ts +91 -0
- package/dist/base/sources/event/index.js +13 -0
- package/dist/base/sources/event/index.js.map +1 -0
- package/dist/base/sources/index.cjs +755 -0
- package/dist/base/sources/index.cjs.map +1 -0
- package/dist/base/sources/index.d.cts +357 -0
- package/dist/base/sources/index.d.ts +357 -0
- package/dist/base/sources/index.js +42 -0
- package/dist/base/sources/index.js.map +1 -0
- package/dist/base/sources/node/index.cjs +320 -0
- package/dist/base/sources/node/index.cjs.map +1 -0
- package/dist/base/sources/node/index.d.cts +185 -0
- package/dist/base/sources/node/index.d.ts +185 -0
- package/dist/base/sources/node/index.js +306 -0
- package/dist/base/sources/node/index.js.map +1 -0
- package/dist/base/utils/index.cjs +37 -0
- package/dist/base/utils/index.cjs.map +1 -0
- package/dist/base/utils/index.d.cts +37 -0
- package/dist/base/utils/index.d.ts +37 -0
- package/dist/base/utils/index.js +11 -0
- package/dist/base/utils/index.js.map +1 -0
- package/dist/base/worker/index.cjs +548 -0
- package/dist/base/worker/index.cjs.map +1 -0
- package/dist/base/worker/index.d.cts +207 -0
- package/dist/base/worker/index.d.ts +207 -0
- package/dist/base/worker/index.js +20 -0
- package/dist/base/worker/index.js.map +1 -0
- package/dist/breaker-C9skL3d8.d.ts +175 -0
- package/dist/breaker-ugSdq54q.d.cts +175 -0
- package/dist/cascading-CSSbKGrJ.d.ts +199 -0
- package/dist/cascading-baGkiihI.d.cts +199 -0
- package/dist/chunk-255UCBG4.js +58 -0
- package/dist/chunk-255UCBG4.js.map +1 -0
- package/dist/chunk-2LO3EL4W.js +1 -0
- package/dist/chunk-2LO3EL4W.js.map +1 -0
- package/dist/chunk-2OB3CEJS.js +1065 -0
- package/dist/chunk-2OB3CEJS.js.map +1 -0
- package/dist/chunk-36NMM65U.js +144 -0
- package/dist/chunk-36NMM65U.js.map +1 -0
- package/dist/chunk-3CEXCBN6.js +1 -0
- package/dist/chunk-3CEXCBN6.js.map +1 -0
- package/dist/chunk-3MUSLI6E.js +105 -0
- package/dist/chunk-3MUSLI6E.js.map +1 -0
- package/dist/chunk-3PSLNJDU.js +884 -0
- package/dist/chunk-3PSLNJDU.js.map +1 -0
- package/dist/chunk-3QZY5BI7.js +92 -0
- package/dist/chunk-3QZY5BI7.js.map +1 -0
- package/dist/chunk-42FQ27MQ.js +594 -0
- package/dist/chunk-42FQ27MQ.js.map +1 -0
- package/dist/chunk-4GYMCUDZ.js +1085 -0
- package/dist/chunk-4GYMCUDZ.js.map +1 -0
- package/dist/chunk-4S53H2KR.js +382 -0
- package/dist/chunk-4S53H2KR.js.map +1 -0
- package/dist/chunk-4XCHZRUJ.js +128 -0
- package/dist/chunk-4XCHZRUJ.js.map +1 -0
- package/dist/chunk-5THCXDWY.js +725 -0
- package/dist/chunk-5THCXDWY.js.map +1 -0
- package/dist/chunk-6XZYT4SW.js +256 -0
- package/dist/chunk-6XZYT4SW.js.map +1 -0
- package/dist/chunk-7EGRP2VX.js +76 -0
- package/dist/chunk-7EGRP2VX.js.map +1 -0
- package/dist/chunk-A7KV5UK4.js +150 -0
- package/dist/chunk-A7KV5UK4.js.map +1 -0
- package/dist/chunk-APY2SS5X.js +156 -0
- package/dist/chunk-APY2SS5X.js.map +1 -0
- package/dist/chunk-AZDQPQ3V.js +66 -0
- package/dist/chunk-AZDQPQ3V.js.map +1 -0
- package/dist/chunk-BU3SEFA5.js +90 -0
- package/dist/chunk-BU3SEFA5.js.map +1 -0
- package/dist/chunk-BXGZFGZ4.js +189 -0
- package/dist/chunk-BXGZFGZ4.js.map +1 -0
- package/dist/chunk-CGHORL6G.js +579 -0
- package/dist/chunk-CGHORL6G.js.map +1 -0
- package/dist/chunk-CXANAIZU.js +530 -0
- package/dist/chunk-CXANAIZU.js.map +1 -0
- package/dist/chunk-CZQHCKKG.js +1 -0
- package/dist/chunk-CZQHCKKG.js.map +1 -0
- package/dist/chunk-DKNHAICT.js +133 -0
- package/dist/chunk-DKNHAICT.js.map +1 -0
- package/dist/chunk-DM4OMPWK.js +584 -0
- package/dist/chunk-DM4OMPWK.js.map +1 -0
- package/dist/chunk-DMSNO6ZB.js +452 -0
- package/dist/chunk-DMSNO6ZB.js.map +1 -0
- package/dist/chunk-E5OZPDIW.js +229 -0
- package/dist/chunk-E5OZPDIW.js.map +1 -0
- package/dist/chunk-EVYY4X5A.js +509 -0
- package/dist/chunk-EVYY4X5A.js.map +1 -0
- package/dist/chunk-FDFD67UO.js +1 -0
- package/dist/chunk-FDFD67UO.js.map +1 -0
- package/dist/chunk-FMPF42Q4.js +13 -0
- package/dist/chunk-FMPF42Q4.js.map +1 -0
- package/dist/chunk-FR6RGA3B.js +1277 -0
- package/dist/chunk-FR6RGA3B.js.map +1 -0
- package/dist/chunk-FW23JYNQ.js +454 -0
- package/dist/chunk-FW23JYNQ.js.map +1 -0
- package/dist/chunk-GBCENOLN.js +1575 -0
- package/dist/chunk-GBCENOLN.js.map +1 -0
- package/dist/chunk-HL7HUJIX.js +1 -0
- package/dist/chunk-HL7HUJIX.js.map +1 -0
- package/dist/chunk-HULCUY35.js +2508 -0
- package/dist/chunk-HULCUY35.js.map +1 -0
- package/dist/chunk-IHTWQEDR.js +169 -0
- package/dist/chunk-IHTWQEDR.js.map +1 -0
- package/dist/chunk-IJRR6YAI.js +128 -0
- package/dist/chunk-IJRR6YAI.js.map +1 -0
- package/dist/chunk-JGFRAFDL.js +221 -0
- package/dist/chunk-JGFRAFDL.js.map +1 -0
- package/dist/chunk-KIIXR252.js +211 -0
- package/dist/chunk-KIIXR252.js.map +1 -0
- package/dist/chunk-KN3H5CNT.js +11 -0
- package/dist/chunk-KN3H5CNT.js.map +1 -0
- package/dist/chunk-KPG3DGLA.js +1 -0
- package/dist/chunk-KPG3DGLA.js.map +1 -0
- package/dist/chunk-KRNQ6RGQ.js +1 -0
- package/dist/chunk-KRNQ6RGQ.js.map +1 -0
- package/dist/chunk-LBAJK24K.js +1071 -0
- package/dist/chunk-LBAJK24K.js.map +1 -0
- package/dist/chunk-MLTPJMH6.js +417 -0
- package/dist/chunk-MLTPJMH6.js.map +1 -0
- package/dist/chunk-N3SZ7BMH.js +95 -0
- package/dist/chunk-N3SZ7BMH.js.map +1 -0
- package/dist/chunk-NDUD3IMO.js +540 -0
- package/dist/chunk-NDUD3IMO.js.map +1 -0
- package/dist/chunk-NY2PYHNC.js +873 -0
- package/dist/chunk-NY2PYHNC.js.map +1 -0
- package/dist/chunk-O3MT7DYI.js +225 -0
- package/dist/chunk-O3MT7DYI.js.map +1 -0
- package/dist/chunk-OCUDSN63.js +2386 -0
- package/dist/chunk-OCUDSN63.js.map +1 -0
- package/dist/chunk-OIWU3NYV.js +199 -0
- package/dist/chunk-OIWU3NYV.js.map +1 -0
- package/dist/chunk-OO5BM6CJ.js +1153 -0
- package/dist/chunk-OO5BM6CJ.js.map +1 -0
- package/dist/chunk-OQUIJT7A.js +1 -0
- package/dist/chunk-OQUIJT7A.js.map +1 -0
- package/dist/chunk-P5LBT622.js +105 -0
- package/dist/chunk-P5LBT622.js.map +1 -0
- package/dist/chunk-PKGQG5QQ.js +519 -0
- package/dist/chunk-PKGQG5QQ.js.map +1 -0
- package/dist/chunk-PKPO3JTZ.js +561 -0
- package/dist/chunk-PKPO3JTZ.js.map +1 -0
- package/dist/chunk-PL5UDIQ5.js +118 -0
- package/dist/chunk-PL5UDIQ5.js.map +1 -0
- package/dist/chunk-PZWISPIQ.js +432 -0
- package/dist/chunk-PZWISPIQ.js.map +1 -0
- package/dist/chunk-Q3EYOCZB.js +510 -0
- package/dist/chunk-Q3EYOCZB.js.map +1 -0
- package/dist/chunk-QMBYUVRL.js +15 -0
- package/dist/chunk-QMBYUVRL.js.map +1 -0
- package/dist/chunk-RAGGHLCV.js +200 -0
- package/dist/chunk-RAGGHLCV.js.map +1 -0
- package/dist/chunk-RGL53X5G.js +574 -0
- package/dist/chunk-RGL53X5G.js.map +1 -0
- package/dist/chunk-RJOG4IJU.js +1039 -0
- package/dist/chunk-RJOG4IJU.js.map +1 -0
- package/dist/chunk-SOOKUYVM.js +403 -0
- package/dist/chunk-SOOKUYVM.js.map +1 -0
- package/dist/chunk-T5BN5KG7.js +1 -0
- package/dist/chunk-T5BN5KG7.js.map +1 -0
- package/dist/chunk-TP7244Y6.js +207 -0
- package/dist/chunk-TP7244Y6.js.map +1 -0
- package/dist/chunk-TSBFTJKM.js +57 -0
- package/dist/chunk-TSBFTJKM.js.map +1 -0
- package/dist/chunk-URQ2CBBF.js +143 -0
- package/dist/chunk-URQ2CBBF.js.map +1 -0
- package/dist/chunk-W2BOPXTI.js +1 -0
- package/dist/chunk-W2BOPXTI.js.map +1 -0
- package/dist/chunk-WKSWLSCX.js +207 -0
- package/dist/chunk-WKSWLSCX.js.map +1 -0
- package/dist/chunk-Y52CS6YA.js +88 -0
- package/dist/chunk-Y52CS6YA.js.map +1 -0
- package/dist/chunk-YCBUWK77.js +92 -0
- package/dist/chunk-YCBUWK77.js.map +1 -0
- package/dist/chunk-YJ4U2D2C.js +314 -0
- package/dist/chunk-YJ4U2D2C.js.map +1 -0
- package/dist/chunk-Z4YXAUDN.js +239 -0
- package/dist/chunk-Z4YXAUDN.js.map +1 -0
- package/dist/chunk-Z6EGP5D7.js +92 -0
- package/dist/chunk-Z6EGP5D7.js.map +1 -0
- package/dist/compat/index.cjs +3083 -2
- package/dist/compat/index.cjs.map +1 -1
- package/dist/compat/index.d.cts +116 -1
- package/dist/compat/index.d.ts +116 -1
- package/dist/compat/index.js +175 -2
- package/dist/compat/index.js.map +1 -1
- package/dist/compat/jotai/index.cjs +130 -2
- package/dist/compat/jotai/index.cjs.map +1 -1
- package/dist/compat/jotai/index.d.cts +2 -1
- package/dist/compat/jotai/index.d.ts +2 -1
- package/dist/compat/jotai/index.js +7 -2
- package/dist/compat/jotai/index.js.map +1 -1
- package/dist/compat/nanostores/index.cjs +186 -2
- package/dist/compat/nanostores/index.cjs.map +1 -1
- package/dist/compat/nanostores/index.d.cts +2 -1
- package/dist/compat/nanostores/index.d.ts +2 -1
- package/dist/compat/nanostores/index.js +21 -2
- package/dist/compat/nanostores/index.js.map +1 -1
- package/dist/compat/nestjs/index.cjs +2224 -2
- package/dist/compat/nestjs/index.cjs.map +1 -1
- package/dist/compat/nestjs/index.d.cts +10 -1
- package/dist/compat/nestjs/index.d.ts +10 -1
- package/dist/compat/nestjs/index.js +77 -2
- package/dist/compat/nestjs/index.js.map +1 -1
- package/dist/compat/react/index.cjs +95 -2
- package/dist/compat/react/index.cjs.map +1 -1
- package/dist/compat/react/index.d.cts +2 -1
- package/dist/compat/react/index.d.ts +2 -1
- package/dist/compat/react/index.js +11 -2
- package/dist/compat/react/index.js.map +1 -1
- package/dist/compat/solid/index.cjs +82 -2
- package/dist/compat/solid/index.cjs.map +1 -1
- package/dist/compat/solid/index.d.cts +2 -1
- package/dist/compat/solid/index.d.ts +2 -1
- package/dist/compat/solid/index.js +11 -2
- package/dist/compat/solid/index.js.map +1 -1
- package/dist/compat/svelte/index.cjs +85 -2
- package/dist/compat/svelte/index.cjs.map +1 -1
- package/dist/compat/svelte/index.d.cts +2 -1
- package/dist/compat/svelte/index.d.ts +2 -1
- package/dist/compat/svelte/index.js +11 -2
- package/dist/compat/svelte/index.js.map +1 -1
- package/dist/compat/vue/index.cjs +100 -2
- package/dist/compat/vue/index.cjs.map +1 -1
- package/dist/compat/vue/index.d.cts +3 -1
- package/dist/compat/vue/index.d.ts +3 -1
- package/dist/compat/vue/index.js +11 -2
- package/dist/compat/vue/index.js.map +1 -1
- package/dist/compat/zustand/index.cjs +50 -2
- package/dist/compat/zustand/index.cjs.map +1 -1
- package/dist/compat/zustand/index.d.cts +2 -1
- package/dist/compat/zustand/index.d.ts +2 -1
- package/dist/compat/zustand/index.js +7 -2
- package/dist/compat/zustand/index.js.map +1 -1
- package/dist/distill-De6Rnn15.d.cts +48 -0
- package/dist/distill-De6Rnn15.d.ts +48 -0
- package/dist/external-register-CWyroXb_.d.cts +138 -0
- package/dist/external-register-CWyroXb_.d.ts +138 -0
- package/dist/fallback-Bx46zqky.d.cts +243 -0
- package/dist/fallback-pIWW8A2d.d.ts +243 -0
- package/dist/guarded-execution-BcdtxeBk.d.ts +207 -0
- package/dist/guarded-execution-C-3hnP6A.d.cts +207 -0
- package/dist/index-5SU_O78r.d.cts +754 -0
- package/dist/index-B6pxYJzO.d.cts +36 -0
- package/dist/index-B6pxYJzO.d.ts +36 -0
- package/dist/index-BFsng6v1.d.cts +44 -0
- package/dist/index-BFsng6v1.d.ts +44 -0
- package/dist/index-Bg-LwEt-.d.cts +45 -0
- package/dist/index-Bg-LwEt-.d.ts +45 -0
- package/dist/index-Brp888t0.d.cts +127 -0
- package/dist/index-Brp888t0.d.ts +127 -0
- package/dist/index-CDfk6jHN.d.cts +37 -0
- package/dist/index-CDfk6jHN.d.ts +37 -0
- package/dist/index-CEXCtYYJ.d.ts +754 -0
- package/dist/index-DLAxYaN5.d.cts +169 -0
- package/dist/index-DLAxYaN5.d.ts +169 -0
- package/dist/index-DeWbQzMe.d.cts +34 -0
- package/dist/index-DeWbQzMe.d.ts +34 -0
- package/dist/index-dX9IzPqj.d.cts +86 -0
- package/dist/index-dX9IzPqj.d.ts +86 -0
- package/dist/index.cjs +25950 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -42
- package/dist/index.d.ts +56 -42
- package/dist/index.js +849 -0
- package/dist/index.js.map +1 -1
- package/dist/layout-types-B5aiHYgk.d.cts +72 -0
- package/dist/layout-types-B5aiHYgk.d.ts +72 -0
- package/dist/memory-composers-BryDrRBX.d.cts +529 -0
- package/dist/memory-composers-CVQqPYEV.d.ts +529 -0
- package/dist/observable-BXQoW1P-.d.cts +36 -0
- package/dist/observable-BXQoW1P-.d.ts +36 -0
- package/dist/pipeline-graph-Ce47CB6Y.d.cts +145 -0
- package/dist/pipeline-graph-DXCwY9vG.d.ts +145 -0
- package/dist/presets/ai/index.cjs +4377 -0
- package/dist/presets/ai/index.cjs.map +1 -0
- package/dist/presets/ai/index.d.cts +98 -0
- package/dist/presets/ai/index.d.ts +98 -0
- package/dist/presets/ai/index.js +54 -0
- package/dist/presets/ai/index.js.map +1 -0
- package/dist/presets/harness/index.cjs +5929 -0
- package/dist/presets/harness/index.cjs.map +1 -0
- package/dist/presets/harness/index.d.cts +566 -0
- package/dist/presets/harness/index.d.ts +566 -0
- package/dist/presets/harness/index.js +71 -0
- package/dist/presets/harness/index.js.map +1 -0
- package/dist/presets/index.cjs +9782 -0
- package/dist/presets/index.cjs.map +1 -0
- package/dist/presets/index.d.cts +28 -0
- package/dist/presets/index.d.ts +28 -0
- package/dist/presets/index.js +129 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/inspect/index.cjs +1087 -0
- package/dist/presets/inspect/index.cjs.map +1 -0
- package/dist/presets/inspect/index.d.cts +172 -0
- package/dist/presets/inspect/index.d.ts +172 -0
- package/dist/presets/inspect/index.js +21 -0
- package/dist/presets/inspect/index.js.map +1 -0
- package/dist/presets/resilience/index.cjs +1593 -0
- package/dist/presets/resilience/index.cjs.map +1 -0
- package/dist/presets/resilience/index.d.cts +205 -0
- package/dist/presets/resilience/index.d.ts +205 -0
- package/dist/presets/resilience/index.js +18 -0
- package/dist/presets/resilience/index.js.map +1 -0
- package/dist/rate-limiter-CEALq4N1.d.ts +559 -0
- package/dist/rate-limiter-DpVbSYdH.d.cts +559 -0
- package/dist/reactive-layout-fswlBUvX.d.cts +195 -0
- package/dist/reactive-layout-fswlBUvX.d.ts +195 -0
- package/dist/retry-BDbRZ_gx.d.ts +125 -0
- package/dist/retry-DWuhjvsA.d.cts +125 -0
- package/dist/solutions/index.cjs +8200 -0
- package/dist/solutions/index.cjs.map +1 -0
- package/dist/solutions/index.d.cts +23 -0
- package/dist/solutions/index.d.ts +23 -0
- package/dist/solutions/index.js +55 -0
- package/dist/solutions/index.js.map +1 -0
- package/dist/spawnable-5mDY501F.d.cts +746 -0
- package/dist/spawnable-D3lR0oQu.d.ts +746 -0
- package/dist/status-U-rUI79b.d.cts +84 -0
- package/dist/status-U-rUI79b.d.ts +84 -0
- package/dist/timeout-U5O4ESK3.js +12 -0
- package/dist/timeout-U5O4ESK3.js.map +1 -0
- package/dist/types-BB5Lw-pB.d.cts +442 -0
- package/dist/types-BB5Lw-pB.d.ts +442 -0
- package/dist/types-CJWIMJiZ.d.ts +548 -0
- package/dist/types-vCq7ShIm.d.cts +548 -0
- package/dist/utils/ai/browser.cjs +2169 -0
- package/dist/utils/ai/browser.cjs.map +1 -0
- package/dist/utils/ai/browser.d.cts +129 -0
- package/dist/utils/ai/browser.d.ts +129 -0
- package/dist/utils/ai/browser.js +255 -0
- package/dist/utils/ai/browser.js.map +1 -0
- package/dist/utils/ai/index.cjs +8468 -0
- package/dist/utils/ai/index.cjs.map +1 -0
- package/dist/utils/ai/index.d.cts +1777 -0
- package/dist/utils/ai/index.d.ts +1777 -0
- package/dist/utils/ai/index.js +173 -0
- package/dist/utils/ai/index.js.map +1 -0
- package/dist/utils/ai/node.cjs +648 -0
- package/dist/utils/ai/node.cjs.map +1 -0
- package/dist/utils/ai/node.d.cts +57 -0
- package/dist/utils/ai/node.d.ts +57 -0
- package/dist/utils/ai/node.js +84 -0
- package/dist/utils/ai/node.js.map +1 -0
- package/dist/utils/cqrs/index.cjs +1036 -0
- package/dist/utils/cqrs/index.cjs.map +1 -0
- package/dist/utils/cqrs/index.d.cts +438 -0
- package/dist/utils/cqrs/index.d.ts +438 -0
- package/dist/utils/cqrs/index.js +18 -0
- package/dist/utils/cqrs/index.js.map +1 -0
- package/dist/utils/demo-shell/index.cjs +865 -0
- package/dist/utils/demo-shell/index.cjs.map +1 -0
- package/dist/utils/demo-shell/index.d.cts +90 -0
- package/dist/utils/demo-shell/index.d.ts +90 -0
- package/dist/utils/demo-shell/index.js +13 -0
- package/dist/utils/demo-shell/index.js.map +1 -0
- package/dist/utils/domain-templates/index.cjs +732 -0
- package/dist/utils/domain-templates/index.cjs.map +1 -0
- package/dist/utils/domain-templates/index.d.cts +214 -0
- package/dist/utils/domain-templates/index.d.ts +214 -0
- package/dist/utils/domain-templates/index.js +17 -0
- package/dist/utils/domain-templates/index.js.map +1 -0
- package/dist/utils/graphspec/index.cjs +1174 -0
- package/dist/utils/graphspec/index.cjs.map +1 -0
- package/dist/utils/graphspec/index.d.cts +449 -0
- package/dist/utils/graphspec/index.d.ts +449 -0
- package/dist/utils/graphspec/index.js +35 -0
- package/dist/utils/graphspec/index.js.map +1 -0
- package/dist/utils/harness/index.cjs +656 -0
- package/dist/utils/harness/index.cjs.map +1 -0
- package/dist/utils/harness/index.d.cts +542 -0
- package/dist/utils/harness/index.d.ts +542 -0
- package/dist/utils/harness/index.js +56 -0
- package/dist/utils/harness/index.js.map +1 -0
- package/dist/utils/index.cjs +17609 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +96 -0
- package/dist/utils/index.d.ts +96 -0
- package/dist/utils/index.js +514 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inspect/index.cjs +807 -0
- package/dist/utils/inspect/index.cjs.map +1 -0
- package/dist/utils/inspect/index.d.cts +123 -0
- package/dist/utils/inspect/index.d.ts +123 -0
- package/dist/utils/inspect/index.js +30 -0
- package/dist/utils/inspect/index.js.map +1 -0
- package/dist/utils/job-queue/index.cjs +717 -0
- package/dist/utils/job-queue/index.cjs.map +1 -0
- package/dist/utils/job-queue/index.d.cts +200 -0
- package/dist/utils/job-queue/index.d.ts +200 -0
- package/dist/utils/job-queue/index.js +18 -0
- package/dist/utils/job-queue/index.js.map +1 -0
- package/dist/utils/memory/index.cjs +1451 -0
- package/dist/utils/memory/index.cjs.map +1 -0
- package/dist/utils/memory/index.d.cts +582 -0
- package/dist/utils/memory/index.d.ts +582 -0
- package/dist/utils/memory/index.js +19 -0
- package/dist/utils/memory/index.js.map +1 -0
- package/dist/utils/messaging/index.cjs +666 -0
- package/dist/utils/messaging/index.cjs.map +1 -0
- package/dist/utils/messaging/index.d.cts +562 -0
- package/dist/utils/messaging/index.d.ts +562 -0
- package/dist/utils/messaging/index.js +50 -0
- package/dist/utils/messaging/index.js.map +1 -0
- package/dist/utils/orchestration/index.cjs +876 -0
- package/dist/utils/orchestration/index.cjs.map +1 -0
- package/dist/utils/orchestration/index.d.cts +233 -0
- package/dist/utils/orchestration/index.d.ts +233 -0
- package/dist/utils/orchestration/index.js +19 -0
- package/dist/utils/orchestration/index.js.map +1 -0
- package/dist/utils/process/index.cjs +743 -0
- package/dist/utils/process/index.cjs.map +1 -0
- package/dist/utils/process/index.d.cts +411 -0
- package/dist/utils/process/index.d.ts +411 -0
- package/dist/utils/process/index.js +14 -0
- package/dist/utils/process/index.js.map +1 -0
- package/dist/utils/reactive-layout/index.cjs +1607 -0
- package/dist/utils/reactive-layout/index.cjs.map +1 -0
- package/dist/utils/reactive-layout/index.d.cts +492 -0
- package/dist/utils/reactive-layout/index.d.ts +492 -0
- package/dist/utils/reactive-layout/index.js +52 -0
- package/dist/utils/reactive-layout/index.js.map +1 -0
- package/dist/utils/reduction/index.cjs +203 -0
- package/dist/utils/reduction/index.cjs.map +1 -0
- package/dist/utils/reduction/index.d.cts +102 -0
- package/dist/utils/reduction/index.d.ts +102 -0
- package/dist/utils/reduction/index.js +14 -0
- package/dist/utils/reduction/index.js.map +1 -0
- package/dist/utils/resilience/index.cjs +1617 -0
- package/dist/utils/resilience/index.cjs.map +1 -0
- package/dist/utils/resilience/index.d.cts +9 -0
- package/dist/utils/resilience/index.d.ts +9 -0
- package/dist/utils/resilience/index.js +44 -0
- package/dist/utils/resilience/index.js.map +1 -0
- package/dist/utils/surface/index.cjs +1070 -0
- package/dist/utils/surface/index.cjs.map +1 -0
- package/dist/utils/surface/index.d.cts +240 -0
- package/dist/utils/surface/index.d.ts +240 -0
- package/dist/utils/surface/index.js +30 -0
- package/dist/utils/surface/index.js.map +1 -0
- package/dist/utils/topology-view/index.cjs +620 -0
- package/dist/utils/topology-view/index.cjs.map +1 -0
- package/dist/utils/topology-view/index.d.cts +68 -0
- package/dist/utils/topology-view/index.d.ts +68 -0
- package/dist/utils/topology-view/index.js +11 -0
- package/dist/utils/topology-view/index.js.map +1 -0
- package/package.json +293 -237
- package/dist/core/index.cjs +0 -21
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.js +0 -3
- package/dist/core/index.js.map +0 -1
- package/dist/extra/browser.cjs +0 -21
- package/dist/extra/browser.cjs.map +0 -1
- package/dist/extra/browser.d.cts +0 -1
- package/dist/extra/browser.d.ts +0 -1
- package/dist/extra/browser.js +0 -3
- package/dist/extra/browser.js.map +0 -1
- package/dist/extra/index.cjs +0 -21
- package/dist/extra/index.cjs.map +0 -1
- package/dist/extra/index.d.cts +0 -1
- package/dist/extra/index.d.ts +0 -1
- package/dist/extra/index.js +0 -3
- package/dist/extra/index.js.map +0 -1
- package/dist/extra/node.cjs +0 -21
- package/dist/extra/node.cjs.map +0 -1
- package/dist/extra/node.d.cts +0 -1
- package/dist/extra/node.d.ts +0 -1
- package/dist/extra/node.js +0 -3
- package/dist/extra/node.js.map +0 -1
- package/dist/extra/operators.cjs +0 -21
- package/dist/extra/operators.cjs.map +0 -1
- package/dist/extra/operators.d.cts +0 -1
- package/dist/extra/operators.d.ts +0 -1
- package/dist/extra/operators.js +0 -3
- package/dist/extra/operators.js.map +0 -1
- package/dist/extra/reactive.cjs +0 -21
- package/dist/extra/reactive.cjs.map +0 -1
- package/dist/extra/reactive.d.cts +0 -1
- package/dist/extra/reactive.d.ts +0 -1
- package/dist/extra/reactive.js +0 -3
- package/dist/extra/reactive.js.map +0 -1
- package/dist/extra/render/index.cjs +0 -21
- package/dist/extra/render/index.cjs.map +0 -1
- package/dist/extra/render/index.d.cts +0 -1
- package/dist/extra/render/index.d.ts +0 -1
- package/dist/extra/render/index.js +0 -3
- package/dist/extra/render/index.js.map +0 -1
- package/dist/extra/sources.cjs +0 -21
- package/dist/extra/sources.cjs.map +0 -1
- package/dist/extra/sources.d.cts +0 -1
- package/dist/extra/sources.d.ts +0 -1
- package/dist/extra/sources.js +0 -3
- package/dist/extra/sources.js.map +0 -1
- package/dist/extra/storage-browser.cjs +0 -21
- package/dist/extra/storage-browser.cjs.map +0 -1
- package/dist/extra/storage-browser.d.cts +0 -1
- package/dist/extra/storage-browser.d.ts +0 -1
- package/dist/extra/storage-browser.js +0 -3
- package/dist/extra/storage-browser.js.map +0 -1
- package/dist/extra/storage-core.cjs +0 -21
- package/dist/extra/storage-core.cjs.map +0 -1
- package/dist/extra/storage-core.d.cts +0 -1
- package/dist/extra/storage-core.d.ts +0 -1
- package/dist/extra/storage-core.js +0 -3
- package/dist/extra/storage-core.js.map +0 -1
- package/dist/extra/storage-node.cjs +0 -21
- package/dist/extra/storage-node.cjs.map +0 -1
- package/dist/extra/storage-node.d.cts +0 -1
- package/dist/extra/storage-node.d.ts +0 -1
- package/dist/extra/storage-node.js +0 -3
- package/dist/extra/storage-node.js.map +0 -1
- package/dist/extra/storage-tiers-browser.cjs +0 -21
- package/dist/extra/storage-tiers-browser.cjs.map +0 -1
- package/dist/extra/storage-tiers-browser.d.cts +0 -1
- package/dist/extra/storage-tiers-browser.d.ts +0 -1
- package/dist/extra/storage-tiers-browser.js +0 -3
- package/dist/extra/storage-tiers-browser.js.map +0 -1
- package/dist/extra/storage-tiers-node.cjs +0 -21
- package/dist/extra/storage-tiers-node.cjs.map +0 -1
- package/dist/extra/storage-tiers-node.d.cts +0 -1
- package/dist/extra/storage-tiers-node.d.ts +0 -1
- package/dist/extra/storage-tiers-node.js +0 -3
- package/dist/extra/storage-tiers-node.js.map +0 -1
- package/dist/extra/storage-tiers.cjs +0 -21
- package/dist/extra/storage-tiers.cjs.map +0 -1
- package/dist/extra/storage-tiers.d.cts +0 -1
- package/dist/extra/storage-tiers.d.ts +0 -1
- package/dist/extra/storage-tiers.js +0 -3
- package/dist/extra/storage-tiers.js.map +0 -1
- package/dist/extra/storage-wal.cjs +0 -21
- package/dist/extra/storage-wal.cjs.map +0 -1
- package/dist/extra/storage-wal.d.cts +0 -1
- package/dist/extra/storage-wal.d.ts +0 -1
- package/dist/extra/storage-wal.js +0 -3
- package/dist/extra/storage-wal.js.map +0 -1
- package/dist/graph/index.cjs +0 -21
- package/dist/graph/index.cjs.map +0 -1
- package/dist/graph/index.d.cts +0 -1
- package/dist/graph/index.d.ts +0 -1
- package/dist/graph/index.js +0 -3
- package/dist/graph/index.js.map +0 -1
- package/dist/patterns/ai/browser.cjs +0 -21
- package/dist/patterns/ai/browser.cjs.map +0 -1
- package/dist/patterns/ai/browser.d.cts +0 -1
- package/dist/patterns/ai/browser.d.ts +0 -1
- package/dist/patterns/ai/browser.js +0 -3
- package/dist/patterns/ai/browser.js.map +0 -1
- package/dist/patterns/ai/index.cjs +0 -21
- package/dist/patterns/ai/index.cjs.map +0 -1
- package/dist/patterns/ai/index.d.cts +0 -1
- package/dist/patterns/ai/index.d.ts +0 -1
- package/dist/patterns/ai/index.js +0 -3
- package/dist/patterns/ai/index.js.map +0 -1
- package/dist/patterns/ai/node.cjs +0 -21
- package/dist/patterns/ai/node.cjs.map +0 -1
- package/dist/patterns/ai/node.d.cts +0 -1
- package/dist/patterns/ai/node.d.ts +0 -1
- package/dist/patterns/ai/node.js +0 -3
- package/dist/patterns/ai/node.js.map +0 -1
- package/dist/patterns/cqrs/index.cjs +0 -21
- package/dist/patterns/cqrs/index.cjs.map +0 -1
- package/dist/patterns/cqrs/index.d.cts +0 -1
- package/dist/patterns/cqrs/index.d.ts +0 -1
- package/dist/patterns/cqrs/index.js +0 -3
- package/dist/patterns/cqrs/index.js.map +0 -1
- package/dist/patterns/demo-shell/index.cjs +0 -21
- package/dist/patterns/demo-shell/index.cjs.map +0 -1
- package/dist/patterns/demo-shell/index.d.cts +0 -1
- package/dist/patterns/demo-shell/index.d.ts +0 -1
- package/dist/patterns/demo-shell/index.js +0 -3
- package/dist/patterns/demo-shell/index.js.map +0 -1
- package/dist/patterns/domain-templates/index.cjs +0 -21
- package/dist/patterns/domain-templates/index.cjs.map +0 -1
- package/dist/patterns/domain-templates/index.d.cts +0 -1
- package/dist/patterns/domain-templates/index.d.ts +0 -1
- package/dist/patterns/domain-templates/index.js +0 -3
- package/dist/patterns/domain-templates/index.js.map +0 -1
- package/dist/patterns/graphspec/index.cjs +0 -21
- package/dist/patterns/graphspec/index.cjs.map +0 -1
- package/dist/patterns/graphspec/index.d.cts +0 -1
- package/dist/patterns/graphspec/index.d.ts +0 -1
- package/dist/patterns/graphspec/index.js +0 -3
- package/dist/patterns/graphspec/index.js.map +0 -1
- package/dist/patterns/harness/index.cjs +0 -21
- package/dist/patterns/harness/index.cjs.map +0 -1
- package/dist/patterns/harness/index.d.cts +0 -1
- package/dist/patterns/harness/index.d.ts +0 -1
- package/dist/patterns/harness/index.js +0 -3
- package/dist/patterns/harness/index.js.map +0 -1
- package/dist/patterns/inspect/index.cjs +0 -21
- package/dist/patterns/inspect/index.cjs.map +0 -1
- package/dist/patterns/inspect/index.d.cts +0 -1
- package/dist/patterns/inspect/index.d.ts +0 -1
- package/dist/patterns/inspect/index.js +0 -3
- package/dist/patterns/inspect/index.js.map +0 -1
- package/dist/patterns/job-queue/index.cjs +0 -21
- package/dist/patterns/job-queue/index.cjs.map +0 -1
- package/dist/patterns/job-queue/index.d.cts +0 -1
- package/dist/patterns/job-queue/index.d.ts +0 -1
- package/dist/patterns/job-queue/index.js +0 -3
- package/dist/patterns/job-queue/index.js.map +0 -1
- package/dist/patterns/memory/index.cjs +0 -21
- package/dist/patterns/memory/index.cjs.map +0 -1
- package/dist/patterns/memory/index.d.cts +0 -1
- package/dist/patterns/memory/index.d.ts +0 -1
- package/dist/patterns/memory/index.js +0 -3
- package/dist/patterns/memory/index.js.map +0 -1
- package/dist/patterns/messaging/index.cjs +0 -21
- package/dist/patterns/messaging/index.cjs.map +0 -1
- package/dist/patterns/messaging/index.d.cts +0 -1
- package/dist/patterns/messaging/index.d.ts +0 -1
- package/dist/patterns/messaging/index.js +0 -3
- package/dist/patterns/messaging/index.js.map +0 -1
- package/dist/patterns/orchestration/index.cjs +0 -21
- package/dist/patterns/orchestration/index.cjs.map +0 -1
- package/dist/patterns/orchestration/index.d.cts +0 -1
- package/dist/patterns/orchestration/index.d.ts +0 -1
- package/dist/patterns/orchestration/index.js +0 -3
- package/dist/patterns/orchestration/index.js.map +0 -1
- package/dist/patterns/process/index.cjs +0 -21
- package/dist/patterns/process/index.cjs.map +0 -1
- package/dist/patterns/process/index.d.cts +0 -1
- package/dist/patterns/process/index.d.ts +0 -1
- package/dist/patterns/process/index.js +0 -3
- package/dist/patterns/process/index.js.map +0 -1
- package/dist/patterns/reactive-layout/index.cjs +0 -21
- package/dist/patterns/reactive-layout/index.cjs.map +0 -1
- package/dist/patterns/reactive-layout/index.d.cts +0 -1
- package/dist/patterns/reactive-layout/index.d.ts +0 -1
- package/dist/patterns/reactive-layout/index.js +0 -3
- package/dist/patterns/reactive-layout/index.js.map +0 -1
- package/dist/patterns/reduction/index.cjs +0 -21
- package/dist/patterns/reduction/index.cjs.map +0 -1
- package/dist/patterns/reduction/index.d.cts +0 -1
- package/dist/patterns/reduction/index.d.ts +0 -1
- package/dist/patterns/reduction/index.js +0 -3
- package/dist/patterns/reduction/index.js.map +0 -1
- package/dist/patterns/surface/index.cjs +0 -21
- package/dist/patterns/surface/index.cjs.map +0 -1
- package/dist/patterns/surface/index.d.cts +0 -1
- package/dist/patterns/surface/index.d.ts +0 -1
- package/dist/patterns/surface/index.js +0 -3
- package/dist/patterns/surface/index.js.map +0 -1
- package/dist/patterns/topology-view/index.cjs +0 -21
- package/dist/patterns/topology-view/index.cjs.map +0 -1
- package/dist/patterns/topology-view/index.d.cts +0 -1
- package/dist/patterns/topology-view/index.d.ts +0 -1
- package/dist/patterns/topology-view/index.js +0 -3
- package/dist/patterns/topology-view/index.js.map +0 -1
- package/dist/testing/index.cjs +0 -21
- package/dist/testing/index.cjs.map +0 -1
- package/dist/testing/index.d.cts +0 -1
- package/dist/testing/index.d.ts +0 -1
- package/dist/testing/index.js +0 -3
- package/dist/testing/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/domain-templates/index.ts","../../../src/utils/reduction/index.ts","../../../src/base/meta/domain-meta.ts","../../../src/base/mutation/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","/**\n * Reduction primitives (roadmap §8.1).\n *\n * Composable building blocks for taking heterogeneous massive inputs and producing\n * prioritized, auditable, human-actionable output. Each primitive is either a Graph\n * factory or a Node factory, built on top of core + extra primitives.\n *\n * @module\n */\n\nimport {\n\tbatch,\n\tCOMPLETE,\n\tDATA,\n\tERROR,\n\ttype Message,\n\ttype Node,\n\ttype NodeOptions,\n\tnode,\n} from \"@graphrefly/pure-ts/core\";\n\nimport { merge } from \"@graphrefly/pure-ts/extra\";\nimport { Graph, type GraphOptions } from \"@graphrefly/pure-ts/graph\";\n\n// ---------------------------------------------------------------------------\n// Shared helpers (same pattern as orchestration.ts)\n// ---------------------------------------------------------------------------\n\nexport type { StepRef } from \"../orchestration/pipeline-graph.js\";\n\nimport { keepalive } from \"@graphrefly/pure-ts/extra\";\nimport { domainMeta } from \"../../base/meta/domain-meta.js\";\nimport { tryIncrementBounded } from \"../../base/mutation/index.js\";\nimport type { StepRef } from \"../orchestration/pipeline-graph.js\";\n\nfunction baseMeta(kind: string, meta?: Record<string, unknown>): Record<string, unknown> {\n\treturn domainMeta(\"reduction\", kind, meta);\n}\n\n// stratify moved to `src/extra/stratify.ts` (protocol-level primitive).\n\n// ---------------------------------------------------------------------------\n// funnel\n// ---------------------------------------------------------------------------\n\n/** A named stage for {@link funnel}. */\nexport type FunnelStage = {\n\t/** Stage name (mounted as subgraph). */\n\tname: string;\n\t/** Builder: receives a sub-graph, should add an `\"input\"` and `\"output\"` node. */\n\tbuild: (sub: Graph) => void;\n};\n\n/** Options for {@link funnel}. */\nexport type FunnelOptions = GraphOptions & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Multi-source merge with sequential reduction stages.\n *\n * Sources are merged into a single stream. Each stage is a named subgraph\n * (mounted via `graph.mount()`). Stages connect linearly:\n * `merged → stage[0].input → stage[0].output → stage[1].input → ...`\n *\n * @param name - Graph name.\n * @param sources - Input nodes to merge.\n * @param stages - Sequential reduction stages.\n * @param opts - Optional graph/meta options.\n * @returns Graph with `\"merged\"` and mounted stage subgraphs.\n *\n * @category patterns\n */\nexport function funnel<T>(\n\tname: string,\n\tsources: ReadonlyArray<Node<T>>,\n\tstages: ReadonlyArray<FunnelStage>,\n\topts?: FunnelOptions,\n): Graph {\n\tif (sources.length === 0) throw new RangeError(\"funnel requires at least one source\");\n\tif (stages.length === 0) throw new RangeError(\"funnel requires at least one stage\");\n\n\tconst g = new Graph(name, opts);\n\n\t// Merge all sources\n\tconst merged = sources.length === 1 ? sources[0] : merge(...(sources as unknown as Node<T>[]));\n\tg.add(merged as Node<unknown>, { name: \"merged\" });\n\n\t// Build and mount each stage linearly.\n\t// Stage inputs are standalone state nodes, so we bridge via subscribe\n\t// (connect() requires constructor deps). Bridge effects forward DATA\n\t// from the previous output to the next stage's input.\n\tlet prevOutputPath = \"merged\";\n\tfor (let i = 0; i < stages.length; i++) {\n\t\tconst stage = stages[i];\n\t\tconst sub = new Graph(stage.name);\n\t\tstage.build(sub);\n\n\t\t// Validate that the stage has input and output nodes\n\t\ttry {\n\t\t\tsub.resolve(\"input\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"input\" node`);\n\t\t}\n\t\ttry {\n\t\t\tsub.resolve(\"output\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"output\" node`);\n\t\t}\n\n\t\tg.mount(stage.name, sub);\n\n\t\t// Bridge replacement: effect that forwards DATA from previous output\n\t\t// to the next stage's input. TEARDOWN excluded because stage lifecycle\n\t\t// is managed by the parent graph. Shows up in describe().\n\t\tconst prevNode = g.resolve(prevOutputPath);\n\t\tconst stageInputPath = `${stage.name}::input`;\n\t\tconst stageInput = g.resolve(stageInputPath);\n\t\tconst bridgeName = `__bridge_${prevOutputPath}→${stage.name}_input`;\n\t\tconst br = node(\n\t\t\t[prevNode],\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\tstageInput.emit(data[0]);\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{ describeKind: \"effect\", name: bridgeName },\n\t\t);\n\t\tg.add(br as Node<unknown>, { name: bridgeName });\n\t\tg.addDisposer(keepalive(br));\n\n\t\tprevOutputPath = `${stage.name}::output`;\n\t}\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// feedback\n// ---------------------------------------------------------------------------\n\n/** Options for {@link feedback}. */\nexport type FeedbackOptions = {\n\t/** Maximum feedback iterations before stopping (default: 10). */\n\tmaxIterations?: number;\n\t/** Optional budget gate node path for cost-bounded iteration. */\n\tbudgetNode?: StepRef;\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Introduce a bounded reactive cycle into an existing graph.\n *\n * When `condition` emits a non-null DATA value, the feedback effect routes it\n * back to the `reentry` state node — creating a cycle. Bounded by\n * `maxIterations` (default 10). The counter node (`__feedback_<condition>`)\n * is the source of truth — reset it to 0 to allow more iterations.\n *\n * To remove the feedback cycle, call `graph.remove(\"__feedback_<condition>\")`.\n *\n * @param graph - Existing graph to augment with a feedback cycle.\n * @param condition - Path to a node whose DATA triggers feedback.\n * @param reentry - Path to a state node that receives the feedback value.\n * @param opts - Iteration bounds and metadata.\n * @returns The same graph (mutated with feedback nodes added).\n *\n * @category patterns\n */\nexport function feedback(\n\tgraph: Graph,\n\tcondition: string,\n\treentry: string,\n\topts?: FeedbackOptions,\n): Graph {\n\tconst maxIter = opts?.maxIterations ?? 10;\n\n\t// Internal counter node — source of truth for iteration bound.\n\t// Reset to 0 to allow more iterations.\n\tconst counterName = `__feedback_${condition}`;\n\tconst counter = node<number>([], {\n\t\t...{\n\t\t\tmeta: baseMeta(\"feedback_counter\", {\n\t\t\t\tmaxIterations: maxIter,\n\t\t\t\tfeedbackFrom: condition,\n\t\t\t\tfeedbackTo: reentry,\n\t\t\t}),\n\t\t},\n\t\tinitial: 0,\n\t});\n\tgraph.add(counter as Node<unknown>, { name: counterName });\n\n\t// Resolve the condition and reentry nodes\n\tconst condNode = graph.resolve(condition);\n\tconst reentryNode = graph.resolve(reentry);\n\n\t// Graph-visible feedback effect: intercepts condition DATA, routes back to\n\t// reentry with iteration counting. Registered in the graph so it shows up\n\t// in describe() and cleans up on graph.destroy().\n\t// Feedback effect: subscribe to condition node for per-message interception\n\t// (onMessage removed in v5 — use producer+subscribe instead)\n\tconst feedbackEffectName = `__feedback_effect_${condition}`;\n\tconst feedbackEffect = node(\n\t\t[],\n\t\t(_data, _feedbackActions) => {\n\t\t\tconst unsub = condNode.subscribe((msgs) => {\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tconst t = msg[0];\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\tconst condValue = msg[1];\n\t\t\t\t\t\tif (condValue == null) return;\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tif (tryIncrementBounded(counter, maxIter)) {\n\t\t\t\t\t\t\t\treentryNode.emit(condValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (t === COMPLETE || t === ERROR) {\n\t\t\t\t\t\tconst terminal: Message = t === ERROR && msg.length > 1 ? [ERROR, msg[1]] : [t];\n\t\t\t\t\t\tcounter.down([terminal]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => unsub();\n\t\t},\n\t\t{\n\t\t\tname: feedbackEffectName,\n\t\t\tdescribeKind: \"effect\",\n\t\t\tmeta: {\n\t\t\t\t...baseMeta(\"feedback_effect\", {\n\t\t\t\t\tfeedbackFrom: condition,\n\t\t\t\t\tfeedbackTo: reentry,\n\t\t\t\t}),\n\t\t\t\t_internal: true,\n\t\t\t},\n\t\t},\n\t);\n\tgraph.add(feedbackEffect as Node<unknown>, { name: feedbackEffectName });\n\tgraph.addDisposer(keepalive(feedbackEffect));\n\n\treturn graph;\n}\n\n// `budgetGate` was promoted to `extra/resilience/budget-gate.ts` per Tier 2.2.\n// Import from `@graphrefly/graphrefly/extra` (or `../../extra/resilience/budget-gate.js`\n// internally) instead. See the resilience family for sibling primitives:\n// `retry`, `circuitBreaker`, `rateLimiter`, `tokenBucket`, `fallback`, `withStatus`.\n\n// ---------------------------------------------------------------------------\n// scorer\n// ---------------------------------------------------------------------------\n\n/** A scored item with full breakdown. */\nexport type ScoredItem<T = unknown> = {\n\t/** Original value. */\n\tvalue: T;\n\t/** Final weighted score. */\n\tscore: number;\n\t/** Per-signal breakdown: signal index → weighted contribution. */\n\tbreakdown: number[];\n};\n\n/** Options for {@link scorer}. */\nexport type ScorerOptions = Omit<NodeOptions<unknown>, \"describeKind\" | \"name\" | \"meta\"> & {\n\tmeta?: Record<string, unknown>;\n\t/** Custom scoring function per signal. Default: identity (signal value IS the score). */\n\tscoreFns?: ReadonlyArray<(value: unknown) => number>;\n};\n\n/**\n * Reactive multi-signal scoring with live weights.\n *\n * Each source emits items to score. Weights are reactive state nodes that\n * LLM or human can adjust live. Output is sorted scored items with full\n * breakdown.\n *\n * @param sources - Signal nodes (each emits a numeric score dimension).\n * @param weights - Reactive weight nodes (one per source).\n * @param opts - Optional node/meta options.\n * @returns Node emitting scored output.\n *\n * @category patterns\n */\nexport function scorer(\n\tsources: ReadonlyArray<Node<number>>,\n\tweights: ReadonlyArray<Node<number>>,\n\topts?: ScorerOptions,\n): Node<ScoredItem<number[]>> {\n\tif (sources.length === 0) throw new RangeError(\"scorer requires at least one source\");\n\tif (sources.length !== weights.length) {\n\t\tthrow new RangeError(\"scorer requires the same number of sources and weights\");\n\t}\n\n\tconst allDeps = [...(sources as unknown as Node[]), ...(weights as unknown as Node[])];\n\tconst n = sources.length;\n\tconst scoreFns = opts?.scoreFns;\n\n\treturn node<ScoredItem<number[]>>(\n\t\tallDeps,\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 signals = vals.slice(0, n) as number[];\n\t\t\tconst weightValues = vals.slice(n) as number[];\n\n\t\t\tconst breakdown: number[] = [];\n\t\t\tlet totalScore = 0;\n\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst sig = signals[i] ?? 0;\n\t\t\t\tconst wt = weightValues[i] ?? 0;\n\t\t\t\tconst rawScore = scoreFns?.[i] ? scoreFns[i](sig) : sig;\n\t\t\t\tconst weighted = (rawScore as number) * wt;\n\t\t\t\tbreakdown.push(weighted);\n\t\t\t\ttotalScore += weighted;\n\t\t\t}\n\n\t\t\tactions.emit({\n\t\t\t\tvalue: signals,\n\t\t\t\tscore: totalScore,\n\t\t\t\tbreakdown,\n\t\t\t});\n\t\t},\n\t\t{\n\t\t\t...(opts\n\t\t\t\t? {\n\t\t\t\t\t\tequals: opts.equals,\n\t\t\t\t\t\tresubscribable: opts.resubscribable,\n\t\t\t\t\t\tresetOnTeardown: opts.resetOnTeardown,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"scorer\", opts?.meta),\n\t\t},\n\t);\n}\n\n// `effectivenessTracker` was deleted per Class B audit Alt E (2026-04-30).\n// The shared substrate now lives in `extra/composition/audited-success-tracker.ts`\n// — re-exported via `@graphrefly/graphrefly-ts/extra` for general use.\n","/**\n * Metadata helpers for pattern-layer nodes (Tier 2.2 promotion from\n * `patterns/_internal/`).\n *\n * Each domain (orchestration, messaging, reduction, ai, cqrs, domain_template,\n * memory, lens, audit, harness) shares the same metadata convention. Promoted\n * to `extra/` so non-patterns code (and downstream consumers building their\n * own domain primitives) can use the same shape.\n *\n * @module\n */\n\n/**\n * Build a domain metadata object for pattern-layer nodes.\n *\n * Each domain follows the same shape: `{ [domain]: true, [domain]_type: kind, ...extra }`.\n *\n * @param domain - The domain tag (e.g. `\"orchestration\"`, `\"ai\"`, `\"cqrs\"`).\n * @param kind - The specific type within the domain (e.g. `\"gate\"`, `\"prompt\"`).\n * @param extra - Additional metadata to merge.\n * @returns Metadata object.\n */\nexport function domainMeta(\n\tdomain: string,\n\tkind: string,\n\textra?: Record<string, unknown>,\n): Record<string, unknown> {\n\treturn {\n\t\t[domain]: true,\n\t\t[`${domain}_type`]: kind,\n\t\t...(extra ?? {}),\n\t};\n}\n","/**\n * Universal mutation framework (Phase 14 — DS-14 locked 2026-05-05).\n *\n * Single `mutate(act, opts)` factory replaces the prior `lightMutation` +\n * `wrapMutation` two-tier split (pre-1.0 break per Q-O2).\n *\n * Two frames:\n * - `\"inline\"` — no batch; up() runs raw. Seq bumps before action; persists\n * on throw. Hot-path-friendly for atomic single-write mutations.\n * - `\"transactional\"` — opens `batch(() => up(...))`. On throw: batch discards\n * deferred deliveries, then `down()` runs (if provided), then failure record.\n *\n * Phase-4 primitives share the same shape: imperative mutation methods +\n * closure state + reactive audit log + freeze-at-entry + rollback-on-throw.\n * This module factors out the common machinery so each primitive becomes\n * declarative wiring over typed audit records.\n */\n\nimport {\n\tbatch,\n\tDATA,\n\tDIRTY,\n\ttype Node,\n\ttype NodeGuard,\n\tnode,\n\tpolicy,\n\twallClockNs,\n} from \"@graphrefly/pure-ts/core\";\nimport {\n\ttype ReactiveLogBundle,\n\ttype ReactiveLogOptions,\n\treactiveLog,\n} from \"@graphrefly/pure-ts/extra\";\nimport { Graph } from \"@graphrefly/pure-ts/graph\";\n\n// ── tryIncrementBounded ──────────────────────────────────────────────────\n\n/**\n * Bounded increment for a self-owned counter state node.\n *\n * Reads `counter.cache`, bumps by `by` (default 1) if `cur + by <= cap`,\n * writes back. Returns `false` when the cap would be exceeded (no-op write).\n * Documented P3 exception: the counter is not a declared dep of the caller —\n * it's a private budget read+written from a single call site. This helper\n * keeps the `.cache` access in one named place so caller bodies (which may\n * be inside reactive fn execution paths) stay free of cross-node `.cache`\n * reads.\n *\n * **Safety today:**\n * 1. Single-threaded JS runner never invokes the caller concurrently.\n * 2. `counter.down` writes the cache synchronously before returning, so\n * synchronous re-entry through a downstream publish reads the\n * freshly-incremented value — no double-count.\n *\n * **Future risk:** under a free-threaded runner (PY no-GIL or hypothetical\n * concurrent TS runner), two concurrent firings could still race. Revisit\n * when that surfaces.\n *\n * @param counter - Self-owned counter Node. Caller is the sole writer.\n * @param cap - Upper bound (inclusive). Pass `Number.MAX_SAFE_INTEGER` for\n * \"effectively unbounded\" use cases (e.g. token meters).\n * @param by - Delta to add (default `1`). Must be a finite non-negative\n * number; callers should pre-validate. Overflow-safe via\n * `by > cap - cur` check rather than `cur + by >= cap`.\n */\nexport function tryIncrementBounded(counter: Node<number>, cap: number, by = 1): boolean {\n\tconst cur = (counter.cache as number | undefined) ?? 0;\n\tif (by > cap - cur) return false;\n\tcounter.down([[DIRTY], [DATA, cur + by]]);\n\treturn true;\n}\n\n// ── Audit record schema ──────────────────────────────────────────────────\n\n/** Shared base shape for every audit record. Per-primitive types extend this. */\nexport interface BaseAuditRecord {\n\treadonly t_ns: number;\n\treadonly seq?: number;\n\treadonly handlerVersion?: { id: string; version: string | number };\n}\n\n// ── Default audit guard ──────────────────────────────────────────────────\n\n/**\n * Allow `observe` and `signal`; deny external `write` on the audit log so\n * consumers can subscribe + signal-bridge but cannot inject fake records.\n */\nexport const DEFAULT_AUDIT_GUARD: NodeGuard = policy((allow, deny) => {\n\tallow(\"observe\");\n\tallow(\"signal\");\n\tdeny(\"write\");\n});\n\n// ── createAuditLog ───────────────────────────────────────────────────────\n\nexport type AuditLogOpts<R extends BaseAuditRecord> = {\n\tname: string;\n\t/** Bounded retention; default 1024 per Audit 2 / cross-cutting bounded-default policy. */\n\tretainedLimit?: number;\n\t/** Override the default audit guard. */\n\tguard?: NodeGuard;\n\t/** Mount the audit `entries` Node under this graph (and activate withLatest). */\n\tgraph?: Graph;\n\t/** Pass-through to {@link reactiveLog}. */\n\tversioning?: ReactiveLogOptions<R>[\"versioning\"];\n};\n\n/**\n * Build a reactive audit log with sane defaults: bounded retention, deny-write\n * guard, `withLatest()` companions activated. Returns the {@link ReactiveLogBundle}\n * directly — primitives expose this as `<primitive>.events` / `.decisions` /\n * `.dispatches` / `.invocations` and alias it as `.audit`.\n *\n * @category internal\n */\nexport function createAuditLog<R extends BaseAuditRecord>(\n\topts: AuditLogOpts<R>,\n): ReactiveLogBundle<R> {\n\tconst log = reactiveLog<R>([], {\n\t\tname: opts.name,\n\t\tmaxSize: opts.retainedLimit ?? 1024,\n\t\tguard: opts.guard ?? DEFAULT_AUDIT_GUARD,\n\t\t...(opts.versioning != null ? { versioning: opts.versioning } : {}),\n\t});\n\t// Lazy companion activation up-front so `bundle.lastValue` / `hasLatest`\n\t// are queryable without an explicit `withLatest()` call.\n\tlog.withLatest();\n\tif (opts.graph) {\n\t\topts.graph.add(log.entries, { name: opts.name });\n\t}\n\treturn log;\n}\n\n// ── Universal mutation factory (Phase 14 — DS-14 lock Q-O2/Q-O3) ────────\n//\n// Single `mutate(act, opts)` factory. Two frames:\n//\n// - `\"inline\"` — no batch frame; up() runs raw. Seq bumps before action;\n// persists on throw. Hot-path-friendly for atomic single-write mutations.\n//\n// - `\"transactional\"` — opens `batch(() => up(...))`. On throw: batch discards\n// deferred deliveries, then `down()` runs, then failure record persists.\n//\n// **Heuristic:** if your imperative method's body is one or two lines (mutate\n// state, emit), use `frame: \"inline\"`. If it runs a user-supplied handler or\n// has multiple steps that could leave inconsistent state mid-throw, use\n// `frame: \"transactional\"`.\n\nexport type FailureMeta = {\n\tt_ns: number;\n\tseq?: number;\n\terrorType: string;\n};\n\nexport type SuccessMeta = {\n\tt_ns: number;\n\tseq?: number;\n};\n\n/**\n * Mutation action shape. Plain function shorthand auto-wraps as `{ up: fn }`.\n *\n * - `up` — the mutation action (the \"up migration\").\n * - `down` — optional rollback for closure mutations that `batch()` can't\n * reach. Receives the SAME frozen args as `up`. Runs AFTER batch reactive\n * rollback, BEFORE the failure record. Throws inside `down` are\n * console.error'd without masking the original error. Only meaningful\n * with `frame: \"transactional\"`.\n */\nexport type MutationAct<TArgs extends readonly unknown[], TResult> = {\n\tup: (...args: TArgs) => TResult;\n\tdown?: (...args: TArgs) => void;\n};\n\nexport type MutationFrame = \"inline\" | \"transactional\";\n\nexport type MutateOpts<TArgs extends readonly unknown[], TResult, R extends BaseAuditRecord> = {\n\t/** Frame mode. `\"inline\"` = no batch; `\"transactional\"` = batch + rollback. */\n\tframe: MutationFrame;\n\t/**\n\t * Optional log to append records to. When omitted, the wrapper still\n\t * provides freeze / seq-advance / rollback-on-throw but skips record\n\t * emission — useful for primitives that want centralized mutation\n\t * semantics without a dedicated log surface (e.g. `Topic.publish`).\n\t */\n\tlog?: ReactiveLogBundle<R>;\n\t/** Build the success record from the action's args + result + meta. */\n\tonSuccessRecord?: (args: TArgs, result: TResult, meta: SuccessMeta) => R | undefined;\n\t/** Build the failure record from the args + error + meta. */\n\tonFailureRecord?: (args: TArgs, error: unknown, meta: FailureMeta) => R | undefined;\n\t/** Deep-freeze args at entry (default `true`). Opt out for hot paths. */\n\tfreeze?: boolean;\n\t/** Optional sequence cursor — auto-advanced and stamped onto records. */\n\tseq?: Node<number>;\n\t/** Optional handler version — stamped per Audit 5. */\n\thandlerVersion?: { id: string; version: string | number };\n};\n\nfunction deepFreeze<T>(value: T): T {\n\tif (value === null || typeof value !== \"object\" || Object.isFrozen(value)) return value;\n\tfor (const k of Object.keys(value as Record<string, unknown>)) {\n\t\tdeepFreeze((value as Record<string, unknown>)[k]);\n\t}\n\treturn Object.freeze(value);\n}\n\n/**\n * Universal mutation factory (Phase 14 — DS-14 Q-O2).\n *\n * Replaces the prior `lightMutation` + `wrapMutation` two-tier split.\n * Single factory with `frame: \"inline\" | \"transactional\"` discriminant.\n *\n * @param act - The mutation action. Either a plain function (auto-wrapped as\n * `{ up: fn }`) or a `{ up, down? }` object for explicit rollback.\n * @param opts - Configuration: frame, log, record builders, freeze, seq.\n * @returns A typed wrapper function with the same signature as `act.up`.\n */\nexport function mutate<TArgs extends readonly unknown[], TResult, R extends BaseAuditRecord>(\n\tact: MutationAct<TArgs, TResult> | ((...args: TArgs) => TResult),\n\topts: MutateOpts<TArgs, TResult, R>,\n): (...args: TArgs) => TResult {\n\tconst { up, down } = typeof act === \"function\" ? { up: act, down: undefined } : act;\n\tconst freeze = opts.freeze ?? true;\n\n\tif (opts.frame === \"inline\") {\n\t\treturn function wrapped(...args: TArgs): TResult {\n\t\t\tconst sealed = freeze ? (args.map(deepFreeze) as unknown as TArgs) : args;\n\t\t\tconst t_ns = wallClockNs();\n\t\t\tconst seq = opts.seq ? bumpCursor(opts.seq) : undefined;\n\t\t\ttry {\n\t\t\t\tconst result = up(...sealed);\n\t\t\t\tif (opts.log && opts.onSuccessRecord) {\n\t\t\t\t\tappendAudit<TArgs, TResult, R, SuccessMeta>(\n\t\t\t\t\t\topts.log,\n\t\t\t\t\t\topts.onSuccessRecord,\n\t\t\t\t\t\tsealed,\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\t{ t_ns, seq },\n\t\t\t\t\t\topts.handlerVersion,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tif (opts.log && opts.onFailureRecord) {\n\t\t\t\t\tconst errorType = err instanceof Error ? err.name : typeof err;\n\t\t\t\t\tappendAudit<TArgs, unknown, R, FailureMeta>(\n\t\t\t\t\t\topts.log,\n\t\t\t\t\t\topts.onFailureRecord,\n\t\t\t\t\t\tsealed,\n\t\t\t\t\t\terr,\n\t\t\t\t\t\t{ t_ns, seq, errorType },\n\t\t\t\t\t\topts.handlerVersion,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t};\n\t}\n\n\t// frame === \"transactional\"\n\treturn function wrapped(...args: TArgs): TResult {\n\t\tconst sealed = freeze ? (args.map(deepFreeze) as unknown as TArgs) : args;\n\t\tconst t_ns = wallClockNs();\n\t\tlet result: TResult;\n\t\tlet captured: unknown;\n\t\tlet captureSet = false;\n\t\tlet seq: number | undefined;\n\t\ttry {\n\t\t\tbatch(() => {\n\t\t\t\tif (opts.seq) seq = bumpCursor(opts.seq);\n\t\t\t\ttry {\n\t\t\t\t\tresult = up(...sealed);\n\t\t\t\t\tif (opts.log && opts.onSuccessRecord) {\n\t\t\t\t\t\tappendAudit<TArgs, TResult, R, SuccessMeta>(\n\t\t\t\t\t\t\topts.log,\n\t\t\t\t\t\t\topts.onSuccessRecord,\n\t\t\t\t\t\t\tsealed,\n\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t{ t_ns, seq },\n\t\t\t\t\t\t\topts.handlerVersion,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tcaptured = err;\n\t\t\t\t\tcaptureSet = true;\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (outerErr) {\n\t\t\t// Fire `down` AFTER batch's reactive rollback, BEFORE failure record.\n\t\t\t// Gate on `captureSet` — if the throw came from outside the inner try\n\t\t\t// (framework-level batch error before action ran), don't fire down.\n\t\t\tif (captureSet && down) {\n\t\t\t\ttry {\n\t\t\t\t\tdown(...sealed);\n\t\t\t\t} catch (downErr) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`mutate: down hook threw — original action error preserved (${\n\t\t\t\t\t\t\tcaptured instanceof Error ? captured.name : typeof captured\n\t\t\t\t\t\t}). Down error:`,\n\t\t\t\t\t\tdownErr,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (captureSet && opts.log && opts.onFailureRecord) {\n\t\t\t\tconst errorType = captured instanceof Error ? captured.name : typeof captured;\n\t\t\t\tappendAudit<TArgs, unknown, R, FailureMeta>(\n\t\t\t\t\topts.log,\n\t\t\t\t\topts.onFailureRecord,\n\t\t\t\t\tsealed,\n\t\t\t\t\tcaptured,\n\t\t\t\t\t{ t_ns, seq, errorType },\n\t\t\t\t\topts.handlerVersion,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow captureSet ? captured : outerErr;\n\t\t}\n\t\treturn result!;\n\t};\n}\n\n/**\n * Advance a cursor node and return the new value. Emits `[DIRTY], [DATA, next]`\n * directly on the cursor — atomic outside a batch, rollback-discardable inside.\n *\n * Resets to `0` if the cursor cache is missing, non-numeric, `NaN`, or\n * non-finite (e.g. corrupted by `restore()` from a malformed snapshot, or\n * by a misbehaving codec). `??` alone would let `NaN` and `\"\"` pass through\n * and silently corrupt audit ordering downstream.\n *\n * **Silent reset diagnostic (EH-12).** When the cache holds a non-numeric\n * value at bump time, the cursor restarts at 0 and the next bump returns 1\n * — colliding with the seq stamped on the very first record after construct.\n * To make seq-monotonicity violations after a restore visible to operators,\n * the helper emits a one-shot `console.warn` per cursor instance describing\n * the offending value. The cursor is identified by a `WeakSet<Node<number>>`\n * so the warning fires exactly once per node — repeat malformed bumps stay\n * quiet to avoid log spam. Production callers wanting to suppress can swap\n * the global `console` (universal-safe code path; no Node-only API used).\n *\n * Works whether or not the cursor has any subscribers — `down` updates the\n * cache regardless, so primitives that bump before consumers attach (e.g.\n * `JobQueueGraph.enqueue`) still see a coherent sequence.\n *\n * @category internal\n */\nconst _bumpCursorWarned = new WeakSet<Node<number>>();\nexport function bumpCursor(seq: Node<number>): number {\n\tconst raw = seq.cache;\n\tconst valid = typeof raw === \"number\" && Number.isFinite(raw);\n\tif (!valid && raw !== undefined && !_bumpCursorWarned.has(seq)) {\n\t\t_bumpCursorWarned.add(seq);\n\t\tconsole.warn(\n\t\t\t`bumpCursor: cursor cache held a non-numeric value (${String(raw)}); resetting to 0. ` +\n\t\t\t\t\"Causes include: a snapshot codec round-tripping the cursor as a string / null / NaN, \" +\n\t\t\t\t\"OR a malformed initial seed (e.g. state<number>(NaN)). \" +\n\t\t\t\t\"Audit consumers may see colliding seq values after this point.\",\n\t\t);\n\t}\n\tconst cur = valid ? raw : 0;\n\tconst next = cur + 1;\n\tseq.down([[DIRTY], [DATA, next]]);\n\treturn next;\n}\n\n/**\n * Build a record via the supplied builder, stamp `handlerVersion` if present,\n * and append it to the audit log. `undefined` records are skipped (callers\n * pass an `onSuccess` / `onFailure` that returns `undefined` to opt out per\n * call).\n *\n * @category internal\n */\nexport function appendAudit<\n\tTArgs extends readonly unknown[],\n\tTValue,\n\tR extends BaseAuditRecord,\n\tM extends SuccessMeta | FailureMeta,\n>(\n\taudit: ReactiveLogBundle<R>,\n\tbuilder: (args: TArgs, value: TValue, meta: M) => R | undefined,\n\targs: TArgs,\n\tvalue: TValue,\n\tmeta: M,\n\thandlerVersion?: { id: string; version: string | number },\n): void {\n\tconst record = builder(args, value, meta);\n\tif (record === undefined) return;\n\tconst stamped = handlerVersion != null ? ({ ...record, handlerVersion } as R) : record;\n\taudit.append(stamped);\n}\n\n// ── registerCursor / registerCursorMap ───────────────────────────────────\n\n/**\n * Promote a closure counter to a state node mounted under `graph`.\n * Replaces ad-hoc `let _seq = 0` patterns with a node observable in\n * `describe()` and persistable via storage tiers.\n *\n * @category internal\n */\nexport function registerCursor(graph: Graph, name: string, initial = 0): Node<number> {\n\tconst cursor = node<number>([], { initial, name, describeKind: \"state\" });\n\tgraph.add(cursor, { name });\n\treturn cursor;\n}\n\n/**\n * Promote a closure `Map<K, number>` to N state nodes (one per key) mounted\n * under `<graph>::<name>::<key>`. Used by saga (per-event-type cursor).\n *\n * @category internal\n */\nexport function registerCursorMap<K extends string>(\n\tgraph: Graph,\n\tname: string,\n\tkeys: readonly K[],\n\tinitial = 0,\n): { readonly [P in K]: Node<number> } {\n\tconst out = {} as { [P in K]: Node<number> };\n\t// Mount cursors under a child plain-Graph so per-key node names stay flat\n\t// (path-separator `::` is reserved by Graph.add). Using `Graph` directly\n\t// rather than `graph.constructor` avoids spawning a typed subclass with\n\t// an incompatible constructor signature (e.g., CqrsGraph(name, opts)).\n\tconst sub = new Graph(name);\n\tfor (const k of keys) {\n\t\tconst cursor = node<number>([], {\n\t\t\tinitial,\n\t\t\tname: k,\n\t\t\tdescribeKind: \"state\",\n\t\t});\n\t\tsub.add(cursor, { name: k });\n\t\tout[k] = cursor;\n\t}\n\tgraph.mount(name, sub);\n\treturn out;\n}\n"],"mappings":"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","names":["import_core","import_extra","import_graph","import_core","import_extra","import_graph","batch","import_extra","baseMeta","batch","policy"]}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { Node } from '@graphrefly/pure-ts/core';
|
|
2
|
+
import { GraphOptions, Graph } from '@graphrefly/pure-ts/graph';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Domain templates (roadmap §8.2).
|
|
6
|
+
*
|
|
7
|
+
* Opinionated Graph factories for common "info → action" domains.
|
|
8
|
+
* Each template wires up §8.1 reduction primitives (stratify, funnel, feedback,
|
|
9
|
+
* budgetGate, scorer) with domain-specific stages. Users fork/extend by
|
|
10
|
+
* accessing named nodes and swapping stages.
|
|
11
|
+
*
|
|
12
|
+
* **Source injection (option B):** templates accept a `source` node, not a
|
|
13
|
+
* hardcoded adapter. Pass `fromOTel(...)`, `fromGitHook(...)`, or a test
|
|
14
|
+
* `state()` — the topology is the same.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** Stratification branch config for observability signals. */
|
|
20
|
+
type ObservabilityBranch = {
|
|
21
|
+
name: string;
|
|
22
|
+
classify: (value: unknown) => boolean;
|
|
23
|
+
};
|
|
24
|
+
/** Options for {@link observabilityGraph}. */
|
|
25
|
+
type ObservabilityGraphOptions = GraphOptions & {
|
|
26
|
+
/** Ingested signal source (e.g. fromOTel(...) or test state). */
|
|
27
|
+
source: Node<unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Classification rules for signal stratification.
|
|
30
|
+
* Default: errors / traces / metrics branches.
|
|
31
|
+
*/
|
|
32
|
+
branches?: ObservabilityBranch[];
|
|
33
|
+
/**
|
|
34
|
+
* Correlation function: receives stratified branch values and produces
|
|
35
|
+
* correlated insights. Default: identity pass-through.
|
|
36
|
+
*/
|
|
37
|
+
correlate?: (values: unknown[]) => unknown;
|
|
38
|
+
/**
|
|
39
|
+
* SLO verification function: returns a verification result for a
|
|
40
|
+
* correlated insight. Default: always passes.
|
|
41
|
+
*/
|
|
42
|
+
sloCheck?: (value: unknown) => unknown;
|
|
43
|
+
/**
|
|
44
|
+
* Scorer weights for alert prioritization. One per branch.
|
|
45
|
+
* Default: equal weights [1, 1, 1].
|
|
46
|
+
*/
|
|
47
|
+
weights?: number[];
|
|
48
|
+
/** Max feedback iterations for false-positive learning. Default: 5. */
|
|
49
|
+
maxFeedbackIterations?: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* OTel ingest → stratified reduction → correlation → SLO verification →
|
|
53
|
+
* alert prioritization → output.
|
|
54
|
+
*
|
|
55
|
+
* Well-known node names:
|
|
56
|
+
* - `"source"` — injected signal source
|
|
57
|
+
* - `"stratify::branch/<name>"` — per-branch classification
|
|
58
|
+
* - `"correlate"` — cross-branch correlation
|
|
59
|
+
* - `"slo_value"`, `"slo_verified"` — SLO verification pair
|
|
60
|
+
* - `"alerts"` — scored, prioritized output
|
|
61
|
+
* - `"output"` — final output (alias for alerts)
|
|
62
|
+
*
|
|
63
|
+
* @category patterns
|
|
64
|
+
*/
|
|
65
|
+
declare function observabilityGraph(name: string, opts: ObservabilityGraphOptions): Graph;
|
|
66
|
+
/** A structured issue extracted from raw findings. */
|
|
67
|
+
type ExtractedIssue = {
|
|
68
|
+
id: string;
|
|
69
|
+
title: string;
|
|
70
|
+
severity: number;
|
|
71
|
+
source: string;
|
|
72
|
+
raw: unknown;
|
|
73
|
+
};
|
|
74
|
+
/** Options for {@link issueTrackerGraph}. */
|
|
75
|
+
type IssueTrackerGraphOptions = GraphOptions & {
|
|
76
|
+
/** Findings source (e.g. fromGitHook(...), fromFSWatch(...)). */
|
|
77
|
+
source: Node<unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Extract structured issues from raw findings.
|
|
80
|
+
* Default: wraps raw value as a single issue.
|
|
81
|
+
*/
|
|
82
|
+
extract?: (raw: unknown) => ExtractedIssue;
|
|
83
|
+
/**
|
|
84
|
+
* Verify an extracted issue (assertion check).
|
|
85
|
+
* Default: always valid.
|
|
86
|
+
*/
|
|
87
|
+
verify?: (issue: ExtractedIssue) => unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Detect regression by comparing against known patterns.
|
|
90
|
+
* Receives (current issue, known patterns).
|
|
91
|
+
* Default: no regression detected.
|
|
92
|
+
*/
|
|
93
|
+
detectRegression?: (issue: ExtractedIssue, known: unknown) => unknown;
|
|
94
|
+
/** Max feedback iterations for re-scanning. Default: 3. */
|
|
95
|
+
maxFeedbackIterations?: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Findings ingest → extraction → verification → regression detection →
|
|
99
|
+
* distillation → prioritized queue.
|
|
100
|
+
*
|
|
101
|
+
* Well-known node names:
|
|
102
|
+
* - `"source"` — injected findings source
|
|
103
|
+
* - `"extract"` — structured issue extraction
|
|
104
|
+
* - `"verify"` — issue verification
|
|
105
|
+
* - `"known_patterns"` — accumulated known issue patterns (state)
|
|
106
|
+
* - `"regression"` — regression detection
|
|
107
|
+
* - `"priority"` — severity-based prioritization
|
|
108
|
+
* - `"output"` — final prioritized output
|
|
109
|
+
*
|
|
110
|
+
* @category patterns
|
|
111
|
+
*/
|
|
112
|
+
declare function issueTrackerGraph(name: string, opts: IssueTrackerGraphOptions): Graph;
|
|
113
|
+
/** Classification result from LLM moderation. */
|
|
114
|
+
type ModerationResult = {
|
|
115
|
+
label: "safe" | "review" | "block";
|
|
116
|
+
confidence: number;
|
|
117
|
+
reason?: string;
|
|
118
|
+
original: unknown;
|
|
119
|
+
};
|
|
120
|
+
/** Options for {@link contentModerationGraph}. */
|
|
121
|
+
type ContentModerationGraphOptions = GraphOptions & {
|
|
122
|
+
/** Content source (text/multimedia ingest). */
|
|
123
|
+
source: Node<unknown>;
|
|
124
|
+
/**
|
|
125
|
+
* Classification function: returns a ModerationResult.
|
|
126
|
+
* Default: labels everything "review" with confidence 0.5.
|
|
127
|
+
*/
|
|
128
|
+
classify?: (content: unknown) => ModerationResult;
|
|
129
|
+
/** System prompt for LLM classification. */
|
|
130
|
+
systemPrompt?: string;
|
|
131
|
+
/** Scorer weights: [safe, review, block]. Default: [0.1, 1, 2]. */
|
|
132
|
+
weights?: [number, number, number];
|
|
133
|
+
/** Max feedback iterations for policy refinement. Default: 5. */
|
|
134
|
+
maxFeedbackIterations?: number;
|
|
135
|
+
/** Max review queue size. When set, oldest entries are trimmed on overflow. */
|
|
136
|
+
maxQueueSize?: number;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Content ingest → LLM/rule classification → stratified routing (safe/review/block) →
|
|
140
|
+
* human review queue → scorer → feedback (false positives → policy refinement) → output.
|
|
141
|
+
*
|
|
142
|
+
* Well-known node names:
|
|
143
|
+
* - `"source"` — content ingest
|
|
144
|
+
* - `"classify"` — LLM or rule-based classification
|
|
145
|
+
* - `"stratify::branch/safe"`, `"stratify::branch/review"`, `"stratify::branch/block"` — routed branches
|
|
146
|
+
* - `"review_queue"` — state node for human review items
|
|
147
|
+
* - `"priority"` — scored priority output
|
|
148
|
+
* - `"policy"` — writable state for policy refinement
|
|
149
|
+
* - `"output"` — final moderation output
|
|
150
|
+
*
|
|
151
|
+
* @category patterns
|
|
152
|
+
*/
|
|
153
|
+
declare function contentModerationGraph(name: string, opts: ContentModerationGraphOptions): Graph;
|
|
154
|
+
/** Schema validation result. */
|
|
155
|
+
type ValidationResult = {
|
|
156
|
+
valid: boolean;
|
|
157
|
+
errors: string[];
|
|
158
|
+
record: unknown;
|
|
159
|
+
};
|
|
160
|
+
/** Anomaly detection result. */
|
|
161
|
+
type AnomalyResult = {
|
|
162
|
+
anomaly: boolean;
|
|
163
|
+
score: number;
|
|
164
|
+
detail?: string;
|
|
165
|
+
record: unknown;
|
|
166
|
+
};
|
|
167
|
+
/** Options for {@link dataQualityGraph}. */
|
|
168
|
+
type DataQualityGraphOptions = GraphOptions & {
|
|
169
|
+
/** Data source (e.g. fromPrisma(...), fromKysely(...)). */
|
|
170
|
+
source: Node<unknown>;
|
|
171
|
+
/**
|
|
172
|
+
* Schema validation function.
|
|
173
|
+
* Default: always valid.
|
|
174
|
+
*/
|
|
175
|
+
validate?: (record: unknown) => ValidationResult;
|
|
176
|
+
/**
|
|
177
|
+
* Anomaly detection function.
|
|
178
|
+
* Default: no anomaly.
|
|
179
|
+
*/
|
|
180
|
+
detectAnomaly?: (record: unknown) => AnomalyResult;
|
|
181
|
+
/**
|
|
182
|
+
* Drift detection: compares current record against baseline.
|
|
183
|
+
* Default: no drift.
|
|
184
|
+
*/
|
|
185
|
+
detectDrift?: (record: unknown, baseline: unknown) => unknown;
|
|
186
|
+
/**
|
|
187
|
+
* Remediation suggestion function.
|
|
188
|
+
* Default: no suggestion.
|
|
189
|
+
*/
|
|
190
|
+
suggest?: (result: {
|
|
191
|
+
validation: ValidationResult;
|
|
192
|
+
anomaly: AnomalyResult;
|
|
193
|
+
}) => unknown;
|
|
194
|
+
/** Max feedback iterations for rule refinement. Default: 3. */
|
|
195
|
+
maxFeedbackIterations?: number;
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Data ingest → schema validation → anomaly detection → drift alerting →
|
|
199
|
+
* auto-remediation suggestions → output.
|
|
200
|
+
*
|
|
201
|
+
* Well-known node names:
|
|
202
|
+
* - `"source"` — data ingest
|
|
203
|
+
* - `"validate"` — schema validation
|
|
204
|
+
* - `"anomaly"` — anomaly detection
|
|
205
|
+
* - `"baseline"` — rolling baseline state
|
|
206
|
+
* - `"drift"` — drift detection
|
|
207
|
+
* - `"remediate"` — auto-remediation suggestions
|
|
208
|
+
* - `"output"` — combined quality report
|
|
209
|
+
*
|
|
210
|
+
* @category patterns
|
|
211
|
+
*/
|
|
212
|
+
declare function dataQualityGraph(name: string, opts: DataQualityGraphOptions): Graph;
|
|
213
|
+
|
|
214
|
+
export { type AnomalyResult, type ContentModerationGraphOptions, type DataQualityGraphOptions, type ExtractedIssue, type IssueTrackerGraphOptions, type ModerationResult, type ObservabilityBranch, type ObservabilityGraphOptions, type ValidationResult, contentModerationGraph, dataQualityGraph, issueTrackerGraph, observabilityGraph };
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { Node } from '@graphrefly/pure-ts/core';
|
|
2
|
+
import { GraphOptions, Graph } from '@graphrefly/pure-ts/graph';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Domain templates (roadmap §8.2).
|
|
6
|
+
*
|
|
7
|
+
* Opinionated Graph factories for common "info → action" domains.
|
|
8
|
+
* Each template wires up §8.1 reduction primitives (stratify, funnel, feedback,
|
|
9
|
+
* budgetGate, scorer) with domain-specific stages. Users fork/extend by
|
|
10
|
+
* accessing named nodes and swapping stages.
|
|
11
|
+
*
|
|
12
|
+
* **Source injection (option B):** templates accept a `source` node, not a
|
|
13
|
+
* hardcoded adapter. Pass `fromOTel(...)`, `fromGitHook(...)`, or a test
|
|
14
|
+
* `state()` — the topology is the same.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** Stratification branch config for observability signals. */
|
|
20
|
+
type ObservabilityBranch = {
|
|
21
|
+
name: string;
|
|
22
|
+
classify: (value: unknown) => boolean;
|
|
23
|
+
};
|
|
24
|
+
/** Options for {@link observabilityGraph}. */
|
|
25
|
+
type ObservabilityGraphOptions = GraphOptions & {
|
|
26
|
+
/** Ingested signal source (e.g. fromOTel(...) or test state). */
|
|
27
|
+
source: Node<unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Classification rules for signal stratification.
|
|
30
|
+
* Default: errors / traces / metrics branches.
|
|
31
|
+
*/
|
|
32
|
+
branches?: ObservabilityBranch[];
|
|
33
|
+
/**
|
|
34
|
+
* Correlation function: receives stratified branch values and produces
|
|
35
|
+
* correlated insights. Default: identity pass-through.
|
|
36
|
+
*/
|
|
37
|
+
correlate?: (values: unknown[]) => unknown;
|
|
38
|
+
/**
|
|
39
|
+
* SLO verification function: returns a verification result for a
|
|
40
|
+
* correlated insight. Default: always passes.
|
|
41
|
+
*/
|
|
42
|
+
sloCheck?: (value: unknown) => unknown;
|
|
43
|
+
/**
|
|
44
|
+
* Scorer weights for alert prioritization. One per branch.
|
|
45
|
+
* Default: equal weights [1, 1, 1].
|
|
46
|
+
*/
|
|
47
|
+
weights?: number[];
|
|
48
|
+
/** Max feedback iterations for false-positive learning. Default: 5. */
|
|
49
|
+
maxFeedbackIterations?: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* OTel ingest → stratified reduction → correlation → SLO verification →
|
|
53
|
+
* alert prioritization → output.
|
|
54
|
+
*
|
|
55
|
+
* Well-known node names:
|
|
56
|
+
* - `"source"` — injected signal source
|
|
57
|
+
* - `"stratify::branch/<name>"` — per-branch classification
|
|
58
|
+
* - `"correlate"` — cross-branch correlation
|
|
59
|
+
* - `"slo_value"`, `"slo_verified"` — SLO verification pair
|
|
60
|
+
* - `"alerts"` — scored, prioritized output
|
|
61
|
+
* - `"output"` — final output (alias for alerts)
|
|
62
|
+
*
|
|
63
|
+
* @category patterns
|
|
64
|
+
*/
|
|
65
|
+
declare function observabilityGraph(name: string, opts: ObservabilityGraphOptions): Graph;
|
|
66
|
+
/** A structured issue extracted from raw findings. */
|
|
67
|
+
type ExtractedIssue = {
|
|
68
|
+
id: string;
|
|
69
|
+
title: string;
|
|
70
|
+
severity: number;
|
|
71
|
+
source: string;
|
|
72
|
+
raw: unknown;
|
|
73
|
+
};
|
|
74
|
+
/** Options for {@link issueTrackerGraph}. */
|
|
75
|
+
type IssueTrackerGraphOptions = GraphOptions & {
|
|
76
|
+
/** Findings source (e.g. fromGitHook(...), fromFSWatch(...)). */
|
|
77
|
+
source: Node<unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Extract structured issues from raw findings.
|
|
80
|
+
* Default: wraps raw value as a single issue.
|
|
81
|
+
*/
|
|
82
|
+
extract?: (raw: unknown) => ExtractedIssue;
|
|
83
|
+
/**
|
|
84
|
+
* Verify an extracted issue (assertion check).
|
|
85
|
+
* Default: always valid.
|
|
86
|
+
*/
|
|
87
|
+
verify?: (issue: ExtractedIssue) => unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Detect regression by comparing against known patterns.
|
|
90
|
+
* Receives (current issue, known patterns).
|
|
91
|
+
* Default: no regression detected.
|
|
92
|
+
*/
|
|
93
|
+
detectRegression?: (issue: ExtractedIssue, known: unknown) => unknown;
|
|
94
|
+
/** Max feedback iterations for re-scanning. Default: 3. */
|
|
95
|
+
maxFeedbackIterations?: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Findings ingest → extraction → verification → regression detection →
|
|
99
|
+
* distillation → prioritized queue.
|
|
100
|
+
*
|
|
101
|
+
* Well-known node names:
|
|
102
|
+
* - `"source"` — injected findings source
|
|
103
|
+
* - `"extract"` — structured issue extraction
|
|
104
|
+
* - `"verify"` — issue verification
|
|
105
|
+
* - `"known_patterns"` — accumulated known issue patterns (state)
|
|
106
|
+
* - `"regression"` — regression detection
|
|
107
|
+
* - `"priority"` — severity-based prioritization
|
|
108
|
+
* - `"output"` — final prioritized output
|
|
109
|
+
*
|
|
110
|
+
* @category patterns
|
|
111
|
+
*/
|
|
112
|
+
declare function issueTrackerGraph(name: string, opts: IssueTrackerGraphOptions): Graph;
|
|
113
|
+
/** Classification result from LLM moderation. */
|
|
114
|
+
type ModerationResult = {
|
|
115
|
+
label: "safe" | "review" | "block";
|
|
116
|
+
confidence: number;
|
|
117
|
+
reason?: string;
|
|
118
|
+
original: unknown;
|
|
119
|
+
};
|
|
120
|
+
/** Options for {@link contentModerationGraph}. */
|
|
121
|
+
type ContentModerationGraphOptions = GraphOptions & {
|
|
122
|
+
/** Content source (text/multimedia ingest). */
|
|
123
|
+
source: Node<unknown>;
|
|
124
|
+
/**
|
|
125
|
+
* Classification function: returns a ModerationResult.
|
|
126
|
+
* Default: labels everything "review" with confidence 0.5.
|
|
127
|
+
*/
|
|
128
|
+
classify?: (content: unknown) => ModerationResult;
|
|
129
|
+
/** System prompt for LLM classification. */
|
|
130
|
+
systemPrompt?: string;
|
|
131
|
+
/** Scorer weights: [safe, review, block]. Default: [0.1, 1, 2]. */
|
|
132
|
+
weights?: [number, number, number];
|
|
133
|
+
/** Max feedback iterations for policy refinement. Default: 5. */
|
|
134
|
+
maxFeedbackIterations?: number;
|
|
135
|
+
/** Max review queue size. When set, oldest entries are trimmed on overflow. */
|
|
136
|
+
maxQueueSize?: number;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Content ingest → LLM/rule classification → stratified routing (safe/review/block) →
|
|
140
|
+
* human review queue → scorer → feedback (false positives → policy refinement) → output.
|
|
141
|
+
*
|
|
142
|
+
* Well-known node names:
|
|
143
|
+
* - `"source"` — content ingest
|
|
144
|
+
* - `"classify"` — LLM or rule-based classification
|
|
145
|
+
* - `"stratify::branch/safe"`, `"stratify::branch/review"`, `"stratify::branch/block"` — routed branches
|
|
146
|
+
* - `"review_queue"` — state node for human review items
|
|
147
|
+
* - `"priority"` — scored priority output
|
|
148
|
+
* - `"policy"` — writable state for policy refinement
|
|
149
|
+
* - `"output"` — final moderation output
|
|
150
|
+
*
|
|
151
|
+
* @category patterns
|
|
152
|
+
*/
|
|
153
|
+
declare function contentModerationGraph(name: string, opts: ContentModerationGraphOptions): Graph;
|
|
154
|
+
/** Schema validation result. */
|
|
155
|
+
type ValidationResult = {
|
|
156
|
+
valid: boolean;
|
|
157
|
+
errors: string[];
|
|
158
|
+
record: unknown;
|
|
159
|
+
};
|
|
160
|
+
/** Anomaly detection result. */
|
|
161
|
+
type AnomalyResult = {
|
|
162
|
+
anomaly: boolean;
|
|
163
|
+
score: number;
|
|
164
|
+
detail?: string;
|
|
165
|
+
record: unknown;
|
|
166
|
+
};
|
|
167
|
+
/** Options for {@link dataQualityGraph}. */
|
|
168
|
+
type DataQualityGraphOptions = GraphOptions & {
|
|
169
|
+
/** Data source (e.g. fromPrisma(...), fromKysely(...)). */
|
|
170
|
+
source: Node<unknown>;
|
|
171
|
+
/**
|
|
172
|
+
* Schema validation function.
|
|
173
|
+
* Default: always valid.
|
|
174
|
+
*/
|
|
175
|
+
validate?: (record: unknown) => ValidationResult;
|
|
176
|
+
/**
|
|
177
|
+
* Anomaly detection function.
|
|
178
|
+
* Default: no anomaly.
|
|
179
|
+
*/
|
|
180
|
+
detectAnomaly?: (record: unknown) => AnomalyResult;
|
|
181
|
+
/**
|
|
182
|
+
* Drift detection: compares current record against baseline.
|
|
183
|
+
* Default: no drift.
|
|
184
|
+
*/
|
|
185
|
+
detectDrift?: (record: unknown, baseline: unknown) => unknown;
|
|
186
|
+
/**
|
|
187
|
+
* Remediation suggestion function.
|
|
188
|
+
* Default: no suggestion.
|
|
189
|
+
*/
|
|
190
|
+
suggest?: (result: {
|
|
191
|
+
validation: ValidationResult;
|
|
192
|
+
anomaly: AnomalyResult;
|
|
193
|
+
}) => unknown;
|
|
194
|
+
/** Max feedback iterations for rule refinement. Default: 3. */
|
|
195
|
+
maxFeedbackIterations?: number;
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Data ingest → schema validation → anomaly detection → drift alerting →
|
|
199
|
+
* auto-remediation suggestions → output.
|
|
200
|
+
*
|
|
201
|
+
* Well-known node names:
|
|
202
|
+
* - `"source"` — data ingest
|
|
203
|
+
* - `"validate"` — schema validation
|
|
204
|
+
* - `"anomaly"` — anomaly detection
|
|
205
|
+
* - `"baseline"` — rolling baseline state
|
|
206
|
+
* - `"drift"` — drift detection
|
|
207
|
+
* - `"remediate"` — auto-remediation suggestions
|
|
208
|
+
* - `"output"` — combined quality report
|
|
209
|
+
*
|
|
210
|
+
* @category patterns
|
|
211
|
+
*/
|
|
212
|
+
declare function dataQualityGraph(name: string, opts: DataQualityGraphOptions): Graph;
|
|
213
|
+
|
|
214
|
+
export { type AnomalyResult, type ContentModerationGraphOptions, type DataQualityGraphOptions, type ExtractedIssue, type IssueTrackerGraphOptions, type ModerationResult, type ObservabilityBranch, type ObservabilityGraphOptions, type ValidationResult, contentModerationGraph, dataQualityGraph, issueTrackerGraph, observabilityGraph };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
contentModerationGraph,
|
|
3
|
+
dataQualityGraph,
|
|
4
|
+
issueTrackerGraph,
|
|
5
|
+
observabilityGraph
|
|
6
|
+
} from "../../chunk-DM4OMPWK.js";
|
|
7
|
+
import "../../chunk-IHTWQEDR.js";
|
|
8
|
+
import "../../chunk-FMPF42Q4.js";
|
|
9
|
+
import "../../chunk-BXGZFGZ4.js";
|
|
10
|
+
import "../../chunk-AZDQPQ3V.js";
|
|
11
|
+
export {
|
|
12
|
+
contentModerationGraph,
|
|
13
|
+
dataQualityGraph,
|
|
14
|
+
issueTrackerGraph,
|
|
15
|
+
observabilityGraph
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|