@graphrefly/graphrefly 0.47.1 → 0.48.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/dist/base/composition/index.cjs +28 -19
- package/dist/base/composition/index.cjs.map +1 -1
- package/dist/base/composition/index.d.cts +14 -5
- package/dist/base/composition/index.d.ts +14 -5
- package/dist/base/composition/index.js +9 -9
- package/dist/base/index.cjs +294 -164
- package/dist/base/index.cjs.map +1 -1
- package/dist/base/index.d.cts +2 -2
- package/dist/base/index.d.ts +2 -2
- package/dist/base/index.js +77 -72
- package/dist/base/io/index.cjs +145 -85
- package/dist/base/io/index.cjs.map +1 -1
- package/dist/base/io/index.d.cts +32 -5
- package/dist/base/io/index.d.ts +32 -5
- package/dist/base/io/index.js +5 -5
- package/dist/base/mutation/index.cjs +21 -0
- package/dist/base/mutation/index.cjs.map +1 -1
- package/dist/base/mutation/index.d.cts +23 -1
- package/dist/base/mutation/index.d.ts +23 -1
- package/dist/base/mutation/index.js +3 -1
- package/dist/base/sources/browser/index.cjs +18 -12
- package/dist/base/sources/browser/index.cjs.map +1 -1
- package/dist/base/sources/browser/index.d.cts +20 -2
- package/dist/base/sources/browser/index.d.ts +20 -2
- package/dist/base/sources/browser/index.js +18 -12
- package/dist/base/sources/browser/index.js.map +1 -1
- package/dist/base/sources/event/index.cjs +29 -1
- package/dist/base/sources/event/index.cjs.map +1 -1
- package/dist/base/sources/event/index.d.cts +67 -3
- package/dist/base/sources/event/index.d.ts +67 -3
- package/dist/base/sources/event/index.js +5 -2
- package/dist/base/sources/index.cjs +96 -50
- package/dist/base/sources/index.cjs.map +1 -1
- package/dist/base/sources/index.d.cts +1 -1
- package/dist/base/sources/index.d.ts +1 -1
- package/dist/base/sources/index.js +7 -4
- package/dist/base/sources/node/index.cjs +43 -37
- package/dist/base/sources/node/index.cjs.map +1 -1
- package/dist/base/sources/node/index.js +43 -37
- package/dist/base/sources/node/index.js.map +1 -1
- package/dist/{chunk-J5WFUEO4.js → chunk-23MAWVOJ.js} +3 -3
- package/dist/{chunk-YXCPV26R.js → chunk-3REMCHSS.js} +39 -27
- package/dist/chunk-3REMCHSS.js.map +1 -0
- package/dist/{chunk-CEVNQ74M.js → chunk-3YGXPUHW.js} +2 -2
- package/dist/{chunk-CEVNQ74M.js.map → chunk-3YGXPUHW.js.map} +1 -1
- package/dist/{chunk-EVYY4X5A.js → chunk-46X2EFQH.js} +16 -5
- package/dist/chunk-46X2EFQH.js.map +1 -0
- package/dist/{chunk-NY2PYHNC.js → chunk-5UY3PNFY.js} +12 -5
- package/dist/chunk-5UY3PNFY.js.map +1 -0
- package/dist/{chunk-RGMTUZCL.js → chunk-65OM4XLQ.js} +50 -4
- package/dist/chunk-65OM4XLQ.js.map +1 -0
- package/dist/{chunk-3PSLNJDU.js → chunk-6DQYBIHW.js} +314 -49
- package/dist/chunk-6DQYBIHW.js.map +1 -0
- package/dist/{chunk-LDCSZ72P.js → chunk-6YBER5UP.js} +3 -3
- package/dist/{chunk-LDCSZ72P.js.map → chunk-6YBER5UP.js.map} +1 -1
- package/dist/{chunk-7EGRP2VX.js → chunk-7BULJTL6.js} +2 -2
- package/dist/{chunk-7EGRP2VX.js.map → chunk-7BULJTL6.js.map} +1 -1
- package/dist/{chunk-VLAGJZSL.js → chunk-7T7WLEPM.js} +25 -4
- package/dist/chunk-7T7WLEPM.js.map +1 -0
- package/dist/{chunk-PKPO3JTZ.js → chunk-AQAKDE7F.js} +29 -11
- package/dist/chunk-AQAKDE7F.js.map +1 -0
- package/dist/{chunk-2OB3CEJS.js → chunk-B5Y5GPD5.js} +2 -2
- package/dist/{chunk-BXGZFGZ4.js → chunk-C5QD5DQX.js} +22 -1
- package/dist/chunk-C5QD5DQX.js.map +1 -0
- package/dist/{chunk-4XCHZRUJ.js → chunk-D5YGR4TP.js} +58 -7
- package/dist/chunk-D5YGR4TP.js.map +1 -0
- package/dist/{chunk-NPRP3MCV.js → chunk-DHDCOOJU.js} +2 -2
- package/dist/chunk-DHDCOOJU.js.map +1 -0
- package/dist/{chunk-MTTRCEJT.js → chunk-DVTDF5OI.js} +2 -2
- package/dist/{chunk-SOOKUYVM.js → chunk-F7EKHR32.js} +13 -9
- package/dist/chunk-F7EKHR32.js.map +1 -0
- package/dist/{chunk-A7KV5UK4.js → chunk-G7H6PN7P.js} +2 -2
- package/dist/{chunk-OCUDSN63.js → chunk-GGKHHG5Y.js} +110 -64
- package/dist/chunk-GGKHHG5Y.js.map +1 -0
- package/dist/{chunk-RAGGHLCV.js → chunk-GUNIRPEJ.js} +8 -6
- package/dist/{chunk-RAGGHLCV.js.map → chunk-GUNIRPEJ.js.map} +1 -1
- package/dist/{chunk-YJ4U2D2C.js → chunk-J5TBZFBD.js} +9 -7
- package/dist/chunk-J5TBZFBD.js.map +1 -0
- package/dist/{chunk-Y52CS6YA.js → chunk-JA67ZQG2.js} +2 -2
- package/dist/{chunk-Y52CS6YA.js.map → chunk-JA67ZQG2.js.map} +1 -1
- package/dist/{chunk-U225SKB4.js → chunk-K4ZYJ4EM.js} +569 -424
- package/dist/chunk-K4ZYJ4EM.js.map +1 -0
- package/dist/{chunk-Z4YXAUDN.js → chunk-KUFXLAEY.js} +11 -7
- package/dist/{chunk-Z4YXAUDN.js.map → chunk-KUFXLAEY.js.map} +1 -1
- package/dist/{chunk-IHTWQEDR.js → chunk-LTSI7ULC.js} +3 -3
- package/dist/{chunk-IHTWQEDR.js.map → chunk-LTSI7ULC.js.map} +1 -1
- package/dist/{chunk-DKNHAICT.js → chunk-MMHGYX44.js} +25 -9
- package/dist/chunk-MMHGYX44.js.map +1 -0
- package/dist/{chunk-K7PDZYQE.js → chunk-MQMTRKY3.js} +129 -50
- package/dist/chunk-MQMTRKY3.js.map +1 -0
- package/dist/{chunk-42FQ27MQ.js → chunk-MTODGQBR.js} +44 -179
- package/dist/chunk-MTODGQBR.js.map +1 -0
- package/dist/{chunk-O3MT7DYI.js → chunk-N6MNJNHB.js} +2 -2
- package/dist/{chunk-FVINAAKA.js → chunk-NBK6QQMG.js} +14 -13
- package/dist/{chunk-FVINAAKA.js.map → chunk-NBK6QQMG.js.map} +1 -1
- package/dist/{chunk-DM4OMPWK.js → chunk-NSA5K5G2.js} +2 -2
- package/dist/{chunk-MLTPJMH6.js → chunk-QQYULEZL.js} +2 -2
- package/dist/chunk-QSW4DFKE.js +31 -0
- package/dist/chunk-QSW4DFKE.js.map +1 -0
- package/dist/{chunk-PZWISPIQ.js → chunk-S7HN5FHL.js} +17 -11
- package/dist/chunk-S7HN5FHL.js.map +1 -0
- package/dist/{chunk-4S53H2KR.js → chunk-SUNCHMML.js} +2 -2
- package/dist/{chunk-4GYMCUDZ.js → chunk-T2U6N3FV.js} +7 -7
- package/dist/{chunk-RJOG4IJU.js → chunk-T5URUIIY.js} +50 -35
- package/dist/chunk-T5URUIIY.js.map +1 -0
- package/dist/{chunk-B4AKFXGE.js → chunk-TPTZZV25.js} +6 -6
- package/dist/chunk-TPTZZV25.js.map +1 -0
- package/dist/{chunk-BU3SEFA5.js → chunk-V46JWFGV.js} +7 -6
- package/dist/chunk-V46JWFGV.js.map +1 -0
- package/dist/{chunk-IJRR6YAI.js → chunk-VLDRAMP7.js} +18 -12
- package/dist/chunk-VLDRAMP7.js.map +1 -0
- package/dist/{chunk-6XZYT4SW.js → chunk-X6ESZDR6.js} +8 -9
- package/dist/chunk-X6ESZDR6.js.map +1 -0
- package/dist/{chunk-E5OZPDIW.js → chunk-X7BA5PWG.js} +7 -5
- package/dist/chunk-X7BA5PWG.js.map +1 -0
- package/dist/{chunk-CXANAIZU.js → chunk-XEWV254I.js} +3 -3
- package/dist/{chunk-CXANAIZU.js.map → chunk-XEWV254I.js.map} +1 -1
- package/dist/{chunk-V4Y3TM7U.js → chunk-YBJVKMTM.js} +38 -16
- package/dist/chunk-YBJVKMTM.js.map +1 -0
- package/dist/{chunk-7ADWWI2T.js → chunk-ZW32BPXV.js} +17 -6
- package/dist/chunk-ZW32BPXV.js.map +1 -0
- package/dist/compat/index.cjs +52 -5
- package/dist/compat/index.cjs.map +1 -1
- package/dist/compat/index.d.cts +1 -1
- package/dist/compat/index.d.ts +1 -1
- package/dist/compat/index.js +7 -7
- package/dist/compat/nestjs/index.cjs +52 -5
- package/dist/compat/nestjs/index.cjs.map +1 -1
- package/dist/compat/nestjs/index.d.cts +1 -1
- package/dist/compat/nestjs/index.d.ts +1 -1
- package/dist/compat/nestjs/index.js +4 -4
- package/dist/{fallback-Bx46zqky.d.cts → fallback-BROR6ZhO.d.cts} +1 -1
- package/dist/{fallback-pIWW8A2d.d.ts → fallback-DO80aM_3.d.ts} +1 -1
- package/dist/{index-B_p8tnvf.d.cts → index-D1z3XcF9.d.cts} +1 -0
- package/dist/{index-_HDSmPyp.d.ts → index-DZ6yua0Q.d.ts} +1 -0
- package/dist/index.cjs +2387 -1707
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +173 -150
- package/dist/index.js.map +1 -1
- package/dist/presets/ai/index.cjs +88 -26
- package/dist/presets/ai/index.cjs.map +1 -1
- package/dist/presets/ai/index.js +14 -14
- package/dist/presets/harness/index.cjs +183 -51
- package/dist/presets/harness/index.cjs.map +1 -1
- package/dist/presets/harness/index.d.cts +15 -5
- package/dist/presets/harness/index.d.ts +15 -5
- package/dist/presets/harness/index.js +26 -26
- package/dist/presets/index.cjs +298 -101
- package/dist/presets/index.cjs.map +1 -1
- package/dist/presets/index.d.cts +2 -2
- package/dist/presets/index.d.ts +2 -2
- package/dist/presets/index.js +49 -49
- package/dist/presets/inspect/index.cjs +63 -14
- package/dist/presets/inspect/index.cjs.map +1 -1
- package/dist/presets/inspect/index.d.cts +1 -1
- package/dist/presets/inspect/index.d.ts +1 -1
- package/dist/presets/inspect/index.js +6 -6
- package/dist/presets/resilience/index.cjs +64 -44
- package/dist/presets/resilience/index.cjs.map +1 -1
- package/dist/presets/resilience/index.d.cts +12 -8
- package/dist/presets/resilience/index.d.ts +12 -8
- package/dist/presets/resilience/index.js +6 -6
- package/dist/{rate-limiter-DpVbSYdH.d.cts → rate-limiter-DC26FM8J.d.cts} +10 -1
- package/dist/{rate-limiter-CEALq4N1.d.ts → rate-limiter-DyWpwpQP.d.ts} +10 -1
- package/dist/{reactive-layout-fswlBUvX.d.ts → reactive-layout-BBBWH0V_.d.cts} +85 -4
- package/dist/{reactive-layout-fswlBUvX.d.cts → reactive-layout-BBBWH0V_.d.ts} +85 -4
- package/dist/solutions/index.cjs +239 -92
- package/dist/solutions/index.cjs.map +1 -1
- package/dist/solutions/index.d.cts +2 -2
- package/dist/solutions/index.d.ts +2 -2
- package/dist/solutions/index.js +32 -32
- package/dist/{spawnable-5mDY501F.d.cts → spawnable-B2IlW60f.d.cts} +23 -2
- package/dist/{spawnable-D3lR0oQu.d.ts → spawnable-tttFz2Nh.d.ts} +23 -2
- package/dist/testing/index.cjs +94 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +59 -0
- package/dist/testing/index.d.ts +59 -0
- package/dist/testing/index.js +73 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/{timeout-U5O4ESK3.js → timeout-BEABACRP.js} +2 -2
- package/dist/utils/ai/browser.cjs.map +1 -1
- package/dist/utils/ai/browser.d.cts +2 -2
- package/dist/utils/ai/browser.d.ts +2 -2
- package/dist/utils/ai/browser.js +10 -10
- package/dist/utils/ai/browser.js.map +1 -1
- package/dist/utils/ai/index.cjs +291 -191
- package/dist/utils/ai/index.cjs.map +1 -1
- package/dist/utils/ai/index.d.cts +108 -12
- package/dist/utils/ai/index.d.ts +108 -12
- package/dist/utils/ai/index.js +23 -21
- package/dist/utils/ai/node.cjs.map +1 -1
- package/dist/utils/ai/node.d.cts +5 -5
- package/dist/utils/ai/node.d.ts +5 -5
- package/dist/utils/ai/node.js +3 -3
- package/dist/utils/ai/node.js.map +1 -1
- package/dist/utils/cqrs/index.cjs +29 -3
- package/dist/utils/cqrs/index.cjs.map +1 -1
- package/dist/utils/cqrs/index.d.cts +12 -7
- package/dist/utils/cqrs/index.d.ts +12 -7
- package/dist/utils/cqrs/index.js +2 -2
- package/dist/utils/demo-shell/index.cjs +45 -19
- package/dist/utils/demo-shell/index.cjs.map +1 -1
- package/dist/utils/demo-shell/index.d.cts +1 -1
- package/dist/utils/demo-shell/index.d.ts +1 -1
- package/dist/utils/demo-shell/index.js +2 -2
- package/dist/utils/domain-templates/index.cjs +1 -1
- package/dist/utils/domain-templates/index.cjs.map +1 -1
- package/dist/utils/domain-templates/index.js +3 -3
- package/dist/utils/graphspec/index.cjs +1 -1
- package/dist/utils/graphspec/index.cjs.map +1 -1
- package/dist/utils/graphspec/index.js +3 -3
- package/dist/utils/harness/index.cjs +16 -10
- package/dist/utils/harness/index.cjs.map +1 -1
- package/dist/utils/harness/index.js +1 -1
- package/dist/utils/index.cjs +1692 -1192
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +7 -7
- package/dist/utils/index.d.ts +7 -7
- package/dist/utils/index.js +77 -59
- package/dist/utils/inspect/index.cjs +52 -4
- package/dist/utils/inspect/index.cjs.map +1 -1
- package/dist/utils/inspect/index.d.cts +32 -3
- package/dist/utils/inspect/index.d.ts +32 -3
- package/dist/utils/inspect/index.js +4 -4
- package/dist/utils/job-queue/index.cjs +46 -9
- package/dist/utils/job-queue/index.cjs.map +1 -1
- package/dist/utils/job-queue/index.d.cts +33 -3
- package/dist/utils/job-queue/index.d.ts +33 -3
- package/dist/utils/job-queue/index.js +2 -2
- package/dist/utils/memory/index.cjs +570 -425
- package/dist/utils/memory/index.cjs.map +1 -1
- package/dist/utils/memory/index.d.cts +261 -33
- package/dist/utils/memory/index.d.ts +261 -33
- package/dist/utils/memory/index.js +10 -2
- package/dist/utils/messaging/index.cjs.map +1 -1
- package/dist/utils/messaging/index.d.cts +4 -3
- package/dist/utils/messaging/index.d.ts +4 -3
- package/dist/utils/messaging/index.js +2 -2
- package/dist/utils/orchestration/index.cjs +14 -3
- package/dist/utils/orchestration/index.cjs.map +1 -1
- package/dist/utils/orchestration/index.js +3 -3
- package/dist/utils/process/index.cjs +32 -2
- package/dist/utils/process/index.cjs.map +1 -1
- package/dist/utils/process/index.d.cts +4 -3
- package/dist/utils/process/index.d.ts +4 -3
- package/dist/utils/process/index.js +3 -3
- package/dist/utils/reactive-layout/index.cjs +184 -55
- package/dist/utils/reactive-layout/index.cjs.map +1 -1
- package/dist/utils/reactive-layout/index.d.cts +128 -3
- package/dist/utils/reactive-layout/index.d.ts +128 -3
- package/dist/utils/reactive-layout/index.js +16 -8
- package/dist/utils/reduction/index.cjs +1 -1
- package/dist/utils/reduction/index.cjs.map +1 -1
- package/dist/utils/reduction/index.js +2 -2
- package/dist/utils/resilience/index.cjs +64 -43
- package/dist/utils/resilience/index.cjs.map +1 -1
- package/dist/utils/resilience/index.d.cts +1 -1
- package/dist/utils/resilience/index.d.ts +1 -1
- package/dist/utils/resilience/index.js +5 -5
- package/dist/utils/surface/index.cjs +1 -1
- package/dist/utils/surface/index.cjs.map +1 -1
- package/dist/utils/surface/index.js +4 -4
- package/package.json +15 -3
- package/dist/chunk-3PSLNJDU.js.map +0 -1
- package/dist/chunk-42FQ27MQ.js.map +0 -1
- package/dist/chunk-4XCHZRUJ.js.map +0 -1
- package/dist/chunk-6XZYT4SW.js.map +0 -1
- package/dist/chunk-7ADWWI2T.js.map +0 -1
- package/dist/chunk-B4AKFXGE.js.map +0 -1
- package/dist/chunk-BU3SEFA5.js.map +0 -1
- package/dist/chunk-BXGZFGZ4.js.map +0 -1
- package/dist/chunk-DKNHAICT.js.map +0 -1
- package/dist/chunk-E5OZPDIW.js.map +0 -1
- package/dist/chunk-EVYY4X5A.js.map +0 -1
- package/dist/chunk-IJRR6YAI.js.map +0 -1
- package/dist/chunk-K7PDZYQE.js.map +0 -1
- package/dist/chunk-NPRP3MCV.js.map +0 -1
- package/dist/chunk-NY2PYHNC.js.map +0 -1
- package/dist/chunk-OCUDSN63.js.map +0 -1
- package/dist/chunk-PKPO3JTZ.js.map +0 -1
- package/dist/chunk-PZWISPIQ.js.map +0 -1
- package/dist/chunk-RGMTUZCL.js.map +0 -1
- package/dist/chunk-RJOG4IJU.js.map +0 -1
- package/dist/chunk-SOOKUYVM.js.map +0 -1
- package/dist/chunk-U225SKB4.js.map +0 -1
- package/dist/chunk-V4Y3TM7U.js.map +0 -1
- package/dist/chunk-VLAGJZSL.js.map +0 -1
- package/dist/chunk-W2BOPXTI.js +0 -1
- package/dist/chunk-YJ4U2D2C.js.map +0 -1
- package/dist/chunk-YXCPV26R.js.map +0 -1
- package/dist/timeout-U5O4ESK3.js.map +0 -1
- /package/dist/{chunk-J5WFUEO4.js.map → chunk-23MAWVOJ.js.map} +0 -0
- /package/dist/{chunk-2OB3CEJS.js.map → chunk-B5Y5GPD5.js.map} +0 -0
- /package/dist/{chunk-MTTRCEJT.js.map → chunk-DVTDF5OI.js.map} +0 -0
- /package/dist/{chunk-A7KV5UK4.js.map → chunk-G7H6PN7P.js.map} +0 -0
- /package/dist/{chunk-O3MT7DYI.js.map → chunk-N6MNJNHB.js.map} +0 -0
- /package/dist/{chunk-DM4OMPWK.js.map → chunk-NSA5K5G2.js.map} +0 -0
- /package/dist/{chunk-MLTPJMH6.js.map → chunk-QQYULEZL.js.map} +0 -0
- /package/dist/{chunk-4S53H2KR.js.map → chunk-SUNCHMML.js.map} +0 -0
- /package/dist/{chunk-4GYMCUDZ.js.map → chunk-T2U6N3FV.js.map} +0 -0
- /package/dist/{chunk-W2BOPXTI.js.map → timeout-BEABACRP.js.map} +0 -0
|
@@ -84,10 +84,10 @@ declare function webllmAdapter(opts: WebLLMAdapterOptions): LLMAdapter;
|
|
|
84
84
|
* Curated `cascadingLlmAdapter` presets that depend on browser-only adapters
|
|
85
85
|
* (`webllmAdapter`, `chromeNanoAdapter`).
|
|
86
86
|
*
|
|
87
|
-
* Split out from `routing/presets.ts` so that importing `
|
|
87
|
+
* Split out from `routing/presets.ts` so that importing `utils/ai` in a
|
|
88
88
|
* Node bundle doesn't transitively pull in `@mlc-ai/web-llm` / Chrome Nano
|
|
89
89
|
* dynamic imports, and so browser-only consumers can opt in cleanly via
|
|
90
|
-
* the `@graphrefly/graphrefly/
|
|
90
|
+
* the `@graphrefly/graphrefly/utils/ai/browser` subpath.
|
|
91
91
|
*
|
|
92
92
|
* @module
|
|
93
93
|
*/
|
|
@@ -84,10 +84,10 @@ declare function webllmAdapter(opts: WebLLMAdapterOptions): LLMAdapter;
|
|
|
84
84
|
* Curated `cascadingLlmAdapter` presets that depend on browser-only adapters
|
|
85
85
|
* (`webllmAdapter`, `chromeNanoAdapter`).
|
|
86
86
|
*
|
|
87
|
-
* Split out from `routing/presets.ts` so that importing `
|
|
87
|
+
* Split out from `routing/presets.ts` so that importing `utils/ai` in a
|
|
88
88
|
* Node bundle doesn't transitively pull in `@mlc-ai/web-llm` / Chrome Nano
|
|
89
89
|
* dynamic imports, and so browser-only consumers can opt in cleanly via
|
|
90
|
-
* the `@graphrefly/graphrefly/
|
|
90
|
+
* the `@graphrefly/graphrefly/utils/ai/browser` subpath.
|
|
91
91
|
*
|
|
92
92
|
* @module
|
|
93
93
|
*/
|
package/dist/utils/ai/browser.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cascadingLlmAdapter,
|
|
3
3
|
createAdapter
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
7
|
-
import "../../chunk-
|
|
8
|
-
import "../../chunk-
|
|
9
|
-
import "../../chunk-
|
|
10
|
-
import "../../chunk-
|
|
11
|
-
import "../../chunk-SOOKUYVM.js";
|
|
12
|
-
import "../../chunk-Y52CS6YA.js";
|
|
13
|
-
import "../../chunk-Z4YXAUDN.js";
|
|
4
|
+
} from "../../chunk-T2U6N3FV.js";
|
|
5
|
+
import "../../chunk-T5URUIIY.js";
|
|
6
|
+
import "../../chunk-GUNIRPEJ.js";
|
|
7
|
+
import "../../chunk-XEWV254I.js";
|
|
8
|
+
import "../../chunk-F7EKHR32.js";
|
|
9
|
+
import "../../chunk-JA67ZQG2.js";
|
|
10
|
+
import "../../chunk-KUFXLAEY.js";
|
|
14
11
|
import "../../chunk-TSBFTJKM.js";
|
|
15
12
|
import "../../chunk-P5LBT622.js";
|
|
13
|
+
import "../../chunk-FMPF42Q4.js";
|
|
14
|
+
import "../../chunk-V46JWFGV.js";
|
|
15
|
+
import "../../chunk-N6MNJNHB.js";
|
|
16
16
|
import "../../chunk-AZDQPQ3V.js";
|
|
17
17
|
|
|
18
18
|
// src/utils/ai/adapters/providers/browser/chrome-nano.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/ai/adapters/providers/browser/chrome-nano.ts","../../../src/utils/ai/adapters/providers/browser/webllm.ts","../../../src/utils/ai/adapters/routing/browser-presets.ts"],"sourcesContent":["/**\n * ChromeNanoAdapter — Chrome Built-in AI Prompt API.\n *\n * Uses `navigator.ai.languageModel` (Chrome 131+, origin trial / flag gated).\n * Zero download, instant startup — but limited capability (no tool use on\n * most versions, no rich system prompts on some).\n *\n * **Stream mode:** Chrome AI has historically switched between emitting\n * accumulated (each chunk is the full text so far) and delta (each chunk is\n * only the new tokens) streams across versions. Default `streamMode: \"accumulated\"`\n * matches current behavior; pass `\"delta\"` if you've verified your browser\n * emits pure deltas.\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n} from \"../../core/types.js\";\n\nexport interface ChromeNanoAdapterOptions {\n\t/** Override the navigator object (for tests). */\n\tnavigatorOverride?: Navigator;\n\t/** Initial system prompt for the session (Chrome AI supports it in 131+). */\n\tsystemPrompt?: string;\n\t/** Temperature (0..1). */\n\ttemperature?: number;\n\t/** Top-K sampling (Chrome AI only). */\n\ttopK?: number;\n\t/**\n\t * Stream chunk shape. `\"accumulated\"` (default) — each chunk contains the\n\t * full cumulative text; adapter computes deltas by string diffing.\n\t * `\"delta\"` — each chunk already contains only the new tokens; adapter\n\t * forwards directly.\n\t */\n\tstreamMode?: \"accumulated\" | \"delta\";\n}\n\ninterface ChromeAiSession {\n\tprompt(input: string, opts?: { signal?: AbortSignal }): Promise<string>;\n\tpromptStreaming(input: string, opts?: { signal?: AbortSignal }): AsyncIterable<string>;\n\tdestroy?(): void;\n}\n\ninterface ChromeAi {\n\tlanguageModel?: {\n\t\tcreate(params?: {\n\t\t\tsystemPrompt?: string;\n\t\t\ttemperature?: number;\n\t\t\ttopK?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t}): Promise<ChromeAiSession>;\n\t\tcapabilities?(): Promise<{ available?: \"readily\" | \"after-download\" | \"no\" }>;\n\t};\n}\n\nfunction makeAbortError(): Error {\n\tconst err = new Error(\"aborted\") as Error & { name: string };\n\terr.name = \"AbortError\";\n\treturn err;\n}\n\nexport function chromeNanoAdapter(opts: ChromeNanoAdapterOptions = {}): LLMAdapter {\n\tconst streamMode = opts.streamMode ?? \"accumulated\";\n\tconst nav = opts.navigatorOverride ?? (globalThis as { navigator?: Navigator }).navigator;\n\tconst getAi = (): ChromeAi => {\n\t\tconst ai = (nav as unknown as { ai?: ChromeAi })?.ai;\n\t\tif (!ai?.languageModel)\n\t\t\tthrow new Error(\n\t\t\t\t\"chromeNanoAdapter: Chrome AI languageModel not available (requires Chrome 131+ with flag/OT).\",\n\t\t\t);\n\t\treturn ai;\n\t};\n\n\tconst session = async (invokeOpts: LLMInvokeOptions | undefined): Promise<ChromeAiSession> => {\n\t\tconst ai = getAi();\n\t\treturn ai.languageModel!.create({\n\t\t\tsystemPrompt: invokeOpts?.systemPrompt ?? opts.systemPrompt,\n\t\t\ttemperature: invokeOpts?.temperature ?? opts.temperature,\n\t\t\ttopK: opts.topK,\n\t\t\tsignal: invokeOpts?.signal,\n\t\t});\n\t};\n\n\tconst flatten = (messages: readonly ChatMessage[]): string => {\n\t\t// Chrome AI has no multi-message chat API; flatten to a single prompt\n\t\t// with role-tagged sections. Assistant history is preserved as context.\n\t\tconst parts: string[] = [];\n\t\tfor (const m of messages) {\n\t\t\tif (m.role === \"system\") continue; // already passed via systemPrompt\n\t\t\tparts.push(`${m.role}: ${m.content}`);\n\t\t}\n\t\treturn parts.join(\"\\n\\n\");\n\t};\n\n\t// Chrome AI exposes no token count; we leave usage zeroed.\n\tconst zeroUsage = (): TokenUsage => ({ input: { regular: 0 }, output: { regular: 0 } });\n\n\treturn {\n\t\tprovider: \"chrome-nano\",\n\t\tmodel: \"chrome-nano\",\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst sess = await session(invokeOpts);\n\t\t\ttry {\n\t\t\t\tconst prompt = flatten(messages);\n\t\t\t\tconst start = monotonicNs();\n\t\t\t\tconst content = await sess.prompt(prompt, { signal: invokeOpts?.signal });\n\t\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\t\treturn {\n\t\t\t\t\tcontent,\n\t\t\t\t\tusage: zeroUsage(),\n\t\t\t\t\tfinishReason: \"stop\",\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tmodel: \"chrome-nano\",\n\t\t\t\t\tprovider: \"chrome-nano\",\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tsess.destroy?.();\n\t\t\t}\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst sess = await session(invokeOpts);\n\t\t\ttry {\n\t\t\t\tconst prompt = flatten(messages);\n\t\t\t\tif (streamMode === \"delta\") {\n\t\t\t\t\tfor await (const chunk of sess.promptStreaming(prompt, {\n\t\t\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t\t\t})) {\n\t\t\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\t\t\tif (chunk) yield { type: \"token\", delta: chunk };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet last = \"\";\n\t\t\t\t\tfor await (const chunk of sess.promptStreaming(prompt, {\n\t\t\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t\t\t})) {\n\t\t\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\t\t\t// Accumulated mode: compute the delta against the last cumulative value.\n\t\t\t\t\t\tconst delta = chunk.startsWith(last) ? chunk.slice(last.length) : chunk;\n\t\t\t\t\t\tlast = chunk;\n\t\t\t\t\t\tif (delta) yield { type: \"token\", delta };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tyield { type: \"usage\", usage: zeroUsage() };\n\t\t\t\tyield { type: \"finish\", reason: \"stop\" };\n\t\t\t} finally {\n\t\t\t\tsess.destroy?.();\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * WebLLMAdapter — browser-only, WebGPU-based inference via `@mlc-ai/web-llm`.\n *\n * Dynamic import + WebGPU feature detection. No server dependency. Typical\n * use: fallback tier in `cascadingLlmAdapter` after a BYOK cloud adapter.\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n} from \"../../core/types.js\";\n\nexport interface WebLLMAdapterOptions {\n\tmodel: string;\n\t/**\n\t * User-provided engine instance (from `CreateMLCEngine(...)`). If omitted,\n\t * the adapter lazy-creates one on first call via dynamic import.\n\t */\n\tengine?: WebLLMEngineLike;\n\t/** Pass-through to `CreateMLCEngine`. */\n\tinitProgressCallback?: (progress: unknown) => void;\n\t/** Navigator override (for tests). */\n\tnavigatorOverride?: Navigator;\n}\n\nexport interface WebLLMEngineLike {\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<{\n\t\t\t\tchoices: ReadonlyArray<{ message?: { content?: string }; finish_reason?: string }>;\n\t\t\t\tusage?: { prompt_tokens?: number; completion_tokens?: number };\n\t\t\t}>;\n\t\t};\n\t};\n}\n\nfunction makeAbortError(): Error {\n\tconst err = new Error(\"aborted\") as Error & { name: string };\n\terr.name = \"AbortError\";\n\treturn err;\n}\n\nexport function webllmAdapter(opts: WebLLMAdapterOptions): LLMAdapter {\n\tlet engine = opts.engine;\n\n\tconst ensureEngine = async (): Promise<WebLLMEngineLike> => {\n\t\tif (engine) return engine;\n\t\tif (!isWebGpuAvailable(opts.navigatorOverride))\n\t\t\tthrow new Error(\"webllmAdapter: WebGPU not available in this environment\");\n\t\tconst mod = await import(\"@mlc-ai/web-llm\" as string).catch(() => {\n\t\t\tthrow new Error(\n\t\t\t\t\"webllmAdapter: @mlc-ai/web-llm not installed. Add it as a peer dependency or pass opts.engine.\",\n\t\t\t);\n\t\t});\n\t\tconst factory = (\n\t\t\tmod as { CreateMLCEngine?: (m: string, o?: unknown) => Promise<WebLLMEngineLike> }\n\t\t).CreateMLCEngine;\n\t\tif (!factory) throw new Error(\"webllmAdapter: @mlc-ai/web-llm missing CreateMLCEngine export\");\n\t\tengine = await factory(opts.model, { initProgressCallback: opts.initProgressCallback });\n\t\treturn engine;\n\t};\n\n\tconst flatten = (\n\t\tmessages: readonly ChatMessage[],\n\t\tinvokeOpts: LLMInvokeOptions | undefined,\n\t): Array<{ role: string; content: string }> => {\n\t\tconst flat: Array<{ role: string; content: string }> = [];\n\t\tif (invokeOpts?.systemPrompt) flat.push({ role: \"system\", content: invokeOpts.systemPrompt });\n\t\tfor (const m of messages)\n\t\t\tflat.push({ role: m.role === \"tool\" ? \"user\" : m.role, content: m.content });\n\t\treturn flat;\n\t};\n\n\tconst mapUsage = (\n\t\tu: { prompt_tokens?: number; completion_tokens?: number } | undefined,\n\t): TokenUsage => ({\n\t\tinput: { regular: u?.prompt_tokens ?? 0 },\n\t\toutput: { regular: u?.completion_tokens ?? 0 },\n\t\traw: u,\n\t});\n\n\treturn {\n\t\tprovider: \"webllm\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst eng = await ensureEngine();\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await eng.chat.completions.create(\n\t\t\t\t{\n\t\t\t\t\tmodel: invokeOpts?.model ?? opts.model,\n\t\t\t\t\tmessages: flatten(messages, invokeOpts),\n\t\t\t\t\tmax_tokens: invokeOpts?.maxTokens,\n\t\t\t\t\ttemperature: invokeOpts?.temperature,\n\t\t\t\t},\n\t\t\t\t{ signal: invokeOpts?.signal },\n\t\t\t);\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\tconst choice = resp.choices?.[0];\n\t\t\treturn {\n\t\t\t\tcontent: choice?.message?.content ?? \"\",\n\t\t\t\tusage: mapUsage(resp.usage),\n\t\t\t\tfinishReason: choice?.finish_reason,\n\t\t\t\tlatencyMs,\n\t\t\t\tmodel: opts.model,\n\t\t\t\tprovider: \"webllm\",\n\t\t\t};\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst eng = await ensureEngine();\n\t\t\tconst asyncIter = (await eng.chat.completions.create(\n\t\t\t\t{\n\t\t\t\t\tmodel: invokeOpts?.model ?? opts.model,\n\t\t\t\t\tmessages: flatten(messages, invokeOpts),\n\t\t\t\t\tmax_tokens: invokeOpts?.maxTokens,\n\t\t\t\t\ttemperature: invokeOpts?.temperature,\n\t\t\t\t\tstream: true,\n\t\t\t\t},\n\t\t\t\t{ signal: invokeOpts?.signal },\n\t\t\t)) as unknown as AsyncIterable<{\n\t\t\t\tchoices?: ReadonlyArray<{ delta?: { content?: string }; finish_reason?: string }>;\n\t\t\t\tusage?: { prompt_tokens?: number; completion_tokens?: number };\n\t\t\t}>;\n\n\t\t\tlet finalUsage: { prompt_tokens?: number; completion_tokens?: number } | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\tfor await (const chunk of asyncIter) {\n\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\tconst c = chunk.choices?.[0];\n\t\t\t\tif (c?.delta?.content) yield { type: \"token\", delta: c.delta.content };\n\t\t\t\tif (c?.finish_reason) finishReason = c.finish_reason;\n\t\t\t\tif (chunk.usage) finalUsage = chunk.usage;\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 isWebGpuAvailable(navOverride?: Navigator): boolean {\n\tconst nav = navOverride ?? (globalThis as { navigator?: Navigator }).navigator;\n\treturn !!(nav && \"gpu\" in nav && (nav as unknown as { gpu?: unknown }).gpu);\n}\n","/**\n * Curated `cascadingLlmAdapter` presets that depend on browser-only adapters\n * (`webllmAdapter`, `chromeNanoAdapter`).\n *\n * Split out from `routing/presets.ts` so that importing `patterns/ai` in a\n * Node bundle doesn't transitively pull in `@mlc-ai/web-llm` / Chrome Nano\n * dynamic imports, and so browser-only consumers can opt in cleanly via\n * the `@graphrefly/graphrefly/patterns/ai/browser` subpath.\n *\n * @module\n */\n\nimport { createAdapter } from \"../core/factory.js\";\nimport type { LLMAdapter } from \"../core/types.js\";\nimport { chromeNanoAdapter } from \"../providers/browser/chrome-nano.js\";\nimport { webllmAdapter } from \"../providers/browser/webllm.js\";\nimport { type CascadingLlmAdapterOptions, cascadingLlmAdapter } from \"./cascading.js\";\n\n// ---------------------------------------------------------------------------\n// Cloud-first: BYOK → WebLLM → Chrome Nano\n// ---------------------------------------------------------------------------\n\nexport interface CloudFirstPresetOptions {\n\t/** BYOK config — passed directly to `createAdapter`. */\n\tcloud: Parameters<typeof createAdapter>[0];\n\t/** WebLLM model name. Pass `null` to skip the WebLLM tier. */\n\twebllmModel?: string | null;\n\t/** Pass `null` to skip the Chrome Nano tier. */\n\tchromeNano?: boolean;\n\t/** Cascade options. */\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\n/**\n * Cloud-first with local fallback: BYOK → WebLLM → Chrome Nano.\n */\nexport function cloudFirstPreset(opts: CloudFirstPresetOptions): LLMAdapter {\n\tconst tiers = [{ name: \"cloud\", adapter: createAdapter(opts.cloud) }];\n\tif (opts.webllmModel) {\n\t\ttiers.push({ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) });\n\t}\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n\n// ---------------------------------------------------------------------------\n// Local-first: Ollama → WebLLM → Chrome Nano\n// ---------------------------------------------------------------------------\n\nexport interface LocalFirstPresetOptions {\n\t/** Ollama model. */\n\tollamaModel: string;\n\t/** Ollama base URL. Default http://localhost:11434/v1. */\n\tollamaBaseURL?: string;\n\twebllmModel?: string | null;\n\tchromeNano?: boolean;\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\n/**\n * Local-first: nothing leaves the machine. Ollama → WebLLM → Chrome Nano.\n */\nexport function localFirstPreset(opts: LocalFirstPresetOptions): LLMAdapter {\n\tconst tiers = [\n\t\t{\n\t\t\tname: \"ollama\",\n\t\t\tadapter: createAdapter({\n\t\t\t\tprovider: \"ollama\",\n\t\t\t\tmodel: opts.ollamaModel,\n\t\t\t\tbaseURL: opts.ollamaBaseURL,\n\t\t\t}),\n\t\t},\n\t];\n\tif (opts.webllmModel) {\n\t\ttiers.push({ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) });\n\t}\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n\n// ---------------------------------------------------------------------------\n// Offline: WebLLM → Chrome Nano (no network)\n// ---------------------------------------------------------------------------\n\nexport interface OfflinePresetOptions {\n\twebllmModel: string;\n\tchromeNano?: boolean;\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\nexport function offlinePreset(opts: OfflinePresetOptions): LLMAdapter {\n\tconst tiers = [{ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) }];\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n"],"mappings":"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","names":["monotonicNs","makeAbortError"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/ai/adapters/providers/browser/chrome-nano.ts","../../../src/utils/ai/adapters/providers/browser/webllm.ts","../../../src/utils/ai/adapters/routing/browser-presets.ts"],"sourcesContent":["/**\n * ChromeNanoAdapter — Chrome Built-in AI Prompt API.\n *\n * Uses `navigator.ai.languageModel` (Chrome 131+, origin trial / flag gated).\n * Zero download, instant startup — but limited capability (no tool use on\n * most versions, no rich system prompts on some).\n *\n * **Stream mode:** Chrome AI has historically switched between emitting\n * accumulated (each chunk is the full text so far) and delta (each chunk is\n * only the new tokens) streams across versions. Default `streamMode: \"accumulated\"`\n * matches current behavior; pass `\"delta\"` if you've verified your browser\n * emits pure deltas.\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n} from \"../../core/types.js\";\n\nexport interface ChromeNanoAdapterOptions {\n\t/** Override the navigator object (for tests). */\n\tnavigatorOverride?: Navigator;\n\t/** Initial system prompt for the session (Chrome AI supports it in 131+). */\n\tsystemPrompt?: string;\n\t/** Temperature (0..1). */\n\ttemperature?: number;\n\t/** Top-K sampling (Chrome AI only). */\n\ttopK?: number;\n\t/**\n\t * Stream chunk shape. `\"accumulated\"` (default) — each chunk contains the\n\t * full cumulative text; adapter computes deltas by string diffing.\n\t * `\"delta\"` — each chunk already contains only the new tokens; adapter\n\t * forwards directly.\n\t */\n\tstreamMode?: \"accumulated\" | \"delta\";\n}\n\ninterface ChromeAiSession {\n\tprompt(input: string, opts?: { signal?: AbortSignal }): Promise<string>;\n\tpromptStreaming(input: string, opts?: { signal?: AbortSignal }): AsyncIterable<string>;\n\tdestroy?(): void;\n}\n\ninterface ChromeAi {\n\tlanguageModel?: {\n\t\tcreate(params?: {\n\t\t\tsystemPrompt?: string;\n\t\t\ttemperature?: number;\n\t\t\ttopK?: number;\n\t\t\tsignal?: AbortSignal;\n\t\t}): Promise<ChromeAiSession>;\n\t\tcapabilities?(): Promise<{ available?: \"readily\" | \"after-download\" | \"no\" }>;\n\t};\n}\n\nfunction makeAbortError(): Error {\n\tconst err = new Error(\"aborted\") as Error & { name: string };\n\terr.name = \"AbortError\";\n\treturn err;\n}\n\nexport function chromeNanoAdapter(opts: ChromeNanoAdapterOptions = {}): LLMAdapter {\n\tconst streamMode = opts.streamMode ?? \"accumulated\";\n\tconst nav = opts.navigatorOverride ?? (globalThis as { navigator?: Navigator }).navigator;\n\tconst getAi = (): ChromeAi => {\n\t\tconst ai = (nav as unknown as { ai?: ChromeAi })?.ai;\n\t\tif (!ai?.languageModel)\n\t\t\tthrow new Error(\n\t\t\t\t\"chromeNanoAdapter: Chrome AI languageModel not available (requires Chrome 131+ with flag/OT).\",\n\t\t\t);\n\t\treturn ai;\n\t};\n\n\tconst session = async (invokeOpts: LLMInvokeOptions | undefined): Promise<ChromeAiSession> => {\n\t\tconst ai = getAi();\n\t\treturn ai.languageModel!.create({\n\t\t\tsystemPrompt: invokeOpts?.systemPrompt ?? opts.systemPrompt,\n\t\t\ttemperature: invokeOpts?.temperature ?? opts.temperature,\n\t\t\ttopK: opts.topK,\n\t\t\tsignal: invokeOpts?.signal,\n\t\t});\n\t};\n\n\tconst flatten = (messages: readonly ChatMessage[]): string => {\n\t\t// Chrome AI has no multi-message chat API; flatten to a single prompt\n\t\t// with role-tagged sections. Assistant history is preserved as context.\n\t\tconst parts: string[] = [];\n\t\tfor (const m of messages) {\n\t\t\tif (m.role === \"system\") continue; // already passed via systemPrompt\n\t\t\tparts.push(`${m.role}: ${m.content}`);\n\t\t}\n\t\treturn parts.join(\"\\n\\n\");\n\t};\n\n\t// Chrome AI exposes no token count; we leave usage zeroed.\n\tconst zeroUsage = (): TokenUsage => ({ input: { regular: 0 }, output: { regular: 0 } });\n\n\treturn {\n\t\tprovider: \"chrome-nano\",\n\t\tmodel: \"chrome-nano\",\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst sess = await session(invokeOpts);\n\t\t\ttry {\n\t\t\t\tconst prompt = flatten(messages);\n\t\t\t\tconst start = monotonicNs();\n\t\t\t\tconst content = await sess.prompt(prompt, { signal: invokeOpts?.signal });\n\t\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\t\treturn {\n\t\t\t\t\tcontent,\n\t\t\t\t\tusage: zeroUsage(),\n\t\t\t\t\tfinishReason: \"stop\",\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tmodel: \"chrome-nano\",\n\t\t\t\t\tprovider: \"chrome-nano\",\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tsess.destroy?.();\n\t\t\t}\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst sess = await session(invokeOpts);\n\t\t\ttry {\n\t\t\t\tconst prompt = flatten(messages);\n\t\t\t\tif (streamMode === \"delta\") {\n\t\t\t\t\tfor await (const chunk of sess.promptStreaming(prompt, {\n\t\t\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t\t\t})) {\n\t\t\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\t\t\tif (chunk) yield { type: \"token\", delta: chunk };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet last = \"\";\n\t\t\t\t\tfor await (const chunk of sess.promptStreaming(prompt, {\n\t\t\t\t\t\tsignal: invokeOpts?.signal,\n\t\t\t\t\t})) {\n\t\t\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\t\t\t// Accumulated mode: compute the delta against the last cumulative value.\n\t\t\t\t\t\tconst delta = chunk.startsWith(last) ? chunk.slice(last.length) : chunk;\n\t\t\t\t\t\tlast = chunk;\n\t\t\t\t\t\tif (delta) yield { type: \"token\", delta };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tyield { type: \"usage\", usage: zeroUsage() };\n\t\t\t\tyield { type: \"finish\", reason: \"stop\" };\n\t\t\t} finally {\n\t\t\t\tsess.destroy?.();\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * WebLLMAdapter — browser-only, WebGPU-based inference via `@mlc-ai/web-llm`.\n *\n * Dynamic import + WebGPU feature detection. No server dependency. Typical\n * use: fallback tier in `cascadingLlmAdapter` after a BYOK cloud adapter.\n */\n\nimport { monotonicNs } from \"@graphrefly/pure-ts/core\";\nimport type {\n\tChatMessage,\n\tLLMAdapter,\n\tLLMInvokeOptions,\n\tLLMResponse,\n\tStreamDelta,\n\tTokenUsage,\n} from \"../../core/types.js\";\n\nexport interface WebLLMAdapterOptions {\n\tmodel: string;\n\t/**\n\t * User-provided engine instance (from `CreateMLCEngine(...)`). If omitted,\n\t * the adapter lazy-creates one on first call via dynamic import.\n\t */\n\tengine?: WebLLMEngineLike;\n\t/** Pass-through to `CreateMLCEngine`. */\n\tinitProgressCallback?: (progress: unknown) => void;\n\t/** Navigator override (for tests). */\n\tnavigatorOverride?: Navigator;\n}\n\nexport interface WebLLMEngineLike {\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<{\n\t\t\t\tchoices: ReadonlyArray<{ message?: { content?: string }; finish_reason?: string }>;\n\t\t\t\tusage?: { prompt_tokens?: number; completion_tokens?: number };\n\t\t\t}>;\n\t\t};\n\t};\n}\n\nfunction makeAbortError(): Error {\n\tconst err = new Error(\"aborted\") as Error & { name: string };\n\terr.name = \"AbortError\";\n\treturn err;\n}\n\nexport function webllmAdapter(opts: WebLLMAdapterOptions): LLMAdapter {\n\tlet engine = opts.engine;\n\n\tconst ensureEngine = async (): Promise<WebLLMEngineLike> => {\n\t\tif (engine) return engine;\n\t\tif (!isWebGpuAvailable(opts.navigatorOverride))\n\t\t\tthrow new Error(\"webllmAdapter: WebGPU not available in this environment\");\n\t\tconst mod = await import(\"@mlc-ai/web-llm\" as string).catch(() => {\n\t\t\tthrow new Error(\n\t\t\t\t\"webllmAdapter: @mlc-ai/web-llm not installed. Add it as a peer dependency or pass opts.engine.\",\n\t\t\t);\n\t\t});\n\t\tconst factory = (\n\t\t\tmod as { CreateMLCEngine?: (m: string, o?: unknown) => Promise<WebLLMEngineLike> }\n\t\t).CreateMLCEngine;\n\t\tif (!factory) throw new Error(\"webllmAdapter: @mlc-ai/web-llm missing CreateMLCEngine export\");\n\t\tengine = await factory(opts.model, { initProgressCallback: opts.initProgressCallback });\n\t\treturn engine;\n\t};\n\n\tconst flatten = (\n\t\tmessages: readonly ChatMessage[],\n\t\tinvokeOpts: LLMInvokeOptions | undefined,\n\t): Array<{ role: string; content: string }> => {\n\t\tconst flat: Array<{ role: string; content: string }> = [];\n\t\tif (invokeOpts?.systemPrompt) flat.push({ role: \"system\", content: invokeOpts.systemPrompt });\n\t\tfor (const m of messages)\n\t\t\tflat.push({ role: m.role === \"tool\" ? \"user\" : m.role, content: m.content });\n\t\treturn flat;\n\t};\n\n\tconst mapUsage = (\n\t\tu: { prompt_tokens?: number; completion_tokens?: number } | undefined,\n\t): TokenUsage => ({\n\t\tinput: { regular: u?.prompt_tokens ?? 0 },\n\t\toutput: { regular: u?.completion_tokens ?? 0 },\n\t\traw: u,\n\t});\n\n\treturn {\n\t\tprovider: \"webllm\",\n\t\tmodel: opts.model,\n\n\t\tasync invoke(messages, invokeOpts): Promise<LLMResponse> {\n\t\t\tconst eng = await ensureEngine();\n\t\t\tconst start = monotonicNs();\n\t\t\tconst resp = await eng.chat.completions.create(\n\t\t\t\t{\n\t\t\t\t\tmodel: invokeOpts?.model ?? opts.model,\n\t\t\t\t\tmessages: flatten(messages, invokeOpts),\n\t\t\t\t\tmax_tokens: invokeOpts?.maxTokens,\n\t\t\t\t\ttemperature: invokeOpts?.temperature,\n\t\t\t\t},\n\t\t\t\t{ signal: invokeOpts?.signal },\n\t\t\t);\n\t\t\tconst latencyMs = Math.max(0, (monotonicNs() - start) / 1e6);\n\t\t\tconst choice = resp.choices?.[0];\n\t\t\treturn {\n\t\t\t\tcontent: choice?.message?.content ?? \"\",\n\t\t\t\tusage: mapUsage(resp.usage),\n\t\t\t\tfinishReason: choice?.finish_reason,\n\t\t\t\tlatencyMs,\n\t\t\t\tmodel: opts.model,\n\t\t\t\tprovider: \"webllm\",\n\t\t\t};\n\t\t},\n\n\t\tasync *stream(messages, invokeOpts): AsyncGenerator<StreamDelta> {\n\t\t\tconst eng = await ensureEngine();\n\t\t\tconst asyncIter = (await eng.chat.completions.create(\n\t\t\t\t{\n\t\t\t\t\tmodel: invokeOpts?.model ?? opts.model,\n\t\t\t\t\tmessages: flatten(messages, invokeOpts),\n\t\t\t\t\tmax_tokens: invokeOpts?.maxTokens,\n\t\t\t\t\ttemperature: invokeOpts?.temperature,\n\t\t\t\t\tstream: true,\n\t\t\t\t},\n\t\t\t\t{ signal: invokeOpts?.signal },\n\t\t\t)) as unknown as AsyncIterable<{\n\t\t\t\tchoices?: ReadonlyArray<{ delta?: { content?: string }; finish_reason?: string }>;\n\t\t\t\tusage?: { prompt_tokens?: number; completion_tokens?: number };\n\t\t\t}>;\n\n\t\t\tlet finalUsage: { prompt_tokens?: number; completion_tokens?: number } | undefined;\n\t\t\tlet finishReason: string | undefined;\n\t\t\tfor await (const chunk of asyncIter) {\n\t\t\t\tif (invokeOpts?.signal?.aborted) throw makeAbortError();\n\t\t\t\tconst c = chunk.choices?.[0];\n\t\t\t\tif (c?.delta?.content) yield { type: \"token\", delta: c.delta.content };\n\t\t\t\tif (c?.finish_reason) finishReason = c.finish_reason;\n\t\t\t\tif (chunk.usage) finalUsage = chunk.usage;\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 isWebGpuAvailable(navOverride?: Navigator): boolean {\n\tconst nav = navOverride ?? (globalThis as { navigator?: Navigator }).navigator;\n\treturn !!(nav && \"gpu\" in nav && (nav as unknown as { gpu?: unknown }).gpu);\n}\n","/**\n * Curated `cascadingLlmAdapter` presets that depend on browser-only adapters\n * (`webllmAdapter`, `chromeNanoAdapter`).\n *\n * Split out from `routing/presets.ts` so that importing `utils/ai` in a\n * Node bundle doesn't transitively pull in `@mlc-ai/web-llm` / Chrome Nano\n * dynamic imports, and so browser-only consumers can opt in cleanly via\n * the `@graphrefly/graphrefly/utils/ai/browser` subpath.\n *\n * @module\n */\n\nimport { createAdapter } from \"../core/factory.js\";\nimport type { LLMAdapter } from \"../core/types.js\";\nimport { chromeNanoAdapter } from \"../providers/browser/chrome-nano.js\";\nimport { webllmAdapter } from \"../providers/browser/webllm.js\";\nimport { type CascadingLlmAdapterOptions, cascadingLlmAdapter } from \"./cascading.js\";\n\n// ---------------------------------------------------------------------------\n// Cloud-first: BYOK → WebLLM → Chrome Nano\n// ---------------------------------------------------------------------------\n\nexport interface CloudFirstPresetOptions {\n\t/** BYOK config — passed directly to `createAdapter`. */\n\tcloud: Parameters<typeof createAdapter>[0];\n\t/** WebLLM model name. Pass `null` to skip the WebLLM tier. */\n\twebllmModel?: string | null;\n\t/** Pass `null` to skip the Chrome Nano tier. */\n\tchromeNano?: boolean;\n\t/** Cascade options. */\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\n/**\n * Cloud-first with local fallback: BYOK → WebLLM → Chrome Nano.\n */\nexport function cloudFirstPreset(opts: CloudFirstPresetOptions): LLMAdapter {\n\tconst tiers = [{ name: \"cloud\", adapter: createAdapter(opts.cloud) }];\n\tif (opts.webllmModel) {\n\t\ttiers.push({ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) });\n\t}\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n\n// ---------------------------------------------------------------------------\n// Local-first: Ollama → WebLLM → Chrome Nano\n// ---------------------------------------------------------------------------\n\nexport interface LocalFirstPresetOptions {\n\t/** Ollama model. */\n\tollamaModel: string;\n\t/** Ollama base URL. Default http://localhost:11434/v1. */\n\tollamaBaseURL?: string;\n\twebllmModel?: string | null;\n\tchromeNano?: boolean;\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\n/**\n * Local-first: nothing leaves the machine. Ollama → WebLLM → Chrome Nano.\n */\nexport function localFirstPreset(opts: LocalFirstPresetOptions): LLMAdapter {\n\tconst tiers = [\n\t\t{\n\t\t\tname: \"ollama\",\n\t\t\tadapter: createAdapter({\n\t\t\t\tprovider: \"ollama\",\n\t\t\t\tmodel: opts.ollamaModel,\n\t\t\t\tbaseURL: opts.ollamaBaseURL,\n\t\t\t}),\n\t\t},\n\t];\n\tif (opts.webllmModel) {\n\t\ttiers.push({ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) });\n\t}\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n\n// ---------------------------------------------------------------------------\n// Offline: WebLLM → Chrome Nano (no network)\n// ---------------------------------------------------------------------------\n\nexport interface OfflinePresetOptions {\n\twebllmModel: string;\n\tchromeNano?: boolean;\n\tcascade?: CascadingLlmAdapterOptions;\n}\n\nexport function offlinePreset(opts: OfflinePresetOptions): LLMAdapter {\n\tconst tiers = [{ name: \"webllm\", adapter: webllmAdapter({ model: opts.webllmModel }) }];\n\tif (opts.chromeNano !== false) {\n\t\ttiers.push({\n\t\t\tname: \"chrome-nano\",\n\t\t\tadapter: chromeNanoAdapter(),\n\t\t\tfilter: (_msgs, iOpts) => !iOpts?.tools || iOpts.tools.length === 0,\n\t\t} as Parameters<typeof cascadingLlmAdapter>[0][number]);\n\t}\n\treturn cascadingLlmAdapter(tiers, opts.cascade);\n}\n"],"mappings":"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","names":["monotonicNs","makeAbortError"]}
|