@graphrefly/graphrefly 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -19
- 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/{extra/render/index.d.ts → base/render/index.d.cts} +75 -31
- package/dist/{extra/render/index.d.cts → base/render/index.d.ts} +75 -31
- 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/{extra/sources.d.ts → base/sources/index.d.cts} +74 -301
- package/dist/{extra/sources.d.cts → base/sources/index.d.ts} +74 -301
- 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/{extra/node.d.ts → base/sources/node/index.d.cts} +35 -37
- package/dist/{extra/node.d.cts → base/sources/node/index.d.ts} +35 -37
- 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-BglDkMdX.d.cts → cascading-CSSbKGrJ.d.ts} +3 -3
- package/dist/{cascading-MFgxu7Yo.d.ts → cascading-baGkiihI.d.cts} +3 -3
- 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 +3100 -9
- package/dist/compat/index.cjs.map +1 -0
- package/dist/compat/index.d.cts +112 -18
- package/dist/compat/index.d.ts +112 -18
- package/dist/compat/index.js +176 -1
- package/dist/compat/index.js.map +1 -0
- package/dist/compat/jotai/index.cjs +149 -1
- package/dist/compat/jotai/index.cjs.map +1 -0
- package/dist/compat/jotai/index.d.cts +2 -2
- package/dist/compat/jotai/index.d.ts +2 -2
- package/dist/compat/jotai/index.js +8 -1
- package/dist/compat/jotai/index.js.map +1 -0
- package/dist/compat/nanostores/index.cjs +205 -1
- package/dist/compat/nanostores/index.cjs.map +1 -0
- package/dist/compat/nanostores/index.d.cts +2 -2
- package/dist/compat/nanostores/index.d.ts +2 -2
- package/dist/compat/nanostores/index.js +22 -1
- package/dist/compat/nanostores/index.js.map +1 -0
- package/dist/compat/nestjs/index.cjs +2241 -9
- package/dist/compat/nestjs/index.cjs.map +1 -0
- package/dist/compat/nestjs/index.d.cts +7 -10
- package/dist/compat/nestjs/index.d.ts +7 -10
- package/dist/compat/nestjs/index.js +78 -1
- package/dist/compat/nestjs/index.js.map +1 -0
- package/dist/compat/react/index.cjs +114 -1
- package/dist/compat/react/index.cjs.map +1 -0
- package/dist/compat/react/index.d.cts +2 -2
- package/dist/compat/react/index.d.ts +2 -2
- package/dist/compat/react/index.js +12 -1
- package/dist/compat/react/index.js.map +1 -0
- package/dist/compat/solid/index.cjs +101 -1
- package/dist/compat/solid/index.cjs.map +1 -0
- package/dist/compat/solid/index.d.cts +2 -2
- package/dist/compat/solid/index.d.ts +2 -2
- package/dist/compat/solid/index.js +12 -1
- package/dist/compat/solid/index.js.map +1 -0
- package/dist/compat/svelte/index.cjs +104 -1
- package/dist/compat/svelte/index.cjs.map +1 -0
- package/dist/compat/svelte/index.d.cts +2 -2
- package/dist/compat/svelte/index.d.ts +2 -2
- package/dist/compat/svelte/index.js +12 -1
- package/dist/compat/svelte/index.js.map +1 -0
- package/dist/compat/vue/index.cjs +119 -1
- package/dist/compat/vue/index.cjs.map +1 -0
- package/dist/compat/vue/index.d.cts +2 -2
- package/dist/compat/vue/index.d.ts +2 -2
- package/dist/compat/vue/index.js +12 -1
- package/dist/compat/vue/index.js.map +1 -0
- package/dist/compat/zustand/index.cjs +69 -3
- package/dist/compat/zustand/index.cjs.map +1 -0
- package/dist/compat/zustand/index.d.cts +2 -6
- package/dist/compat/zustand/index.d.ts +2 -6
- package/dist/compat/zustand/index.js +8 -1
- package/dist/compat/zustand/index.js.map +1 -0
- 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-74oxi34l.d.cts → fallback-Bx46zqky.d.cts} +3 -10
- package/dist/{fallback-DUyyBTBK.d.ts → fallback-pIWW8A2d.d.ts} +3 -10
- package/dist/guarded-execution-BcdtxeBk.d.ts +207 -0
- package/dist/guarded-execution-C-3hnP6A.d.cts +207 -0
- package/dist/{index-CBGUK09R.d.ts → index-5SU_O78r.d.cts} +5 -5
- package/dist/{index-BmZXHqkE.d.ts → index-B6pxYJzO.d.cts} +1 -1
- package/dist/{index-hcDJ8PSI.d.cts → index-B6pxYJzO.d.ts} +1 -1
- package/dist/{index-C5stwKcw.d.cts → index-BFsng6v1.d.cts} +1 -1
- package/dist/{index-CdAlHFEt.d.ts → index-BFsng6v1.d.ts} +1 -1
- package/dist/{index-_6ODbuOu.d.cts → index-Bg-LwEt-.d.cts} +1 -1
- package/dist/{index-CviRnE4K.d.ts → index-Bg-LwEt-.d.ts} +1 -1
- package/dist/{index-CBBLl_rc.d.ts → index-Brp888t0.d.cts} +1 -1
- package/dist/{index-BQSKmbuG.d.cts → index-Brp888t0.d.ts} +1 -1
- package/dist/{index-sqkqlb1p.d.ts → index-CDfk6jHN.d.cts} +1 -1
- package/dist/{index-ZVQhLa2i.d.cts → index-CDfk6jHN.d.ts} +1 -1
- package/dist/{index-Climxqsu.d.cts → index-CEXCtYYJ.d.ts} +5 -5
- package/dist/index-DLAxYaN5.d.cts +169 -0
- package/dist/index-DLAxYaN5.d.ts +169 -0
- package/dist/{index-CK29LV56.d.cts → index-DeWbQzMe.d.cts} +1 -1
- package/dist/{index-CPQlGA29.d.ts → index-DeWbQzMe.d.ts} +1 -1
- package/dist/{index-BrPrLl4e.d.cts → index-dX9IzPqj.d.cts} +1 -1
- package/dist/{index-Dgl1HpPn.d.ts → index-dX9IzPqj.d.ts} +1 -1
- package/dist/index.cjs +25934 -191
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +58 -94
- package/dist/index.d.ts +58 -94
- package/dist/index.js +852 -1
- package/dist/index.js.map +1 -0
- 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-DWjNfLvC.d.ts → observable-BXQoW1P-.d.cts} +1 -1
- package/dist/{observable-e3eiPPFy.d.cts → observable-BXQoW1P-.d.ts} +1 -1
- package/dist/{pipeline-graph-Sgj0gCwn.d.ts → pipeline-graph-Ce47CB6Y.d.cts} +13 -10
- package/dist/{pipeline-graph-CIKhynsF.d.cts → pipeline-graph-DXCwY9vG.d.ts} +13 -10
- 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-DOTs9P3X.d.ts → reactive-layout-fswlBUvX.d.cts} +19 -7
- package/dist/{reactive-layout-DgctbqZo.d.cts → reactive-layout-fswlBUvX.d.ts} +19 -7
- 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-CWFysE9E.d.ts → types-BB5Lw-pB.d.cts} +3 -3
- package/dist/{types-C0_yquda.d.cts → types-BB5Lw-pB.d.ts} +3 -3
- 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/{patterns → utils}/ai/browser.d.cts +7 -5
- package/dist/{patterns → utils}/ai/browser.d.ts +7 -5
- 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/{index-CR8QpwX8.d.ts → utils/ai/index.d.cts} +73 -976
- package/dist/{index-UPSiS-X7.d.cts → utils/ai/index.d.ts} +73 -976
- 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/{patterns → utils}/ai/node.d.cts +5 -7
- package/dist/{patterns → utils}/ai/node.d.ts +5 -7
- 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/{index-CeFiHtAg.d.ts → utils/cqrs/index.d.cts} +7 -37
- package/dist/{index-B-_tFaqV.d.cts → utils/cqrs/index.d.ts} +7 -37
- 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/{index-B8YnZpIR.d.ts → utils/demo-shell/index.d.cts} +4 -16
- package/dist/{index-Cwv0KWcU.d.cts → utils/demo-shell/index.d.ts} +4 -16
- 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/{index-CzLVrjxn.d.ts → utils/domain-templates/index.d.cts} +3 -20
- package/dist/{index-BaQaY_IQ.d.cts → utils/domain-templates/index.d.ts} +3 -20
- 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/{index-CMh5Rz1y.d.ts → utils/graphspec/index.d.cts} +106 -42
- package/dist/{index-CS0LTlB8.d.cts → utils/graphspec/index.d.ts} +106 -42
- 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/{index-DisjX8a-.d.ts → utils/job-queue/index.d.cts} +5 -26
- package/dist/{index-DV_1YuVk.d.cts → utils/job-queue/index.d.ts} +5 -26
- 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/{index-CZ3r5Rxp.d.ts → utils/memory/index.d.cts} +242 -34
- package/dist/{index-B17QddL1.d.cts → utils/memory/index.d.ts} +242 -34
- 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/{index-p09KSrTN.d.ts → utils/process/index.d.cts} +97 -44
- package/dist/{index-CasX6Pfq.d.cts → utils/process/index.d.ts} +97 -44
- 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/{index-B5S8ULbU.d.ts → utils/reactive-layout/index.d.cts} +58 -81
- package/dist/{index-Dc4AYqrJ.d.cts → utils/reactive-layout/index.d.ts} +58 -81
- 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/{index-Byu-OpX_.d.ts → utils/reduction/index.d.cts} +6 -17
- package/dist/{index-tRCxuAXF.d.cts → utils/reduction/index.d.ts} +6 -17
- 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/{index-CYq8vAyV.d.ts → utils/surface/index.d.cts} +7 -58
- package/dist/{index-CSOmP7xT.d.cts → utils/surface/index.d.ts} +7 -58
- 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 +664 -584
- package/dist/backoff-HPZMEZNF.js +0 -1
- package/dist/chunk-2T7U5EU6.js +0 -1
- package/dist/chunk-3G5U5QNE.js +0 -5
- package/dist/chunk-4VVTGLXJ.js +0 -1
- package/dist/chunk-5M4CCMMD.js +0 -45
- package/dist/chunk-5QDBSZBV.js +0 -1
- package/dist/chunk-5XJ6B66J.js +0 -1
- package/dist/chunk-6QZNQS5B.js +0 -1
- package/dist/chunk-6X7AFUJV.js +0 -9
- package/dist/chunk-7K6PWTDQ.js +0 -1
- package/dist/chunk-7LIAPXJB.js +0 -1
- package/dist/chunk-7WPU3UHQ.js +0 -1
- package/dist/chunk-A5WCQ5NO.js +0 -1
- package/dist/chunk-APPIWSGD.js +0 -84
- package/dist/chunk-BEZWM2SY.js +0 -1
- package/dist/chunk-C72GO4IZ.js +0 -1
- package/dist/chunk-CB676TKJ.js +0 -1
- package/dist/chunk-CE6TI2TL.js +0 -1
- package/dist/chunk-CE72X3WO.js +0 -1
- package/dist/chunk-CK2E7BTU.js +0 -1
- package/dist/chunk-CLVB32RD.js +0 -1
- package/dist/chunk-CRVT7D2P.js +0 -1
- package/dist/chunk-D5RFJOZ2.js +0 -1
- package/dist/chunk-D7GPHKFH.js +0 -1
- package/dist/chunk-DHRX7JX4.js +0 -2
- package/dist/chunk-ESMPEKEV.js +0 -1
- package/dist/chunk-F672GV32.js +0 -1
- package/dist/chunk-FZMYDOWV.js +0 -1
- package/dist/chunk-GHBWHMRZ.js +0 -1
- package/dist/chunk-GLERH466.js +0 -1
- package/dist/chunk-GPW2V3RE.js +0 -1
- package/dist/chunk-HIDYF36O.js +0 -1
- package/dist/chunk-HITNVN6B.js +0 -3
- package/dist/chunk-HY4DJBA7.js +0 -5
- package/dist/chunk-KZIEYVXN.js +0 -1
- package/dist/chunk-L6NSJVJZ.js +0 -1
- package/dist/chunk-N4MQX6JU.js +0 -18
- package/dist/chunk-N7FHEL4D.js +0 -1
- package/dist/chunk-NTEURFZH.js +0 -1
- package/dist/chunk-OIVP6KFV.js +0 -1
- package/dist/chunk-OPHBU3LG.js +0 -1
- package/dist/chunk-OYQOZP2F.js +0 -5
- package/dist/chunk-PTZK576G.js +0 -1
- package/dist/chunk-QYADASLV.js +0 -1
- package/dist/chunk-ST7UXLWR.js +0 -1
- package/dist/chunk-SVY7VUYU.js +0 -1
- package/dist/chunk-TK3NWWD4.js +0 -1
- package/dist/chunk-TSOYJ743.js +0 -1
- package/dist/chunk-UNGSTR4X.js +0 -61
- package/dist/chunk-VIMF6LGM.js +0 -1
- package/dist/chunk-VJLMUKOI.js +0 -1
- package/dist/chunk-VN6RDSK2.js +0 -1
- package/dist/chunk-VV4N5P64.js +0 -1
- package/dist/chunk-W3I423PS.js +0 -1
- package/dist/chunk-WJR24TAG.js +0 -1
- package/dist/chunk-XTGKMHSW.js +0 -1
- package/dist/chunk-YBB7ZGTY.js +0 -1
- package/dist/chunk-Z4NPUARF.js +0 -1
- package/dist/chunk-ZGNQRPDT.js +0 -1
- package/dist/chunk-ZKPSFFKU.js +0 -1
- package/dist/chunk-ZLV5SQSX.js +0 -1
- package/dist/content-addressed-storage-4-ST1tYk.d.cts +0 -124
- package/dist/content-addressed-storage-DuYMjV7o.d.ts +0 -124
- package/dist/core/index.cjs +0 -1
- package/dist/core/index.d.cts +0 -3
- package/dist/core/index.d.ts +0 -3
- package/dist/core/index.js +0 -1
- package/dist/decay-BvOWTZ00.d.ts +0 -112
- package/dist/decay-CFlLvXUT.d.cts +0 -112
- package/dist/extra/browser.cjs +0 -1
- package/dist/extra/browser.d.cts +0 -4
- package/dist/extra/browser.d.ts +0 -4
- package/dist/extra/browser.js +0 -1
- package/dist/extra/index.cjs +0 -20
- package/dist/extra/index.d.cts +0 -17
- package/dist/extra/index.d.ts +0 -17
- package/dist/extra/index.js +0 -1
- package/dist/extra/node.cjs +0 -2
- package/dist/extra/node.js +0 -2
- package/dist/extra/operators.cjs +0 -1
- package/dist/extra/operators.d.cts +0 -958
- package/dist/extra/operators.d.ts +0 -958
- package/dist/extra/operators.js +0 -1
- package/dist/extra/reactive.cjs +0 -1
- package/dist/extra/reactive.d.cts +0 -353
- package/dist/extra/reactive.d.ts +0 -353
- package/dist/extra/reactive.js +0 -1
- package/dist/extra/render/index.cjs +0 -5
- package/dist/extra/render/index.js +0 -1
- package/dist/extra/sources.cjs +0 -3
- package/dist/extra/sources.js +0 -1
- package/dist/extra/storage-browser.cjs +0 -1
- package/dist/extra/storage-browser.d.cts +0 -37
- package/dist/extra/storage-browser.d.ts +0 -37
- package/dist/extra/storage-browser.js +0 -1
- package/dist/extra/storage-core.cjs +0 -1
- package/dist/extra/storage-core.d.cts +0 -28
- package/dist/extra/storage-core.d.ts +0 -28
- package/dist/extra/storage-core.js +0 -1
- package/dist/extra/storage-node.cjs +0 -1
- package/dist/extra/storage-node.d.cts +0 -2
- package/dist/extra/storage-node.d.ts +0 -2
- package/dist/extra/storage-node.js +0 -0
- package/dist/extra/storage-tiers-browser.cjs +0 -1
- package/dist/extra/storage-tiers-browser.d.cts +0 -120
- package/dist/extra/storage-tiers-browser.d.ts +0 -120
- package/dist/extra/storage-tiers-browser.js +0 -1
- package/dist/extra/storage-tiers-node.cjs +0 -1
- package/dist/extra/storage-tiers-node.d.cts +0 -210
- package/dist/extra/storage-tiers-node.d.ts +0 -210
- package/dist/extra/storage-tiers-node.js +0 -1
- package/dist/extra/storage-tiers.cjs +0 -1
- package/dist/extra/storage-tiers.d.cts +0 -412
- package/dist/extra/storage-tiers.d.ts +0 -412
- package/dist/extra/storage-tiers.js +0 -1
- package/dist/graph/index.cjs +0 -7
- package/dist/graph/index.d.cts +0 -7
- package/dist/graph/index.d.ts +0 -7
- package/dist/graph/index.js +0 -1
- package/dist/graph-CWvEUQAq.d.cts +0 -1861
- package/dist/graph-D9LFnda9.d.ts +0 -1861
- package/dist/index-5k1T6jl0.d.cts +0 -121
- package/dist/index-9770hRuQ.d.cts +0 -779
- package/dist/index-B1F8Enjf.d.ts +0 -704
- package/dist/index-BHskSB8v.d.ts +0 -3413
- package/dist/index-BIYAkbAi.d.cts +0 -26
- package/dist/index-BoJ5JHxI.d.ts +0 -557
- package/dist/index-BocU7pqs.d.ts +0 -779
- package/dist/index-BxNs2HB9.d.cts +0 -1858
- package/dist/index-C1T3d7V-.d.cts +0 -704
- package/dist/index-C5ri2Axc.d.cts +0 -301
- package/dist/index-C9l6OEBL.d.ts +0 -26
- package/dist/index-CC-AvFTy.d.cts +0 -557
- package/dist/index-CJF1URuX.d.ts +0 -121
- package/dist/index-CdTelp1M.d.ts +0 -202
- package/dist/index-Cj3WohTd.d.cts +0 -202
- package/dist/index-Co7uli2l.d.cts +0 -3413
- package/dist/index-D0aciIex.d.cts +0 -209
- package/dist/index-DHen9Klo.d.ts +0 -1858
- package/dist/index-Yq60JP3s.d.ts +0 -209
- package/dist/index-nozs3fFC.d.ts +0 -301
- package/dist/node-kK3CvTrR.d.cts +0 -1347
- package/dist/node-kK3CvTrR.d.ts +0 -1347
- package/dist/patterns/ai/browser.cjs +0 -8
- package/dist/patterns/ai/browser.js +0 -3
- package/dist/patterns/ai/index.cjs +0 -74
- package/dist/patterns/ai/index.d.cts +0 -20
- package/dist/patterns/ai/index.d.ts +0 -20
- package/dist/patterns/ai/index.js +0 -1
- package/dist/patterns/ai/node.cjs +0 -1
- package/dist/patterns/ai/node.js +0 -1
- package/dist/patterns/cqrs/index.cjs +0 -3
- package/dist/patterns/cqrs/index.d.cts +0 -8
- package/dist/patterns/cqrs/index.d.ts +0 -8
- package/dist/patterns/cqrs/index.js +0 -1
- package/dist/patterns/demo-shell/index.cjs +0 -5
- package/dist/patterns/demo-shell/index.d.cts +0 -7
- package/dist/patterns/demo-shell/index.d.ts +0 -7
- package/dist/patterns/demo-shell/index.js +0 -1
- package/dist/patterns/domain-templates/index.cjs +0 -3
- package/dist/patterns/domain-templates/index.d.cts +0 -6
- package/dist/patterns/domain-templates/index.d.ts +0 -6
- package/dist/patterns/domain-templates/index.js +0 -1
- package/dist/patterns/graphspec/index.cjs +0 -86
- package/dist/patterns/graphspec/index.d.cts +0 -8
- package/dist/patterns/graphspec/index.d.ts +0 -8
- package/dist/patterns/graphspec/index.js +0 -1
- package/dist/patterns/harness/index.cjs +0 -48
- package/dist/patterns/harness/index.d.cts +0 -13
- package/dist/patterns/harness/index.d.ts +0 -13
- package/dist/patterns/harness/index.js +0 -1
- package/dist/patterns/inspect/index.cjs +0 -3
- package/dist/patterns/inspect/index.d.cts +0 -9
- package/dist/patterns/inspect/index.d.ts +0 -9
- package/dist/patterns/inspect/index.js +0 -1
- package/dist/patterns/job-queue/index.cjs +0 -3
- package/dist/patterns/job-queue/index.d.cts +0 -9
- package/dist/patterns/job-queue/index.d.ts +0 -9
- package/dist/patterns/job-queue/index.js +0 -1
- package/dist/patterns/memory/index.cjs +0 -3
- package/dist/patterns/memory/index.d.cts +0 -8
- package/dist/patterns/memory/index.d.ts +0 -8
- package/dist/patterns/memory/index.js +0 -1
- package/dist/patterns/messaging/index.cjs +0 -3
- package/dist/patterns/messaging/index.d.cts +0 -7
- package/dist/patterns/messaging/index.d.ts +0 -7
- package/dist/patterns/messaging/index.js +0 -1
- package/dist/patterns/orchestration/index.cjs +0 -3
- package/dist/patterns/orchestration/index.d.cts +0 -8
- package/dist/patterns/orchestration/index.d.ts +0 -8
- package/dist/patterns/orchestration/index.js +0 -1
- package/dist/patterns/process/index.cjs +0 -3
- package/dist/patterns/process/index.d.cts +0 -10
- package/dist/patterns/process/index.d.ts +0 -10
- package/dist/patterns/process/index.js +0 -1
- package/dist/patterns/reactive-layout/index.cjs +0 -4
- package/dist/patterns/reactive-layout/index.d.cts +0 -7
- package/dist/patterns/reactive-layout/index.d.ts +0 -7
- package/dist/patterns/reactive-layout/index.js +0 -1
- package/dist/patterns/reduction/index.cjs +0 -3
- package/dist/patterns/reduction/index.d.cts +0 -6
- package/dist/patterns/reduction/index.d.ts +0 -6
- package/dist/patterns/reduction/index.js +0 -1
- package/dist/patterns/surface/index.cjs +0 -13
- package/dist/patterns/surface/index.d.cts +0 -9
- package/dist/patterns/surface/index.d.ts +0 -9
- package/dist/patterns/surface/index.js +0 -1
- package/dist/reactive-log-BKALbfal.d.ts +0 -223
- package/dist/reactive-log-DIGdYqQ6.d.cts +0 -223
- package/dist/reactive-map-CEFGp8TK.d.cts +0 -296
- package/dist/reactive-map-DS_SIAxv.d.ts +0 -296
- package/dist/resilience-6LYQJAC5.js +0 -1
- package/dist/sugar-DQjFmVqb.d.cts +0 -399
- package/dist/sugar-fhLIE7TT.d.ts +0 -399
- package/dist/topology-tree-Bcz27hpF.d.cts +0 -25
- package/dist/topology-tree-xvaD0fOX.d.ts +0 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/ai/adapters/providers/anthropic.ts","../src/base/io/http-error.ts","../src/utils/ai/adapters/providers/google.ts","../src/utils/ai/adapters/providers/openai-compat.ts","../src/utils/ai/adapters/core/factory.ts","../src/utils/ai/adapters/routing/cascading.ts"],"sourcesContent":["/**\n * AnthropicAdapter — default fetch-backed, optional SDK-backed.\n *\n * - `anthropicAdapter({ apiKey })` uses native `fetch` + SSE parsing.\n * - `anthropicAdapter({ sdk })` delegates to a user-provided `@anthropic-ai/sdk` instance.\n *\n * Token usage mapping:\n * - `input_tokens` → `input.regular`\n * - `cache_read_input_tokens` → `input.cacheRead`\n * - `cache_creation.ephemeral_5m_input_tokens` → `input.cacheWrite5m`\n * - `cache_creation.ephemeral_1h_input_tokens` → `input.cacheWrite1h`\n * - `cache_creation_input_tokens` (legacy) → `input.cacheWrite5m` (default TTL)\n * - `output_tokens` → `output.regular`\n * - `server_tool_use.web_search_requests` → `auxiliary.webSearchRequests`\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport { makeHttpError } from \"../../../../base/io/http-error.js\";\nimport { parseSSEStream } from \"../../../../base/io/sse.js\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n\tToolDefinition,\n} from \"../core/types.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface AnthropicAdapterOptions {\n\t/** API key. Falls back to `process.env.ANTHROPIC_API_KEY` on Node. */\n\tapiKey?: string;\n\t/** Default model (overridable per-call via `LLMInvokeOptions.model`). */\n\tmodel?: string;\n\t/** Override the base URL. Default `https://api.anthropic.com`. */\n\tbaseURL?: string;\n\t/** API version header. Default `\"2023-06-01\"`. */\n\tanthropicVersion?: string;\n\t/** Additional headers to send on every request (overridden by per-call). */\n\theaders?: Record<string, string>;\n\t/**\n\t * User-provided SDK instance. When present, the adapter delegates to it\n\t * (uses `.messages.create`) instead of native fetch.\n\t * Shape matches `@anthropic-ai/sdk` `.messages` API; any object with a\n\t * compatible `create`/`stream` contract works.\n\t */\n\tsdk?: AnthropicSdkLike;\n\t/** Custom fetch (useful for tests). Default `globalThis.fetch`. */\n\tfetchImpl?: typeof fetch;\n}\n\n/** Minimal SDK shape we interoperate with. */\nexport interface AnthropicSdkLike {\n\tmessages: {\n\t\tcreate(\n\t\t\tparams: Record<string, unknown>,\n\t\t\topts?: { signal?: AbortSignal },\n\t\t): Promise<AnthropicMessageResponse>;\n\t\tstream?(\n\t\t\tparams: Record<string, unknown>,\n\t\t\topts?: { signal?: AbortSignal },\n\t\t): AsyncIterable<AnthropicStreamEvent>;\n\t};\n}\n\ninterface AnthropicMessageResponse {\n\tid: string;\n\tcontent: ReadonlyArray<\n\t\t| { type: \"text\"; text: string }\n\t\t| { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n\t\t| { type: \"thinking\"; thinking: string }\n\t\t| { type: string; [key: string]: unknown }\n\t>;\n\tstop_reason?: string;\n\tusage: AnthropicUsage;\n\tmodel?: string;\n}\n\ninterface AnthropicUsage {\n\tinput_tokens?: number;\n\toutput_tokens?: number;\n\tcache_read_input_tokens?: number;\n\tcache_creation_input_tokens?: number;\n\tcache_creation?: {\n\t\tephemeral_5m_input_tokens?: number;\n\t\tephemeral_1h_input_tokens?: number;\n\t};\n\tserver_tool_use?: {\n\t\tweb_search_requests?: number;\n\t};\n}\n\ntype AnthropicStreamEvent =\n\t| { type: \"message_start\"; message: { usage: AnthropicUsage } }\n\t| { type: \"content_block_start\"; index: number; content_block: Record<string, unknown> }\n\t| { type: \"content_block_delta\"; index: number; delta: Record<string, unknown> }\n\t| { type: \"content_block_stop\"; index: number }\n\t| { type: \"message_delta\"; delta: { stop_reason?: string; usage?: AnthropicUsage } }\n\t| { type: \"message_stop\" }\n\t| { type: string; [key: string]: unknown };\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function anthropicAdapter(opts: AnthropicAdapterOptions = {}): LLMAdapter {\n\tif (opts.sdk) return sdkBackedAnthropic(opts);\n\treturn fetchBackedAnthropic(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Request/response mapping\n// ---------------------------------------------------------------------------\n\nfunction toAnthropicRequest(\n\tmessages: readonly ChatMessage[],\n\tinvokeOpts: LLMInvokeOptions | undefined,\n\tdefaultModel: string | undefined,\n\tstream: boolean,\n): Record<string, unknown> {\n\tconst model = invokeOpts?.model ?? defaultModel;\n\tif (!model)\n\t\tthrow new Error(\"anthropicAdapter: model must be set via options.model or invokeOpts.model\");\n\n\tconst { system, chat } = partitionSystem(messages, invokeOpts?.systemPrompt);\n\n\tconst body: Record<string, unknown> = {\n\t\tmodel,\n\t\tmessages: chat.map(toAnthropicMessage),\n\t\tmax_tokens: invokeOpts?.maxTokens ?? 4096,\n\t};\n\tif (system) body.system = system;\n\tif (invokeOpts?.temperature != null) body.temperature = invokeOpts.temperature;\n\tif (invokeOpts?.tools && invokeOpts.tools.length > 0)\n\t\tbody.tools = invokeOpts.tools.map(toAnthropicTool);\n\tif (invokeOpts?.maxReasoningTokens != null) {\n\t\tbody.thinking = { type: \"enabled\", budget_tokens: invokeOpts.maxReasoningTokens };\n\t}\n\tif (invokeOpts?.cacheHint) {\n\t\t// Cache-control injected per-message by the user (Anthropic cache is\n\t\t// block-level). We surface the hint via metadata, but the canonical\n\t\t// cacheHint API is informational — power users pass cache_control\n\t\t// directly on messages via providerExtras.\n\t}\n\tif (stream) body.stream = true;\n\tif (invokeOpts?.providerExtras) Object.assign(body, invokeOpts.providerExtras);\n\treturn body;\n}\n\nfunction partitionSystem(\n\tmessages: readonly ChatMessage[],\n\tsystemPrompt: string | undefined,\n): { system: string | undefined; chat: readonly ChatMessage[] } {\n\tconst systemParts: string[] = [];\n\tif (systemPrompt) systemParts.push(systemPrompt);\n\tconst chat: ChatMessage[] = [];\n\tfor (const m of messages) {\n\t\tif (m.role === \"system\") systemParts.push(m.content);\n\t\telse chat.push(m);\n\t}\n\treturn { system: systemParts.length > 0 ? systemParts.join(\"\\n\\n\") : undefined, chat };\n}\n\nfunction toAnthropicMessage(m: ChatMessage): Record<string, unknown> {\n\tif (m.role === \"tool\") {\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: m.toolCallId,\n\t\t\t\t\tcontent: m.content,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\tif (m.role === \"assistant\" && m.toolCalls && m.toolCalls.length > 0) {\n\t\tconst blocks: unknown[] = [];\n\t\tif (m.content) blocks.push({ type: \"text\", text: m.content });\n\t\tfor (const tc of m.toolCalls) {\n\t\t\tblocks.push({ type: \"tool_use\", id: tc.id, name: tc.name, input: tc.arguments });\n\t\t}\n\t\treturn { role: \"assistant\", content: blocks };\n\t}\n\treturn { role: m.role, content: m.content };\n}\n\nfunction toAnthropicTool(t: ToolDefinition): Record<string, unknown> {\n\treturn {\n\t\tname: t.name,\n\t\tdescription: t.description,\n\t\tinput_schema: t.parameters,\n\t};\n}\n\n/**\n * Merge an incoming Anthropic usage update into the running snapshot. Unlike\n * a shallow spread, this preserves nested `cache_creation` fields when the\n * update omits them (or sends an empty object). Applied to both SSE and SDK\n * streaming paths.\n */\nfunction mergeAnthropicUsage(\n\tprev: AnthropicUsage | undefined,\n\tnext: AnthropicUsage,\n): AnthropicUsage {\n\tif (!prev) return { ...next };\n\tconst merged: AnthropicUsage = { ...prev };\n\t// Scalar fields: overwrite when present in `next`.\n\tif (next.input_tokens != null) merged.input_tokens = next.input_tokens;\n\tif (next.output_tokens != null) merged.output_tokens = next.output_tokens;\n\tif (next.cache_read_input_tokens != null)\n\t\tmerged.cache_read_input_tokens = next.cache_read_input_tokens;\n\tif (next.cache_creation_input_tokens != null)\n\t\tmerged.cache_creation_input_tokens = next.cache_creation_input_tokens;\n\t// Nested `cache_creation`: shallow-merge its own fields so a non-empty\n\t// update doesn't wipe a prior ephemeral_5m/1h value.\n\tif (next.cache_creation) {\n\t\tmerged.cache_creation = {\n\t\t\t...(prev.cache_creation ?? {}),\n\t\t\t...next.cache_creation,\n\t\t};\n\t}\n\tif (next.server_tool_use) {\n\t\tmerged.server_tool_use = {\n\t\t\t...(prev.server_tool_use ?? {}),\n\t\t\t...next.server_tool_use,\n\t\t};\n\t}\n\treturn merged;\n}\n\nfunction mapUsage(u: AnthropicUsage | undefined): TokenUsage {\n\tconst usage: TokenUsage = {\n\t\tinput: { regular: u?.input_tokens ?? 0 },\n\t\toutput: { regular: u?.output_tokens ?? 0 },\n\t\traw: u,\n\t};\n\tif (u?.cache_read_input_tokens) usage.input.cacheRead = u.cache_read_input_tokens;\n\tif (u?.cache_creation) {\n\t\tif (u.cache_creation.ephemeral_5m_input_tokens)\n\t\t\tusage.input.cacheWrite5m = u.cache_creation.ephemeral_5m_input_tokens;\n\t\tif (u.cache_creation.ephemeral_1h_input_tokens)\n\t\t\tusage.input.cacheWrite1h = u.cache_creation.ephemeral_1h_input_tokens;\n\t} else if (u?.cache_creation_input_tokens) {\n\t\t// Legacy flat field — default to 5m TTL.\n\t\tusage.input.cacheWrite5m = u.cache_creation_input_tokens;\n\t}\n\tif (u?.server_tool_use?.web_search_requests) {\n\t\tusage.auxiliary = { webSearchRequests: u.server_tool_use.web_search_requests };\n\t}\n\treturn usage;\n}\n\nfunction toLLMResponse(msg: AnthropicMessageResponse, latencyMs: number): LLMResponse {\n\tconst textParts: string[] = [];\n\tconst toolCalls: { id: string; name: string; arguments: Record<string, unknown> }[] = [];\n\tfor (const block of msg.content) {\n\t\tif (block.type === \"text\" && typeof (block as { text?: unknown }).text === \"string\") {\n\t\t\ttextParts.push((block as { text: string }).text);\n\t\t} else if (block.type === \"tool_use\") {\n\t\t\tconst tb = block as { id: string; name: string; input: Record<string, unknown> };\n\t\t\ttoolCalls.push({ id: tb.id, name: tb.name, arguments: tb.input ?? {} });\n\t\t}\n\t}\n\treturn {\n\t\tcontent: textParts.join(\"\"),\n\t\ttoolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n\t\tusage: mapUsage(msg.usage),\n\t\tfinishReason: msg.stop_reason,\n\t\tlatencyMs,\n\t\tmodel: msg.model,\n\t\tprovider: \"anthropic\",\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Fetch-backed impl\n// ---------------------------------------------------------------------------\n\nfunction fetchBackedAnthropic(opts: AnthropicAdapterOptions): LLMAdapter {\n\tconst apiKey =\n\t\topts.apiKey ??\n\t\t(globalThis as { process?: { env?: Record<string, string> } }).process?.env?.ANTHROPIC_API_KEY;\n\tif (!apiKey) {\n\t\t// Don't throw at construction — allow test harnesses / dry-run setups\n\t\t// that never call invoke. Throw at first use instead.\n\t}\n\tconst baseURL = opts.baseURL ?? \"https://api.anthropic.com\";\n\tconst anthropicVersion = opts.anthropicVersion ?? \"2023-06-01\";\n\tconst fetchImpl = opts.fetchImpl ?? fetch;\n\n\tconst commonHeaders = (): Record<string, string> => {\n\t\tif (!apiKey)\n\t\t\tthrow new Error(\"anthropicAdapter: apiKey required for invoke/stream (or provide opts.sdk)\");\n\t\treturn {\n\t\t\t\"x-api-key\": apiKey,\n\t\t\t\"anthropic-version\": anthropicVersion,\n\t\t\t\"content-type\": \"application/json\",\n\t\t\t...(opts.headers ?? {}),\n\t\t};\n\t};\n\n\treturn {\n\t\tprovider: \"anthropic\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst body = toAnthropicRequest(messages, invokeOpts, opts.model, false);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await fetchImpl(`${baseURL}/v1/messages`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: commonHeaders(),\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, \"Anthropic\");\n\t\t\tconst json = (await resp.json()) as AnthropicMessageResponse;\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(json, latencyMs);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst body = toAnthropicRequest(messages, invokeOpts, opts.model, true);\n\t\t\tconst resp = await fetchImpl(`${baseURL}/v1/messages`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { ...commonHeaders(), accept: \"text/event-stream\" },\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, \"Anthropic\");\n\t\t\tif (!resp.body) throw new Error(\"anthropicAdapter: streaming response has no body\");\n\n\t\t\tlet finalUsage: AnthropicUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\tconst toolCallsByIndex: Map<number, { id: string; name: string; argBuf: string }> = new Map();\n\n\t\t\tfor await (const event of parseSSEStream(resp.body, { signal: invokeOpts?.signal })) {\n\t\t\t\tconst data = event.data;\n\t\t\t\tif (!data) continue;\n\t\t\t\tlet parsed: AnthropicStreamEvent;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(data) as AnthropicStreamEvent;\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tswitch (parsed.type) {\n\t\t\t\t\tcase \"message_start\": {\n\t\t\t\t\t\tconst ms = parsed as { message: { usage: AnthropicUsage } };\n\t\t\t\t\t\tfinalUsage = mergeAnthropicUsage(finalUsage, ms.message.usage);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"content_block_start\": {\n\t\t\t\t\t\tconst cb = parsed as { index: number; content_block: Record<string, unknown> };\n\t\t\t\t\t\tconst b = cb.content_block;\n\t\t\t\t\t\tif (b.type === \"tool_use\") {\n\t\t\t\t\t\t\ttoolCallsByIndex.set(cb.index, {\n\t\t\t\t\t\t\t\tid: String(b.id ?? \"\"),\n\t\t\t\t\t\t\t\tname: String(b.name ?? \"\"),\n\t\t\t\t\t\t\t\targBuf: \"\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\t\tdelta: { id: String(b.id ?? \"\"), name: String(b.name ?? \"\") },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"content_block_delta\": {\n\t\t\t\t\t\tconst cbd = parsed as { index: number; delta: Record<string, unknown> };\n\t\t\t\t\t\tconst d = cbd.delta;\n\t\t\t\t\t\tif (d.type === \"text_delta\" && typeof d.text === \"string\") {\n\t\t\t\t\t\t\tyield { type: \"token\", delta: d.text };\n\t\t\t\t\t\t} else if (d.type === \"input_json_delta\" && typeof d.partial_json === \"string\") {\n\t\t\t\t\t\t\tconst existing = toolCallsByIndex.get(cbd.index);\n\t\t\t\t\t\t\tif (existing) existing.argBuf += d.partial_json;\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\t\tdelta: { argumentsDelta: d.partial_json },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (d.type === \"thinking_delta\" && typeof d.thinking === \"string\") {\n\t\t\t\t\t\t\tyield { type: \"thinking\", delta: d.thinking };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"message_delta\": {\n\t\t\t\t\t\tconst md = parsed as { delta: { stop_reason?: string; usage?: AnthropicUsage } };\n\t\t\t\t\t\tif (md.delta.stop_reason) finishReason = md.delta.stop_reason;\n\t\t\t\t\t\tif (md.delta.usage) {\n\t\t\t\t\t\t\tfinalUsage = mergeAnthropicUsage(finalUsage, md.delta.usage);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"message_stop\":\n\t\t\t\t\t\t// Fall through to finalize after the loop.\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (finalUsage) yield { type: \"usage\", usage: mapUsage(finalUsage) };\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// SDK-backed impl\n// ---------------------------------------------------------------------------\n\nfunction sdkBackedAnthropic(opts: AnthropicAdapterOptions): LLMAdapter {\n\tconst sdk = opts.sdk;\n\tif (!sdk) throw new Error(\"sdkBackedAnthropic: sdk instance required\");\n\treturn {\n\t\tprovider: \"anthropic\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst body = toAnthropicRequest(messages, invokeOpts, opts.model, false);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = (await sdk.messages.create(body, {\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t})) as AnthropicMessageResponse;\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(resp, latencyMs);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tif (!sdk.messages.stream) {\n\t\t\t\tthrow new Error(\"sdkBackedAnthropic: SDK instance does not expose .messages.stream\");\n\t\t\t}\n\t\t\tconst body = toAnthropicRequest(messages, invokeOpts, opts.model, true);\n\t\t\tlet finalUsage: AnthropicUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\tfor await (const event of sdk.messages.stream(body, { signal: invokeOpts?.signal })) {\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"message_start\":\n\t\t\t\t\t\tfinalUsage = mergeAnthropicUsage(\n\t\t\t\t\t\t\tfinalUsage,\n\t\t\t\t\t\t\t(event as { message: { usage: AnthropicUsage } }).message.usage,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"content_block_delta\": {\n\t\t\t\t\t\tconst d = (event as { delta: Record<string, unknown> }).delta;\n\t\t\t\t\t\tif (d?.type === \"text_delta\" && typeof d.text === \"string\") {\n\t\t\t\t\t\t\tyield { type: \"token\", delta: d.text };\n\t\t\t\t\t\t} else if (d?.type === \"input_json_delta\" && typeof d.partial_json === \"string\") {\n\t\t\t\t\t\t\tyield { type: \"tool-call-delta\", delta: { argumentsDelta: d.partial_json } };\n\t\t\t\t\t\t} else if (d?.type === \"thinking_delta\" && typeof d.thinking === \"string\") {\n\t\t\t\t\t\t\tyield { type: \"thinking\", delta: d.thinking };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"message_delta\": {\n\t\t\t\t\t\tconst md = event as { delta: { stop_reason?: string; usage?: AnthropicUsage } };\n\t\t\t\t\t\tif (md.delta.stop_reason) finishReason = md.delta.stop_reason;\n\t\t\t\t\t\tif (md.delta.usage) finalUsage = mergeAnthropicUsage(finalUsage, md.delta.usage);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (finalUsage) yield { type: \"usage\", usage: mapUsage(finalUsage) };\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// SSE parser\n// ---------------------------------------------------------------------------\n","/**\n * HTTP error builder — companion to {@link ./adapters.ts}'s `fromHTTP` /\n * `fromHTTPStream` / `toHTTP`. Pure, zero-dep function that turns a failed\n * `Response` into an `Error` exposing the `{status, headers, message}` shape\n * that `HttpErrorLike` consumers (rate-limit parsers, retry predicates,\n * observability layers) expect.\n *\n * Universal tier — safe for browser and Node. No Node-only imports.\n */\n\n/**\n * Construct an `Error` carrying `status` + `headers` fields from a non-ok\n * `Response`. Reads the body with `resp.text()` for diagnostic context; a\n * body read failure is swallowed (empty string) so the returned error always\n * reflects the original status/statusText at minimum.\n *\n * @param resp - The offending `Response` object.\n * @param provider - Optional prefix (e.g. `\"Anthropic\"`, `\"openai\"`) used in\n * the error message. Defaults to `\"HTTP\"`.\n * @returns An `Error` whose `message` is `\"${provider} API <status>: <statusText>[ — body]\"`,\n * with `status: number` and `headers: Headers` attached.\n *\n * @category extra\n */\nexport async function makeHttpError(resp: Response, provider?: string): Promise<Error> {\n\tlet body: string;\n\ttry {\n\t\tbody = await resp.text();\n\t} catch {\n\t\tbody = \"\";\n\t}\n\tconst prefix = provider ?? \"HTTP\";\n\tconst err = new Error(\n\t\t`${prefix} API ${resp.status}: ${resp.statusText}${body ? ` — ${body}` : \"\"}`,\n\t) as Error & {\n\t\tstatus: number;\n\t\theaders: Headers;\n\t};\n\terr.status = resp.status;\n\terr.headers = resp.headers;\n\treturn err;\n}\n","/**\n * GoogleAdapter — default fetch-backed, optional SDK-backed.\n *\n * The SDK-backed path targets the `@google/genai` SDK shape:\n * `client.models.generateContent({ model, contents, config })` — single\n * param, with generation params and `abortSignal` under `config`. The\n * legacy `@google/generative-ai` two-arg `(params, {signal})` shape is no\n * longer accepted; pass a `GoogleGenAI` instance via `opts.sdk`.\n *\n * Maps Gemini `usageMetadata`:\n * - `promptTokenCount` minus `cachedContentTokenCount` → `input.regular`\n * - `cachedContentTokenCount` → `input.cacheRead`\n * - `candidatesTokenCount` → `output.regular`\n * - `thoughtsTokenCount` → `output.reasoning`\n * - `toolUsePromptTokenCount` → `input.toolUse`\n * - `promptTokensDetails[]` → `input.{image,audio,video}` per modality\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport { makeHttpError } from \"../../../../base/io/http-error.js\";\nimport { parseSSEStream } from \"../../../../base/io/sse.js\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n\tToolDefinition,\n} from \"../core/types.js\";\n\nexport interface GoogleAdapterOptions {\n\t/** API key. Falls back to `process.env.GOOGLE_API_KEY` / `GEMINI_API_KEY` on Node. */\n\tapiKey?: string;\n\tmodel?: string;\n\tbaseURL?: string;\n\t/** Extra headers on every request. */\n\theaders?: Record<string, string>;\n\t/**\n\t * Optional `@google/genai` SDK instance (e.g. `new GoogleGenAI({apiKey})`).\n\t * When omitted, the adapter uses the fetch-backed path against the\n\t * Generative Language REST API.\n\t */\n\tsdk?: GoogleSdkLike;\n\tfetchImpl?: typeof fetch;\n}\n\n/**\n * Duck-type matching the `@google/genai` (`GoogleGenAI`) SDK shape:\n * single-param `generateContent({ model, contents, config })` where\n * generation parameters and `abortSignal` live under `config`.\n *\n * The `@google/generative-ai` predecessor's two-arg `(params, {signal})`\n * shape is no longer accepted.\n */\nexport interface GoogleSdkLike {\n\tmodels: {\n\t\tgenerateContent(params: GoogleSdkRequestParams): Promise<GeminiResponse>;\n\t\tgenerateContentStream?(\n\t\t\tparams: GoogleSdkRequestParams,\n\t\t): Promise<AsyncIterable<GeminiResponse>> | AsyncIterable<GeminiResponse>;\n\t};\n}\n\n/** Single-param request shape consumed by `@google/genai`'s `models.generateContent`. */\nexport interface GoogleSdkRequestParams {\n\tmodel: string;\n\tcontents: unknown;\n\tconfig?: GoogleSdkRequestConfig;\n}\n\n/**\n * Generation config under the new SDK. `abortSignal` is the cancellation\n * channel — there is no second-arg `{signal}`.\n */\nexport interface GoogleSdkRequestConfig {\n\tabortSignal?: AbortSignal;\n\ttemperature?: number;\n\tmaxOutputTokens?: number;\n\tsystemInstruction?: unknown;\n\ttools?: unknown;\n\tthinkingConfig?: unknown;\n\t[extra: string]: unknown;\n}\n\ninterface GeminiResponse {\n\tcandidates?: ReadonlyArray<{\n\t\tcontent?: {\n\t\t\trole?: string;\n\t\t\tparts?: ReadonlyArray<{\n\t\t\t\ttext?: string;\n\t\t\t\tthought?: boolean;\n\t\t\t\tfunctionCall?: { name: string; args: Record<string, unknown> };\n\t\t\t}>;\n\t\t};\n\t\tfinishReason?: string;\n\t}>;\n\tusageMetadata?: GeminiUsage;\n\tmodelVersion?: string;\n}\n\ninterface GeminiUsage {\n\tpromptTokenCount?: number;\n\tcandidatesTokenCount?: number;\n\ttotalTokenCount?: number;\n\tthoughtsTokenCount?: number;\n\tcachedContentTokenCount?: number;\n\ttoolUsePromptTokenCount?: number;\n\tpromptTokensDetails?: ReadonlyArray<{ modality: string; tokenCount: number }>;\n\tcandidatesTokensDetails?: ReadonlyArray<{ modality: string; tokenCount: number }>;\n\tcacheTokensDetails?: ReadonlyArray<{ modality: string; tokenCount: number }>;\n}\n\nexport function googleAdapter(opts: GoogleAdapterOptions = {}): LLMAdapter {\n\tif (opts.sdk) return sdkBackedGoogle(opts);\n\treturn fetchBackedGoogle(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Mapping\n// ---------------------------------------------------------------------------\n\nfunction toGeminiRequest(\n\tmessages: readonly ChatMessage[],\n\tinvokeOpts: LLMInvokeOptions | undefined,\n): Record<string, unknown> {\n\tconst systemParts: string[] = [];\n\tconst contents: Array<{\n\t\trole: string;\n\t\tparts: Array<{ text?: string; functionCall?: unknown; functionResponse?: unknown }>;\n\t}> = [];\n\tif (invokeOpts?.systemPrompt) systemParts.push(invokeOpts.systemPrompt);\n\n\tfor (const m of messages) {\n\t\tif (m.role === \"system\") {\n\t\t\tsystemParts.push(m.content);\n\t\t\tcontinue;\n\t\t}\n\t\tif (m.role === \"tool\") {\n\t\t\tcontents.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tparts: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfunctionResponse: {\n\t\t\t\t\t\t\tname: m.name ?? m.toolCallId ?? \"tool\",\n\t\t\t\t\t\t\tresponse: { result: m.content },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (m.role === \"assistant\" && m.toolCalls && m.toolCalls.length > 0) {\n\t\t\tconst parts: Array<{ text?: string; functionCall?: unknown }> = [];\n\t\t\tif (m.content) parts.push({ text: m.content });\n\t\t\tfor (const tc of m.toolCalls) {\n\t\t\t\tparts.push({ functionCall: { name: tc.name, args: tc.arguments } });\n\t\t\t}\n\t\t\tcontents.push({ role: \"model\", parts });\n\t\t\tcontinue;\n\t\t}\n\t\tcontents.push({\n\t\t\trole: m.role === \"assistant\" ? \"model\" : \"user\",\n\t\t\tparts: [{ text: m.content }],\n\t\t});\n\t}\n\n\tconst body: Record<string, unknown> = { contents };\n\tif (systemParts.length > 0) {\n\t\tbody.systemInstruction = { role: \"system\", parts: [{ text: systemParts.join(\"\\n\\n\") }] };\n\t}\n\tconst genConfig: Record<string, unknown> = {};\n\tif (invokeOpts?.maxTokens != null) genConfig.maxOutputTokens = invokeOpts.maxTokens;\n\tif (invokeOpts?.temperature != null) genConfig.temperature = invokeOpts.temperature;\n\tif (invokeOpts?.maxReasoningTokens != null) {\n\t\tgenConfig.thinkingConfig = { thinkingBudget: invokeOpts.maxReasoningTokens };\n\t}\n\tif (Object.keys(genConfig).length > 0) body.generationConfig = genConfig;\n\tif (invokeOpts?.tools && invokeOpts.tools.length > 0) {\n\t\tbody.tools = [{ functionDeclarations: invokeOpts.tools.map(toGeminiTool) }];\n\t}\n\tif (invokeOpts?.providerExtras) Object.assign(body, invokeOpts.providerExtras);\n\treturn body;\n}\n\nfunction toGeminiTool(t: ToolDefinition): Record<string, unknown> {\n\treturn {\n\t\tname: t.name,\n\t\tdescription: t.description,\n\t\tparameters: t.parameters,\n\t};\n}\n\n/**\n * Reshape the fetch-API request body into the SDK's `{ model, contents,\n * config }` form. Generation params (`temperature`, `maxOutputTokens`,\n * `thinkingConfig`) move from `body.generationConfig.*` to `config.*`;\n * `systemInstruction` and `tools` move from top-level body keys into\n * `config`; `abortSignal` is threaded into `config`. `providerExtras` keys\n * spread into `config` so escape-hatch usage remains identical.\n */\nfunction toSdkParams(\n\tbody: Record<string, unknown>,\n\tmodel: string,\n\tsignal: AbortSignal | undefined,\n): GoogleSdkRequestParams {\n\tconst config: GoogleSdkRequestConfig = {};\n\tconst gen = body.generationConfig as Record<string, unknown> | undefined;\n\tif (gen) {\n\t\tif (typeof gen.maxOutputTokens === \"number\") config.maxOutputTokens = gen.maxOutputTokens;\n\t\tif (typeof gen.temperature === \"number\") config.temperature = gen.temperature;\n\t\tif (gen.thinkingConfig) config.thinkingConfig = gen.thinkingConfig;\n\t}\n\tif (body.systemInstruction) config.systemInstruction = body.systemInstruction;\n\tif (body.tools) config.tools = body.tools;\n\tfor (const [k, v] of Object.entries(body)) {\n\t\tif (\n\t\t\tk === \"contents\" ||\n\t\t\tk === \"generationConfig\" ||\n\t\t\tk === \"systemInstruction\" ||\n\t\t\tk === \"tools\" ||\n\t\t\t// Skip `abortSignal` so a caller-supplied entry in `providerExtras`\n\t\t\t// can't briefly land in `config.abortSignal` before being\n\t\t\t// overwritten — the canonical signal channel is the second\n\t\t\t// `signal` argument (set on `config.abortSignal` below).\n\t\t\tk === \"abortSignal\" ||\n\t\t\t// Skip `model` so a stray `body.model` (not produced by\n\t\t\t// `toGeminiRequest` today, but defensively guarded) doesn't\n\t\t\t// duplicate the top-level `model` field on the SDK request.\n\t\t\tk === \"model\"\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconfig[k] = v;\n\t}\n\tif (signal) config.abortSignal = signal;\n\treturn {\n\t\tmodel,\n\t\tcontents: body.contents,\n\t\tconfig: Object.keys(config).length > 0 ? config : undefined,\n\t};\n}\n\nfunction mapUsage(u: GeminiUsage | undefined): TokenUsage {\n\tconst usage: TokenUsage = {\n\t\tinput: { regular: 0 },\n\t\toutput: { regular: 0 },\n\t\traw: u,\n\t};\n\tif (!u) return usage;\n\tconst promptTotal = u.promptTokenCount ?? 0;\n\tconst cached = u.cachedContentTokenCount ?? 0;\n\tusage.input.regular = Math.max(0, promptTotal - cached);\n\tif (cached > 0) usage.input.cacheRead = cached;\n\tif (u.toolUsePromptTokenCount) usage.input.toolUse = u.toolUsePromptTokenCount;\n\tif (u.promptTokensDetails) {\n\t\tfor (const d of u.promptTokensDetails) {\n\t\t\tconst modality = d.modality?.toLowerCase();\n\t\t\tif (modality === \"image\") usage.input.image = (usage.input.image ?? 0) + d.tokenCount;\n\t\t\telse if (modality === \"audio\") usage.input.audio = (usage.input.audio ?? 0) + d.tokenCount;\n\t\t\telse if (modality === \"video\") usage.input.video = (usage.input.video ?? 0) + d.tokenCount;\n\t\t}\n\t}\n\tusage.output.regular = u.candidatesTokenCount ?? 0;\n\tif (u.thoughtsTokenCount) usage.output.reasoning = u.thoughtsTokenCount;\n\treturn usage;\n}\n\nfunction toLLMResponse(json: GeminiResponse, latencyMs: number): LLMResponse {\n\tconst cand = json.candidates?.[0];\n\tconst parts = cand?.content?.parts ?? [];\n\tconst textParts: string[] = [];\n\tconst toolCalls: { id: string; name: string; arguments: Record<string, unknown> }[] = [];\n\tlet i = 0;\n\tfor (const p of parts) {\n\t\tif (typeof p.text === \"string\") textParts.push(p.text);\n\t\tif (p.functionCall) {\n\t\t\ttoolCalls.push({\n\t\t\t\tid: `${p.functionCall.name}-${i++}`,\n\t\t\t\tname: p.functionCall.name,\n\t\t\t\targuments: p.functionCall.args ?? {},\n\t\t\t});\n\t\t}\n\t}\n\treturn {\n\t\tcontent: textParts.join(\"\"),\n\t\ttoolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n\t\tusage: mapUsage(json.usageMetadata),\n\t\tfinishReason: cand?.finishReason,\n\t\tlatencyMs,\n\t\tmodel: json.modelVersion,\n\t\tprovider: \"google\",\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Fetch-backed\n// ---------------------------------------------------------------------------\n\nfunction resolveApiKey(opts: GoogleAdapterOptions): string | undefined {\n\tif (opts.apiKey) return opts.apiKey;\n\tconst env = (globalThis as { process?: { env?: Record<string, string> } }).process?.env;\n\treturn env?.GOOGLE_API_KEY ?? env?.GEMINI_API_KEY;\n}\n\nfunction fetchBackedGoogle(opts: GoogleAdapterOptions): LLMAdapter {\n\tconst baseURL = opts.baseURL ?? \"https://generativelanguage.googleapis.com/v1beta\";\n\tconst fetchImpl = opts.fetchImpl ?? fetch;\n\n\tconst pickModel = (invokeOpts: LLMInvokeOptions | undefined): string => {\n\t\tconst model = invokeOpts?.model ?? opts.model;\n\t\tif (!model)\n\t\t\tthrow new Error(\"googleAdapter: model must be set via options.model or invokeOpts.model\");\n\t\treturn model;\n\t};\n\n\tconst keyParam = (): string => {\n\t\tconst key = resolveApiKey(opts);\n\t\tif (!key) throw new Error(\"googleAdapter: apiKey required for invoke/stream\");\n\t\treturn `key=${encodeURIComponent(key)}`;\n\t};\n\n\treturn {\n\t\tprovider: \"google\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst model = pickModel(invokeOpts);\n\t\t\tconst body = toGeminiRequest(messages, invokeOpts);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst url = `${baseURL}/models/${encodeURIComponent(model)}:generateContent?${keyParam()}`;\n\t\t\tconst resp = await fetchImpl(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"content-type\": \"application/json\", ...(opts.headers ?? {}) },\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, \"Google\");\n\t\t\tconst json = (await resp.json()) as GeminiResponse;\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(json, latencyMs);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst model = pickModel(invokeOpts);\n\t\t\tconst body = toGeminiRequest(messages, invokeOpts);\n\t\t\tconst url = `${baseURL}/models/${encodeURIComponent(model)}:streamGenerateContent?alt=sse&${keyParam()}`;\n\t\t\tconst resp = await fetchImpl(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\taccept: \"text/event-stream\",\n\t\t\t\t\t...(opts.headers ?? {}),\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, \"Google\");\n\t\t\tif (!resp.body) throw new Error(\"googleAdapter: streaming response has no body\");\n\n\t\t\tlet finalUsage: GeminiUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\n\t\t\tfor await (const event of parseSSEStream(resp.body, { signal: invokeOpts?.signal })) {\n\t\t\t\tif (!event.data) continue;\n\t\t\t\tlet parsed: GeminiResponse;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(event.data) as GeminiResponse;\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst cand = parsed.candidates?.[0];\n\t\t\t\tfor (const p of cand?.content?.parts ?? []) {\n\t\t\t\t\tif (typeof p.text === \"string\") {\n\t\t\t\t\t\tif (p.thought) yield { type: \"thinking\", delta: p.text };\n\t\t\t\t\t\telse yield { type: \"token\", delta: p.text };\n\t\t\t\t\t}\n\t\t\t\t\tif (p.functionCall) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\tname: p.functionCall.name,\n\t\t\t\t\t\t\t\targumentsDelta: JSON.stringify(p.functionCall.args ?? {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (cand?.finishReason) finishReason = cand.finishReason;\n\t\t\t\tif (parsed.usageMetadata) finalUsage = parsed.usageMetadata;\n\t\t\t}\n\t\t\tif (finalUsage) yield { type: \"usage\", usage: mapUsage(finalUsage) };\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n\nfunction sdkBackedGoogle(opts: GoogleAdapterOptions): LLMAdapter {\n\tconst sdk = opts.sdk;\n\tif (!sdk) throw new Error(\"sdkBackedGoogle: sdk instance required\");\n\n\treturn {\n\t\tprovider: \"google\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst body = toGeminiRequest(messages, invokeOpts);\n\t\t\tconst model = invokeOpts?.model ?? opts.model;\n\t\t\tif (!model) throw new Error(\"googleAdapter: model required\");\n\t\t\tconst params = toSdkParams(body, model, invokeOpts?.signal);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await sdk.models.generateContent(params);\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(resp, latencyMs);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tif (!sdk.models.generateContentStream) {\n\t\t\t\tthrow new Error(\"sdkBackedGoogle: SDK instance does not expose generateContentStream\");\n\t\t\t}\n\t\t\tconst body = toGeminiRequest(messages, invokeOpts);\n\t\t\tconst model = invokeOpts?.model ?? opts.model;\n\t\t\tif (!model) throw new Error(\"googleAdapter: model required\");\n\t\t\tconst params = toSdkParams(body, model, invokeOpts?.signal);\n\t\t\tlet finalUsage: GeminiUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\t// `@google/genai` returns `Promise<AsyncIterable<...>>`; older shapes\n\t\t\t// returned the iterable directly. Awaiting a non-thenable resolves\n\t\t\t// to itself, so this works for both.\n\t\t\tconst stream = await sdk.models.generateContentStream(params);\n\t\t\tfor await (const chunk of stream) {\n\t\t\t\tconst cand = chunk.candidates?.[0];\n\t\t\t\tfor (const p of cand?.content?.parts ?? []) {\n\t\t\t\t\tif (typeof p.text === \"string\") {\n\t\t\t\t\t\tif (p.thought) yield { type: \"thinking\", delta: p.text };\n\t\t\t\t\t\telse yield { type: \"token\", delta: p.text };\n\t\t\t\t\t}\n\t\t\t\t\tif (p.functionCall) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\tname: p.functionCall.name,\n\t\t\t\t\t\t\t\targumentsDelta: JSON.stringify(p.functionCall.args ?? {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (cand?.finishReason) finishReason = cand.finishReason;\n\t\t\t\tif (chunk.usageMetadata) finalUsage = chunk.usageMetadata;\n\t\t\t}\n\t\t\tif (finalUsage) yield { type: \"usage\", usage: mapUsage(finalUsage) };\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n","/**\n * OpenAICompatAdapter — default fetch-backed, optional SDK-backed.\n *\n * Covers any provider that speaks OpenAI chat/completions. Preset base URLs\n * for OpenAI, OpenRouter, Groq, Ollama, DeepSeek, xAI Grok (all expose the\n * same `/v1/chat/completions` shape).\n *\n * Token usage mapping:\n * - `prompt_tokens` → `input.regular` (minus cached_tokens)\n * - `prompt_tokens_details.cached_tokens` → `input.cacheRead`\n * - `prompt_tokens_details.audio_tokens` → `input.audio`\n * - `completion_tokens` → `output.regular` (minus reasoning)\n * - `completion_tokens_details.reasoning_tokens` → `output.reasoning`\n * - `completion_tokens_details.audio_tokens` → `output.audio`\n * - `completion_tokens_details.accepted_prediction_tokens` → `output.predictionAccepted`\n * - `completion_tokens_details.rejected_prediction_tokens` → `output.predictionRejected`\n *\n * DeepSeek compatibility: `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens`\n * are surfaced in the `raw` field of `TokenUsage`; when present we prefer\n * them over the OpenAI-style `cached_tokens` for cache-read attribution.\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport { makeHttpError } from \"../../../../base/io/http-error.js\";\nimport { parseSSEStream } from \"../../../../base/io/sse.js\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n\tToolDefinition,\n} from \"../core/types.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type OpenAICompatPreset = \"openai\" | \"openrouter\" | \"groq\" | \"ollama\" | \"deepseek\" | \"xai\";\n\nconst PRESETS: Record<\n\tOpenAICompatPreset,\n\t{ baseURL: string; apiKeyEnv?: string; provider: string }\n> = {\n\topenai: { baseURL: \"https://api.openai.com/v1\", apiKeyEnv: \"OPENAI_API_KEY\", provider: \"openai\" },\n\topenrouter: {\n\t\tbaseURL: \"https://openrouter.ai/api/v1\",\n\t\tapiKeyEnv: \"OPENROUTER_API_KEY\",\n\t\tprovider: \"openrouter\",\n\t},\n\tgroq: { baseURL: \"https://api.groq.com/openai/v1\", apiKeyEnv: \"GROQ_API_KEY\", provider: \"groq\" },\n\tollama: { baseURL: \"http://localhost:11434/v1\", provider: \"ollama\" },\n\tdeepseek: {\n\t\tbaseURL: \"https://api.deepseek.com/v1\",\n\t\tapiKeyEnv: \"DEEPSEEK_API_KEY\",\n\t\tprovider: \"deepseek\",\n\t},\n\txai: { baseURL: \"https://api.x.ai/v1\", apiKeyEnv: \"XAI_API_KEY\", provider: \"xai\" },\n};\n\nexport interface OpenAICompatAdapterOptions {\n\tpreset?: OpenAICompatPreset;\n\t/** Explicit provider label (defaults to preset's provider). */\n\tprovider?: string;\n\t/** API key. Falls back to the preset's default env var on Node. */\n\tapiKey?: string;\n\tmodel?: string;\n\t/** Override base URL (wins over `preset`). */\n\tbaseURL?: string;\n\t/** Extra request headers. */\n\theaders?: Record<string, string>;\n\t/** Extra request-body fields merged on every request (OpenRouter routing etc.). */\n\tbodyExtras?: Record<string, unknown>;\n\t/** User-provided SDK instance (OpenAI-family shape). */\n\tsdk?: OpenAISdkLike;\n\t/** Custom fetch (for tests). */\n\tfetchImpl?: typeof fetch;\n}\n\nexport interface OpenAISdkLike {\n\tchat: {\n\t\tcompletions: {\n\t\t\tcreate(\n\t\t\t\tparams: Record<string, unknown>,\n\t\t\t\topts?: { signal?: AbortSignal },\n\t\t\t): Promise<OpenAIChatResponse>;\n\t\t};\n\t};\n}\n\ninterface OpenAIChatResponse {\n\tid: string;\n\tchoices: ReadonlyArray<{\n\t\tmessage: {\n\t\t\trole: string;\n\t\t\tcontent?: string | null;\n\t\t\ttool_calls?: ReadonlyArray<{\n\t\t\t\tid: string;\n\t\t\t\ttype: \"function\";\n\t\t\t\tfunction: { name: string; arguments: string };\n\t\t\t}>;\n\t\t\treasoning_content?: string;\n\t\t};\n\t\tfinish_reason?: string;\n\t}>;\n\tusage?: OpenAIUsage;\n\tmodel?: string;\n}\n\ninterface OpenAIUsage {\n\tprompt_tokens?: number;\n\tcompletion_tokens?: number;\n\ttotal_tokens?: number;\n\tprompt_tokens_details?: {\n\t\tcached_tokens?: number;\n\t\taudio_tokens?: number;\n\t};\n\tcompletion_tokens_details?: {\n\t\treasoning_tokens?: number;\n\t\taudio_tokens?: number;\n\t\taccepted_prediction_tokens?: number;\n\t\trejected_prediction_tokens?: number;\n\t};\n\t// DeepSeek\n\tprompt_cache_hit_tokens?: number;\n\tprompt_cache_miss_tokens?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function openAICompatAdapter(opts: OpenAICompatAdapterOptions = {}): LLMAdapter {\n\tif (opts.sdk) return sdkBackedOpenAI(opts);\n\treturn fetchBackedOpenAI(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Mapping\n// ---------------------------------------------------------------------------\n\nfunction toOpenAIRequest(\n\tmessages: readonly ChatMessage[],\n\tinvokeOpts: LLMInvokeOptions | undefined,\n\tdefaultModel: string | undefined,\n\tstream: boolean,\n\tbodyExtras: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n\tconst model = invokeOpts?.model ?? defaultModel;\n\tif (!model)\n\t\tthrow new Error(\"openAICompatAdapter: model must be set via options.model or invokeOpts.model\");\n\tconst mapped = messages.map(toOpenAIMessage);\n\tif (invokeOpts?.systemPrompt && !messages.some((m) => m.role === \"system\")) {\n\t\tmapped.unshift({ role: \"system\", content: invokeOpts.systemPrompt });\n\t}\n\tconst body: Record<string, unknown> = { model, messages: mapped };\n\tif (invokeOpts?.maxTokens != null) body.max_tokens = invokeOpts.maxTokens;\n\tif (invokeOpts?.temperature != null) body.temperature = invokeOpts.temperature;\n\tif (invokeOpts?.tools && invokeOpts.tools.length > 0) {\n\t\tbody.tools = invokeOpts.tools.map(toOpenAITool);\n\t}\n\tif (invokeOpts?.maxReasoningTokens != null) {\n\t\tbody.reasoning = { max_tokens: invokeOpts.maxReasoningTokens };\n\t}\n\tif (stream) {\n\t\tbody.stream = true;\n\t\tbody.stream_options = { include_usage: true };\n\t}\n\tif (bodyExtras) Object.assign(body, bodyExtras);\n\tif (invokeOpts?.providerExtras) Object.assign(body, invokeOpts.providerExtras);\n\treturn body;\n}\n\nfunction toOpenAIMessage(m: ChatMessage): Record<string, unknown> {\n\tif (m.role === \"tool\") {\n\t\treturn { role: \"tool\", tool_call_id: m.toolCallId, content: m.content };\n\t}\n\tif (m.role === \"assistant\" && m.toolCalls && m.toolCalls.length > 0) {\n\t\treturn {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: m.content || null,\n\t\t\ttool_calls: m.toolCalls.map((tc) => ({\n\t\t\t\tid: tc.id,\n\t\t\t\ttype: \"function\",\n\t\t\t\tfunction: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n\t\t\t})),\n\t\t};\n\t}\n\treturn { role: m.role, content: m.content };\n}\n\nfunction toOpenAITool(t: ToolDefinition): Record<string, unknown> {\n\treturn {\n\t\ttype: \"function\",\n\t\tfunction: {\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.parameters,\n\t\t},\n\t};\n}\n\nfunction mapUsage(u: OpenAIUsage | undefined): TokenUsage {\n\tconst usage: TokenUsage = {\n\t\tinput: { regular: 0 },\n\t\toutput: { regular: 0 },\n\t\traw: u,\n\t};\n\tif (!u) return usage;\n\tconst inputTotal = u.prompt_tokens ?? 0;\n\tlet cacheRead = u.prompt_tokens_details?.cached_tokens ?? 0;\n\tif (u.prompt_cache_hit_tokens != null) {\n\t\t// DeepSeek: prefer explicit hit/miss split when present\n\t\tcacheRead = u.prompt_cache_hit_tokens;\n\t\tusage.input.regular = u.prompt_cache_miss_tokens ?? Math.max(0, inputTotal - cacheRead);\n\t} else {\n\t\tusage.input.regular = Math.max(0, inputTotal - cacheRead);\n\t}\n\tif (cacheRead > 0) usage.input.cacheRead = cacheRead;\n\tif (u.prompt_tokens_details?.audio_tokens)\n\t\tusage.input.audio = u.prompt_tokens_details.audio_tokens;\n\n\tconst outputTotal = u.completion_tokens ?? 0;\n\tconst reasoning = u.completion_tokens_details?.reasoning_tokens ?? 0;\n\tusage.output.regular = Math.max(0, outputTotal - reasoning);\n\tif (reasoning > 0) usage.output.reasoning = reasoning;\n\tif (u.completion_tokens_details?.audio_tokens)\n\t\tusage.output.audio = u.completion_tokens_details.audio_tokens;\n\tif (u.completion_tokens_details?.accepted_prediction_tokens) {\n\t\tusage.output.predictionAccepted = u.completion_tokens_details.accepted_prediction_tokens;\n\t}\n\tif (u.completion_tokens_details?.rejected_prediction_tokens) {\n\t\tusage.output.predictionRejected = u.completion_tokens_details.rejected_prediction_tokens;\n\t}\n\treturn usage;\n}\n\nfunction toLLMResponse(json: OpenAIChatResponse, latencyMs: number, provider: string): LLMResponse {\n\tconst choice = json.choices[0];\n\tconst msg = choice?.message;\n\tconst content = msg?.content ?? \"\";\n\tconst toolCalls = (msg?.tool_calls ?? []).map((tc) => ({\n\t\tid: tc.id,\n\t\tname: tc.function.name,\n\t\targuments: safeJsonParse(tc.function.arguments),\n\t}));\n\treturn {\n\t\tcontent,\n\t\ttoolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n\t\tusage: mapUsage(json.usage),\n\t\tfinishReason: choice?.finish_reason,\n\t\tlatencyMs,\n\t\tmodel: json.model,\n\t\tprovider,\n\t};\n}\n\nfunction safeJsonParse(s: string): Record<string, unknown> {\n\ttry {\n\t\tconst parsed = JSON.parse(s);\n\t\treturn typeof parsed === \"object\" && parsed != null\n\t\t\t? (parsed as Record<string, unknown>)\n\t\t\t: { _raw: s };\n\t} catch {\n\t\treturn { _raw: s };\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Fetch-backed\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(opts: OpenAICompatAdapterOptions): {\n\tprovider: string;\n\tbaseURL: string;\n\tapiKey: string | undefined;\n} {\n\tconst preset = opts.preset ?? \"openai\";\n\tconst base = PRESETS[preset];\n\tconst baseURL = opts.baseURL ?? base.baseURL;\n\tconst provider = opts.provider ?? base.provider;\n\tconst envKey = base.apiKeyEnv;\n\tconst apiKey =\n\t\topts.apiKey ??\n\t\t(envKey\n\t\t\t? (globalThis as { process?: { env?: Record<string, string> } }).process?.env?.[envKey]\n\t\t\t: undefined);\n\treturn { provider, baseURL, apiKey };\n}\n\nfunction fetchBackedOpenAI(opts: OpenAICompatAdapterOptions): LLMAdapter {\n\tconst { provider, baseURL, apiKey } = resolveConfig(opts);\n\tconst fetchImpl = opts.fetchImpl ?? fetch;\n\tconst needsKey = provider !== \"ollama\"; // Ollama local default: no key required.\n\n\tconst commonHeaders = (): Record<string, string> => {\n\t\tconst h: Record<string, string> = {\n\t\t\t\"content-type\": \"application/json\",\n\t\t\t...(opts.headers ?? {}),\n\t\t};\n\t\tif (needsKey) {\n\t\t\tif (!apiKey)\n\t\t\t\tthrow new Error(`openAICompatAdapter[${provider}]: apiKey required for invoke/stream`);\n\t\t\th.authorization = `Bearer ${apiKey}`;\n\t\t}\n\t\treturn h;\n\t};\n\n\treturn {\n\t\tprovider,\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst body = toOpenAIRequest(messages, invokeOpts, opts.model, false, opts.bodyExtras);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await fetchImpl(`${baseURL}/chat/completions`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: commonHeaders(),\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, provider);\n\t\t\tconst json = (await resp.json()) as OpenAIChatResponse;\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(json, latencyMs, provider);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst body = toOpenAIRequest(messages, invokeOpts, opts.model, true, opts.bodyExtras);\n\t\t\tconst resp = await fetchImpl(`${baseURL}/chat/completions`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { ...commonHeaders(), accept: \"text/event-stream\" },\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t});\n\t\t\tif (!resp.ok) throw await makeHttpError(resp, provider);\n\t\t\tif (!resp.body)\n\t\t\t\tthrow new Error(`openAICompatAdapter[${provider}]: streaming response has no body`);\n\n\t\t\tlet finalUsage: OpenAIUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\n\t\t\tfor await (const event of parseSSEStream(resp.body, { signal: invokeOpts?.signal })) {\n\t\t\t\tif (!event.data || event.data === \"[DONE]\") continue;\n\t\t\t\tlet parsed: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(event.data) as Record<string, unknown>;\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Streaming shape: choices[0].delta.{content?, tool_calls?, reasoning_content?}\n\t\t\t\tconst choices = parsed.choices as\n\t\t\t\t\t| ReadonlyArray<{\n\t\t\t\t\t\t\tdelta?: {\n\t\t\t\t\t\t\t\tcontent?: string;\n\t\t\t\t\t\t\t\ttool_calls?: ReadonlyArray<{\n\t\t\t\t\t\t\t\t\tindex: number;\n\t\t\t\t\t\t\t\t\tid?: string;\n\t\t\t\t\t\t\t\t\tfunction?: { name?: string; arguments?: string };\n\t\t\t\t\t\t\t\t}>;\n\t\t\t\t\t\t\t\treasoning_content?: string;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tfinish_reason?: string;\n\t\t\t\t\t }>\n\t\t\t\t\t| undefined;\n\t\t\t\tif (choices) {\n\t\t\t\t\tconst c = choices[0];\n\t\t\t\t\tif (c?.delta?.content) yield { type: \"token\", delta: c.delta.content };\n\t\t\t\t\tif (c?.delta?.reasoning_content) {\n\t\t\t\t\t\tyield { type: \"thinking\", delta: c.delta.reasoning_content };\n\t\t\t\t\t}\n\t\t\t\t\tif (c?.delta?.tool_calls) {\n\t\t\t\t\t\tfor (const tc of c.delta.tool_calls) {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\t\tid: tc.id,\n\t\t\t\t\t\t\t\t\tname: tc.function?.name,\n\t\t\t\t\t\t\t\t\targumentsDelta: tc.function?.arguments,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (c?.finish_reason) finishReason = c.finish_reason;\n\t\t\t\t}\n\t\t\t\t// Yield every usage delta the provider emits (Anthropic, Groq, and\n\t\t\t\t// some OpenAI-compat providers can emit mid-stream usage). Downstream\n\t\t\t\t// consumers treat the most-recent delta as authoritative. See D5b in\n\t\t\t\t// adapter QA session.\n\t\t\t\tif (parsed.usage) {\n\t\t\t\t\tfinalUsage = parsed.usage as OpenAIUsage;\n\t\t\t\t\tyield { type: \"usage\", usage: mapUsage(finalUsage) };\n\t\t\t\t}\n\t\t\t}\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n\nfunction sdkBackedOpenAI(opts: OpenAICompatAdapterOptions): LLMAdapter {\n\tconst sdk = opts.sdk;\n\tif (!sdk) throw new Error(\"sdkBackedOpenAI: sdk instance required\");\n\tconst { provider } = resolveConfig(opts);\n\treturn {\n\t\tprovider,\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst body = toOpenAIRequest(messages, invokeOpts, opts.model, false, opts.bodyExtras);\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await sdk.chat.completions.create(body, { signal: invokeOpts?.signal });\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\treturn toLLMResponse(resp, latencyMs, provider);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst body = toOpenAIRequest(messages, invokeOpts, opts.model, true, opts.bodyExtras);\n\t\t\tconst stream = (await sdk.chat.completions.create(body, {\n\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t})) as unknown as AsyncIterable<Record<string, unknown>>;\n\t\t\tlet finalUsage: OpenAIUsage | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\tfor await (const chunk of stream) {\n\t\t\t\tconst choices = (\n\t\t\t\t\tchunk as {\n\t\t\t\t\t\tchoices?: ReadonlyArray<{\n\t\t\t\t\t\t\tdelta?: {\n\t\t\t\t\t\t\t\tcontent?: string;\n\t\t\t\t\t\t\t\ttool_calls?: ReadonlyArray<{\n\t\t\t\t\t\t\t\t\tid?: string;\n\t\t\t\t\t\t\t\t\tfunction?: { name?: string; arguments?: string };\n\t\t\t\t\t\t\t\t}>;\n\t\t\t\t\t\t\t\treasoning_content?: string;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tfinish_reason?: string;\n\t\t\t\t\t\t}>;\n\t\t\t\t\t}\n\t\t\t\t).choices;\n\t\t\t\tif (choices) {\n\t\t\t\t\tconst c = choices[0];\n\t\t\t\t\tif (c?.delta?.content) yield { type: \"token\", delta: c.delta.content };\n\t\t\t\t\tif (c?.delta?.reasoning_content)\n\t\t\t\t\t\tyield { type: \"thinking\", delta: c.delta.reasoning_content };\n\t\t\t\t\tif (c?.delta?.tool_calls) {\n\t\t\t\t\t\tfor (const tc of c.delta.tool_calls) {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"tool-call-delta\",\n\t\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\t\tid: tc.id,\n\t\t\t\t\t\t\t\t\tname: tc.function?.name,\n\t\t\t\t\t\t\t\t\targumentsDelta: tc.function?.arguments,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (c?.finish_reason) finishReason = c.finish_reason;\n\t\t\t\t}\n\t\t\t\tconst u = (chunk as { usage?: OpenAIUsage }).usage;\n\t\t\t\tif (u) {\n\t\t\t\t\tfinalUsage = u;\n\t\t\t\t\tyield { type: \"usage\", usage: mapUsage(u) };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!finalUsage) {\n\t\t\t\t// No usage emitted — yield nothing; downstream consumers default\n\t\t\t\t// to empty usage via their own fallback.\n\t\t\t}\n\t\t\tyield { type: \"finish\", reason: finishReason ?? \"stop\" };\n\t\t},\n\t};\n}\n","/**\n * `createAdapter` — provider-dispatching factory.\n *\n * One entry point, one config object. Picks the right concrete adapter by\n * `provider`, forwards everything else. Users who want finer control import\n * the concrete adapter directly (`anthropicAdapter`, `openAICompatAdapter`,\n * `googleAdapter`, `dryRunAdapter`, `webllmAdapter`, `chromeNanoAdapter`).\n */\n\nimport { type AnthropicAdapterOptions, anthropicAdapter } from \"../providers/anthropic.js\";\nimport { type DryRunAdapterOptions, dryRunAdapter } from \"../providers/dry-run.js\";\nimport { type FallbackAdapterOptions, fallbackAdapter } from \"../providers/fallback.js\";\nimport { type GoogleAdapterOptions, googleAdapter } from \"../providers/google.js\";\nimport {\n\ttype OpenAICompatAdapterOptions,\n\ttype OpenAICompatPreset,\n\topenAICompatAdapter,\n} from \"../providers/openai-compat.js\";\nimport type { LLMAdapter } from \"./types.js\";\n\nexport type AdapterProvider =\n\t| \"anthropic\"\n\t| OpenAICompatPreset // \"openai\" | \"openrouter\" | \"groq\" | \"ollama\" | \"deepseek\" | \"xai\"\n\t| \"google\"\n\t| \"dry-run\"\n\t| \"fallback\";\n\nexport interface CreateAdapterOptions {\n\tprovider: AdapterProvider;\n\tapiKey?: string;\n\tmodel?: string;\n\tbaseURL?: string;\n\theaders?: Record<string, string>;\n\t/** OpenAI-compat bodyExtras (OpenRouter routing, etc.). */\n\tbodyExtras?: Record<string, unknown>;\n\t/** Provider-specific SDK instance (any of AnthropicSdkLike / OpenAISdkLike / GoogleSdkLike). */\n\tsdk?: unknown;\n\t/** Custom fetch (for tests). */\n\tfetchImpl?: typeof fetch;\n\t/** Extra per-provider options forwarded verbatim. */\n\textras?: Record<string, unknown>;\n}\n\nexport function createAdapter(opts: CreateAdapterOptions): LLMAdapter {\n\tswitch (opts.provider) {\n\t\tcase \"anthropic\": {\n\t\t\tconst a: AnthropicAdapterOptions = {\n\t\t\t\tapiKey: opts.apiKey,\n\t\t\t\tmodel: opts.model,\n\t\t\t\tbaseURL: opts.baseURL,\n\t\t\t\theaders: opts.headers,\n\t\t\t\tsdk: opts.sdk as AnthropicAdapterOptions[\"sdk\"],\n\t\t\t\tfetchImpl: opts.fetchImpl,\n\t\t\t\t...(opts.extras as AnthropicAdapterOptions | undefined),\n\t\t\t};\n\t\t\treturn anthropicAdapter(a);\n\t\t}\n\t\tcase \"google\": {\n\t\t\tconst g: GoogleAdapterOptions = {\n\t\t\t\tapiKey: opts.apiKey,\n\t\t\t\tmodel: opts.model,\n\t\t\t\tbaseURL: opts.baseURL,\n\t\t\t\theaders: opts.headers,\n\t\t\t\tsdk: opts.sdk as GoogleAdapterOptions[\"sdk\"],\n\t\t\t\tfetchImpl: opts.fetchImpl,\n\t\t\t\t...(opts.extras as GoogleAdapterOptions | undefined),\n\t\t\t};\n\t\t\treturn googleAdapter(g);\n\t\t}\n\t\tcase \"dry-run\": {\n\t\t\tconst d: DryRunAdapterOptions = {\n\t\t\t\tmodel: opts.model,\n\t\t\t\t...(opts.extras as DryRunAdapterOptions | undefined),\n\t\t\t};\n\t\t\treturn dryRunAdapter(d);\n\t\t}\n\t\tcase \"fallback\": {\n\t\t\t// `provider`/`model` threaded as labels; `fixtures`/`record`/etc.\n\t\t\t// must come through `extras` since `CreateAdapterOptions` doesn't\n\t\t\t// have dedicated slots for them.\n\t\t\tconst f: FallbackAdapterOptions = {\n\t\t\t\tprovider: opts.provider,\n\t\t\t\tmodel: opts.model,\n\t\t\t\t...(opts.extras as FallbackAdapterOptions | undefined),\n\t\t\t};\n\t\t\treturn fallbackAdapter(f);\n\t\t}\n\t\t// OpenAI-compat presets\n\t\tcase \"openai\":\n\t\tcase \"openrouter\":\n\t\tcase \"groq\":\n\t\tcase \"ollama\":\n\t\tcase \"deepseek\":\n\t\tcase \"xai\": {\n\t\t\tconst c: OpenAICompatAdapterOptions = {\n\t\t\t\tpreset: opts.provider,\n\t\t\t\tapiKey: opts.apiKey,\n\t\t\t\tmodel: opts.model,\n\t\t\t\tbaseURL: opts.baseURL,\n\t\t\t\theaders: opts.headers,\n\t\t\t\tbodyExtras: opts.bodyExtras,\n\t\t\t\tsdk: opts.sdk as OpenAICompatAdapterOptions[\"sdk\"],\n\t\t\t\tfetchImpl: opts.fetchImpl,\n\t\t\t\t...(opts.extras as OpenAICompatAdapterOptions | undefined),\n\t\t\t};\n\t\t\treturn openAICompatAdapter(c);\n\t\t}\n\t\tdefault: {\n\t\t\tconst never: never = opts.provider;\n\t\t\tthrow new Error(`createAdapter: unknown provider: ${String(never)}`);\n\t\t}\n\t}\n}\n","/**\n * `cascadingLlmAdapter` — N-tier fallback over any mix of LLM adapters.\n *\n * Same structural pattern as `cascadingCache` and `Graph.attachSnapshotStorage`:\n * ordered list, first-success wins, per-tier breaker optional, filter gates\n * per request. Semantics:\n *\n * - `invoke()`: try tier 0 first. On error (or breaker-open), fall through\n * to tier 1, 2, ... until one succeeds or all fail.\n * - `stream()`: tries to start the stream on tier 0; once tokens begin, it\n * commits — failures in mid-stream surface rather than re-starting on the\n * next tier (would double-bill and confuse consumers). **State-machine\n * consumers (usage accounting, UI accumulators) must handle errors in a\n * catch block — no synthetic `{type: \"finish\"}` is emitted after a thrown\n * stream error.**\n * - `filter`: skips a tier for requests that use features it doesn't\n * support (e.g., Chrome Nano can't do tool use).\n * - `breaker`: per-tier circuit; when open, cascade treats the tier as\n * unavailable and moves on immediately.\n *\n * On exhaustion, throws `AllTiersExhaustedError` with separate `skipped` and\n * `failed` collections so consumers can distinguish \"no tier applicable\"\n * from \"all tiers failed\".\n */\n\nimport { fromAny } from \"@graphrefly/pure-ts/extra\";\nimport { firstValueFrom } from \"../../../../base/sources/settled.js\";\nimport {\n\ttype CircuitBreaker,\n\ttype CircuitBreakerOptions,\n\tcircuitBreaker,\n} from \"../../../../utils/resilience/index.js\";\nimport { withLayer } from \"../_internal/wrappers.js\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n} from \"../core/types.js\";\n\nexport interface AdapterTier {\n\tname: string;\n\tadapter: LLMAdapter;\n\t/** Per-tier circuit breaker. If omitted, no breaker on this tier. */\n\tbreaker?: CircuitBreakerOptions | CircuitBreaker;\n\t/** Skip this tier when the request doesn't fit (e.g. Chrome Nano + tools). */\n\tfilter?: (messages: readonly ChatMessage[], opts?: LLMInvokeOptions) => boolean;\n}\n\nexport interface CascadeExhaustionReport {\n\t/** Tiers that never ran (filter returned false, or breaker was open). */\n\treadonly skipped: ReadonlyArray<{ name: string; reason: \"filter\" | \"breaker\" }>;\n\t/** Tiers that ran and threw. */\n\treadonly failed: ReadonlyMap<string, unknown>;\n}\n\nexport interface CascadingLlmAdapterOptions {\n\tonFallback?: (from: string, to: string, error: unknown) => void;\n\tonExhausted?: (report: CascadeExhaustionReport) => void;\n\t/** Whether to attempt stream retry on subsequent tiers before first chunk. Default true. */\n\tstreamRetryBeforeFirstChunk?: boolean;\n}\n\ninterface ResolvedTier {\n\tname: string;\n\tadapter: LLMAdapter;\n\tbreaker?: CircuitBreaker;\n\tfilter?: (messages: readonly ChatMessage[], opts?: LLMInvokeOptions) => boolean;\n}\n\nexport class AllTiersExhaustedError extends Error {\n\toverride name = \"AllTiersExhaustedError\";\n\treadonly skipped: ReadonlyArray<{ name: string; reason: \"filter\" | \"breaker\" }>;\n\treadonly failed: ReadonlyMap<string, unknown>;\n\tconstructor(report: CascadeExhaustionReport) {\n\t\tconst parts: string[] = [];\n\t\tif (report.failed.size > 0) parts.push(`failed=[${[...report.failed.keys()].join(\",\")}]`);\n\t\tif (report.skipped.length > 0) {\n\t\t\tparts.push(`skipped=[${report.skipped.map((s) => `${s.name}(${s.reason})`).join(\",\")}]`);\n\t\t}\n\t\tsuper(`All LLM adapter tiers exhausted: ${parts.join(\" \")}`);\n\t\tthis.skipped = report.skipped;\n\t\tthis.failed = report.failed;\n\t}\n}\n\nexport function cascadingLlmAdapter(\n\ttiers: readonly AdapterTier[],\n\topts: CascadingLlmAdapterOptions = {},\n): LLMAdapter {\n\tif (tiers.length === 0) throw new RangeError(\"cascadingLlmAdapter: tiers must be non-empty\");\n\n\tconst resolved: ResolvedTier[] = tiers.map((t) => ({\n\t\tname: t.name,\n\t\tadapter: t.adapter,\n\t\tfilter: t.filter,\n\t\tbreaker: t.breaker\n\t\t\t? \"canExecute\" in t.breaker\n\t\t\t\t? (t.breaker as CircuitBreaker)\n\t\t\t\t: circuitBreaker(t.breaker as CircuitBreakerOptions)\n\t\t\t: undefined,\n\t}));\n\n\tconst streamRetryBeforeFirstChunk = opts.streamRetryBeforeFirstChunk ?? true;\n\n\tconst cascade: LLMAdapter = {\n\t\tprovider: \"cascading\",\n\t\tmodel: undefined,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst skipped: Array<{ name: string; reason: \"filter\" | \"breaker\" }> = [];\n\t\t\tconst failed = new Map<string, unknown>();\n\t\t\tfor (let i = 0; i < resolved.length; i++) {\n\t\t\t\tconst t = resolved[i];\n\t\t\t\tif (t.filter && !t.filter(messages, invokeOpts)) {\n\t\t\t\t\tskipped.push({ name: t.name, reason: \"filter\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (t.breaker && !t.breaker.canExecute()) {\n\t\t\t\t\tskipped.push({ name: t.name, reason: \"breaker\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst resp = await firstValueFrom(fromAny(t.adapter.invoke(messages, invokeOpts)));\n\t\t\t\t\tt.breaker?.recordSuccess();\n\t\t\t\t\treturn { ...resp, metadata: { ...(resp.metadata ?? {}), tier: t.name } };\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfailed.set(t.name, err);\n\t\t\t\t\tt.breaker?.recordFailure(err);\n\t\t\t\t\tconst next = resolved[i + 1];\n\t\t\t\t\tif (next) opts.onFallback?.(t.name, next.name, err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst report: CascadeExhaustionReport = { skipped, failed };\n\t\t\topts.onExhausted?.(report);\n\t\t\tthrow new AllTiersExhaustedError(report);\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst skipped: Array<{ name: string; reason: \"filter\" | \"breaker\" }> = [];\n\t\t\tconst failed = new Map<string, unknown>();\n\t\t\tfor (let i = 0; i < resolved.length; i++) {\n\t\t\t\tconst t = resolved[i];\n\t\t\t\tif (t.filter && !t.filter(messages, invokeOpts)) {\n\t\t\t\t\tskipped.push({ name: t.name, reason: \"filter\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (t.breaker && !t.breaker.canExecute()) {\n\t\t\t\t\tskipped.push({ name: t.name, reason: \"breaker\" });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet yieldedAny = false;\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const delta of t.adapter.stream(messages, invokeOpts)) {\n\t\t\t\t\t\tyieldedAny = true;\n\t\t\t\t\t\tyield delta;\n\t\t\t\t\t}\n\t\t\t\t\tt.breaker?.recordSuccess();\n\t\t\t\t\treturn;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfailed.set(t.name, err);\n\t\t\t\t\tt.breaker?.recordFailure(err);\n\t\t\t\t\tif (yieldedAny || !streamRetryBeforeFirstChunk) {\n\t\t\t\t\t\t// Past first chunk — stream commitment. Propagate immediately.\n\t\t\t\t\t\t// Consumers handle the thrown error in their catch; no synthetic\n\t\t\t\t\t\t// finish delta is emitted (see JSDoc at top of file). We do NOT\n\t\t\t\t\t\t// call `onExhausted` here because other tiers were never tried —\n\t\t\t\t\t\t// the error is a single-tier commitment failure, not a\n\t\t\t\t\t\t// \"no-tier-worked\" condition.\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t\tconst next = resolved[i + 1];\n\t\t\t\t\tif (next) opts.onFallback?.(t.name, next.name, err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst report: CascadeExhaustionReport = { skipped, failed };\n\t\t\topts.onExhausted?.(report);\n\t\t\tthrow new AllTiersExhaustedError(report);\n\t\t},\n\t};\n\twithLayer(cascade, `cascade[${resolved.map((t) => t.name).join(\",\")}]`);\n\treturn cascade;\n}\n\n/**\n * Tiny type-safe constructor for an {@link AdapterTier}. Cleans up the\n * heterogeneous array-type cast users (and `browser-presets.ts`) had to write\n * by hand. Per Wave A Unit 13 decision.\n *\n * @example\n * ```ts\n * cascadingLlmAdapter([\n * tier(\"local\", webllmAdapter(...)),\n * tier(\"cloud\", anthropicAdapter(...), { breaker: { failureThreshold: 5 } }),\n * ]);\n * ```\n *\n * @category ai\n */\nexport function tier(\n\tname: string,\n\tadapter: LLMAdapter,\n\topts?: { breaker?: CircuitBreakerOptions | CircuitBreaker; filter?: AdapterTier[\"filter\"] },\n): AdapterTier {\n\tconst out: AdapterTier = { name, adapter };\n\tif (opts?.breaker) out.breaker = opts.breaker;\n\tif (opts?.filter) out.filter = opts.filter;\n\treturn out;\n}\n"],"mappings":"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","names":["monotonicNs","mapUsage","toLLMResponse","monotonicNs","monotonicNs","mapUsage","toLLMResponse","monotonicNs"]}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compileSpec,
|
|
3
|
+
validateSpec,
|
|
4
|
+
validateSpecAgainstCatalog
|
|
5
|
+
} from "./chunk-2OB3CEJS.js";
|
|
6
|
+
|
|
7
|
+
// src/utils/surface/errors.ts
|
|
8
|
+
var SurfaceError = class extends Error {
|
|
9
|
+
code;
|
|
10
|
+
details;
|
|
11
|
+
constructor(code, message, details) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "SurfaceError";
|
|
14
|
+
this.code = code;
|
|
15
|
+
if (details !== void 0) this.details = details;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* JSON-safe payload for wire serialization. Defensively validates
|
|
19
|
+
* `details` — if it can't be round-tripped through `JSON.stringify`
|
|
20
|
+
* (cyclic refs, `BigInt`, `Error` instance not pre-toJSON'd), the
|
|
21
|
+
* payload falls back to `{code, message}` only rather than crashing
|
|
22
|
+
* the MCP/CLI wrapper when it serializes this error onto the wire.
|
|
23
|
+
*/
|
|
24
|
+
toJSON() {
|
|
25
|
+
const out = { code: this.code, message: this.message };
|
|
26
|
+
if (this.details !== void 0) {
|
|
27
|
+
const safe = safeDetails(this.details);
|
|
28
|
+
if (safe !== void 0) out.details = safe;
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
function safeDetails(details) {
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(JSON.stringify(details));
|
|
36
|
+
} catch {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function asSurfaceError(err, fallbackCode = "internal-error") {
|
|
41
|
+
if (err instanceof SurfaceError) return err;
|
|
42
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
43
|
+
return new SurfaceError(fallbackCode, message);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/utils/surface/create.ts
|
|
47
|
+
function createGraph(spec, opts) {
|
|
48
|
+
const structural = validateSpec(spec);
|
|
49
|
+
if (!structural.valid) {
|
|
50
|
+
throw new SurfaceError(
|
|
51
|
+
"invalid-spec",
|
|
52
|
+
`GraphSpec validation failed:
|
|
53
|
+
${structural.errors.join("\n")}`,
|
|
54
|
+
{ errors: structural.errors }
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const catalog = opts?.catalog ?? {};
|
|
58
|
+
const catalogValidation = validateSpecAgainstCatalog(spec, catalog);
|
|
59
|
+
if (!catalogValidation.valid) {
|
|
60
|
+
throw new SurfaceError(
|
|
61
|
+
"catalog-error",
|
|
62
|
+
`Catalog validation failed:
|
|
63
|
+
${catalogValidation.errors.join("\n")}`,
|
|
64
|
+
{ errors: catalogValidation.errors }
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
return compileSpec(spec, opts);
|
|
69
|
+
} catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
throw new SurfaceError("catalog-error", message);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/utils/surface/reduce.ts
|
|
76
|
+
import { COMPLETE, DATA, ERROR, RESOLVED } from "@graphrefly/pure-ts/core";
|
|
77
|
+
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
78
|
+
async function runReduction(spec, input, opts) {
|
|
79
|
+
const inputPath = opts?.inputPath ?? "input";
|
|
80
|
+
const outputPath = opts?.outputPath ?? "output";
|
|
81
|
+
const timeoutMs = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
82
|
+
const graph = createGraph(spec, { catalog: opts?.catalog });
|
|
83
|
+
let outputNode;
|
|
84
|
+
try {
|
|
85
|
+
outputNode = graph.resolve(outputPath);
|
|
86
|
+
} catch {
|
|
87
|
+
graph.destroy();
|
|
88
|
+
throw new SurfaceError(
|
|
89
|
+
"node-not-found",
|
|
90
|
+
`reduce: output path "${outputPath}" is not registered`,
|
|
91
|
+
{ path: outputPath }
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
graph.resolve(inputPath);
|
|
96
|
+
} catch {
|
|
97
|
+
graph.destroy();
|
|
98
|
+
throw new SurfaceError(
|
|
99
|
+
"node-not-found",
|
|
100
|
+
`reduce: input path "${inputPath}" is not registered`,
|
|
101
|
+
{ path: inputPath }
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
return await new Promise((resolve, reject) => {
|
|
106
|
+
let primed = false;
|
|
107
|
+
let settled = false;
|
|
108
|
+
let timer;
|
|
109
|
+
let unsub;
|
|
110
|
+
let shouldUnsub = false;
|
|
111
|
+
const finish = (action) => {
|
|
112
|
+
if (settled) return;
|
|
113
|
+
settled = true;
|
|
114
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
115
|
+
if (unsub !== void 0) {
|
|
116
|
+
unsub();
|
|
117
|
+
unsub = void 0;
|
|
118
|
+
} else {
|
|
119
|
+
shouldUnsub = true;
|
|
120
|
+
}
|
|
121
|
+
action();
|
|
122
|
+
};
|
|
123
|
+
unsub = outputNode.subscribe((msgs) => {
|
|
124
|
+
for (const m of msgs) {
|
|
125
|
+
if (settled) return;
|
|
126
|
+
if (!primed) continue;
|
|
127
|
+
if (m[0] === DATA) {
|
|
128
|
+
finish(() => resolve(m[1]));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (m[0] === RESOLVED) {
|
|
132
|
+
const cached = outputNode.cache;
|
|
133
|
+
finish(() => resolve(cached));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (m[0] === ERROR) {
|
|
137
|
+
const payload = m[1];
|
|
138
|
+
const message = payload instanceof Error ? payload.message : String(payload);
|
|
139
|
+
const cause = payload instanceof Error ? payload : void 0;
|
|
140
|
+
finish(
|
|
141
|
+
() => reject(
|
|
142
|
+
new SurfaceError(
|
|
143
|
+
"internal-error",
|
|
144
|
+
`reduce: output emitted ERROR: ${message}`,
|
|
145
|
+
cause != null ? { cause } : void 0
|
|
146
|
+
)
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (m[0] === COMPLETE) {
|
|
152
|
+
finish(
|
|
153
|
+
() => reject(
|
|
154
|
+
new SurfaceError(
|
|
155
|
+
"internal-error",
|
|
156
|
+
`reduce: output COMPLETEd without a post-push DATA`
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
if (shouldUnsub) {
|
|
165
|
+
unsub?.();
|
|
166
|
+
unsub = void 0;
|
|
167
|
+
}
|
|
168
|
+
primed = true;
|
|
169
|
+
try {
|
|
170
|
+
graph.set(inputPath, input);
|
|
171
|
+
} catch (err) {
|
|
172
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
173
|
+
const cause = err instanceof Error ? err : void 0;
|
|
174
|
+
finish(
|
|
175
|
+
() => reject(
|
|
176
|
+
new SurfaceError(
|
|
177
|
+
"internal-error",
|
|
178
|
+
`reduce: failed to set input on "${inputPath}": ${message}`,
|
|
179
|
+
cause != null ? { path: inputPath, cause } : { path: inputPath }
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (!settled && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
186
|
+
timer = setTimeout(() => {
|
|
187
|
+
finish(
|
|
188
|
+
() => reject(
|
|
189
|
+
new SurfaceError(
|
|
190
|
+
"reduce-timeout",
|
|
191
|
+
`reduce: no output emitted within ${timeoutMs}ms`,
|
|
192
|
+
{ timeoutMs, outputPath }
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
);
|
|
196
|
+
}, timeoutMs);
|
|
197
|
+
timer.unref?.();
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
} finally {
|
|
201
|
+
graph.destroy();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/utils/surface/snapshot.ts
|
|
206
|
+
import { wallClockNs } from "@graphrefly/pure-ts/core";
|
|
207
|
+
import { Graph, SNAPSHOT_VERSION } from "@graphrefly/pure-ts/graph";
|
|
208
|
+
var SNAPSHOT_WIRE_VERSION = SNAPSHOT_VERSION;
|
|
209
|
+
var SNAPSHOT_KEY_PREFIX = "snapshot:";
|
|
210
|
+
function assertExternalId(snapshotId) {
|
|
211
|
+
if (snapshotId.startsWith(SNAPSHOT_KEY_PREFIX)) {
|
|
212
|
+
throw new SurfaceError(
|
|
213
|
+
"snapshot-failed",
|
|
214
|
+
`snapshot id must not start with "${SNAPSHOT_KEY_PREFIX}" (reserved); got "${snapshotId}"`,
|
|
215
|
+
{ snapshotId }
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function encodeKey(snapshotId) {
|
|
220
|
+
return `${SNAPSHOT_KEY_PREFIX}${snapshotId}`;
|
|
221
|
+
}
|
|
222
|
+
function decodeKey(key) {
|
|
223
|
+
return key.startsWith(SNAPSHOT_KEY_PREFIX) ? key.slice(SNAPSHOT_KEY_PREFIX.length) : void 0;
|
|
224
|
+
}
|
|
225
|
+
function unwrapCheckpoint(raw, snapshotId) {
|
|
226
|
+
if (raw == null || typeof raw !== "object") {
|
|
227
|
+
throw new SurfaceError("snapshot-not-found", `snapshot "${snapshotId}" not found in tier`, {
|
|
228
|
+
snapshotId
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
const record = raw;
|
|
232
|
+
if ("mode" in record) {
|
|
233
|
+
if (record.mode === "full" && "snapshot" in record) {
|
|
234
|
+
return record.snapshot;
|
|
235
|
+
}
|
|
236
|
+
if (record.mode === "diff") {
|
|
237
|
+
throw new SurfaceError(
|
|
238
|
+
"restore-failed",
|
|
239
|
+
`snapshot "${snapshotId}" is a diff record (legacy/non-paired tier write); under the Phase 14.6 paired-tier shape snapshot tiers hold only baselines. For WAL replay use Graph.restoreSnapshot({ mode: "diff", source: { tier, walTier } }).`,
|
|
240
|
+
{ snapshotId, mode: "diff" }
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
throw new SurfaceError(
|
|
244
|
+
"restore-failed",
|
|
245
|
+
`snapshot "${snapshotId}" has unknown mode "${String(record.mode)}"`,
|
|
246
|
+
{ snapshotId, mode: String(record.mode) }
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
if ("nodes" in record && "edges" in record && "subgraphs" in record && "name" in record) {
|
|
250
|
+
return record;
|
|
251
|
+
}
|
|
252
|
+
throw new SurfaceError(
|
|
253
|
+
"restore-failed",
|
|
254
|
+
`snapshot "${snapshotId}" payload is not a GraphCheckpointRecord or GraphPersistSnapshot`,
|
|
255
|
+
{ snapshotId }
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
async function saveSnapshot(graph, snapshotId, tier) {
|
|
259
|
+
assertExternalId(snapshotId);
|
|
260
|
+
let snapshot;
|
|
261
|
+
try {
|
|
262
|
+
snapshot = graph.snapshot();
|
|
263
|
+
} catch (err) {
|
|
264
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
265
|
+
throw new SurfaceError(
|
|
266
|
+
"snapshot-failed",
|
|
267
|
+
`snapshot "${snapshotId}" serialization failed: ${message}`,
|
|
268
|
+
{ snapshotId }
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
const record = {
|
|
272
|
+
name: graph.name,
|
|
273
|
+
mode: "full",
|
|
274
|
+
seq: 0,
|
|
275
|
+
timestamp_ns: wallClockNs(),
|
|
276
|
+
format_version: SNAPSHOT_WIRE_VERSION,
|
|
277
|
+
snapshot
|
|
278
|
+
};
|
|
279
|
+
try {
|
|
280
|
+
await tier.save(encodeKey(snapshotId), record);
|
|
281
|
+
} catch (err) {
|
|
282
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
283
|
+
throw new SurfaceError("snapshot-failed", `snapshot "${snapshotId}" save failed: ${message}`, {
|
|
284
|
+
snapshotId
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return { snapshotId, timestamp_ns: record.timestamp_ns };
|
|
288
|
+
}
|
|
289
|
+
async function restoreSnapshot(snapshotId, tier, opts) {
|
|
290
|
+
assertExternalId(snapshotId);
|
|
291
|
+
const key = encodeKey(snapshotId);
|
|
292
|
+
let raw = await tier.load(key);
|
|
293
|
+
if (raw === void 0) {
|
|
294
|
+
raw = await tier.load(snapshotId);
|
|
295
|
+
}
|
|
296
|
+
const snapshot = unwrapCheckpoint(raw, snapshotId);
|
|
297
|
+
try {
|
|
298
|
+
return Graph.fromSnapshot(
|
|
299
|
+
snapshot,
|
|
300
|
+
opts?.factories ? { factories: opts.factories } : void 0
|
|
301
|
+
);
|
|
302
|
+
} catch (err) {
|
|
303
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
304
|
+
throw new SurfaceError(
|
|
305
|
+
"restore-failed",
|
|
306
|
+
`snapshot "${snapshotId}" restore failed: ${message}`,
|
|
307
|
+
{
|
|
308
|
+
snapshotId
|
|
309
|
+
}
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async function diffSnapshots(snapshotIdA, snapshotIdB, tier) {
|
|
314
|
+
assertExternalId(snapshotIdA);
|
|
315
|
+
assertExternalId(snapshotIdB);
|
|
316
|
+
const loadWithFallback = async (id) => {
|
|
317
|
+
const key = encodeKey(id);
|
|
318
|
+
let raw = await tier.load(key);
|
|
319
|
+
if (raw === void 0) raw = await tier.load(id);
|
|
320
|
+
return raw;
|
|
321
|
+
};
|
|
322
|
+
const [rawA, rawB] = await Promise.all([
|
|
323
|
+
loadWithFallback(snapshotIdA),
|
|
324
|
+
loadWithFallback(snapshotIdB)
|
|
325
|
+
]);
|
|
326
|
+
const snapshotA = unwrapCheckpoint(rawA, snapshotIdA);
|
|
327
|
+
const snapshotB = unwrapCheckpoint(rawB, snapshotIdB);
|
|
328
|
+
return Graph.diff(snapshotA, snapshotB);
|
|
329
|
+
}
|
|
330
|
+
async function listSnapshots(tier, opts) {
|
|
331
|
+
if (typeof tier.list !== "function") {
|
|
332
|
+
throw new SurfaceError(
|
|
333
|
+
"tier-no-list",
|
|
334
|
+
"KvStorageTier does not implement list(); wrap the tier with an enumerator or use a different backend"
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
const keys = await tier.list();
|
|
338
|
+
const result = [];
|
|
339
|
+
const includeUnprefixed = opts?.includeUnprefixed === true;
|
|
340
|
+
for (const k of keys) {
|
|
341
|
+
const decoded = decodeKey(k);
|
|
342
|
+
if (decoded !== void 0) result.push(decoded);
|
|
343
|
+
else if (includeUnprefixed) result.push(k);
|
|
344
|
+
}
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
async function deleteSnapshot(snapshotId, tier) {
|
|
348
|
+
assertExternalId(snapshotId);
|
|
349
|
+
if (typeof tier.delete !== "function") {
|
|
350
|
+
throw new SurfaceError(
|
|
351
|
+
"snapshot-failed",
|
|
352
|
+
`KvStorageTier is append-only (no delete()); cannot delete "${snapshotId}"`,
|
|
353
|
+
{ snapshotId }
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
await tier.delete(encodeKey(snapshotId));
|
|
358
|
+
} catch (err) {
|
|
359
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
360
|
+
throw new SurfaceError(
|
|
361
|
+
"snapshot-failed",
|
|
362
|
+
`snapshot "${snapshotId}" delete failed: ${message}`,
|
|
363
|
+
{
|
|
364
|
+
snapshotId
|
|
365
|
+
}
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export {
|
|
371
|
+
SurfaceError,
|
|
372
|
+
asSurfaceError,
|
|
373
|
+
createGraph,
|
|
374
|
+
runReduction,
|
|
375
|
+
SNAPSHOT_WIRE_VERSION,
|
|
376
|
+
saveSnapshot,
|
|
377
|
+
restoreSnapshot,
|
|
378
|
+
diffSnapshots,
|
|
379
|
+
listSnapshots,
|
|
380
|
+
deleteSnapshot
|
|
381
|
+
};
|
|
382
|
+
//# sourceMappingURL=chunk-4S53H2KR.js.map
|