@graphrefly/graphrefly 0.45.0 → 0.47.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 +865 -0
- package/dist/base/composition/index.cjs.map +1 -0
- package/dist/base/composition/index.d.cts +468 -0
- package/dist/base/composition/index.d.ts +468 -0
- package/dist/base/composition/index.js +40 -0
- package/dist/base/composition/index.js.map +1 -0
- package/dist/base/index.cjs +6390 -0
- package/dist/base/index.cjs.map +1 -0
- package/dist/base/index.d.cts +21 -0
- package/dist/base/index.d.ts +21 -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-22SG74BD.js +207 -0
- package/dist/chunk-22SG74BD.js.map +1 -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-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-5IMMNARC.js +1153 -0
- package/dist/chunk-5IMMNARC.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-EHRRQ4IC.js +211 -0
- package/dist/chunk-EHRRQ4IC.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-FW23JYNQ.js +454 -0
- package/dist/chunk-FW23JYNQ.js.map +1 -0
- package/dist/chunk-GWRNLJNW.js +2508 -0
- package/dist/chunk-GWRNLJNW.js.map +1 -0
- package/dist/chunk-HL7HUJIX.js +1 -0
- package/dist/chunk-HL7HUJIX.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-JKTC747G.js +725 -0
- package/dist/chunk-JKTC747G.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-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-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-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-TNX5ZGDJ.js +574 -0
- package/dist/chunk-TNX5ZGDJ.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-VLAGJZSL.js +1079 -0
- package/dist/chunk-VLAGJZSL.js.map +1 -0
- package/dist/chunk-W2BOPXTI.js +1 -0
- package/dist/chunk-W2BOPXTI.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-Z65DVDEQ.js +146 -0
- package/dist/chunk-Z65DVDEQ.js.map +1 -0
- package/dist/chunk-Z6EGP5D7.js +92 -0
- package/dist/chunk-Z6EGP5D7.js.map +1 -0
- package/dist/chunk-ZT4WMQW4.js +1575 -0
- package/dist/chunk-ZT4WMQW4.js.map +1 -0
- package/dist/chunk-ZVXXDWIB.js +1282 -0
- package/dist/chunk-ZVXXDWIB.js.map +1 -0
- package/dist/compat/index.cjs +3150 -6
- 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 +2291 -6
- 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 +76 -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-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-B_p8tnvf.d.cts +770 -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-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-_HDSmPyp.d.ts +770 -0
- package/dist/index-dX9IzPqj.d.cts +86 -0
- package/dist/index-dX9IzPqj.d.ts +86 -0
- package/dist/index.cjs +26009 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +55 -42
- package/dist/index.d.ts +55 -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-B25XqCbZ.d.cts +59 -0
- package/dist/observable-B25XqCbZ.d.ts +59 -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 +17614 -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 +1456 -0
- package/dist/utils/memory/index.cjs.map +1 -0
- package/dist/utils/memory/index.d.cts +660 -0
- package/dist/utils/memory/index.d.ts +660 -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 -241
- 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,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
awaitSettled,
|
|
3
|
+
firstValueFrom
|
|
4
|
+
} from "./chunk-O3MT7DYI.js";
|
|
5
|
+
|
|
6
|
+
// src/presets/ai/debate/index.ts
|
|
7
|
+
import {
|
|
8
|
+
batch,
|
|
9
|
+
node as createNode,
|
|
10
|
+
ERROR,
|
|
11
|
+
INVALIDATE,
|
|
12
|
+
RESOLVED
|
|
13
|
+
} from "@graphrefly/pure-ts/core";
|
|
14
|
+
import { fromAny, switchMap } from "@graphrefly/pure-ts/extra";
|
|
15
|
+
import { Graph } from "@graphrefly/pure-ts/graph";
|
|
16
|
+
var DebateGraph = class extends Graph {
|
|
17
|
+
};
|
|
18
|
+
var SYNTH_RE = /synth/i;
|
|
19
|
+
function defaultConverge(transcript) {
|
|
20
|
+
const rounds = transcript.reduce((m, t) => Math.max(m, t.round), 0);
|
|
21
|
+
if (rounds < 2) return false;
|
|
22
|
+
const at = (r) => {
|
|
23
|
+
const m = /* @__PURE__ */ new Map();
|
|
24
|
+
for (const t of transcript) if (t.round === r) m.set(t.role, t.content);
|
|
25
|
+
return m;
|
|
26
|
+
};
|
|
27
|
+
const prev = at(rounds - 1);
|
|
28
|
+
const cur = at(rounds);
|
|
29
|
+
if (prev.size === 0 || prev.size !== cur.size) return false;
|
|
30
|
+
for (const [role, content] of cur) if (prev.get(role) !== content) return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
var _debateSeq = 0;
|
|
34
|
+
function heterogeneousDebate(parent, opts) {
|
|
35
|
+
const output = opts.output ?? "transcript";
|
|
36
|
+
if (output === "synthesizer-final" && !opts.participants.some((p) => SYNTH_RE.test(p.role))) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
"heterogeneousDebate: output 'synthesizer-final' requires a participant whose role matches /synth/i (DS-14.6.A D-C2)."
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (opts.participants.length === 0) {
|
|
42
|
+
throw new Error("heterogeneousDebate: at least one participant is required");
|
|
43
|
+
}
|
|
44
|
+
const name = opts.name ?? `debate-${++_debateSeq}`;
|
|
45
|
+
const graph = new DebateGraph(name);
|
|
46
|
+
parent.mount(name, graph);
|
|
47
|
+
const term = opts.rounds ?? 3;
|
|
48
|
+
const maxRounds = opts.maxRounds ?? 12;
|
|
49
|
+
const converge = opts.converge ?? defaultConverge;
|
|
50
|
+
const untilNode = typeof term === "object" ? term.until : createNode([], { initial: false });
|
|
51
|
+
const roundTrigger = createNode([], { name: `${name}.round`, initial: 0 });
|
|
52
|
+
const statusState = createNode([], { name: `${name}.status`, initial: "running" });
|
|
53
|
+
const resultState = createNode([], { name: `${name}.result`, initial: void 0 });
|
|
54
|
+
let history = [];
|
|
55
|
+
function buildMessages(p) {
|
|
56
|
+
const msgs = [
|
|
57
|
+
{ role: "system", content: p.systemPrompt },
|
|
58
|
+
{ role: "user", content: opts.question }
|
|
59
|
+
];
|
|
60
|
+
for (const t of history) {
|
|
61
|
+
msgs.push({ role: "assistant", content: `[${t.role} r${t.round}] ${t.content}` });
|
|
62
|
+
}
|
|
63
|
+
return msgs;
|
|
64
|
+
}
|
|
65
|
+
const roundWork = switchMap(
|
|
66
|
+
roundTrigger,
|
|
67
|
+
(r) => createNode(
|
|
68
|
+
[],
|
|
69
|
+
(_data, actions) => {
|
|
70
|
+
if (r < 1) {
|
|
71
|
+
actions.down([[RESOLVED]]);
|
|
72
|
+
return void 0;
|
|
73
|
+
}
|
|
74
|
+
const ac = new AbortController();
|
|
75
|
+
let cancelled = false;
|
|
76
|
+
(async () => {
|
|
77
|
+
const turns = [];
|
|
78
|
+
try {
|
|
79
|
+
for (const p of opts.participants) {
|
|
80
|
+
const res = await firstValueFrom(
|
|
81
|
+
fromAny(
|
|
82
|
+
p.adapter.invoke(buildMessages(p), {
|
|
83
|
+
signal: ac.signal
|
|
84
|
+
})
|
|
85
|
+
)
|
|
86
|
+
);
|
|
87
|
+
if (cancelled) return;
|
|
88
|
+
turns.push({ round: r, role: p.role, content: res.content });
|
|
89
|
+
}
|
|
90
|
+
if (!cancelled) actions.emit({ round: r, turns });
|
|
91
|
+
} catch (err) {
|
|
92
|
+
if (!cancelled) actions.down([[ERROR, err]]);
|
|
93
|
+
}
|
|
94
|
+
})();
|
|
95
|
+
return () => {
|
|
96
|
+
cancelled = true;
|
|
97
|
+
ac.abort();
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
{ describeKind: "producer", name: `${name}.round-work` }
|
|
101
|
+
),
|
|
102
|
+
{ name: `${name}.rounds` }
|
|
103
|
+
);
|
|
104
|
+
graph.add(roundWork, { name: "rounds" });
|
|
105
|
+
const transcript = createNode(
|
|
106
|
+
[roundWork],
|
|
107
|
+
(batchData, actions, ctx) => {
|
|
108
|
+
const env = batchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : ctx.prevData[0];
|
|
109
|
+
if (env === void 0) {
|
|
110
|
+
actions.down([[RESOLVED]]);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
actions.emit(history.slice());
|
|
114
|
+
},
|
|
115
|
+
{ name: `${name}.transcript`, describeKind: "derived" }
|
|
116
|
+
);
|
|
117
|
+
graph.add(transcript, { name: "transcript" });
|
|
118
|
+
const converged = createNode(
|
|
119
|
+
[transcript, untilNode],
|
|
120
|
+
(batchData, actions, ctx) => {
|
|
121
|
+
const tr = batchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : ctx.prevData[0];
|
|
122
|
+
const untilV = batchData[1] != null && batchData[1].length > 0 ? batchData[1].at(-1) : ctx.prevData[1];
|
|
123
|
+
const rounds = (tr ?? []).reduce((m, t) => Math.max(m, t.round), 0);
|
|
124
|
+
if (typeof term === "number") {
|
|
125
|
+
actions.emit({ done: rounds >= term, reason: "max-rounds" });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (term === "until-converge") {
|
|
129
|
+
if (converge(tr ?? [])) actions.emit({ done: true, reason: "converged" });
|
|
130
|
+
else actions.emit({ done: rounds >= maxRounds, reason: "max-rounds" });
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
actions.emit({ done: untilV === true || rounds >= maxRounds, reason: "max-rounds" });
|
|
134
|
+
},
|
|
135
|
+
{ name: `${name}.converged`, describeKind: "derived" }
|
|
136
|
+
);
|
|
137
|
+
graph.add(converged, { name: "converged" });
|
|
138
|
+
const decideEffect = createNode(
|
|
139
|
+
[roundWork, untilNode],
|
|
140
|
+
(batchData, _actions, ctx) => {
|
|
141
|
+
const env = batchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : void 0;
|
|
142
|
+
const untilV = batchData[1] != null && batchData[1].length > 0 ? batchData[1].at(-1) : ctx.prevData[1];
|
|
143
|
+
if (env === void 0) {
|
|
144
|
+
if (typeof term === "object" && untilV === true && statusState.cache === "running") {
|
|
145
|
+
finalize("max-rounds");
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
history = [...history, ...env.turns];
|
|
150
|
+
const r = env.round;
|
|
151
|
+
let done = false;
|
|
152
|
+
let reason = "max-rounds";
|
|
153
|
+
if (typeof term === "number") done = r >= term;
|
|
154
|
+
else if (term === "until-converge") {
|
|
155
|
+
if (converge(history)) {
|
|
156
|
+
done = true;
|
|
157
|
+
reason = "converged";
|
|
158
|
+
} else done = r >= maxRounds;
|
|
159
|
+
} else done = untilV === true || r >= maxRounds;
|
|
160
|
+
if (done) finalize(reason);
|
|
161
|
+
else roundTrigger.emit(r + 1);
|
|
162
|
+
},
|
|
163
|
+
{ name: `${name}.decide`, describeKind: "effect", errorWhenDepsError: false }
|
|
164
|
+
);
|
|
165
|
+
graph.add(decideEffect, { name: "decide" });
|
|
166
|
+
function finalize(reason) {
|
|
167
|
+
let out;
|
|
168
|
+
if (output === "transcript") out = history.slice();
|
|
169
|
+
else if (output === "synthesizer-final") {
|
|
170
|
+
const synth = [...history].reverse().find((t) => SYNTH_RE.test(t.role));
|
|
171
|
+
out = synth?.content ?? null;
|
|
172
|
+
} else out = output.project(history.slice());
|
|
173
|
+
batch(() => {
|
|
174
|
+
statusState.emit(reason);
|
|
175
|
+
resultState.emit(out);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const errorWatcher = createNode(
|
|
179
|
+
[roundWork],
|
|
180
|
+
(_b, _a, ec) => {
|
|
181
|
+
const t = ec.terminalDeps[0];
|
|
182
|
+
if (t !== void 0 && t !== true && statusState.cache === "running") {
|
|
183
|
+
batch(() => {
|
|
184
|
+
statusState.emit("error");
|
|
185
|
+
resultState.emit(new Error("heterogeneousDebate: a participant adapter errored"));
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{ name: `${name}.error-watcher`, describeKind: "effect", errorWhenDepsError: false }
|
|
190
|
+
);
|
|
191
|
+
graph.add(errorWatcher, { name: "error-watcher" });
|
|
192
|
+
decideEffect.subscribe(() => void 0);
|
|
193
|
+
errorWatcher.subscribe(() => void 0);
|
|
194
|
+
transcript.subscribe(() => void 0);
|
|
195
|
+
converged.subscribe(() => void 0);
|
|
196
|
+
let running = false;
|
|
197
|
+
return {
|
|
198
|
+
transcript,
|
|
199
|
+
result: resultState,
|
|
200
|
+
status: statusState,
|
|
201
|
+
graph,
|
|
202
|
+
async run() {
|
|
203
|
+
if (running) {
|
|
204
|
+
throw new RangeError(
|
|
205
|
+
`heterogeneousDebate "${name}": run() called while a previous run() is still pending`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
running = true;
|
|
209
|
+
try {
|
|
210
|
+
history = [];
|
|
211
|
+
batch(() => {
|
|
212
|
+
statusState.emit("running");
|
|
213
|
+
resultState.down([[INVALIDATE]]);
|
|
214
|
+
});
|
|
215
|
+
const settled = awaitSettled(resultState, { skipCurrent: true });
|
|
216
|
+
roundTrigger.emit(1);
|
|
217
|
+
return await settled;
|
|
218
|
+
} finally {
|
|
219
|
+
running = false;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export {
|
|
226
|
+
DebateGraph,
|
|
227
|
+
heterogeneousDebate
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=chunk-E5OZPDIW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presets/ai/debate/index.ts"],"sourcesContent":["/**\n * DS-14.6.A U-C — `heterogeneousDebate()` (Phase 14.5).\n *\n * Stanford-MAD heterogeneity thesis (SESSION-DS-14.6-A L9): participants get\n * **different model adapters + different role prompts**. Closed reasoning\n * loop — no tools / side effects / persistent state beyond the transcript.\n *\n * **Reactive topology (QA M1→b, 2026-05-15).** The round loop is NOT a\n * top-level `async while` driver. It mirrors `refineLoop`'s §7 feedback\n * shape so `describe()` / `explain()` / dry-run see the structure:\n *\n * ```\n * roundTrigger(state) ──▶ roundWork(switchMap→producer, per-round\n * sequential adapter.invoke) ──▶ transcript(scan)\n * └─▶ converged(derived) │\n * ▲ │\n * └──────────── decideEffect (feedback + trigger) ◀─────┘\n * ```\n *\n * The per-round participant calls are an async **source boundary** inside\n * the switchMap producer (spec §5.10 — async belongs in sources), with an\n * abort-on-deactivate `AbortController` (COMPOSITION-GUIDE §45) so a\n * superseded / torn-down round cancels its in-flight LLM calls. `decideEffect`\n * is the sole feedback authority (computes termination inline from the round\n * envelope + closure history, §28); `converged` is a parallel derived purely\n * for external `status` observability. Termination: `fixedRounds |\n * \"until-converge\" | { until: Node<boolean> }` — `until` is a real reactive\n * dep, not a `.cache` poll. `\"until-converge\"` uses a pluggable `converge?`\n * fn, default = no participant changed stance across the last 2 rounds\n * (D-C1, zero extra LLM cost). `output:\"synthesizer-final\"` with no\n * synthesizer-role participant throws at construction (D-C2).\n *\n * @module\n */\n\nimport {\n\tbatch,\n\tnode as createNode,\n\tERROR,\n\tINVALIDATE,\n\ttype Node,\n\tRESOLVED,\n} from \"@graphrefly/pure-ts/core\";\nimport { fromAny, switchMap } from \"@graphrefly/pure-ts/extra\";\nimport { Graph } from \"@graphrefly/pure-ts/graph\";\nimport { awaitSettled, firstValueFrom } from \"../../../base/sources/settled.js\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMResponse,\n\tNodeInput,\n} from \"../../../utils/ai/adapters/core/types.js\";\n\nexport interface Turn {\n\treadonly round: number;\n\treadonly role: string;\n\treadonly content: string;\n}\n\nexport interface DebateParticipant {\n\treadonly adapter: LLMAdapter;\n\t/** e.g. \"advocate\" | \"skeptic\" | \"synthesizer\" | custom. */\n\treadonly role: string;\n\treadonly systemPrompt: string;\n}\n\nexport type DebateTermination = number | \"until-converge\" | { readonly until: Node<boolean> };\n\nexport type DebateOutput =\n\t| \"transcript\"\n\t| \"synthesizer-final\"\n\t| { readonly project: (transcript: readonly Turn[]) => unknown };\n\nexport type DebateStatus = \"running\" | \"converged\" | \"max-rounds\" | \"error\";\n\nexport interface HeterogeneousDebateOptions {\n\treadonly question: string;\n\treadonly participants: readonly DebateParticipant[];\n\t/** Default `3`. */\n\treadonly rounds?: DebateTermination;\n\t/** Default `\"transcript\"`. */\n\treadonly output?: DebateOutput;\n\t/**\n\t * D-C1 — `\"until-converge\"` detector. Default: no participant's latest\n\t * content changed vs the previous round (structural compare, no LLM).\n\t */\n\treadonly converge?: (transcript: readonly Turn[]) => boolean;\n\treadonly name?: string;\n\t/** Hard ceiling for `\"until-converge\"` / `{ until }` (default 12). */\n\treadonly maxRounds?: number;\n}\n\nexport interface HeterogeneousDebateBundle {\n\treadonly transcript: Node<readonly Turn[]>;\n\treadonly result: Node<unknown>;\n\treadonly status: Node<DebateStatus>;\n\treadonly graph: DebateGraph;\n\t/**\n\t * Thin `awaitSettled` bridge (mirrors `agentLoop.run()`): kicks the\n\t * reactive round loop and resolves the final `result`. Throws\n\t * `RangeError` if a prior `run()` is still pending (QA P4 re-entrancy).\n\t */\n\trun(): Promise<unknown>;\n}\n\nexport class DebateGraph extends Graph {}\n\nconst SYNTH_RE = /synth/i;\n\n/** Default converge: every role's latest two rounds are identical. */\nfunction defaultConverge(transcript: readonly Turn[]): boolean {\n\tconst rounds = transcript.reduce((m, t) => Math.max(m, t.round), 0);\n\tif (rounds < 2) return false;\n\tconst at = (r: number): Map<string, string> => {\n\t\tconst m = new Map<string, string>();\n\t\tfor (const t of transcript) if (t.round === r) m.set(t.role, t.content);\n\t\treturn m;\n\t};\n\tconst prev = at(rounds - 1);\n\tconst cur = at(rounds);\n\tif (prev.size === 0 || prev.size !== cur.size) return false;\n\tfor (const [role, content] of cur) if (prev.get(role) !== content) return false;\n\treturn true;\n}\n\n/** Process-wide sequence for collision-safe default mount names (QA P6). */\nlet _debateSeq = 0;\n\ninterface RoundEnvelope {\n\treadonly round: number;\n\treadonly turns: readonly Turn[];\n}\n\nexport function heterogeneousDebate(\n\tparent: Graph,\n\topts: HeterogeneousDebateOptions,\n): HeterogeneousDebateBundle {\n\tconst output = opts.output ?? \"transcript\";\n\tif (output === \"synthesizer-final\" && !opts.participants.some((p) => SYNTH_RE.test(p.role))) {\n\t\tthrow new Error(\n\t\t\t\"heterogeneousDebate: output 'synthesizer-final' requires a participant whose role matches /synth/i (DS-14.6.A D-C2).\",\n\t\t);\n\t}\n\tif (opts.participants.length === 0) {\n\t\tthrow new Error(\"heterogeneousDebate: at least one participant is required\");\n\t}\n\n\tconst name = opts.name ?? `debate-${++_debateSeq}`;\n\tconst graph = new DebateGraph(name);\n\tparent.mount(name, graph);\n\n\tconst term = opts.rounds ?? 3;\n\tconst maxRounds = opts.maxRounds ?? 12;\n\tconst converge = opts.converge ?? defaultConverge;\n\t// `{ until }` becomes a real reactive dep (QA P10 — no `.cache` poll);\n\t// non-until modes use a constant-false node for stable dep arity.\n\tconst untilNode: Node<boolean> =\n\t\ttypeof term === \"object\" ? term.until : createNode<boolean>([], { initial: false });\n\n\t// --- state / output nodes -------------------------------------------------\n\tconst roundTrigger = createNode<number>([], { name: `${name}.round`, initial: 0 });\n\tconst statusState = createNode<DebateStatus>([], { name: `${name}.status`, initial: \"running\" });\n\tconst resultState = createNode<unknown>([], { name: `${name}.result`, initial: undefined });\n\n\t// Closure history (§28 factory-time mirror) — the feedback authority's\n\t// view of the transcript without a declared dep cycle.\n\tlet history: Turn[] = [];\n\n\tfunction buildMessages(p: DebateParticipant): ChatMessage[] {\n\t\tconst msgs: ChatMessage[] = [\n\t\t\t{ role: \"system\", content: p.systemPrompt },\n\t\t\t{ role: \"user\", content: opts.question },\n\t\t];\n\t\tfor (const t of history) {\n\t\t\tmsgs.push({ role: \"assistant\", content: `[${t.role} r${t.round}] ${t.content}` });\n\t\t}\n\t\treturn msgs;\n\t}\n\n\t// --- GENERATE: roundTrigger → per-round sequential participant calls -------\n\t// switchMap producer = async source boundary (spec §5.10). The producer's\n\t// deactivate cleanup aborts in-flight calls (COMPOSITION-GUIDE §45 + the\n\t// switchMap supersede path), so a torn-down round burns no extra tokens.\n\tconst roundWork = switchMap<number, RoundEnvelope>(\n\t\troundTrigger,\n\t\t(r) =>\n\t\t\tcreateNode<RoundEnvelope>(\n\t\t\t\t[],\n\t\t\t\t(_data, actions) => {\n\t\t\t\t\tif (r < 1) {\n\t\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst ac = new AbortController();\n\t\t\t\t\tlet cancelled = false;\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\tconst turns: Turn[] = [];\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tfor (const p of opts.participants) {\n\t\t\t\t\t\t\t\tconst res = await firstValueFrom(\n\t\t\t\t\t\t\t\t\tfromAny<LLMResponse>(\n\t\t\t\t\t\t\t\t\t\tp.adapter.invoke(buildMessages(p), {\n\t\t\t\t\t\t\t\t\t\t\tsignal: ac.signal,\n\t\t\t\t\t\t\t\t\t\t}) as NodeInput<LLMResponse>,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\t\t\tturns.push({ round: r, role: p.role, content: res.content });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!cancelled) actions.emit({ round: r, turns });\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tif (!cancelled) actions.down([[ERROR, err]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tcancelled = true;\n\t\t\t\t\t\tac.abort();\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t{ describeKind: \"producer\", name: `${name}.round-work` },\n\t\t\t),\n\t\t{ name: `${name}.rounds` },\n\t);\n\tgraph.add(roundWork, { name: \"rounds\" });\n\n\t// --- transcript: scan-accumulate (external observability) -----------------\n\tconst transcript = createNode<readonly Turn[]>(\n\t\t[roundWork],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst env = (\n\t\t\t\tbatchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : ctx.prevData[0]\n\t\t\t) as RoundEnvelope | undefined;\n\t\t\tif (env === undefined) {\n\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactions.emit(history.slice());\n\t\t},\n\t\t{ name: `${name}.transcript`, describeKind: \"derived\" },\n\t);\n\tgraph.add(transcript, { name: \"transcript\" });\n\n\t// --- converged: parallel derived for external `status` (NOT authority) ----\n\tconst converged = createNode<{ done: boolean; reason: DebateStatus }>(\n\t\t[transcript as Node, untilNode as Node],\n\t\t(batchData, actions, ctx) => {\n\t\t\tconst tr = (\n\t\t\t\tbatchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : ctx.prevData[0]\n\t\t\t) as readonly Turn[] | undefined;\n\t\t\tconst untilV = (\n\t\t\t\tbatchData[1] != null && batchData[1].length > 0 ? batchData[1].at(-1) : ctx.prevData[1]\n\t\t\t) as boolean | undefined;\n\t\t\tconst rounds = (tr ?? []).reduce((m, t) => Math.max(m, t.round), 0);\n\t\t\tif (typeof term === \"number\") {\n\t\t\t\tactions.emit({ done: rounds >= term, reason: \"max-rounds\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (term === \"until-converge\") {\n\t\t\t\tif (converge(tr ?? [])) actions.emit({ done: true, reason: \"converged\" });\n\t\t\t\telse actions.emit({ done: rounds >= maxRounds, reason: \"max-rounds\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactions.emit({ done: untilV === true || rounds >= maxRounds, reason: \"max-rounds\" });\n\t\t},\n\t\t{ name: `${name}.converged`, describeKind: \"derived\" },\n\t);\n\tgraph.add(converged, { name: \"converged\" });\n\n\t// --- decideEffect: SOLE feedback authority (§7 single-trigger) ------------\n\t// Computes termination INLINE (round envelope + closure history + the\n\t// reactive `untilNode` dep) — does NOT read `converged.cache` (avoids the\n\t// same-wave drain-order hazard refineLoop documents). `converged` above is\n\t// purely for external observation.\n\tconst decideEffect = createNode(\n\t\t[roundWork as Node, untilNode as Node],\n\t\t(batchData, _actions, ctx) => {\n\t\t\tconst env = (\n\t\t\t\tbatchData[0] != null && batchData[0].length > 0 ? batchData[0].at(-1) : undefined\n\t\t\t) as RoundEnvelope | undefined;\n\t\t\tconst untilV = (\n\t\t\t\tbatchData[1] != null && batchData[1].length > 0 ? batchData[1].at(-1) : ctx.prevData[1]\n\t\t\t) as boolean | undefined;\n\t\t\tif (env === undefined) {\n\t\t\t\t// `until` flipped with no new round — finalize if it went true.\n\t\t\t\tif (typeof term === \"object\" && untilV === true && statusState.cache === \"running\") {\n\t\t\t\t\tfinalize(\"max-rounds\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// New round settled — fold into the closure history first.\n\t\t\thistory = [...history, ...env.turns];\n\t\t\tconst r = env.round;\n\t\t\tlet done = false;\n\t\t\tlet reason: DebateStatus = \"max-rounds\";\n\t\t\tif (typeof term === \"number\") done = r >= term;\n\t\t\telse if (term === \"until-converge\") {\n\t\t\t\tif (converge(history)) {\n\t\t\t\t\tdone = true;\n\t\t\t\t\treason = \"converged\";\n\t\t\t\t} else done = r >= maxRounds;\n\t\t\t} else done = untilV === true || r >= maxRounds;\n\n\t\t\tif (done) finalize(reason);\n\t\t\telse roundTrigger.emit(r + 1); // §7 feedback edge\n\t\t},\n\t\t{ name: `${name}.decide`, describeKind: \"effect\", errorWhenDepsError: false },\n\t);\n\tgraph.add(decideEffect, { name: \"decide\" });\n\n\tfunction finalize(reason: DebateStatus): void {\n\t\tlet out: unknown;\n\t\tif (output === \"transcript\") out = history.slice();\n\t\telse if (output === \"synthesizer-final\") {\n\t\t\tconst synth = [...history].reverse().find((t) => SYNTH_RE.test(t.role));\n\t\t\tout = synth?.content ?? null;\n\t\t} else out = output.project(history.slice());\n\t\tbatch(() => {\n\t\t\tstatusState.emit(reason);\n\t\t\tresultState.emit(out);\n\t\t});\n\t}\n\n\t// Error watcher — adapter throw surfaces as ERROR on roundWork.\n\tconst errorWatcher = createNode(\n\t\t[roundWork as Node],\n\t\t(_b, _a, ec) => {\n\t\t\tconst t = ec.terminalDeps[0];\n\t\t\tif (t !== undefined && t !== true && statusState.cache === \"running\") {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tstatusState.emit(\"error\");\n\t\t\t\t\tresultState.emit(new Error(\"heterogeneousDebate: a participant adapter errored\"));\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t{ name: `${name}.error-watcher`, describeKind: \"effect\", errorWhenDepsError: false },\n\t);\n\tgraph.add(errorWatcher, { name: \"error-watcher\" });\n\n\t// Keepalive: activate the feedback + observability nodes so the loop runs\n\t// and `.cache` stays warm without an external subscriber. These live for\n\t// the graph's lifetime (torn down on parent-graph destroy).\n\tdecideEffect.subscribe(() => undefined);\n\terrorWatcher.subscribe(() => undefined);\n\ttranscript.subscribe(() => undefined);\n\tconverged.subscribe(() => undefined);\n\n\tlet running = false;\n\n\treturn {\n\t\ttranscript,\n\t\tresult: resultState,\n\t\tstatus: statusState,\n\t\tgraph,\n\t\tasync run(): Promise<unknown> {\n\t\t\tif (running) {\n\t\t\t\tthrow new RangeError(\n\t\t\t\t\t`heterogeneousDebate \"${name}\": run() called while a previous run() is still pending`,\n\t\t\t\t);\n\t\t\t}\n\t\t\trunning = true;\n\t\t\ttry {\n\t\t\t\thistory = [];\n\t\t\t\tbatch(() => {\n\t\t\t\t\tstatusState.emit(\"running\");\n\t\t\t\t\tresultState.down([[INVALIDATE]]);\n\t\t\t\t});\n\t\t\t\t// Subscribe BEFORE the kick (sync adapters would otherwise drain\n\t\t\t\t// the terminal before awaitSettled subscribes).\n\t\t\t\tconst settled = awaitSettled(resultState, { skipCurrent: true });\n\t\t\t\troundTrigger.emit(1); // kick\n\t\t\t\treturn await settled;\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import {
|
|
2
|
+
aiMeta
|
|
3
|
+
} from "./chunk-5IMMNARC.js";
|
|
4
|
+
|
|
5
|
+
// src/presets/ai/context/index.ts
|
|
6
|
+
import { node, wallClockNs } from "@graphrefly/pure-ts/core";
|
|
7
|
+
import { reactiveLog } from "@graphrefly/pure-ts/extra";
|
|
8
|
+
import { Graph } from "@graphrefly/pure-ts/graph";
|
|
9
|
+
var CompressionCache = class {
|
|
10
|
+
constructor(_max) {
|
|
11
|
+
this._max = _max;
|
|
12
|
+
}
|
|
13
|
+
_m = /* @__PURE__ */ new Map();
|
|
14
|
+
/** Insertion-order list of `id` keys for LRU eviction at the id granularity. */
|
|
15
|
+
_order = [];
|
|
16
|
+
get(id, tier) {
|
|
17
|
+
const inner = this._m.get(id);
|
|
18
|
+
const v = inner?.get(tier);
|
|
19
|
+
if (v !== void 0) {
|
|
20
|
+
const i = this._order.indexOf(id);
|
|
21
|
+
if (i >= 0) this._order.splice(i, 1);
|
|
22
|
+
this._order.push(id);
|
|
23
|
+
}
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
set(id, tier, value) {
|
|
27
|
+
let inner = this._m.get(id);
|
|
28
|
+
if (inner === void 0) {
|
|
29
|
+
inner = /* @__PURE__ */ new Map();
|
|
30
|
+
this._m.set(id, inner);
|
|
31
|
+
}
|
|
32
|
+
inner.set(tier, value);
|
|
33
|
+
const i = this._order.indexOf(id);
|
|
34
|
+
if (i >= 0) this._order.splice(i, 1);
|
|
35
|
+
this._order.push(id);
|
|
36
|
+
while (this._m.size > this._max) {
|
|
37
|
+
const evict = this._order.shift();
|
|
38
|
+
if (evict === void 0) break;
|
|
39
|
+
this._m.delete(evict);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var _poolSeq = 0;
|
|
44
|
+
function taggedContextPool(parent, opts) {
|
|
45
|
+
const mountName = opts.name ?? `ctxpool-${opts.topic}-${++_poolSeq}`;
|
|
46
|
+
const graph = new Graph(mountName);
|
|
47
|
+
parent.mount(mountName, graph);
|
|
48
|
+
const log = reactiveLog(void 0, {
|
|
49
|
+
name: `${mountName}.log`,
|
|
50
|
+
maxSize: opts.maxEntries
|
|
51
|
+
});
|
|
52
|
+
const cache = new CompressionCache(opts.cacheMax ?? 512);
|
|
53
|
+
let autoId = 0;
|
|
54
|
+
const entries = log.entries;
|
|
55
|
+
function add(e) {
|
|
56
|
+
const id = e.id ?? `ctx-${++autoId}`;
|
|
57
|
+
log.append({
|
|
58
|
+
id,
|
|
59
|
+
payload: e.payload,
|
|
60
|
+
tags: e.tags,
|
|
61
|
+
importance: e.importance,
|
|
62
|
+
compressible: e.compressible,
|
|
63
|
+
topic: e.topic,
|
|
64
|
+
t_ns: wallClockNs()
|
|
65
|
+
// QA P2 — clock.ts invariant (was Date.now()*1e6)
|
|
66
|
+
});
|
|
67
|
+
return id;
|
|
68
|
+
}
|
|
69
|
+
function byTag(tag) {
|
|
70
|
+
return node(
|
|
71
|
+
[entries],
|
|
72
|
+
(data, actions, ctx) => {
|
|
73
|
+
const cur = data[0] != null && data[0].length > 0 ? data[0].at(-1) : ctx.prevData[0];
|
|
74
|
+
actions.emit((cur ?? []).filter((x) => x.tags.includes(tag)));
|
|
75
|
+
},
|
|
76
|
+
{ describeKind: "derived", meta: aiMeta("contextPool.byTag", { tag }) }
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function poolGC(policy) {
|
|
80
|
+
const all = log.entries.cache ?? [];
|
|
81
|
+
const nowNs = wallClockNs();
|
|
82
|
+
let survivors = all.filter((e) => {
|
|
83
|
+
if (policy.topic != null && e.topic !== policy.topic) return true;
|
|
84
|
+
if (policy.olderThanNs != null && nowNs - e.t_ns >= policy.olderThanNs) return false;
|
|
85
|
+
if (policy.importanceBelow != null && e.importance < policy.importanceBelow) return false;
|
|
86
|
+
return true;
|
|
87
|
+
});
|
|
88
|
+
if (policy.max != null && survivors.length > policy.max) {
|
|
89
|
+
survivors = survivors.slice(survivors.length - policy.max);
|
|
90
|
+
}
|
|
91
|
+
const removed = all.length - survivors.length;
|
|
92
|
+
if (removed > 0) {
|
|
93
|
+
log.clear();
|
|
94
|
+
log.appendMany(survivors);
|
|
95
|
+
}
|
|
96
|
+
return removed;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
add,
|
|
100
|
+
entries,
|
|
101
|
+
byTag,
|
|
102
|
+
poolGC,
|
|
103
|
+
graph,
|
|
104
|
+
_cache: cache,
|
|
105
|
+
_opts: opts,
|
|
106
|
+
dispose() {
|
|
107
|
+
log.dispose();
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
var DEFAULT_TOKENIZER = (s) => Math.ceil(s.length / 4);
|
|
112
|
+
function matches(e, m) {
|
|
113
|
+
if (m.topic != null) {
|
|
114
|
+
if (typeof m.topic === "string" ? e.topic !== m.topic : !m.topic.test(e.topic)) return false;
|
|
115
|
+
}
|
|
116
|
+
if (m.tagsAny != null && !m.tagsAny.some((t) => e.tags.includes(t))) return false;
|
|
117
|
+
if (m.importanceMin != null && e.importance < m.importanceMin) return false;
|
|
118
|
+
if (m.importanceMax != null && e.importance > m.importanceMax) return false;
|
|
119
|
+
if (m.compressible != null && e.compressible !== m.compressible) return false;
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
function tierCompress(e, rules, pressure, cache, llmCompress) {
|
|
123
|
+
const base = {
|
|
124
|
+
id: e.id,
|
|
125
|
+
topic: e.topic,
|
|
126
|
+
tags: e.tags,
|
|
127
|
+
tier: 0,
|
|
128
|
+
payload: e.payload,
|
|
129
|
+
compressed: false
|
|
130
|
+
};
|
|
131
|
+
if (pressure <= 0) return base;
|
|
132
|
+
for (const rule of rules) {
|
|
133
|
+
if (!matches(e, rule.match)) continue;
|
|
134
|
+
switch (rule.action) {
|
|
135
|
+
case "evict":
|
|
136
|
+
return void 0;
|
|
137
|
+
case "reference":
|
|
138
|
+
return { ...base, tier: 1, payload: `[ref:${e.id}]`, compressed: true };
|
|
139
|
+
case "truncate": {
|
|
140
|
+
const s = typeof e.payload === "string" ? e.payload : JSON.stringify(e.payload);
|
|
141
|
+
return {
|
|
142
|
+
...base,
|
|
143
|
+
tier: 1,
|
|
144
|
+
payload: s.length > rule.maxChars ? s.slice(0, rule.maxChars) : s,
|
|
145
|
+
compressed: s.length > rule.maxChars
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
case "llm-summary": {
|
|
149
|
+
if (!llmCompress) {
|
|
150
|
+
throw new Error("tierCompress: 'llm-summary' rule requires `llmCompress`");
|
|
151
|
+
}
|
|
152
|
+
const cached = cache.get(e.id, rule.toTier);
|
|
153
|
+
const text = cached ?? llmCompress(e, rule.toTier);
|
|
154
|
+
if (cached === void 0) cache.set(e.id, rule.toTier, text);
|
|
155
|
+
return { ...base, tier: rule.toTier, payload: text, compressed: true };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return base;
|
|
160
|
+
}
|
|
161
|
+
function renderContextView(pool, view) {
|
|
162
|
+
const usesLlm = view.rules.some((r) => r.action === "llm-summary");
|
|
163
|
+
if (usesLlm && !pool._opts.llmCompress) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
"renderContextView: view has an 'llm-summary' rule but the pool was created without `llmCompress` (DS-14.6.A D-A3)."
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
const tokenize = view.tokenizer ?? DEFAULT_TOKENIZER;
|
|
169
|
+
const llmCompress = pool._opts.llmCompress;
|
|
170
|
+
return node(
|
|
171
|
+
[pool.entries, view.pressure],
|
|
172
|
+
(data, actions, ctx) => {
|
|
173
|
+
const entries = data[0] != null && data[0].length > 0 ? data[0].at(-1) : ctx.prevData[0];
|
|
174
|
+
const pressure = data[1] != null && data[1].length > 0 ? data[1].at(-1) : ctx.prevData[1];
|
|
175
|
+
if (entries === void 0) {
|
|
176
|
+
actions.emit([]);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const p = pressure ?? 0;
|
|
180
|
+
const rendered = [];
|
|
181
|
+
for (const e of entries) {
|
|
182
|
+
if (!view.filter(e)) continue;
|
|
183
|
+
const r = tierCompress(e, view.rules, p, pool._cache, llmCompress);
|
|
184
|
+
if (r !== void 0) rendered.push(r);
|
|
185
|
+
}
|
|
186
|
+
const cost = (r) => tokenize(typeof r.payload === "string" ? r.payload : JSON.stringify(r.payload));
|
|
187
|
+
let total = 0;
|
|
188
|
+
for (const r of rendered) total += cost(r);
|
|
189
|
+
if (total > view.budgetTokens) {
|
|
190
|
+
const byImp = entries.reduce(
|
|
191
|
+
(acc, e) => acc.set(e.id, e.importance),
|
|
192
|
+
/* @__PURE__ */ new Map()
|
|
193
|
+
);
|
|
194
|
+
rendered.sort((a, b) => (byImp.get(a.id) ?? 0) - (byImp.get(b.id) ?? 0));
|
|
195
|
+
while (total > view.budgetTokens && rendered.length > 0) {
|
|
196
|
+
total -= cost(rendered.shift());
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
actions.emit(rendered);
|
|
200
|
+
},
|
|
201
|
+
{ describeKind: "derived", meta: aiMeta("contextView", { topic: pool._opts.topic }) }
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export {
|
|
206
|
+
CompressionCache,
|
|
207
|
+
taggedContextPool,
|
|
208
|
+
tierCompress,
|
|
209
|
+
renderContextView
|
|
210
|
+
};
|
|
211
|
+
//# sourceMappingURL=chunk-EHRRQ4IC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presets/ai/context/index.ts"],"sourcesContent":["/**\n * DS-14.6.A U-A — tagged context substrate (Phase 14.5).\n *\n * Per-view tagged context (SESSION-DS-14.6-A L3–L6 + SESSION-DS-14.6-A-9Q\n * implementation walk). Pool stores immutable tier-0 originals on an\n * **append-only `reactiveLog`** (D-A4 — structural tier-0 immutability, free\n * `LogChange` mutations, side-steps the DS14R1 TTL/LRU prune-fidelity bug).\n * Each consumer holds a `ContextView` that materialises its own filtered +\n * compressed slice (`Node<readonly RenderedEntry[]>`). Routing is mechanical\n * tag comparison (zero LLM); only `llm-summary` rules cross to an injected\n * `llmCompress` (D-A3). Compression cache is one shared `(id, tier)` map in\n * the pool bundle, bounded LRU (D-A5). Schema is pure data, presentation\n * layer (D-A1) — no `@graphrefly/pure-ts` consumer.\n *\n * @module\n */\n\nimport { type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type ReactiveLogBundle, reactiveLog } from \"@graphrefly/pure-ts/extra\";\nimport { Graph } from \"@graphrefly/pure-ts/graph\";\nimport { aiMeta } from \"../../../utils/ai/_internal.js\";\n\n// ── Schema (pure data — D-A1) ────────────────────────────────────────────────\n\nexport type Tag = string;\n\n/** Compression tier. 0 = original; higher = more compressed. */\nexport type Tier = 0 | 1 | 2 | 3;\n\nexport interface ContextEntry<T> {\n\t/** Stable id — cache key component `(id, tier)`. Auto-assigned if omitted. */\n\treadonly id: string;\n\treadonly payload: T;\n\treadonly tags: readonly Tag[];\n\t/** 0..1. Budget/GC ordering. */\n\treadonly importance: number;\n\treadonly compressible: boolean;\n\treadonly topic: string;\n\t/** Wall-clock at add (ns) — used by `poolGC({ olderThanNs })`. */\n\treadonly t_ns: number;\n}\n\nexport interface RuleMatch {\n\treadonly topic?: string | RegExp;\n\treadonly tagsAny?: readonly Tag[];\n\treadonly importanceMin?: number;\n\treadonly importanceMax?: number;\n\treadonly compressible?: boolean;\n}\n\nexport type CompressionRule =\n\t| { readonly match: RuleMatch; readonly action: \"evict\" }\n\t| { readonly match: RuleMatch; readonly action: \"truncate\"; readonly maxChars: number }\n\t| { readonly match: RuleMatch; readonly action: \"reference\" }\n\t| { readonly match: RuleMatch; readonly action: \"llm-summary\"; readonly toTier: Tier };\n\nexport interface RenderedEntry<T> {\n\treadonly id: string;\n\treadonly topic: string;\n\treadonly tags: readonly Tag[];\n\treadonly tier: Tier;\n\t/** Original payload at tier 0; compressed `string` otherwise. */\n\treadonly payload: T | string;\n\treadonly compressed: boolean;\n}\n\nexport interface ContextView<T> {\n\treadonly filter: (e: ContextEntry<T>) => boolean;\n\t/** 0..1. A rule fires when `pressure > 0` and the entry matches. */\n\treadonly pressure: Node<number>;\n\treadonly budgetTokens: number;\n\treadonly rules: readonly CompressionRule[];\n\t/** Default `s => Math.ceil(s.length / 4)`. */\n\treadonly tokenizer?: (s: string) => number;\n}\n\nexport interface PoolGCPolicy {\n\t/** Drop entries with `t_ns < (now - olderThanNs)`. */\n\treadonly olderThanNs?: number;\n\t/** Drop entries with `importance < importanceBelow`. */\n\treadonly importanceBelow?: number;\n\t/**\n\t * **Scope**, not a match-to-evict rule: when set, GC only considers\n\t * entries whose `topic === this`; entries of other topics always survive.\n\t * `olderThanNs` / `importanceBelow` are ANDed *within* this scope.\n\t */\n\treadonly topic?: string;\n\t/** Keep at most this many most-recent entries. */\n\treadonly max?: number;\n}\n\n/** `(entry, toTier) => compressedText`. Injected; required iff a view uses `llm-summary`. */\nexport type LlmCompress<T> = (entry: ContextEntry<T>, toTier: Tier) => string;\n\nexport interface TaggedContextPoolOptions<T> {\n\treadonly topic: string;\n\t/** Forwarded to the backing append-only `reactiveLog` (poolGC ceiling). */\n\treadonly maxEntries?: number;\n\t/** Required iff any rendered view uses an `llm-summary` rule (D-A3). */\n\treadonly llmCompress?: LlmCompress<T>;\n\t/** Shared `(id, tier)` compression cache cap (D-A5). Default 512. */\n\treadonly cacheMax?: number;\n\treadonly name?: string;\n}\n\nexport interface TaggedContextPoolBundle<T> {\n\t/**\n\t * Append an entry (immutable tier-0). Returns its id (auto-assigned\n\t * `ctx-N` per-pool if omitted).\n\t *\n\t * **Caller-supplied ids must be unique within the pool.** The log is\n\t * append-only and does NOT dedupe; the compression cache is keyed by\n\t * `(id, tier)`, so appending two different entries with the same explicit\n\t * `id` makes the second render the first's cached summary (QA P11).\n\t */\n\tadd(entry: Omit<ContextEntry<T>, \"id\" | \"t_ns\"> & { id?: string }): string;\n\t/** All live tier-0 entries. */\n\treadonly entries: Node<readonly ContextEntry<T>[]>;\n\t/** Entries carrying `tag`. */\n\tbyTag(tag: Tag): Node<readonly ContextEntry<T>[]>;\n\t/** Pool-global retention (L6 — distinct from per-view filtering). Returns removed count. */\n\tpoolGC(policy: PoolGCPolicy): number;\n\treadonly graph: Graph;\n\t/** Internal — shared compression cache (one per pool, D-A5). */\n\treadonly _cache: CompressionCache;\n\treadonly _opts: TaggedContextPoolOptions<T>;\n\tdispose(): void;\n}\n\n// ── Shared bounded (id,tier) compression cache (D-A5) ────────────────────────\n\n/**\n * Bounded LRU cache keyed by `(id, tier)`. Uses a nested `Map<id, Map<tier,\n * value>>` (NOT a `${id}::${tier}` string key) so a caller-supplied `id`\n * containing the separator cannot collide (QA P5). LRU is tracked at the\n * (id,tier) leaf via a flat insertion-order key list.\n */\nexport class CompressionCache {\n\tprivate readonly _m = new Map<string, Map<Tier, string>>();\n\t/** Insertion-order list of `id` keys for LRU eviction at the id granularity. */\n\tprivate readonly _order: string[] = [];\n\tconstructor(private readonly _max: number) {}\n\tget(id: string, tier: Tier): string | undefined {\n\t\tconst inner = this._m.get(id);\n\t\tconst v = inner?.get(tier);\n\t\tif (v !== undefined) {\n\t\t\tconst i = this._order.indexOf(id);\n\t\t\tif (i >= 0) this._order.splice(i, 1);\n\t\t\tthis._order.push(id);\n\t\t}\n\t\treturn v;\n\t}\n\tset(id: string, tier: Tier, value: string): void {\n\t\tlet inner = this._m.get(id);\n\t\tif (inner === undefined) {\n\t\t\tinner = new Map<Tier, string>();\n\t\t\tthis._m.set(id, inner);\n\t\t}\n\t\tinner.set(tier, value);\n\t\tconst i = this._order.indexOf(id);\n\t\tif (i >= 0) this._order.splice(i, 1);\n\t\tthis._order.push(id);\n\t\twhile (this._m.size > this._max) {\n\t\t\tconst evict = this._order.shift();\n\t\t\tif (evict === undefined) break;\n\t\t\tthis._m.delete(evict);\n\t\t}\n\t}\n}\n\n// ── Pool ─────────────────────────────────────────────────────────────────────\n\n/** Process-wide sequence for collision-safe default mount names (QA P6). */\nlet _poolSeq = 0;\n\n/**\n * Append-only tagged context pool (D-A4). The pool is a `reactiveLog` of\n * immutable tier-0 entries plus a derived `entries` node; `byTag` derives a\n * filtered view; `poolGC` is the explicit pool-global retention (L6).\n */\nexport function taggedContextPool<T>(\n\tparent: Graph,\n\topts: TaggedContextPoolOptions<T>,\n): TaggedContextPoolBundle<T> {\n\t// QA P6: collision-safe default mount name — two pools with the same\n\t// `topic` under one parent must not collide on `parent.mount`. Explicit\n\t// `opts.name` is respected verbatim (caller owns uniqueness then).\n\tconst mountName = opts.name ?? `ctxpool-${opts.topic}-${++_poolSeq}`;\n\tconst graph = new Graph(mountName);\n\tparent.mount(mountName, graph);\n\n\tconst log: ReactiveLogBundle<ContextEntry<T>> = reactiveLog<ContextEntry<T>>(undefined, {\n\t\tname: `${mountName}.log`,\n\t\tmaxSize: opts.maxEntries,\n\t});\n\tconst cache = new CompressionCache(opts.cacheMax ?? 512);\n\t// QA P5: per-pool id counter (was module-global → test-pollution +\n\t// cross-pool cache-key cross-talk).\n\tlet autoId = 0;\n\n\tconst entries: Node<readonly ContextEntry<T>[]> = log.entries;\n\n\tfunction add(e: Omit<ContextEntry<T>, \"id\" | \"t_ns\"> & { id?: string }): string {\n\t\tconst id = e.id ?? `ctx-${++autoId}`;\n\t\tlog.append({\n\t\t\tid,\n\t\t\tpayload: e.payload,\n\t\t\ttags: e.tags,\n\t\t\timportance: e.importance,\n\t\t\tcompressible: e.compressible,\n\t\t\ttopic: e.topic,\n\t\t\tt_ns: wallClockNs(), // QA P2 — clock.ts invariant (was Date.now()*1e6)\n\t\t});\n\t\treturn id;\n\t}\n\n\tfunction byTag(tag: Tag): Node<readonly ContextEntry<T>[]> {\n\t\treturn node<readonly ContextEntry<T>[]>(\n\t\t\t[entries as Node],\n\t\t\t(data, actions, ctx) => {\n\t\t\t\tconst cur = (data[0] != null && data[0].length > 0 ? data[0].at(-1) : ctx.prevData[0]) as\n\t\t\t\t\t| readonly ContextEntry<T>[]\n\t\t\t\t\t| undefined;\n\t\t\t\tactions.emit((cur ?? []).filter((x) => x.tags.includes(tag)));\n\t\t\t},\n\t\t\t{ describeKind: \"derived\", meta: aiMeta(\"contextPool.byTag\", { tag }) },\n\t\t);\n\t}\n\n\tfunction poolGC(policy: PoolGCPolicy): number {\n\t\tconst all = log.entries.cache ?? [];\n\t\tconst nowNs = wallClockNs();\n\t\tlet survivors = all.filter((e) => {\n\t\t\t// QA P1: `topic` is a SCOPE, not a match-to-evict rule — entries\n\t\t\t// outside the topic are never GC'd by this call; eviction criteria\n\t\t\t// (olderThanNs / importanceBelow) are ANDed within the scope.\n\t\t\tif (policy.topic != null && e.topic !== policy.topic) return true;\n\t\t\tif (policy.olderThanNs != null && nowNs - e.t_ns >= policy.olderThanNs) return false;\n\t\t\tif (policy.importanceBelow != null && e.importance < policy.importanceBelow) return false;\n\t\t\treturn true;\n\t\t});\n\t\tif (policy.max != null && survivors.length > policy.max) {\n\t\t\tsurvivors = survivors.slice(survivors.length - policy.max);\n\t\t}\n\t\tconst removed = all.length - survivors.length;\n\t\tif (removed > 0) {\n\t\t\tlog.clear();\n\t\t\tlog.appendMany(survivors);\n\t\t}\n\t\treturn removed;\n\t}\n\n\treturn {\n\t\tadd,\n\t\tentries,\n\t\tbyTag,\n\t\tpoolGC,\n\t\tgraph,\n\t\t_cache: cache,\n\t\t_opts: opts,\n\t\tdispose(): void {\n\t\t\tlog.dispose();\n\t\t},\n\t};\n}\n\n// ── tierCompress + renderContextView ─────────────────────────────────────────\n\nconst DEFAULT_TOKENIZER = (s: string): number => Math.ceil(s.length / 4);\n\nfunction matches(e: ContextEntry<unknown>, m: RuleMatch): boolean {\n\tif (m.topic != null) {\n\t\tif (typeof m.topic === \"string\" ? e.topic !== m.topic : !m.topic.test(e.topic)) return false;\n\t}\n\tif (m.tagsAny != null && !m.tagsAny.some((t) => e.tags.includes(t))) return false;\n\tif (m.importanceMin != null && e.importance < m.importanceMin) return false;\n\tif (m.importanceMax != null && e.importance > m.importanceMax) return false;\n\tif (m.compressible != null && e.compressible !== m.compressible) return false;\n\treturn true;\n}\n\n/**\n * Apply the first matching rule to one entry under `pressure`. Non-LLM\n * strategies (truncate / evict / reference) are pure data; `llm-summary`\n * calls the injected `llmCompress`, caching by `(id, toTier)` (D-A5).\n * Returns `undefined` for evicted / pressure-filtered entries.\n */\nexport function tierCompress<T>(\n\te: ContextEntry<T>,\n\trules: readonly CompressionRule[],\n\tpressure: number,\n\tcache: CompressionCache,\n\tllmCompress?: LlmCompress<T>,\n): RenderedEntry<T> | undefined {\n\tconst base: RenderedEntry<T> = {\n\t\tid: e.id,\n\t\ttopic: e.topic,\n\t\ttags: e.tags,\n\t\ttier: 0,\n\t\tpayload: e.payload,\n\t\tcompressed: false,\n\t};\n\tif (pressure <= 0) return base;\n\tfor (const rule of rules) {\n\t\tif (!matches(e, rule.match)) continue;\n\t\tswitch (rule.action) {\n\t\t\tcase \"evict\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"reference\":\n\t\t\t\treturn { ...base, tier: 1, payload: `[ref:${e.id}]`, compressed: true };\n\t\t\tcase \"truncate\": {\n\t\t\t\tconst s = typeof e.payload === \"string\" ? e.payload : JSON.stringify(e.payload);\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\ttier: 1,\n\t\t\t\t\tpayload: s.length > rule.maxChars ? s.slice(0, rule.maxChars) : s,\n\t\t\t\t\tcompressed: s.length > rule.maxChars,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"llm-summary\": {\n\t\t\t\tif (!llmCompress) {\n\t\t\t\t\t// Defence-in-depth — construction guard should have thrown.\n\t\t\t\t\tthrow new Error(\"tierCompress: 'llm-summary' rule requires `llmCompress`\");\n\t\t\t\t}\n\t\t\t\tconst cached = cache.get(e.id, rule.toTier);\n\t\t\t\tconst text = cached ?? llmCompress(e, rule.toTier);\n\t\t\t\tif (cached === undefined) cache.set(e.id, rule.toTier, text);\n\t\t\t\treturn { ...base, tier: rule.toTier, payload: text, compressed: true };\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * Per-consumer reactive rendering (D-A2). Materialises a\n * `Node<readonly RenderedEntry[]>` over the pool: filter → per-entry rule\n * application under `pressure` → token-budget trim (lowest-importance first).\n *\n * Recomputes the slice per `(entries | pressure)` wave (O(n) — behaviourally\n * identical to the incremental closure-mirror; incremental is a perf\n * follow-up, not a correctness gap).\n *\n * @throws if any rule is `llm-summary` and the pool has no `llmCompress`\n * (D-A3 construction guard).\n */\nexport function renderContextView<T>(\n\tpool: TaggedContextPoolBundle<T>,\n\tview: ContextView<T>,\n): Node<readonly RenderedEntry<T>[]> {\n\tconst usesLlm = view.rules.some((r) => r.action === \"llm-summary\");\n\tif (usesLlm && !pool._opts.llmCompress) {\n\t\tthrow new Error(\n\t\t\t\"renderContextView: view has an 'llm-summary' rule but the pool was created without `llmCompress` (DS-14.6.A D-A3).\",\n\t\t);\n\t}\n\tconst tokenize = view.tokenizer ?? DEFAULT_TOKENIZER;\n\tconst llmCompress = pool._opts.llmCompress;\n\n\treturn node<readonly RenderedEntry<T>[]>(\n\t\t[pool.entries as Node, view.pressure as Node],\n\t\t(data, actions, ctx) => {\n\t\t\tconst entries = (data[0] != null && data[0].length > 0 ? data[0].at(-1) : ctx.prevData[0]) as\n\t\t\t\t| readonly ContextEntry<T>[]\n\t\t\t\t| undefined;\n\t\t\tconst pressure = (data[1] != null && data[1].length > 0 ? data[1].at(-1) : ctx.prevData[1]) as\n\t\t\t\t| number\n\t\t\t\t| undefined;\n\t\t\tif (entries === undefined) {\n\t\t\t\tactions.emit([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst p = pressure ?? 0;\n\t\t\tconst rendered: RenderedEntry<T>[] = [];\n\t\t\tfor (const e of entries) {\n\t\t\t\tif (!view.filter(e)) continue;\n\t\t\t\tconst r = tierCompress(e, view.rules, p, pool._cache, llmCompress);\n\t\t\t\tif (r !== undefined) rendered.push(r);\n\t\t\t}\n\t\t\t// Token-budget trim: drop lowest-importance entries until under budget.\n\t\t\tconst cost = (r: RenderedEntry<T>): number =>\n\t\t\t\ttokenize(typeof r.payload === \"string\" ? r.payload : JSON.stringify(r.payload));\n\t\t\tlet total = 0;\n\t\t\tfor (const r of rendered) total += cost(r);\n\t\t\tif (total > view.budgetTokens) {\n\t\t\t\tconst byImp = entries.reduce<Map<string, number>>(\n\t\t\t\t\t(acc, e) => acc.set(e.id, e.importance),\n\t\t\t\t\tnew Map(),\n\t\t\t\t);\n\t\t\t\trendered.sort((a, b) => (byImp.get(a.id) ?? 0) - (byImp.get(b.id) ?? 0));\n\t\t\t\twhile (total > view.budgetTokens && rendered.length > 0) {\n\t\t\t\t\ttotal -= cost(rendered.shift() as RenderedEntry<T>);\n\t\t\t\t}\n\t\t\t}\n\t\t\tactions.emit(rendered);\n\t\t},\n\t\t{ describeKind: \"derived\", meta: aiMeta(\"contextView\", { topic: pool._opts.topic }) },\n\t);\n}\n"],"mappings":"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","names":[]}
|