@vibgrate/cli 2026.728.2 → 2026.728.4
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/DOCS.md +3 -3
- package/dist/baseline-QD4HVNVJ.js +8 -0
- package/dist/{baseline-MRUM2P6H.js.map → baseline-QD4HVNVJ.js.map} +1 -1
- package/dist/{chunk-A2IYFNCQ.js → chunk-2ZHWF7C6.js} +227 -19
- package/dist/chunk-2ZHWF7C6.js.map +1 -0
- package/dist/{chunk-UZJS7GMK.js → chunk-3LSG7Z4I.js} +10 -6
- package/dist/chunk-3LSG7Z4I.js.map +1 -0
- package/dist/{chunk-KKRSQQ3A.js → chunk-7AVYKZEM.js} +4 -4
- package/dist/{chunk-KKRSQQ3A.js.map → chunk-7AVYKZEM.js.map} +1 -1
- package/dist/{chunk-3SDV6ADQ.js → chunk-CQDUBAQY.js} +3 -3
- package/dist/{chunk-3SDV6ADQ.js.map → chunk-CQDUBAQY.js.map} +1 -1
- package/dist/{chunk-R2QNFXE5.js → chunk-DBOT2ELH.js} +3 -3
- package/dist/{chunk-R2QNFXE5.js.map → chunk-DBOT2ELH.js.map} +1 -1
- package/dist/{chunk-6UK6QPTR.js → chunk-EETK7S43.js} +137 -34
- package/dist/chunk-EETK7S43.js.map +1 -0
- package/dist/{chunk-JRAGO6OB.js → chunk-EVWW3BPM.js} +4 -4
- package/dist/{chunk-JRAGO6OB.js.map → chunk-EVWW3BPM.js.map} +1 -1
- package/dist/chunk-G4HTI4ZM.js +1537 -0
- package/dist/chunk-G4HTI4ZM.js.map +1 -0
- package/dist/{chunk-NTW5UEKT.js → chunk-HY2RVURA.js} +3 -3
- package/dist/{chunk-NTW5UEKT.js.map → chunk-HY2RVURA.js.map} +1 -1
- package/dist/chunk-IPICO2RV.js +789 -0
- package/dist/chunk-IPICO2RV.js.map +1 -0
- package/dist/{chunk-IWP7MYIA.js → chunk-LYDH2PHN.js} +10 -10
- package/dist/{chunk-IWP7MYIA.js.map → chunk-LYDH2PHN.js.map} +1 -1
- package/dist/{chunk-PVZBYZZR.js → chunk-NZELMYT4.js} +27 -6
- package/dist/chunk-NZELMYT4.js.map +1 -0
- package/dist/{chunk-GYSOQH5C.js → chunk-OV4KGXPD.js} +30 -4
- package/dist/chunk-OV4KGXPD.js.map +1 -0
- package/dist/{chunk-6UQMXIAG.js → chunk-OWSFZQOP.js} +62 -12
- package/dist/chunk-OWSFZQOP.js.map +1 -0
- package/dist/{chunk-WH2N22S3.js → chunk-PRGCCW7D.js} +4 -4
- package/dist/{chunk-WH2N22S3.js.map → chunk-PRGCCW7D.js.map} +1 -1
- package/dist/{chunk-ZFTFCM7B.js → chunk-RCBMY7CR.js} +11 -11
- package/dist/{chunk-ZFTFCM7B.js.map → chunk-RCBMY7CR.js.map} +1 -1
- package/dist/{chunk-OSD546W7.js → chunk-REIGWTTH.js} +5 -3
- package/dist/chunk-REIGWTTH.js.map +1 -0
- package/dist/{chunk-B3YUO3NW.js → chunk-RYNAK4LK.js} +3 -3
- package/dist/{chunk-B3YUO3NW.js.map → chunk-RYNAK4LK.js.map} +1 -1
- package/dist/{chunk-YF43FOPP.js → chunk-RZEXHDCF.js} +33 -14
- package/dist/chunk-RZEXHDCF.js.map +1 -0
- package/dist/chunk-SA4BMEU6.js +2184 -0
- package/dist/chunk-SA4BMEU6.js.map +1 -0
- package/dist/{chunk-HK3AWUXH.js → chunk-TCJTQGAO.js} +3 -3
- package/dist/{chunk-HK3AWUXH.js.map → chunk-TCJTQGAO.js.map} +1 -1
- package/dist/{chunk-ZBTY6VV4.js → chunk-US2DAKCM.js} +15 -5
- package/dist/chunk-US2DAKCM.js.map +1 -0
- package/dist/{chunk-ON25BX6T.js → chunk-UTNNGKKX.js} +3 -3
- package/dist/{chunk-ON25BX6T.js.map → chunk-UTNNGKKX.js.map} +1 -1
- package/dist/chunk-WDJNUC6V.js +3059 -0
- package/dist/chunk-WDJNUC6V.js.map +1 -0
- package/dist/{chunk-UIOBFLE6.js → chunk-WHJMS7XC.js} +4 -4
- package/dist/{chunk-UIOBFLE6.js.map → chunk-WHJMS7XC.js.map} +1 -1
- package/dist/chunk-Z6ZWNWWR.js +30 -0
- package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/{chunk-WY6DGTBP.js → chunk-ZU7VD4QL.js} +7 -6
- package/dist/chunk-ZU7VD4QL.js.map +1 -0
- package/dist/cli.js +554 -175
- package/dist/cli.js.map +1 -1
- package/dist/{execution-env-ZU45JZ4G.js → execution-env-4MS5AYAN.js} +3 -3
- package/dist/{execution-env-ZU45JZ4G.js.map → execution-env-4MS5AYAN.js.map} +1 -1
- package/dist/{federation-SZWZIFZ7.js → federation-MDQPO3PW.js} +3 -3
- package/dist/{federation-SZWZIFZ7.js.map → federation-MDQPO3PW.js.map} +1 -1
- package/dist/{fs-O5IQYXHO.js → fs-4G5A65KS.js} +3 -3
- package/dist/fs-4G5A65KS.js.map +1 -0
- package/dist/{fs-B5HZ2MIU.js → fs-6JKZNQ3U.js} +3 -3
- package/dist/fs-6JKZNQ3U.js.map +1 -0
- package/dist/{git-ref-XDXB6JP5.js → git-ref-RSRAN4OH.js} +3 -3
- package/dist/{git-ref-XDXB6JP5.js.map → git-ref-RSRAN4OH.js.map} +1 -1
- package/dist/{graph-backend-UTOL3SHE.js → graph-backend-GBL33GMW.js} +5 -5
- package/dist/{graph-backend-UTOL3SHE.js.map → graph-backend-GBL33GMW.js.map} +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +14 -12
- package/dist/index.js.map +1 -1
- package/dist/{interactive-36ZZ64WL.js → interactive-32LSIBRG.js} +48 -27
- package/dist/interactive-32LSIBRG.js.map +1 -0
- package/dist/{llm-host-XYBT4267.js → llm-host-5RE34322.js} +3 -3
- package/dist/{llm-host-XYBT4267.js.map → llm-host-5RE34322.js.map} +1 -1
- package/dist/load-SEFJA3M5.js +8 -0
- package/dist/{load-QPOWQD7C.js.map → load-SEFJA3M5.js.map} +1 -1
- package/dist/local-runtime-2ED33KK6.js +6 -0
- package/dist/{local-runtime-5O2NN3GA.js.map → local-runtime-2ED33KK6.js.map} +1 -1
- package/dist/mcp-tools-KAJS34TN.js +4 -0
- package/dist/{mcp-tools-I7JK3S2M.js.map → mcp-tools-KAJS34TN.js.map} +1 -1
- package/dist/{model-execution-profile-TFBKCNJG.js → model-execution-profile-ELWF3Z6H.js} +3 -3
- package/dist/{model-execution-profile-TFBKCNJG.js.map → model-execution-profile-ELWF3Z6H.js.map} +1 -1
- package/dist/model-manager-GJ2YSTSK.js +10 -0
- package/dist/{model-manager-OEPY4I7W.js.map → model-manager-GJ2YSTSK.js.map} +1 -1
- package/dist/{model-orchestrator-4VSYP4J4.js → model-orchestrator-LHYPJBFH.js} +4 -4
- package/dist/{model-orchestrator-4VSYP4J4.js.map → model-orchestrator-LHYPJBFH.js.map} +1 -1
- package/dist/parse-worker.js +2 -2
- package/dist/{paths-2RAH3GME.js → paths-62AKTFSR.js} +3 -3
- package/dist/{paths-2RAH3GME.js.map → paths-62AKTFSR.js.map} +1 -1
- package/dist/resolve-gguf-SDIYGGI6.js +9 -0
- package/dist/{resolve-gguf-Y6FH3CNB.js.map → resolve-gguf-SDIYGGI6.js.map} +1 -1
- package/dist/{runtime-session-EJQZXANB.js → runtime-session-4IACVDSY.js} +7 -7
- package/dist/{runtime-session-EJQZXANB.js.map → runtime-session-4IACVDSY.js.map} +1 -1
- package/dist/session-2JT4AUZT.js +13 -0
- package/dist/{session-ZJGENHKX.js.map → session-2JT4AUZT.js.map} +1 -1
- package/dist/session-store-O4XPXKOV.js +4 -0
- package/dist/{session-store-WFBX7HXL.js.map → session-store-O4XPXKOV.js.map} +1 -1
- package/dist/{sql-extract-JELDZA6W.js → sql-extract-6UJOLJDL.js} +3 -3
- package/dist/{sql-extract-JELDZA6W.js.map → sql-extract-6UJOLJDL.js.map} +1 -1
- package/dist/stream-json-Y45JBNYP.js +112 -0
- package/dist/stream-json-Y45JBNYP.js.map +1 -0
- package/dist/ui-K7D3BCHD.js +5 -0
- package/dist/ui-K7D3BCHD.js.map +1 -0
- package/dist/vg-mcp-bridge-E4SJFL7Q.js +75 -0
- package/dist/vg-mcp-bridge-E4SJFL7Q.js.map +1 -0
- package/dist/{vgd-3MHSB4KA.js → vgd-KDQFS33M.js} +6 -6
- package/dist/vgd-KDQFS33M.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-MRUM2P6H.js +0 -8
- package/dist/chunk-6AXHLQBV.js +0 -1892
- package/dist/chunk-6AXHLQBV.js.map +0 -1
- package/dist/chunk-6UK6QPTR.js.map +0 -1
- package/dist/chunk-6UQMXIAG.js.map +0 -1
- package/dist/chunk-A2IYFNCQ.js.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -10
- package/dist/chunk-GQTWDKMJ.js +0 -5645
- package/dist/chunk-GQTWDKMJ.js.map +0 -1
- package/dist/chunk-GYSOQH5C.js.map +0 -1
- package/dist/chunk-OSD546W7.js.map +0 -1
- package/dist/chunk-PVZBYZZR.js.map +0 -1
- package/dist/chunk-UZJS7GMK.js.map +0 -1
- package/dist/chunk-WY6DGTBP.js.map +0 -1
- package/dist/chunk-YF43FOPP.js.map +0 -1
- package/dist/chunk-ZBTY6VV4.js.map +0 -1
- package/dist/fs-B5HZ2MIU.js.map +0 -1
- package/dist/fs-O5IQYXHO.js.map +0 -1
- package/dist/interactive-36ZZ64WL.js.map +0 -1
- package/dist/load-QPOWQD7C.js +0 -8
- package/dist/local-runtime-5O2NN3GA.js +0 -5
- package/dist/mcp-tools-I7JK3S2M.js +0 -4
- package/dist/model-manager-OEPY4I7W.js +0 -10
- package/dist/resolve-gguf-Y6FH3CNB.js +0 -9
- package/dist/session-ZJGENHKX.js +0 -13
- package/dist/session-store-WFBX7HXL.js +0 -4
- package/dist/stream-json-Z5KC2DM3.js +0 -78
- package/dist/stream-json-Z5KC2DM3.js.map +0 -1
- package/dist/ui-Q6DJ3GCU.js +0 -5
- package/dist/ui-Q6DJ3GCU.js.map +0 -1
- package/dist/vgd-3MHSB4KA.js.map +0 -1
|
@@ -209,6 +209,17 @@ function fitPack(input) {
|
|
|
209
209
|
if (pack.mode === "forge" && ((input.repo?.fileCount ?? 0) > 1e4 || (input.repo?.graphNodeCount ?? 0) > 1e5) && label === "comfortable") {
|
|
210
210
|
reasons.push("large repository \u2014 prefer moderated capsule + graph paging");
|
|
211
211
|
}
|
|
212
|
+
const diskNeedBytes = Math.round(modelBytes + Math.max(GiB, modelBytes * 0.15));
|
|
213
|
+
if (typeof input.freeDiskBytes === "number" && Number.isFinite(input.freeDiskBytes)) {
|
|
214
|
+
if (input.freeDiskBytes < diskNeedBytes) {
|
|
215
|
+
if (label !== "will_not_fit") {
|
|
216
|
+
label = "will_not_fit";
|
|
217
|
+
}
|
|
218
|
+
reasons.push(
|
|
219
|
+
`needs ~${fmtGb(diskNeedBytes)} free disk for weights, only ~${fmtGb(input.freeDiskBytes)} free`
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
212
223
|
let score = Math.max(0, Math.min(100, Math.round(ratio * 50)));
|
|
213
224
|
if (label === "will_not_fit") score = Math.min(score, 20);
|
|
214
225
|
if (label === "tight") score = Math.min(Math.max(score, 25), 45);
|
|
@@ -219,6 +230,8 @@ function fitPack(input) {
|
|
|
219
230
|
score,
|
|
220
231
|
needBytes,
|
|
221
232
|
availableBytes,
|
|
233
|
+
diskNeedBytes,
|
|
234
|
+
freeDiskBytes: typeof input.freeDiskBytes === "number" ? input.freeDiskBytes : void 0,
|
|
222
235
|
breakdown: {
|
|
223
236
|
modelBytes,
|
|
224
237
|
kvBytes,
|
|
@@ -261,9 +274,12 @@ function packToProfile(pack, underlying, fit) {
|
|
|
261
274
|
inferenceIsolation: pack.contract.inferenceIsolation ?? "embedded"
|
|
262
275
|
};
|
|
263
276
|
}
|
|
264
|
-
function tryWeights(pack, weights, system, repo, taskClass) {
|
|
277
|
+
function tryWeights(pack, weights, system, repo, taskClass, freeDiskBytes) {
|
|
265
278
|
const trial = { ...pack, primary: weights };
|
|
266
|
-
return {
|
|
279
|
+
return {
|
|
280
|
+
fit: fitPack({ system, pack: trial, repo, freeDiskBytes }),
|
|
281
|
+
underlying: weights
|
|
282
|
+
};
|
|
267
283
|
}
|
|
268
284
|
function resolveMode(opts) {
|
|
269
285
|
const packs = opts.packs ?? QUALIFIED_PACKS;
|
|
@@ -290,14 +306,14 @@ function resolveMode(opts) {
|
|
|
290
306
|
const candidates = [pack.primary, ...pack.fallback ?? []];
|
|
291
307
|
let best = null;
|
|
292
308
|
for (const w of candidates) {
|
|
293
|
-
const trial = tryWeights(pack, w, opts.system, opts.repo, opts.taskClass);
|
|
309
|
+
const trial = tryWeights(pack, w, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);
|
|
294
310
|
if (!best || fitRank(trial.fit) > fitRank(best.fit)) best = trial;
|
|
295
311
|
if (trial.fit.label === "flies" || trial.fit.label === "comfortable") {
|
|
296
312
|
best = trial;
|
|
297
313
|
break;
|
|
298
314
|
}
|
|
299
315
|
}
|
|
300
|
-
const chosen = best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass);
|
|
316
|
+
const chosen = best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);
|
|
301
317
|
const profile = packToProfile(pack, chosen.underlying, chosen.fit);
|
|
302
318
|
return {
|
|
303
319
|
schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,
|
|
@@ -350,6 +366,7 @@ function recommendMode(system, repo, packs = QUALIFIED_PACKS) {
|
|
|
350
366
|
function buildOrchestratorStatus(opts) {
|
|
351
367
|
const packs = opts.packs ?? QUALIFIED_PACKS;
|
|
352
368
|
const installed = new Set((opts.installedNames ?? []).map((n) => n.toLowerCase()));
|
|
369
|
+
const freeDiskBytes = opts.freeDiskBytes;
|
|
353
370
|
const recommended = recommendMode(opts.system, opts.repo, packs);
|
|
354
371
|
const pinFor = (mode) => {
|
|
355
372
|
const fromMap = opts.pins?.[mode];
|
|
@@ -363,6 +380,7 @@ function buildOrchestratorStatus(opts) {
|
|
|
363
380
|
autoFit: false,
|
|
364
381
|
system: opts.system,
|
|
365
382
|
repo: opts.repo,
|
|
383
|
+
freeDiskBytes,
|
|
366
384
|
pin: pinFor(mode),
|
|
367
385
|
packs
|
|
368
386
|
});
|
|
@@ -379,6 +397,7 @@ function buildOrchestratorStatus(opts) {
|
|
|
379
397
|
fitScore: resolved.fit.score,
|
|
380
398
|
needBytes: resolved.fit.needBytes,
|
|
381
399
|
availableBytes: resolved.fit.availableBytes,
|
|
400
|
+
diskNeedBytes: resolved.fit.diskNeedBytes,
|
|
382
401
|
installed: installedHit,
|
|
383
402
|
pinned: resolved.pinned
|
|
384
403
|
};
|
|
@@ -387,6 +406,7 @@ function buildOrchestratorStatus(opts) {
|
|
|
387
406
|
mode: recommended,
|
|
388
407
|
autoFit: false,
|
|
389
408
|
system: opts.system,
|
|
409
|
+
freeDiskBytes,
|
|
390
410
|
repo: opts.repo,
|
|
391
411
|
pin: pinFor(recommended),
|
|
392
412
|
packs
|
|
@@ -402,6 +422,7 @@ function buildOrchestratorStatus(opts) {
|
|
|
402
422
|
freeRamBytes: opts.system.freeRamBytes,
|
|
403
423
|
...typeof opts.system.vramTotalBytes === "number" ? { vramTotalBytes: opts.system.vramTotalBytes } : {},
|
|
404
424
|
...typeof opts.system.vramFreeBytes === "number" ? { vramFreeBytes: opts.system.vramFreeBytes } : {},
|
|
425
|
+
...typeof freeDiskBytes === "number" ? { freeDiskBytes } : {},
|
|
405
426
|
loaded: opts.system.loaded.map((l) => ({ name: l.name, bytes: l.bytes }))
|
|
406
427
|
},
|
|
407
428
|
memoryBreakdown: recResolved.fit.breakdown
|
|
@@ -484,5 +505,5 @@ function parseMode(raw) {
|
|
|
484
505
|
}
|
|
485
506
|
|
|
486
507
|
export { MODEL_ORCHESTRATOR_SCHEMA_VERSION, QUALIFIED_PACKS, activePin, buildOrchestratorStatus, fitPack, listModes, orchestratorStatePath, packById, packForMode, parseMode, pinPack, providerForBackend, readOrchestratorState, recommendMode, resolveMode, setDefaultMode, unpinPack, writeOrchestratorState };
|
|
487
|
-
//# sourceMappingURL=chunk-
|
|
488
|
-
//# sourceMappingURL=chunk-
|
|
508
|
+
//# sourceMappingURL=chunk-NZELMYT4.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-NZELMYT4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/model-orchestrator.ts"],"names":[],"mappings":";;;;;;AA6BO,IAAM,iCAAA,GAAoC;AAiLjD,IAAM,YAAA,GAAe,WAAA;AASd,IAAM,eAAA,GAAmC;AAAA,EAC9C;AAAA,IACE,MAAA,EAAQ,SAAS,YAAY,CAAA,CAAA;AAAA,IAC7B,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,OAAA;AAAA,IACb,OAAA,EAAS,mEAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,UAAA,EAAY,8BAAA;AAAA,MACZ,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA,KACvD;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA,OACvD;AAAA,MACA;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,oBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,oBAAoB,CAAA,CAAE;AAAA;AACzD,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,SAAA;AAAA,MACb,UAAA,EAAY,eAAA;AAAA,MACZ,mBAAA,EAAqB,GAAA;AAAA,MACrB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,IAAA;AAAA,MACnB,mBAAA,EAAqB,IAAA;AAAA,MACrB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,UAAA;AAAA,MACpB,eAAA,EAAiB,eAAA;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,WAAW,EAAE,QAAA,EAAU,GAAG,uBAAA,EAAyB,CAAA,GAAI,OAAO,IAAA,EAAK;AAAA,IACnE,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAQ,YAAY,CAAA,CAAA;AAAA,IAC5B,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,MAAA;AAAA,IACb,OAAA,EAAS,qDAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,UAAA,EAAY,8BAAA;AAAA,MACZ,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA,KACvD;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA,OACvD;AAAA,MACA;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA;AACvD,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,QAAA;AAAA,MACb,UAAA,EAAY,MAAA;AAAA,MACZ,mBAAA,EAAqB,IAAA;AAAA,MACrB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,IAAA;AAAA,MACnB,mBAAA,EAAqB,KAAA;AAAA,MACrB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,UAAA;AAAA,MACpB,eAAA,EAAiB,eAAA;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,SAAA,EAAW,EAAE,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,EAAG,uBAAA,EAAyB,CAAA,GAAI,IAAA,GAAO,IAAA,EAAK;AAAA,IACjF,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,SAAS,YAAY,CAAA,CAAA;AAAA,IAC7B,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,OAAA;AAAA,IACb,OAAA,EAAS,gEAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,UAAA,EAAY,+BAAA;AAAA,MACZ,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,YAAA,EAAc,kBAAA,CAAmB,mBAAmB,CAAA,CAAE;AAAA,KACxD;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,mBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,mBAAmB,CAAA,CAAE;AAAA,OACxD;AAAA,MACA;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,YAAA;AAAA,QACT,YAAA,EAAc,kBAAA,CAAmB,kBAAkB,CAAA,CAAE;AAAA;AACvD,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,QAAA;AAAA,MACb,UAAA,EAAY,eAAA;AAAA,MACZ,mBAAA,EAAqB,GAAA;AAAA,MACrB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,GAAA;AAAA,MACnB,mBAAA,EAAqB,KAAA;AAAA,MACrB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,UAAA;AAAA,MACpB,eAAA,EAAiB,eAAA;AAAA,MACjB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,SAAA,EAAW,EAAE,QAAA,EAAU,EAAA,EAAI,WAAW,EAAA,EAAI,uBAAA,EAAyB,CAAA,GAAI,IAAA,GAAO,IAAA,EAAK;AAAA,IACnF,UAAA,EAAY;AAAA,MACV,KAAA,EACE;AAAA;AACJ;AAEJ;AAEA,IAAM,MAAM,IAAA,IAAQ,CAAA;AAWpB,IAAM,gBAAA,GAAmB;AAAA,EACvB,UAAU,GAAA,GAAM,GAAA;AAAA,EAChB,SAAS,CAAA,GAAI,GAAA;AAAA,EACb,YAAY,GAAA,GAAM,GAAA;AAAA,EAClB,YAAY,IAAA,GAAO,GAAA;AAAA,EACnB,mBAAmB,CAAA,GAAI;AACzB,CAAA;AAGA,IAAM,sBAAA,GAAyB,IAAA;AAIxB,SAAS,WAAA,CAAY,IAAA,EAAiB,KAAA,GAAyB,eAAA,EAAuC;AAC3G,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,IAAA;AAC/C;AAEO,SAAS,QAAA,CAAS,MAAA,EAAgB,KAAA,GAAyB,eAAA,EAAuC;AACvG,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,IAAK,IAAA;AACnD;AAEO,SAAS,SAAA,GAAyB;AACvC,EAAA,OAAO,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAClC;AAUO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,MAAM,IAAI,EAAE,GAAG,gBAAA,EAAkB,GAAG,MAAM,QAAA,EAAS;AACnD,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,YAAA,GACJ,KAAK,OAAA,CAAQ,YAAA,IACb,mBAAmB,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,KAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,mBAAA,IAAuB,IAAA,CAAK,SAAS,mBAAA,GAAsB,CAAA;AACnF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,uBAAA,IAA2B,IAAI,IAAA,GAAO,IAAA;AACrE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,SAAA,GAAY,MAAQ,OAAO,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,YAAA;AACnB,EAAA,MAAM,YAAY,UAAA,GAAa,OAAA;AAE/B,EAAA,MAAM,OAAA,GACJ,OAAO,KAAA,CAAM,MAAA,CAAO,mBAAmB,QAAA,IAAY,KAAA,CAAM,OAAO,cAAA,GAAiB,CAAA;AACnF,EAAA,MAAM,UAAU,OAAA,GACX,KAAA,CAAM,OAAO,aAAA,IAAiB,CAAA,GAC/B,MAAM,MAAA,CAAO,YAAA;AACjB,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAEvE,EAAA,MAAM,WAAW,OAAA,GAAU,WAAA;AAE3B,EAAA,MAAM,SAAA,GAAA,CACH,KAAA,CAAM,IAAA,EAAM,cAAA,IAAkB,KAAK,GAAA,GAChC,GAAA,GAAM,GAAA,GAAA,CACL,KAAA,CAAM,IAAA,EAAM,SAAA,IAAa,CAAA,IAAK,GAAA,GAC7B,OAAO,GAAA,GACP,CAAA;AACR,EAAA,MAAM,UAAA,GAAa,EAAE,UAAA,GAAa,SAAA;AAKlC,EAAA,MAAM,QAAA,GAAW,OAAA,GACb,CAAA,CAAE,iBAAA,GACF,UAAA,GACA,CAAA,CAAE,UAAA,GACF,CAAA,CAAE,iBAAA,GACF,sBAAA,IAA0B,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,OAAA,CAAA;AAC7C,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,QAAQ,CAAA;AAEzD,EAAA,MAAM,cAAA,GAAiB,iBAAA;AACvB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,WAAW,cAAA,GAAiB,SAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,CAAA,GAAI,cAAA,GAAiB,SAAA,GAAY,CAAA;AAE3D,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,0BAAA;AAEJ,EAAA,IAAI,cAAA,GAAiB,YAAY,IAAA,EAAM;AACrC,IAAA,KAAA,GAAQ,cAAA;AACR,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,UAAU,KAAA,CAAM,SAAS,CAAC,CAAA,WAAA,EAAc,KAAA,CAAM,cAAc,CAAC,CAAA,uBAAA;AAAA,KAC/D;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,GAAQ,GAAA,IAAO,QAAA,GAAW,MAAM,GAAA,EAAK;AAC9C,IAAA,KAAA,GAAQ,OAAA;AACR,IAAA,0BAAA,GAA6B,IAAA,CAAK,GAAA;AAAA,MAChC,IAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,sBAAsB,IAAI;AAAA,KACrD;AACA,IAAA,OAAA,CAAQ,KAAK,+DAA0D,CAAA;AAAA,EACzE,CAAA,MAAA,IAAW,KAAA,IAAS,GAAA,IAAO,QAAA,IAAY,IAAI,GAAA,EAAK;AAC9C,IAAA,KAAA,GAAQ,OAAA;AACR,IAAA,OAAA,CAAQ,KAAK,oCAAoC,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,aAAA;AACR,IAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAAA,EAC/C;AAGA,EAAA,IACE,IAAA,CAAK,IAAA,KAAS,OAAA,KAAA,CACZ,KAAA,CAAM,MAAM,SAAA,IAAa,CAAA,IAAK,GAAA,IAAA,CAAW,KAAA,CAAM,IAAA,EAAM,cAAA,IAAkB,CAAA,IAAK,GAAA,CAAA,IAC9E,UAAU,aAAA,EACV;AACA,IAAA,OAAA,CAAQ,KAAK,iEAA4D,CAAA;AAAA,EAC3E;AAGA,EAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,UAAA,GAAa,KAAK,GAAA,CAAI,GAAA,EAAK,UAAA,GAAa,IAAI,CAAC,CAAA;AAC9E,EAAA,IAAI,OAAO,MAAM,aAAA,KAAkB,QAAA,IAAY,OAAO,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA,EAAG;AACnF,IAAA,IAAI,KAAA,CAAM,gBAAgB,aAAA,EAAe;AACvC,MAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,QAAA,KAAA,GAAQ,cAAA;AAAA,MACV;AACA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,OAAA,EAAU,MAAM,aAAa,CAAC,iCAAiC,KAAA,CAAM,KAAA,CAAM,aAAa,CAAC,CAAA,KAAA;AAAA,OAC3F;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAC,CAAC,CAAA;AAC7D,EAAA,IAAI,UAAU,cAAA,EAAgB,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,EAAE,CAAA;AACxD,EAAA,IAAI,KAAA,KAAU,OAAA,EAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA;AAC/D,EAAA,IAAI,KAAA,KAAU,aAAA,EAAe,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA;AACrE,EAAA,IAAI,UAAU,OAAA,EAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,EAAE,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAe,OAAO,KAAA,CAAM,aAAA,KAAkB,QAAA,GAAW,MAAM,aAAA,GAAgB,MAAA;AAAA,IAC/E,SAAA,EAAW;AAAA,MACT,UAAA;AAAA,MACA,OAAA;AAAA;AAAA,MAEA,QAAA,EAAU,OAAA,GAAU,CAAA,GAAI,sBAAA,GAAyB,CAAA,CAAE,QAAA;AAAA,MACnD,OAAA,EAAS,OAAA,GAAU,CAAA,GAAI,sBAAA,GAAyB,CAAA,CAAE,OAAA;AAAA,MAClD,UAAA,EAAY,UAAU,CAAA,GAAI,UAAA;AAAA,MAC1B,UAAA,EAAY,OAAA,GAAU,CAAA,GAAI,CAAA,CAAE,UAAA;AAAA,MAC5B,sBAAA,EAAwB;AAAA,KAC1B;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AACpC;AAqBA,SAAS,aAAA,CAAc,IAAA,EAAqB,UAAA,EAA4B,GAAA,EAAuC;AAC7G,EAAA,MAAM,MAAA,GACJ,IAAI,KAAA,KAAU,OAAA,IAAW,IAAI,0BAAA,GACzB,GAAA,CAAI,0BAAA,GACJ,IAAA,CAAK,QAAA,CAAS,mBAAA;AACpB,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,sCAAA;AAAA,IACf,IAAI,UAAA,CAAW,UAAA;AAAA,IACf,aAAa,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,MAAA,EAAM,WAAW,UAAU,CAAA,CAAA;AAAA,IAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EACE,UAAA,CAAW,OAAA,KAAY,QAAA,GACnB,QAAA,GACA,UAAA,CAAW,OAAA,KAAY,WAAA,GACrB,WAAA,GACA,UAAA,CAAW,OAAA,KAAY,WAAA,GACrB,mBAAA,GACA,OAAA;AAAA,IACV,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,IAC3B,UAAA,EAAY,KAAK,QAAA,CAAS,UAAA;AAAA,IAC1B,mBAAA,EAAqB,MAAA;AAAA,IACrB,gBAAA,EAAkB,KAAK,QAAA,CAAS,gBAAA;AAAA,IAChC,eAAA,EAAiB,KAAK,QAAA,CAAS,eAAA;AAAA,IAC/B,WAAA,EAAa,CAAA;AAAA,IACb,mBAAA,EAAqB,IAAA,CAAK,QAAA,CAAS,mBAAA,IAAuB,KAAA;AAAA,IAC1D,eAAA,EAAiB,KAAK,QAAA,CAAS,eAAA;AAAA,IAC/B,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,KAAK,SAAA,CAAU,QAAA;AAAA,MACzB,SAAA,EAAW,KAAK,SAAA,CAAU,SAAA;AAAA,MAC1B,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,IACA,YAAA,EAAc,KAAK,QAAA,CAAS,YAAA;AAAA,IAC5B,kBAAA,EAAoB,IAAA,CAAK,QAAA,CAAS,kBAAA,IAAsB;AAAA,GAC1D;AACF;AAEA,SAAS,WACP,IAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACA,WACA,aAAA,EACgD;AAChD,EAAA,MAAM,KAAA,GAAuB,EAAE,GAAG,IAAA,EAAM,SAAS,OAAA,EAAQ;AACzD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,EAAE,MAAA,EAAQ,MAAM,KAAA,EAAO,IAAA,EAAiB,aAAA,EAAe,CAAA;AAAA,IACpE,UAAA,EAAY;AAAA,GACd;AACF;AAOO,SAAS,YAAY,IAAA,EAAwC;AAClE,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,eAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,MAAA;AACxC,EAAA,IAAI,IAAA,GAAkB,KAAK,IAAA,IAAQ,WAAA;AACnC,EAAA,IAAI,SAAA,GAAuC,IAAA,CAAK,IAAA,GAAO,UAAA,GAAa,SAAA;AAEpE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,YAAY,KAAA,EAAO;AACxC,IAAA,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AAClD,IAAA,SAAA,GAAY,UAAA;AAAA,EACd;AAEA,EAAA,IAAI,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAO,WAAA,CAAY,QAAQ,KAAK,CAAA;AAChC,IAAA,IAAA,GAAO,MAAA;AACP,IAAA,SAAA,GAAY,SAAA;AAAA,EACd;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,SAAS,IAAA,EAAM;AACtC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,QAAQ,KAAK,CAAA;AAC9C,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,IAAA,EAAM;AAClC,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,SAAA,GAAY,QAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,OAAA,EAAS,GAAI,IAAA,CAAK,QAAA,IAAY,EAAG,CAAA;AAC1D,EAAA,IAAI,IAAA,GAA8D,IAAA;AAElE,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,aAAa,CAAA;AAC5F,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,GAAO,KAAA;AAC5D,IAAA,IAAI,MAAM,GAAA,CAAI,KAAA,KAAU,WAAW,KAAA,CAAM,GAAA,CAAI,UAAU,aAAA,EAAe;AACpE,MAAA,IAAA,GAAO,KAAA;AACP,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GACJ,IAAA,IAAQ,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,KAAK,aAAa,CAAA;AACnG,EAAA,MAAM,UAAU,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,OAAO,GAAG,CAAA;AAEjE,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,iCAAA;AAAA,IACf,IAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,OAAA;AAAA,IACA,QAAQ,SAAA,KAAc,QAAA;AAAA,IACtB;AAAA,GACF;AACF;AAEA,SAAS,QAAQ,CAAA,EAAsB;AACrC,EAAA,MAAM,KAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAA;AAAA,IACb,KAAA,EAAO,CAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AACA,EAAA,OAAO,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,GAAI,MAAO,CAAA,CAAE,KAAA;AACnC;AAMO,SAAS,aAAA,CACd,MAAA,EACA,IAAA,EACA,KAAA,GAAyB,eAAA,EACd;AACX,EAAA,MAAM,KAAA,GAAqB,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,IAAI,SAAA,GAA8B,IAAA;AAClC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,WAAW,WAAA,CAAY;AAAA,MAC3B,IAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,SAAS,GAAA,CAAI,KAAA,KAAU,WAAW,QAAA,CAAS,GAAA,CAAI,UAAU,aAAA,EAAe;AAE1E,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,CAAA;AAC9E,QAAA,IAAI,KAAK,GAAA,CAAI,KAAA,KAAU,WAAW,IAAA,CAAK,GAAA,CAAI,UAAU,aAAA,EAAe;AAClE,UAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,IAAa,CAAA;AACjC,UAAA,IAAI,KAAA,GAAQ,KAAM,OAAO,MAAA;AAAA,QAC3B;AACA,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,GAAA,CAAI,KAAA,KAAU,OAAA,IAAW,CAAC,WAAW,SAAA,GAAY,IAAA;AAAA,EAChE;AACA,EAAA,OAAO,SAAA,IAAa,OAAA;AACtB;AAGO,SAAS,wBAAwB,IAAA,EAWjB;AACrB,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,eAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAA,CAAK,IAAA,CAAK,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACjF,EAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,EAAA,MAAM,cAAc,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAgE;AAC9E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,IAAI,CAAA;AAChC,IAAA,IAAI,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAQ;AAC5C,IAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,KAAS,IAAA,SAAa,IAAA,CAAK,GAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,SAAA,EAAU,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACtC,IAAA,MAAM,WAAW,WAAA,CAAY;AAAA,MAC3B,IAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAA;AAAA,MACA,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,UAAA,CAAW,UAAA,CAAW,WAAA,EAAY;AACtD,IAAA,MAAM,eACJ,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,IAChB,CAAC,GAAG,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,KAAK,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAC7D,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,MAAA,EAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,MACtB,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,MAC3B,OAAA,EAAS,SAAS,IAAA,CAAK,OAAA;AAAA,MACvB,iBAAA,EAAmB,SAAS,UAAA,CAAW,UAAA;AAAA,MACvC,OAAA,EAAS,SAAS,UAAA,CAAW,OAAA;AAAA,MAC7B,GAAA,EAAK,SAAS,GAAA,CAAI,KAAA;AAAA,MAClB,QAAA,EAAU,SAAS,GAAA,CAAI,KAAA;AAAA,MACvB,SAAA,EAAW,SAAS,GAAA,CAAI,SAAA;AAAA,MACxB,cAAA,EAAgB,SAAS,GAAA,CAAI,cAAA;AAAA,MAC7B,aAAA,EAAe,SAAS,GAAA,CAAI,aAAA;AAAA,MAC5B,SAAA,EAAW,YAAA;AAAA,MACX,QAAQ,QAAA,CAAS;AAAA,KACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,cAAc,WAAA,CAAY;AAAA,IAC9B,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAA;AAAA,IACA,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,GAAA,EAAK,OAAO,WAAW,CAAA;AAAA,IACvB;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,iCAAA;AAAA,IACf,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,GAAA,EAAK,OAAO,WAAW,CAAA;AAAA,IACvB,KAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,MAC1B,GAAI,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,KAAmB,QAAA,GACtC,EAAE,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,cAAA,EAAe,GAC7C,EAAC;AAAA,MACL,GAAI,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,KAAkB,QAAA,GACrC,EAAE,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc,GAC3C,EAAC;AAAA,MACL,GAAI,OAAO,aAAA,KAAkB,WAAW,EAAE,aAAA,KAAkB,EAAC;AAAA,MAC7D,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE;AAAA,KAC1E;AAAA,IACA,eAAA,EAAiB,YAAY,GAAA,CAAI;AAAA,GACnC;AACF;AAaO,SAAS,sBACd,GAAA,GAAyB,OAAA,CAAQ,KACjC,QAAA,GAA4B,OAAA,CAAQ,UACpC,IAAA,EACQ;AACR,EAAA,OAAY,UAAK,eAAA,CAAgB,GAAA,EAAK,UAAU,IAAI,CAAA,EAAG,sBAAsB,YAAY,CAAA;AAC3F;AAEO,SAAS,sBACd,GAAA,GAAyB,OAAA,CAAQ,KACjC,QAAA,GAA4B,OAAA,CAAQ,UACpC,IAAA,EACsB;AACtB,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAS,EAAA,CAAA,YAAA,CAAa,CAAA,EAAG,MAAM,CAAC,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,0BAAA;AAAA,MACf,IAAA,EAAM,IAAI,IAAA,IAAQ,OAAO,IAAI,IAAA,KAAS,QAAA,GAAW,GAAA,CAAI,IAAA,GAAO,EAAC;AAAA,MAC7D,WAAA,EACE,GAAA,CAAI,WAAA,KAAgB,OAAA,IAAW,GAAA,CAAI,WAAA,KAAgB,MAAA,IAAU,GAAA,CAAI,WAAA,KAAgB,OAAA,GAC7E,GAAA,CAAI,WAAA,GACJ,KAAA,CAAA;AAAA,MACN,SAAA,EAAW,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GAAW,GAAA,CAAI,SAAA,GAAA,iBAAY,IAAI,IAAA,CAAK,CAAC,CAAA,EAAE,WAAA;AAAY,KACzF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,0BAAA;AAAA,MACf,MAAM,EAAC;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,CAAK,CAAC,GAAE,WAAA;AAAY,KACrC;AAAA,EACF;AACF;AAEO,SAAS,sBAAA,CACd,OACA,GAAA,GAAyB,OAAA,CAAQ,KACjC,QAAA,GAA4B,OAAA,CAAQ,UACpC,IAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACnD,EAAG,aAAe,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,MAAM,IAAA,GAA6B;AAAA,IACjC,GAAG,KAAA;AAAA,IACH,aAAA,EAAe,0BAAA;AAAA,IACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AACA,EAAG,EAAA,CAAA,aAAA,CAAc,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAChE,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,OAAA,CACd,IAAA,EACA,MAAA,EACA,GAAA,EACA,UACA,IAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACvD,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAE,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACnB,EAAA,sBAAA,CAAuB,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,SAAA,CACd,IAAA,EACA,GAAA,EACA,QAAA,EACA,IAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACvD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACtB,EAAA,sBAAA,CAAuB,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAA,CACd,IAAA,EACA,GAAA,EACA,QAAA,EACA,IAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACvD,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,EAAA,sBAAA,CAAuB,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,SAAA,CACd,IAAA,EACA,KAAA,GAA8B,qBAAA,EAAsB,EACR;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,OAAO,MAAA,GAAS,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,IAAA;AACrC;AAGO,SAAS,mBAAmB,OAAA,EAA4C;AAC7E,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAGO,SAAS,UAAU,GAAA,EAAkD;AAC1E,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACjC,EAAA,IAAI,MAAM,OAAA,IAAW,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,SAAS,OAAO,CAAA;AAC3D,EAAA,OAAO,IAAA;AACT","file":"chunk-NZELMYT4.js","sourcesContent":["/**\n * Vibgrate Model Orchestrator — Code Modes (Spark / Flow / Forge).\n *\n * Product stance (PRD): users and agents select outcome-oriented **Code Modes**,\n * never GGUF names by default. This module:\n * 1. Declares versioned **qualified packs** (contract + primary/fallback weights)\n * 2. Runs a **fit** algorithm (available memory now × reserves × repo signals)\n * 3. Resolves mode → pack → concrete model / backend\n * 4. Supports pin/unpin for reproducibility\n *\n * Pure resolve + fit helpers have no I/O. Registry pin state uses the global\n * Vibgrate data dir (never in-repo). Pull/ensure is a separate CLI concern that\n * calls into `vg models pull` after resolve.\n *\n * schemaVersion: model-orchestrator/0\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { estimateModelBytes, type SystemMemory } from '../code/capability.js';\nimport {\n MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n type ModelExecutionProfile,\n type ModelMode,\n type ToolCallingMode,\n type EditFormatPreference,\n} from './model-execution-profile.js';\nimport { vibgrateDataDir } from './paths.js';\n\nexport const MODEL_ORCHESTRATOR_SCHEMA_VERSION = 'model-orchestrator/0' as const;\n\n/** UX fit vocabulary (stricter than “weights fit”). */\nexport type FitLabel = 'flies' | 'comfortable' | 'tight' | 'will_not_fit';\n\nexport type TaskClass = 'spark_task' | 'flow_task' | 'forge_task' | 'explicit_mode';\n\nexport interface PackWeightsRef {\n /** Backend that can load these weights. */\n backend: 'ollama' | 'llama.cpp' | 'lm-studio' | 'foundry-local' | 'other';\n /** Concrete model id / slug (e.g. qwen2.5-coder:3b). */\n weightsRef: string;\n quant?: string;\n /** SPDX / short license note for first-download surface. */\n license?: string;\n /** Approx weights size in bytes (for fit when not discoverable). */\n weightsBytes?: number;\n /**\n * Optional HTTPS GGUF URL for the first-party weight store (must pass host\n * allowlist). When set, `vg models install` can download without Ollama.\n */\n downloadUrl?: string;\n /** Optional content hash for downloaded GGUF. */\n sha256?: string;\n}\n\nexport interface PackContract {\n toolCalling: ToolCallingMode;\n editFormat: EditFormatPreference;\n capsuleBudgetTokens: number;\n maxRepairRounds: number;\n maxParallelEdits: number;\n /** Minimum qualification score (0–1) this pack was gated on. */\n minEffectiveScore?: number;\n constrainedDecoding?: boolean;\n kvCacheStrategy?: ModelExecutionProfile['kvCacheStrategy'];\n securityTier?: ModelExecutionProfile['securityTier'];\n /**\n * Preferred inference path when available (ADR-005). Weights may still be\n * pulled via Ollama; embedded llama.cpp is preferred for sampler/grammar.\n */\n preferredInference?: 'ollama' | 'llama.cpp';\n /** Process isolation for preferredInference llama.cpp (default embedded). */\n inferenceIsolation?: ModelExecutionProfile['inferenceIsolation'];\n}\n\nexport interface QualifiedPack {\n /** e.g. flow@2026.07.1 */\n packId: string;\n mode: ModelMode;\n displayName: string;\n /** User-facing promise (one line). */\n promise: string;\n primary: PackWeightsRef;\n fallback?: PackWeightsRef[];\n contract: PackContract;\n resources: {\n minRamGb: number;\n minVramGb?: number;\n /** Estimated KV cache bytes per 1k context tokens. */\n estimatedKvPer1kContext?: number;\n };\n provenance?: {\n evalRunIds?: string[];\n notes?: string;\n };\n}\n\nexport interface RepoSignals {\n /** Approximate source file count (0 = unknown). */\n fileCount?: number;\n /** Graph node count when a map is warm (0 = unknown). */\n graphNodeCount?: number;\n /** Dominant languages (optional). */\n languages?: string[];\n}\n\nexport interface FitInput {\n system: SystemMemory;\n pack: QualifiedPack;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /**\n * Free space on the volume that holds model weights (weight store / Ollama).\n * When set, insufficient disk for the GGUF forces {@link FitLabel will_not_fit}.\n */\n freeDiskBytes?: number;\n /**\n * Static reserves (bytes) for IDE / OS / graph / tests.\n * Defaults applied when omitted.\n */\n reserves?: {\n ideBytes?: number;\n osBytes?: number;\n graphBytes?: number;\n testsBytes?: number;\n safetyMarginBytes?: number;\n };\n /** Context budget used to estimate KV (tokens). Defaults from pack contract. */\n contextBudgetTokens?: number;\n}\n\nexport interface FitResult {\n label: FitLabel;\n /** 0–100; higher is more headroom. */\n score: number;\n needBytes: number;\n availableBytes: number;\n /** Disk needed to store weights safely (weights + 15% + ≥1 GiB floor). */\n diskNeedBytes?: number;\n /** Free disk observed when fit was computed (if provided). */\n freeDiskBytes?: number;\n /** Breakdown for “memory pie” UX. */\n breakdown: {\n modelBytes: number;\n kvBytes: number;\n ideBytes: number;\n osBytes: number;\n graphBytes: number;\n testsBytes: number;\n freeAfterReservesBytes: number;\n };\n /** When tight: suggested reduced capsule budget. */\n reducedCapsuleBudgetTokens?: number;\n reasons: string[];\n}\n\nexport interface ResolvedMode {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n mode: ModelMode;\n pack: QualifiedPack;\n /** Concrete weights chosen (primary or fallback after fit). */\n underlying: PackWeightsRef;\n fit: FitResult;\n profile: ModelExecutionProfile;\n /** True when pack id was pinned by the user. */\n pinned: boolean;\n /** How the mode was chosen. */\n selection: 'explicit' | 'default' | 'auto_fit' | 'pinned';\n}\n\nexport interface OrchestratorStatus {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n defaultMode: ModelMode;\n pin?: { mode: ModelMode; packId: string } | null;\n modes: Array<{\n mode: ModelMode;\n packId: string;\n displayName: string;\n promise: string;\n underlyingModelId: string;\n backend: string;\n fit: FitLabel;\n fitScore: number;\n needBytes: number;\n availableBytes: number;\n /** Disk budget for storing this pack’s weights (when free disk was known). */\n diskNeedBytes?: number;\n installed: boolean;\n pinned: boolean;\n }>;\n recommended: ModelMode;\n system: {\n totalRamBytes: number;\n freeRamBytes: number;\n vramTotalBytes?: number;\n vramFreeBytes?: number;\n loaded: Array<{ name: string; bytes: number }>;\n /** Free bytes on the model-cache volume (when probed). */\n freeDiskBytes?: number;\n };\n memoryBreakdown?: FitResult['breakdown'];\n}\n\n// ── Curated packs (versioned; weights may change under the same mode contract) ─\n\n/** Pack channel — bump when contracts or weight refs change under stable mode names. */\nconst PACK_CHANNEL = '2026.07.4';\n\n/**\n * Current qualified packs — one primary per mode.\n *\n * Approach B default: Spark/Flow **primary** is first-party GGUF (llama.cpp)\n * for install + inference when fit allows. Ollama remains an explicit fallback\n * adapter, not the default path.\n */\nexport const QUALIFIED_PACKS: QualifiedPack[] = [\n {\n packId: `spark@${PACK_CHANNEL}`,\n mode: 'spark',\n displayName: 'Spark',\n promise: 'Fastest capable local coding — simple edits, minimal memory.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-3b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:1.5b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:1.5b').bytes,\n },\n ],\n contract: {\n toolCalling: 'grammar',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 2000,\n maxRepairRounds: 2,\n maxParallelEdits: 2,\n minEffectiveScore: 0.55,\n constrainedDecoding: true,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 4, estimatedKvPer1kContext: 2 * 1024 * 1024 },\n provenance: {\n notes: 'Spark@2026.07.4 — Approach B: first-party GGUF + embedded vibgrate manager; Ollama pack fallback only',\n },\n },\n {\n packId: `flow@${PACK_CHANNEL}`,\n mode: 'flow',\n displayName: 'Flow',\n promise: 'Best everyday graph-guided coding for this machine.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-7b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'auto',\n capsuleBudgetTokens: 3500,\n maxRepairRounds: 2,\n maxParallelEdits: 4,\n minEffectiveScore: 0.65,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 8, minVramGb: 6, estimatedKvPer1kContext: 4 * 1024 * 1024 },\n provenance: {\n notes: 'Flow@2026.07.4 — first-party GGUF primary; Ollama pack fallback only',\n },\n },\n {\n packId: `forge@${PACK_CHANNEL}`,\n mode: 'forge',\n displayName: 'Forge',\n promise: 'Strongest deep work that safely fits (migrations, multi-file).',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-14b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:14b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 6000,\n maxRepairRounds: 3,\n maxParallelEdits: 6,\n minEffectiveScore: 0.7,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 16, minVramGb: 12, estimatedKvPer1kContext: 8 * 1024 * 1024 },\n provenance: {\n notes:\n 'Forge@2026.07.4 — first-party 14B GGUF + embedded vibgrate manager (same path as Spark/Flow); Ollama pack fallback only',\n },\n },\n];\n\nconst GiB = 1024 ** 3;\n\n/**\n * Static reserves applied on top of *available* RAM.\n *\n * Important: `freeRamBytes` is already residual after currently-running\n * processes (IDE, OS, browsers, …). Subtracting a full IDE/OS footprint again\n * double-counts and falsely zeros fit on healthy machines. Keep growth\n * headroom for graph/tests (often not yet resident) + safety, and a modest\n * fraction of IDE/OS for workspace growth under load.\n */\nconst DEFAULT_RESERVES = {\n ideBytes: 1.5 * GiB,\n osBytes: 2 * GiB,\n graphBytes: 0.5 * GiB,\n testsBytes: 0.25 * GiB,\n safetyMarginBytes: 1 * GiB,\n};\n\n/** Fraction of IDE+OS reserves kept as growth headroom on the free-RAM path. */\nconst IDE_OS_GROWTH_FRACTION = 0.25;\n\n// ── Pack lookup ───────────────────────────────────────────────────────────────\n\nexport function packForMode(mode: ModelMode, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.mode === mode) ?? null;\n}\n\nexport function packById(packId: string, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.packId === packId) ?? null;\n}\n\nexport function listModes(): ModelMode[] {\n return ['spark', 'flow', 'forge'];\n}\n\n// ── Fit algorithm ─────────────────────────────────────────────────────────────\n\n/**\n * Fit decision: available memory *now* after IDE/OS/graph/tests reserves and\n * safety margin — not only “weights fit in total RAM”.\n *\n * Target: < 100 ms once system snapshot is warm (pure arithmetic).\n */\nexport function fitPack(input: FitInput): FitResult {\n const r = { ...DEFAULT_RESERVES, ...input.reserves };\n const pack = input.pack;\n const weightsBytes =\n pack.primary.weightsBytes ??\n estimateModelBytes(pack.primary.weightsRef).bytes;\n const ctxTokens = input.contextBudgetTokens ?? pack.contract.capsuleBudgetTokens * 2;\n const kvPer1k = pack.resources.estimatedKvPer1kContext ?? 2 * 1024 * 1024;\n const kvBytes = Math.round((ctxTokens / 1000) * kvPer1k);\n const modelBytes = weightsBytes;\n const needBytes = modelBytes + kvBytes;\n\n const useVram =\n typeof input.system.vramTotalBytes === 'number' && input.system.vramTotalBytes > 0;\n const freeNow = useVram\n ? (input.system.vramFreeBytes ?? 0)\n : input.system.freeRamBytes;\n const loadedBytes = input.system.loaded.reduce((n, m) => n + m.bytes, 0);\n // Prefer free-after-unload for fit of *next* load when something is resident.\n const freePool = freeNow + loadedBytes;\n\n const graphBump =\n (input.repo?.graphNodeCount ?? 0) > 50_000\n ? 0.5 * GiB\n : (input.repo?.fileCount ?? 0) > 5_000\n ? 0.25 * GiB\n : 0;\n const graphBytes = r.graphBytes + graphBump;\n\n // On discrete VRAM, only model+KV compete for VRAM — host reserves stay on RAM.\n // On unified / CPU path: free/available RAM already excludes current IDE/OS\n // usage, so only charge growth (graph/tests/safety + modest IDE/OS headroom).\n const reserved = useVram\n ? r.safetyMarginBytes\n : graphBytes +\n r.testsBytes +\n r.safetyMarginBytes +\n IDE_OS_GROWTH_FRACTION * (r.ideBytes + r.osBytes);\n const freeAfterReserves = Math.max(0, freePool - reserved);\n\n const availableBytes = freeAfterReserves;\n const reasons: string[] = [];\n const headroom = availableBytes - needBytes;\n const ratio = needBytes > 0 ? availableBytes / needBytes : 0;\n\n let label: FitLabel;\n let reducedCapsuleBudgetTokens: number | undefined;\n\n if (availableBytes < needBytes * 0.85) {\n label = 'will_not_fit';\n reasons.push(\n `needs ~${fmtGb(needBytes)} but only ~${fmtGb(availableBytes)} is free after reserves`,\n );\n } else if (ratio < 1.1 || headroom < 0.5 * GiB) {\n label = 'tight';\n reducedCapsuleBudgetTokens = Math.max(\n 1200,\n Math.floor(pack.contract.capsuleBudgetTokens * 0.65),\n );\n reasons.push('tight fit — capsule budget will be reduced automatically');\n } else if (ratio >= 1.6 && headroom >= 2 * GiB) {\n label = 'flies';\n reasons.push('comfortable headroom for this mode');\n } else {\n label = 'comfortable';\n reasons.push('within policy for this machine');\n }\n\n // Large monorepo + forge → soft-downgrade score (does not force will_not_fit).\n if (\n pack.mode === 'forge' &&\n ((input.repo?.fileCount ?? 0) > 10_000 || (input.repo?.graphNodeCount ?? 0) > 100_000) &&\n label === 'comfortable'\n ) {\n reasons.push('large repository — prefer moderated capsule + graph paging');\n }\n\n // Disk: downloads need the full GGUF + headroom on the cache volume (not RAM).\n const diskNeedBytes = Math.round(modelBytes + Math.max(GiB, modelBytes * 0.15));\n if (typeof input.freeDiskBytes === 'number' && Number.isFinite(input.freeDiskBytes)) {\n if (input.freeDiskBytes < diskNeedBytes) {\n if (label !== 'will_not_fit') {\n label = 'will_not_fit';\n }\n reasons.push(\n `needs ~${fmtGb(diskNeedBytes)} free disk for weights, only ~${fmtGb(input.freeDiskBytes)} free`,\n );\n }\n }\n\n // Score: map ratio into 0–100 with floors for labels.\n let score = Math.max(0, Math.min(100, Math.round(ratio * 50)));\n if (label === 'will_not_fit') score = Math.min(score, 20);\n if (label === 'tight') score = Math.min(Math.max(score, 25), 45);\n if (label === 'comfortable') score = Math.min(Math.max(score, 50), 75);\n if (label === 'flies') score = Math.max(score, 80);\n\n return {\n label,\n score,\n needBytes,\n availableBytes,\n diskNeedBytes,\n freeDiskBytes: typeof input.freeDiskBytes === 'number' ? input.freeDiskBytes : undefined,\n breakdown: {\n modelBytes,\n kvBytes,\n // Report the charged growth headroom (not the full static IDE/OS footprint).\n ideBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.ideBytes,\n osBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.osBytes,\n graphBytes: useVram ? 0 : graphBytes,\n testsBytes: useVram ? 0 : r.testsBytes,\n freeAfterReservesBytes: freeAfterReserves,\n },\n reducedCapsuleBudgetTokens,\n reasons,\n };\n}\n\nfunction fmtGb(bytes: number): string {\n return `${(bytes / GiB).toFixed(1)} GiB`;\n}\n\n// ── Resolve mode → pack → underlying ──────────────────────────────────────────\n\nexport interface ResolveModeOptions {\n mode?: ModelMode;\n /** Prefer auto-fit when no mode set (default true for first-run wizard). */\n autoFit?: boolean;\n system: SystemMemory;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /** Free disk on the weight-store volume (bytes). */\n freeDiskBytes?: number;\n /** Installed model names (ollama/lmstudio) for installed: true. */\n installedNames?: string[];\n /** Pin map mode → packId. */\n pin?: { mode: ModelMode; packId: string } | null;\n packs?: QualifiedPack[];\n defaultMode?: ModelMode;\n}\n\nfunction packToProfile(pack: QualifiedPack, underlying: PackWeightsRef, fit: FitResult): ModelExecutionProfile {\n const budget =\n fit.label === 'tight' && fit.reducedCapsuleBudgetTokens\n ? fit.reducedCapsuleBudgetTokens\n : pack.contract.capsuleBudgetTokens;\n return {\n schemaVersion: MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n id: underlying.weightsRef,\n displayName: `${pack.displayName} · ${underlying.weightsRef}`,\n mode: pack.mode,\n backend:\n underlying.backend === 'ollama'\n ? 'ollama'\n : underlying.backend === 'llama.cpp'\n ? 'llama.cpp'\n : underlying.backend === 'lm-studio'\n ? 'openai-compatible'\n : 'other',\n toolCalling: pack.contract.toolCalling,\n editFormat: pack.contract.editFormat,\n capsuleBudgetTokens: budget,\n maxParallelEdits: pack.contract.maxParallelEdits,\n maxRepairRounds: pack.contract.maxRepairRounds,\n temperature: 0,\n constrainedDecoding: pack.contract.constrainedDecoding ?? false,\n kvCacheStrategy: pack.contract.kvCacheStrategy,\n resources: {\n minRamGb: pack.resources.minRamGb,\n minVramGb: pack.resources.minVramGb,\n quant: underlying.quant,\n },\n securityTier: pack.contract.securityTier,\n inferenceIsolation: pack.contract.inferenceIsolation ?? 'embedded',\n };\n}\n\nfunction tryWeights(\n pack: QualifiedPack,\n weights: PackWeightsRef,\n system: SystemMemory,\n repo?: RepoSignals,\n taskClass?: TaskClass,\n freeDiskBytes?: number,\n): { fit: FitResult; underlying: PackWeightsRef } {\n const trial: QualifiedPack = { ...pack, primary: weights };\n return {\n fit: fitPack({ system, pack: trial, repo, taskClass, freeDiskBytes }),\n underlying: weights,\n };\n}\n\n/**\n * Resolve a Code Mode to a pack, concrete weights, fit label, and MEP.\n * Refuses primary load when fit is will_not_fit and tries fallbacks; if all\n * fail, returns the best effort with label will_not_fit (caller must not load).\n */\nexport function resolveMode(opts: ResolveModeOptions): ResolvedMode {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const defaultMode = opts.defaultMode ?? 'flow';\n let mode: ModelMode = opts.mode ?? defaultMode;\n let selection: ResolvedMode['selection'] = opts.mode ? 'explicit' : 'default';\n\n if (!opts.mode && opts.autoFit !== false) {\n mode = recommendMode(opts.system, opts.repo, packs);\n selection = 'auto_fit';\n }\n\n let pack = packForMode(mode, packs);\n if (!pack) {\n pack = packForMode('flow', packs)!;\n mode = 'flow';\n selection = 'default';\n }\n\n if (opts.pin && opts.pin.mode === mode) {\n const pinned = packById(opts.pin.packId, packs);\n if (pinned && pinned.mode === mode) {\n pack = pinned;\n selection = 'pinned';\n }\n }\n\n const candidates = [pack.primary, ...(pack.fallback ?? [])];\n let best: { fit: FitResult; underlying: PackWeightsRef } | null = null;\n\n for (const w of candidates) {\n const trial = tryWeights(pack, w, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n if (!best || fitRank(trial.fit) > fitRank(best.fit)) best = trial;\n if (trial.fit.label === 'flies' || trial.fit.label === 'comfortable') {\n best = trial;\n break;\n }\n }\n\n const chosen =\n best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n const profile = packToProfile(pack, chosen.underlying, chosen.fit);\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n mode,\n pack,\n underlying: chosen.underlying,\n fit: chosen.fit,\n profile,\n pinned: selection === 'pinned',\n selection,\n };\n}\n\nfunction fitRank(f: FitResult): number {\n const order: Record<FitLabel, number> = {\n flies: 4,\n comfortable: 3,\n tight: 2,\n will_not_fit: 1,\n };\n return order[f.label] * 1000 + f.score;\n}\n\n/**\n * Pick the strongest mode that still fits at least “comfortable” (or tight\n * for spark). Prefer Flow when both Flow and Forge are comfortable.\n */\nexport function recommendMode(\n system: SystemMemory,\n repo?: RepoSignals,\n packs: QualifiedPack[] = QUALIFIED_PACKS,\n): ModelMode {\n const order: ModelMode[] = ['forge', 'flow', 'spark'];\n let bestTight: ModelMode | null = null;\n for (const mode of order) {\n const pack = packForMode(mode, packs);\n if (!pack) continue;\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system,\n repo,\n packs,\n });\n if (resolved.fit.label === 'flies' || resolved.fit.label === 'comfortable') {\n // Prefer Flow as daily default when Forge also fits, unless repo is tiny.\n if (mode === 'forge') {\n const flow = resolveMode({ mode: 'flow', autoFit: false, system, repo, packs });\n if (flow.fit.label === 'flies' || flow.fit.label === 'comfortable') {\n const files = repo?.fileCount ?? 0;\n if (files < 2000) return 'flow';\n }\n return 'forge';\n }\n return mode;\n }\n if (resolved.fit.label === 'tight' && !bestTight) bestTight = mode;\n }\n return bestTight ?? 'spark';\n}\n\n/** Build orchestrator status for `vg models status` / host UIs. */\nexport function buildOrchestratorStatus(opts: {\n system: SystemMemory;\n repo?: RepoSignals;\n installedNames?: string[];\n /** Free bytes on the weight-store volume (factored into fit). */\n freeDiskBytes?: number;\n /** Single pin (legacy) or full pin map. */\n pin?: { mode: ModelMode; packId: string } | null;\n pins?: Partial<Record<ModelMode, string>>;\n defaultMode?: ModelMode;\n packs?: QualifiedPack[];\n}): OrchestratorStatus {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const installed = new Set((opts.installedNames ?? []).map((n) => n.toLowerCase()));\n const freeDiskBytes = opts.freeDiskBytes;\n const recommended = recommendMode(opts.system, opts.repo, packs);\n const pinFor = (mode: ModelMode): { mode: ModelMode; packId: string } | null => {\n const fromMap = opts.pins?.[mode];\n if (fromMap) return { mode, packId: fromMap };\n if (opts.pin?.mode === mode) return opts.pin;\n return null;\n };\n const modes = listModes().map((mode) => {\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system: opts.system,\n repo: opts.repo,\n freeDiskBytes,\n pin: pinFor(mode),\n packs,\n });\n const id = resolved.underlying.weightsRef.toLowerCase();\n const installedHit =\n installed.has(id) ||\n [...installed].some((n) => n.includes(id) || id.includes(n));\n return {\n mode,\n packId: resolved.pack.packId,\n displayName: resolved.pack.displayName,\n promise: resolved.pack.promise,\n underlyingModelId: resolved.underlying.weightsRef,\n backend: resolved.underlying.backend,\n fit: resolved.fit.label,\n fitScore: resolved.fit.score,\n needBytes: resolved.fit.needBytes,\n availableBytes: resolved.fit.availableBytes,\n diskNeedBytes: resolved.fit.diskNeedBytes,\n installed: installedHit,\n pinned: resolved.pinned,\n };\n });\n\n const recResolved = resolveMode({\n mode: recommended,\n autoFit: false,\n system: opts.system,\n freeDiskBytes,\n repo: opts.repo,\n pin: pinFor(recommended),\n packs,\n });\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n defaultMode: opts.defaultMode ?? 'flow',\n pin: pinFor(recommended),\n modes,\n recommended,\n system: {\n totalRamBytes: opts.system.totalRamBytes,\n freeRamBytes: opts.system.freeRamBytes,\n ...(typeof opts.system.vramTotalBytes === 'number'\n ? { vramTotalBytes: opts.system.vramTotalBytes }\n : {}),\n ...(typeof opts.system.vramFreeBytes === 'number'\n ? { vramFreeBytes: opts.system.vramFreeBytes }\n : {}),\n ...(typeof freeDiskBytes === 'number' ? { freeDiskBytes } : {}),\n loaded: opts.system.loaded.map((l) => ({ name: l.name, bytes: l.bytes })),\n },\n memoryBreakdown: recResolved.fit.breakdown,\n };\n}\n\n// ── Pin registry (global storage, not in-repo) ────────────────────────────────\n\nexport interface OrchestratorPinState {\n schemaVersion: 'model-orchestrator-pin/0';\n /** mode → packId */\n pins: Partial<Record<ModelMode, string>>;\n /** Workspace / global default mode preference. */\n defaultMode?: ModelMode;\n updatedAt: string;\n}\n\nexport function orchestratorStatePath(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n return path.join(vibgrateDataDir(env, platform, home), 'model-orchestrator', 'state.json');\n}\n\nexport function readOrchestratorState(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): OrchestratorPinState {\n const p = orchestratorStatePath(env, platform, home);\n try {\n const raw = JSON.parse(fs.readFileSync(p, 'utf8')) as Partial<OrchestratorPinState>;\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: raw.pins && typeof raw.pins === 'object' ? raw.pins : {},\n defaultMode:\n raw.defaultMode === 'spark' || raw.defaultMode === 'flow' || raw.defaultMode === 'forge'\n ? raw.defaultMode\n : undefined,\n updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : new Date(0).toISOString(),\n };\n } catch {\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: {},\n updatedAt: new Date(0).toISOString(),\n };\n }\n}\n\nexport function writeOrchestratorState(\n state: OrchestratorPinState,\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n const p = orchestratorStatePath(env, platform, home);\n fs.mkdirSync(path.dirname(p), { recursive: true });\n const next: OrchestratorPinState = {\n ...state,\n schemaVersion: 'model-orchestrator-pin/0',\n updatedAt: new Date().toISOString(),\n };\n fs.writeFileSync(p, JSON.stringify(next, null, 2) + '\\n', 'utf8');\n return p;\n}\n\nexport function pinPack(\n mode: ModelMode,\n packId: string,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n if (!packById(packId)) {\n throw new Error(`unknown pack id: ${packId}`);\n }\n state.pins[mode] = packId;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function unpinPack(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n delete state.pins[mode];\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function setDefaultMode(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n state.defaultMode = mode;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\n/** Active pin for a mode, if any. */\nexport function activePin(\n mode: ModelMode,\n state: OrchestratorPinState = readOrchestratorState(),\n): { mode: ModelMode; packId: string } | null {\n const packId = state.pins[mode];\n return packId ? { mode, packId } : null;\n}\n\n/** Map backend hint to vg code --provider id. */\nexport function providerForBackend(backend: PackWeightsRef['backend']): string {\n switch (backend) {\n case 'ollama':\n return 'ollama';\n case 'llama.cpp':\n return 'llama-cpp';\n case 'lm-studio':\n return 'lmstudio';\n default:\n return 'ollama';\n }\n}\n\n/** Parse mode from user string; null if invalid. */\nexport function parseMode(raw: string | undefined | null): ModelMode | null {\n if (!raw) return null;\n const m = raw.trim().toLowerCase();\n if (m === 'spark' || m === 'flow' || m === 'forge') return m;\n return null;\n}\n"]}
|
|
@@ -148,7 +148,16 @@ async function ensureWeightCached(ref, options = {}) {
|
|
|
148
148
|
}
|
|
149
149
|
function sha256File(file) {
|
|
150
150
|
const h = createHash("sha256");
|
|
151
|
-
|
|
151
|
+
const fd = fs.openSync(file, "r");
|
|
152
|
+
try {
|
|
153
|
+
const buf = Buffer.alloc(8 * 1024 * 1024);
|
|
154
|
+
let n;
|
|
155
|
+
while ((n = fs.readSync(fd, buf, 0, buf.length, null)) > 0) {
|
|
156
|
+
h.update(n === buf.length ? buf : buf.subarray(0, n));
|
|
157
|
+
}
|
|
158
|
+
} finally {
|
|
159
|
+
fs.closeSync(fd);
|
|
160
|
+
}
|
|
152
161
|
return h.digest("hex");
|
|
153
162
|
}
|
|
154
163
|
function defaultFetchToFile(url, dest, onProgress) {
|
|
@@ -201,6 +210,23 @@ function defaultFetchToFile(url, dest, onProgress) {
|
|
|
201
210
|
get(url, 0);
|
|
202
211
|
});
|
|
203
212
|
}
|
|
213
|
+
function freeBytesOnVolume(targetPath) {
|
|
214
|
+
let dir = targetPath;
|
|
215
|
+
for (let i = 0; i < 10; i++) {
|
|
216
|
+
try {
|
|
217
|
+
const st = fs.statfsSync?.(dir);
|
|
218
|
+
if (st) {
|
|
219
|
+
const free = Number(st.bavail) * Number(st.bsize);
|
|
220
|
+
if (Number.isFinite(free) && free >= 0) return free;
|
|
221
|
+
}
|
|
222
|
+
} catch {
|
|
223
|
+
}
|
|
224
|
+
const parent = path.dirname(dir);
|
|
225
|
+
if (parent === dir) break;
|
|
226
|
+
dir = parent;
|
|
227
|
+
}
|
|
228
|
+
return void 0;
|
|
229
|
+
}
|
|
204
230
|
function listCachedWeights(env = process.env) {
|
|
205
231
|
const dir = weightStoreDir(env);
|
|
206
232
|
try {
|
|
@@ -210,6 +236,6 @@ function listCachedWeights(env = process.env) {
|
|
|
210
236
|
}
|
|
211
237
|
}
|
|
212
238
|
|
|
213
|
-
export { catalogIntegrityReport, ensureWeightCached, isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef, weightStoreDir };
|
|
214
|
-
//# sourceMappingURL=chunk-
|
|
215
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
export { catalogIntegrityReport, ensureWeightCached, freeBytesOnVolume, isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef, weightStoreDir };
|
|
240
|
+
//# sourceMappingURL=chunk-OV4KGXPD.js.map
|
|
241
|
+
//# sourceMappingURL=chunk-OV4KGXPD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/weight-store.ts"],"names":[],"mappings":"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","file":"chunk-OV4KGXPD.js","sourcesContent":["/**\n * First-party weight store — content-addressed GGUF cache under the Vibgrate\n * cache root (never in-repo). Complements Ollama as a download channel so\n * embedded llama.cpp packs need not depend on a third-party app for weights.\n *\n * Only HTTPS URLs from an allowlist (or pack-declared URLs that pass the same\n * host allowlist) are fetched. No auto-download except via explicit\n * `vg models install` / executor consent.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport { createHash } from 'node:crypto';\nimport { vibgrateCacheDir } from './paths.js';\n\nexport const WEIGHT_STORE_SCHEMA = 'weight-store/0' as const;\n\n/** Hosts we will download weights from (no arbitrary open proxy). */\nexport const WEIGHT_DOWNLOAD_HOST_ALLOWLIST = new Set([\n 'huggingface.co',\n 'hf.co',\n 'cdn-lfs.huggingface.co',\n 'cdn-lfs-us-1.huggingface.co',\n 'us.aws.cdn.hf.co',\n 'cas-server.xethub.hf.co',\n 'objects.githubusercontent.com',\n 'github.com',\n]);\n\n/** Host suffixes allowed for HF LFS / Xet CDN redirects. */\nexport function isAllowedWeightHost(hostname: string): boolean {\n const h = hostname.toLowerCase();\n if (WEIGHT_DOWNLOAD_HOST_ALLOWLIST.has(h)) return true;\n if (h.endsWith('.huggingface.co')) return true;\n if (h.endsWith('.hf.co')) return true;\n if (h.endsWith('.cdn.hf.co')) return true;\n return false;\n}\n\nexport interface WeightCatalogEntry {\n /** Stable ref (matches pack weightsRef or basename). */\n ref: string;\n /** HTTPS URL to the GGUF (or redirected LFS object). */\n url: string;\n /** Optional expected size for progress UX. */\n bytes?: number;\n license?: string;\n /**\n * When set, download **must** match this sha256 or install fails (B6).\n * Leave unset only while pinning is pending — status reports unpinned.\n */\n sha256?: string;\n /** Pack channel this entry was verified against. */\n packChannel?: string;\n}\n\n/**\n * Curated first-party catalog — small, versioned with packs. Not a general hub.\n * URLs point at public Hugging Face GGUF artifacts for Qwen2.5-Coder.\n *\n * Integrity: sha256 pins are required for production installs once verified.\n * Entries without sha256 are marked unpinned in {@link catalogIntegrityReport}\n * and still download, but CI should fail if any pack primary lacks a pin.\n */\nexport const FIRST_PARTY_WEIGHT_CATALOG: WeightCatalogEntry[] = [\n {\n ref: 'qwen2.5-coder-3b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-3B-Instruct-GGUF/resolve/main/qwen2.5-coder-3b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.3',\n // Git LFS oid = content sha256 (from HF API tree, 2026-07-27).\n sha256: '724fb256bec1ff062b2f65e4569e871ad2e95ab2a3989723d1769c54294730b7',\n bytes: 2_104_932_800,\n },\n {\n ref: 'qwen2.5-coder-7b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/main/qwen2.5-coder-7b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.3',\n sha256: '509287f78cb4d4cf6b3843734733b914b2c158e43e22a7f4bf5e963800894d3c',\n bytes: 4_683_073_536,\n },\n {\n ref: 'qwen2.5-coder-14b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-14B-Instruct-GGUF/resolve/main/qwen2.5-coder-14b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.4',\n // Git LFS oid = content sha256 (from HF API tree, 2026-07-27).\n sha256: 'c1e659736d89ac1065fb495330fb824d94001974a4bfa78e7270e43476a8d940',\n bytes: 8_988_110_272,\n },\n];\n\nexport interface CatalogIntegrityReport {\n total: number;\n pinned: number;\n unpinned: string[];\n /** True when every entry has sha256. */\n complete: boolean;\n}\n\nexport function catalogIntegrityReport(\n catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG,\n): CatalogIntegrityReport {\n const unpinned = catalog.filter((e) => !e.sha256?.trim()).map((e) => e.ref);\n return {\n total: catalog.length,\n pinned: catalog.length - unpinned.length,\n unpinned,\n complete: unpinned.length === 0,\n };\n}\n\n/** Require sha256 on every catalog entry (CI gate for pack releases). */\nexport function assertCatalogPinned(catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG): void {\n const report = catalogIntegrityReport(catalog);\n if (!report.complete) {\n throw new Error(\n `weight catalog incomplete: ${report.unpinned.length}/${report.total} entries missing sha256: ${report.unpinned.join(', ')}`,\n );\n }\n}\n\nexport function weightStoreDir(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(vibgrateCacheDir(env), 'weights');\n}\n\nexport function weightPathForRef(ref: string, env: NodeJS.ProcessEnv = process.env): string {\n const base = path.basename(ref).replace(/[^a-zA-Z0-9._+-]/g, '_');\n return path.join(weightStoreDir(env), base);\n}\n\nexport function isWeightCached(ref: string, env: NodeJS.ProcessEnv = process.env): boolean {\n try {\n const p = weightPathForRef(ref, env);\n return fs.existsSync(p) && fs.statSync(p).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function lookupCatalog(ref: string, catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG): WeightCatalogEntry | null {\n const want = ref.toLowerCase();\n return (\n catalog.find((e) => e.ref.toLowerCase() === want) ??\n catalog.find((e) => want.includes(e.ref.toLowerCase()) || e.ref.toLowerCase().includes(want)) ??\n null\n );\n}\n\nexport function isAllowedWeightUrl(url: string): boolean {\n try {\n const u = new URL(url);\n if (u.protocol !== 'https:') return false;\n return isAllowedWeightHost(u.hostname);\n } catch {\n return false;\n }\n}\n\nexport interface DownloadWeightOptions {\n env?: NodeJS.ProcessEnv;\n /** Override catalog URL. */\n url?: string;\n expectedSha256?: string;\n onProgress?: (line: string) => void;\n /** Injectable fetch for tests. */\n fetchToFile?: (url: string, dest: string, onProgress?: (line: string) => void) => Promise<void>;\n}\n\nexport interface DownloadWeightResult {\n ok: boolean;\n path?: string;\n error?: string;\n fromCache?: boolean;\n}\n\n/** In-flight downloads: one network fetch per dest path (concurrent install-safe). */\nconst inflight = new Map<string, Promise<DownloadWeightResult>>();\n\n/**\n * Ensure weights for `ref` exist in the first-party store. Downloads when missing.\n * Concurrent callers for the same ref share a single download promise.\n */\nexport async function ensureWeightCached(ref: string, options: DownloadWeightOptions = {}): Promise<DownloadWeightResult> {\n const env = options.env ?? process.env;\n const dest = weightPathForRef(ref, env);\n if (isWeightCached(ref, env)) {\n return { ok: true, path: dest, fromCache: true };\n }\n\n const existing = inflight.get(dest);\n if (existing) return existing;\n\n const work = (async (): Promise<DownloadWeightResult> => {\n // Re-check after joining the queue.\n if (isWeightCached(ref, env)) {\n return { ok: true, path: dest, fromCache: true };\n }\n\n const entry = lookupCatalog(ref);\n const url = options.url ?? entry?.url;\n if (!url) {\n return { ok: false, error: `no first-party download URL for weights ref \"${ref}\" — set a pack downloadUrl or place a gguf at ${dest}` };\n }\n if (!isAllowedWeightUrl(url)) {\n return { ok: false, error: `weight URL host not allowlisted: ${url}` };\n }\n\n try {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n const tmp = `${dest}.partial.${process.pid}.${Date.now()}`;\n const fetchFn = options.fetchToFile ?? defaultFetchToFile;\n options.onProgress?.(`downloading ${ref}`);\n await fetchFn(url, tmp, options.onProgress);\n const sha = (options.expectedSha256 ?? entry?.sha256)?.trim();\n if (sha) {\n const actual = sha256File(tmp);\n if (actual !== sha.toLowerCase()) {\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return { ok: false, error: `sha256 mismatch for ${ref} (expected ${sha}, got ${actual})` };\n }\n } else if (entry && !entry.sha256) {\n options.onProgress?.(`warning: ${ref} has no sha256 pin in catalog — integrity not verified`);\n }\n // Atomic publish: if another worker won the race, drop our partial.\n if (isWeightCached(ref, env)) {\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return { ok: true, path: dest, fromCache: true };\n }\n fs.renameSync(tmp, dest);\n return { ok: true, path: dest, fromCache: false };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n } finally {\n inflight.delete(dest);\n }\n })();\n\n inflight.set(dest, work);\n return work;\n}\n\n/**\n * Stream a file through sha256. Never `readFileSync` whole weights — Node rejects\n * buffers larger than ~2 GiB (`File size (…) is greater than 2 GiB`), which broke\n * Flow/Forge installs even when the download completed.\n */\nfunction sha256File(file: string): string {\n const h = createHash('sha256');\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(8 * 1024 * 1024);\n let n: number;\n while ((n = fs.readSync(fd, buf, 0, buf.length, null)) > 0) {\n h.update(n === buf.length ? buf : buf.subarray(0, n));\n }\n } finally {\n fs.closeSync(fd);\n }\n return h.digest('hex');\n}\n\n/** Minimal HTTPS GET with redirect follow (tests inject fetchToFile). */\nexport function defaultFetchToFile(url: string, dest: string, onProgress?: (line: string) => void): Promise<void> {\n return new Promise((resolve, reject) => {\n const get = (u: string, redirects: number): void => {\n if (redirects > 8) {\n reject(new Error('too many redirects'));\n return;\n }\n const lib = u.startsWith('https:') ? https : http;\n const req = lib.get(u, (res) => {\n const code = res.statusCode ?? 0;\n if (code >= 300 && code < 400 && res.headers.location) {\n const next = new URL(res.headers.location, u).href;\n // Redirects must stay on HTTPS + allowlisted hosts (incl. HF LFS/Xet CDNs).\n try {\n const nextUrl = new URL(next);\n if (nextUrl.protocol !== 'https:' || !isAllowedWeightHost(nextUrl.hostname)) {\n reject(new Error(`redirect host not allowlisted: ${nextUrl.hostname || next}`));\n return;\n }\n } catch {\n reject(new Error('invalid redirect URL'));\n return;\n }\n res.resume();\n get(next, redirects + 1);\n return;\n }\n if (code !== 200) {\n reject(new Error(`HTTP ${code} fetching weights`));\n res.resume();\n return;\n }\n const total = Number(res.headers['content-length'] || 0);\n let got = 0;\n const out = fs.createWriteStream(dest);\n res.on('data', (chunk: Buffer) => {\n got += chunk.length;\n if (total > 0 && got % (8 * 1024 * 1024) < chunk.length) {\n onProgress?.(`${Math.floor((100 * got) / total)}%`);\n }\n });\n res.pipe(out);\n out.on('finish', () => resolve());\n out.on('error', reject);\n res.on('error', reject);\n });\n req.on('error', reject);\n };\n get(url, 0);\n });\n}\n\n/**\n * Free bytes on the volume that holds `targetPath` (weight store / cache).\n * Best-effort via `statfsSync` (Node 18.15+); walks parents if path is missing.\n */\nexport function freeBytesOnVolume(targetPath: string): number | undefined {\n let dir = targetPath;\n for (let i = 0; i < 10; i++) {\n try {\n const st = (\n fs as typeof fs & {\n statfsSync?: (p: string) => { bavail: number | bigint; bsize: number | bigint };\n }\n ).statfsSync?.(dir);\n if (st) {\n const free = Number(st.bavail) * Number(st.bsize);\n if (Number.isFinite(free) && free >= 0) return free;\n }\n } catch {\n /* try parent */\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return undefined;\n}\n\n/** List GGUF files already in the first-party store (for discovery). */\nexport function listCachedWeights(env: NodeJS.ProcessEnv = process.env): Array<{ name: string; path: string }> {\n const dir = weightStoreDir(env);\n try {\n return fs\n .readdirSync(dir)\n .filter((n) => n.endsWith('.gguf'))\n .sort()\n .map((n) => ({ name: n, path: path.join(dir, n) }));\n } catch {\n return [];\n }\n}\n"]}
|
|
@@ -1,8 +1,49 @@
|
|
|
1
1
|
import { parseOllamaPs, parseNvidiaSmi } from './chunk-7N4Y3E47.js';
|
|
2
|
-
import
|
|
2
|
+
import { whichOnPath, init_cli_invocation } from './chunk-3LSG7Z4I.js';
|
|
3
|
+
import { __export, __esm } from './chunk-Z6ZWNWWR.js';
|
|
4
|
+
import * as fs2 from 'fs';
|
|
5
|
+
import * as os2 from 'os';
|
|
6
|
+
import * as path from 'path';
|
|
3
7
|
import { spawnSync, spawn } from 'child_process';
|
|
4
|
-
import * as fs from 'fs';
|
|
5
8
|
|
|
9
|
+
// src/util/resolve-ollama.ts
|
|
10
|
+
var resolve_ollama_exports = {};
|
|
11
|
+
__export(resolve_ollama_exports, {
|
|
12
|
+
hasOllamaBinary: () => hasOllamaBinary,
|
|
13
|
+
resolveOllamaBinary: () => resolveOllamaBinary
|
|
14
|
+
});
|
|
15
|
+
function resolveOllamaBinary() {
|
|
16
|
+
const names = process.platform === "win32" ? ["ollama.exe", "ollama"] : ["ollama"];
|
|
17
|
+
for (const name of names) {
|
|
18
|
+
const hit = whichOnPath(name);
|
|
19
|
+
if (hit) return hit;
|
|
20
|
+
}
|
|
21
|
+
const candidates = process.platform === "win32" ? [
|
|
22
|
+
path.join(process.env.LOCALAPPDATA || "", "Programs", "Ollama", "ollama.exe"),
|
|
23
|
+
path.join(process.env.ProgramFiles || "C:\\Program Files", "Ollama", "ollama.exe")
|
|
24
|
+
] : [
|
|
25
|
+
"/opt/homebrew/bin/ollama",
|
|
26
|
+
"/usr/local/bin/ollama",
|
|
27
|
+
"/usr/bin/ollama",
|
|
28
|
+
path.join(os2.homedir(), ".local", "bin", "ollama")
|
|
29
|
+
];
|
|
30
|
+
for (const c of candidates) {
|
|
31
|
+
if (!c) continue;
|
|
32
|
+
try {
|
|
33
|
+
if (fs2.existsSync(c)) return c;
|
|
34
|
+
} catch {
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function hasOllamaBinary() {
|
|
40
|
+
return resolveOllamaBinary() !== null;
|
|
41
|
+
}
|
|
42
|
+
var init_resolve_ollama = __esm({
|
|
43
|
+
"src/util/resolve-ollama.ts"() {
|
|
44
|
+
init_cli_invocation();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
6
47
|
function parseVmStatAvailableBytes(stdout) {
|
|
7
48
|
if (!stdout || !/Pages free:/i.test(stdout)) return null;
|
|
8
49
|
const pageMatch = stdout.match(/page size of (\d+) bytes/i);
|
|
@@ -34,7 +75,7 @@ function parseMeminfoAvailableBytes(content) {
|
|
|
34
75
|
}
|
|
35
76
|
return null;
|
|
36
77
|
}
|
|
37
|
-
function availableRamBytes(platform = process.platform, freemem2 = () =>
|
|
78
|
+
function availableRamBytes(platform = process.platform, freemem2 = () => os2.freemem()) {
|
|
38
79
|
const nodeFree = safeNonNeg(freemem2());
|
|
39
80
|
let platformAvail = null;
|
|
40
81
|
if (platform === "darwin") {
|
|
@@ -56,7 +97,7 @@ function readMacAvailableBytes() {
|
|
|
56
97
|
}
|
|
57
98
|
function readLinuxAvailableBytes() {
|
|
58
99
|
try {
|
|
59
|
-
const content =
|
|
100
|
+
const content = fs2.readFileSync("/proc/meminfo", "utf8");
|
|
60
101
|
return parseMeminfoAvailableBytes(content);
|
|
61
102
|
} catch {
|
|
62
103
|
return null;
|
|
@@ -67,11 +108,13 @@ function safeNonNeg(n) {
|
|
|
67
108
|
}
|
|
68
109
|
|
|
69
110
|
// src/code/local-runtime.ts
|
|
111
|
+
init_resolve_ollama();
|
|
70
112
|
function gatherSystemMemory() {
|
|
71
|
-
const
|
|
113
|
+
const ollama = resolveOllamaBinary();
|
|
114
|
+
const loaded = ollama ? safeRun(ollama, ["ps"]).map(parseOllamaPs).flat() : [];
|
|
72
115
|
const smi = safeRun("nvidia-smi", ["--query-gpu=memory.total,memory.used", "--format=csv,noheader,nounits"]).map(parseNvidiaSmi).find(Boolean);
|
|
73
116
|
const sys = {
|
|
74
|
-
totalRamBytes:
|
|
117
|
+
totalRamBytes: os2.totalmem(),
|
|
75
118
|
freeRamBytes: availableRamBytes(),
|
|
76
119
|
loaded
|
|
77
120
|
};
|
|
@@ -82,14 +125,21 @@ function gatherSystemMemory() {
|
|
|
82
125
|
return sys;
|
|
83
126
|
}
|
|
84
127
|
function hasOllama() {
|
|
85
|
-
return
|
|
128
|
+
return hasOllamaBinary();
|
|
86
129
|
}
|
|
87
130
|
function stopModel(name) {
|
|
88
|
-
|
|
131
|
+
const ollama = resolveOllamaBinary();
|
|
132
|
+
if (!ollama) return false;
|
|
133
|
+
return spawnSync(ollama, ["stop", name], { stdio: "ignore" }).status === 0;
|
|
89
134
|
}
|
|
90
135
|
function pullModelClean(name, spinner) {
|
|
91
136
|
return new Promise((resolve) => {
|
|
92
|
-
const
|
|
137
|
+
const ollama = resolveOllamaBinary();
|
|
138
|
+
if (!ollama) {
|
|
139
|
+
resolve(false);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const child = spawn(ollama, ["pull", name]);
|
|
93
143
|
const onData = (buf) => {
|
|
94
144
|
const line = lastMeaningfulLine(buf.toString());
|
|
95
145
|
if (line) spinner.update(`pulling ${name} \u2014 ${line}`);
|
|
@@ -117,6 +167,6 @@ function safeRun(bin, args) {
|
|
|
117
167
|
}
|
|
118
168
|
}
|
|
119
169
|
|
|
120
|
-
export { gatherSystemMemory, hasOllama, pullModelClean, stopModel };
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
170
|
+
export { gatherSystemMemory, hasOllama, hasOllamaBinary, init_resolve_ollama, pullModelClean, resolveOllamaBinary, resolve_ollama_exports, stopModel };
|
|
171
|
+
//# sourceMappingURL=chunk-OWSFZQOP.js.map
|
|
172
|
+
//# sourceMappingURL=chunk-OWSFZQOP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/resolve-ollama.ts","../src/code/available-memory.ts","../src/code/local-runtime.ts"],"names":["freemem","os","fs","os3","spawnSync"],"mappings":";;;;;;;;;AAAA,IAAA,sBAAA,GAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgBO,SAAS,mBAAA,GAAqC;AACnD,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,YAAA,EAAc,QAAQ,CAAA,GAAI,CAAC,QAAQ,CAAA;AACjF,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AAEA,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,OAAA,GACjB;AAAA,IACO,UAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,EAAA,EAAI,UAAA,EAAY,UAAU,YAAY,CAAA;AAAA,IACvE,UAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,mBAAA,EAAqB,UAAU,YAAY;AAAA,GACnF,GACA;AAAA,IACE,0BAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA;AAAA,IACK,IAAA,CAAA,IAAA,CAAQ,GAAA,CAAA,OAAA,EAAQ,EAAG,QAAA,EAAU,OAAO,QAAQ;AAAA,GACnD;AAEN,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI;AACF,MAAA,IAAO,GAAA,CAAA,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,qBAAoB,KAAM,IAAA;AACnC;AAlDA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAaA,IAAA,mBAAA,EAAA;AAAA,EAAA;AAAA,CAAA;ACcO,SAAS,0BAA0B,MAAA,EAA+B;AACvE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,eAAe,IAAA,CAAK,MAAM,GAAG,OAAO,IAAA;AACpD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,2BAA2B,CAAA;AAE1D,EAAA,MAAM,WAAW,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,GAAI,IAAA;AACpD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,IAAY,GAAG,OAAO,IAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA0B;AAEvC,IAAA,MAAM,CAAA,GAAI,OAAO,KAAA,CAAM,IAAI,OAAO,CAAA,EAAG,KAAK,CAAA,eAAA,CAAA,EAAmB,GAAG,CAAC,CAAA;AACjE,IAAA,OAAO,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,YAAY,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAgB,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAmB,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,MAAM,iBAAiB,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,IAAA,GAAO,QAAA,GAAW,WAAA,GAAc,SAAA;AACnD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,GAAa,GAAG,OAAO,IAAA;AAC3D,EAAA,OAAO,UAAA,GAAa,QAAA;AACtB;AAMO,SAAS,2BAA2B,OAAA,EAAgC;AACzE,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,+BAA+B,CAAA;AAC3D,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,IAAA;AAC7B,IAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,IAAI,CAAA,GAAI,IAAA;AAAA,EAC5C;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AACrD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,GAAI,IAAA;AAC5B,IAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,IAAI,CAAA,GAAI,IAAA;AAAA,EAC5C;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,kBACd,QAAA,GAA4B,OAAA,CAAQ,UACpCA,QAAAA,GAAwB,MAASC,aAAQ,EACjC;AACR,EAAA,MAAM,QAAA,GAAW,UAAA,CAAWD,QAAAA,EAAS,CAAA;AACrC,EAAA,IAAI,aAAA,GAA+B,IAAA;AAEnC,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,aAAA,GAAgB,qBAAA,EAAsB;AAAA,EACxC,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,IAAA,aAAA,GAAgB,uBAAA,EAAwB;AAAA,EAC1C;AAKA,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,aAAA,GAAgB,QAAA,EAAU,OAAO,aAAA;AAC9D,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,qBAAA,GAAuC;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,SAAA,EAAW,EAAC,EAAG,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAM,CAAA;AACxE,IAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,OAAO,GAAA,CAAI,MAAA,KAAW,UAAU,OAAO,IAAA;AAC/D,IAAA,OAAO,yBAAA,CAA0B,IAAI,MAAM,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,uBAAA,GAAyC;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAaE,GAAA,CAAA,YAAA,CAAa,eAAA,EAAiB,MAAM,CAAA;AACvD,IAAA,OAAO,2BAA2B,OAAO,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAC3C;;;AClGA,mBAAA,EAAA;AASO,SAAS,kBAAA,GAAmC;AACjD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,CAAC,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,aAAa,CAAA,CAAE,IAAA,KAAS,EAAC;AAC7E,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,EAAc,CAAC,sCAAA,EAAwC,+BAA+B,CAAC,CAAA,CACxG,GAAA,CAAI,cAAc,CAAA,CAClB,IAAA,CAAK,OAAO,CAAA;AACf,EAAA,MAAM,GAAA,GAAoB;AAAA,IACxB,eAAkBC,GAAA,CAAA,QAAA,EAAS;AAAA,IAC3B,cAAc,iBAAA,EAAkB;AAAA,IAChC;AAAA,GACF;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,GAAA,CAAI,iBAAiB,GAAA,CAAI,UAAA;AACzB,IAAA,GAAA,CAAI,gBAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,GAAA,CAAI,UAAA,GAAa,IAAI,SAAS,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,eAAA,EAAgB;AACzB;AAGO,SAAS,UAAU,IAAA,EAAuB;AAC/C,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,OAAOC,SAAAA,CAAU,MAAA,EAAQ,CAAC,MAAA,EAAQ,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,MAAA,KAAW,CAAA;AAC3E;AAOO,SAAS,cAAA,CAAe,MAAc,OAAA,EAAoC;AAC/E,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,EAAQ,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAsB;AACpC,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,CAAA;AAC9C,MAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,WAAW,IAAI,CAAA,QAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACtD,CAAA;AACA,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAC/B,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAC/B,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtC,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAAS,OAAA,CAAQ,IAAA,KAAS,CAAC,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAGA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,KAAA,CAAM,SAAS,CAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAEnB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA,CAAE,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAAE,IAAA,EAAM,CAAA,CAC1F,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAExC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACxD,EAAA,OAAO,GAAA,GAAM,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,IAAA,EAAK,GAAI,MAAA;AAC/C;AAGA,SAAS,OAAA,CAAQ,KAAa,IAAA,EAA0B;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMA,UAAU,GAAA,EAAK,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAM,CAAA;AACpE,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,OAAO,IAAI,MAAA,KAAW,QAAA,SAAiB,EAAC;AAChE,IAAA,OAAO,CAAC,IAAI,MAAM,CAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF","file":"chunk-OWSFZQOP.js","sourcesContent":["/**\n * Locate the Ollama CLI for install/uninstall/pull.\n *\n * Dock-launched GUI apps (VS Code, Cursor) often inherit a stripped PATH that\n * omits Homebrew (`/opt/homebrew/bin`) and the official installer locations.\n * Discovery of models still works (on-disk manifests under ~/.ollama), so the\n * UI lists models that then fail to uninstall with \"ollama not on PATH\".\n * Resolve the binary via PATH first, then well-known install prefixes.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { whichOnPath } from './cli-invocation.js';\n\n/** Absolute path to the ollama binary, or null if not found. */\nexport function resolveOllamaBinary(): string | null {\n const names = process.platform === 'win32' ? ['ollama.exe', 'ollama'] : ['ollama'];\n for (const name of names) {\n const hit = whichOnPath(name);\n if (hit) return hit;\n }\n\n const candidates =\n process.platform === 'win32'\n ? [\n path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Ollama', 'ollama.exe'),\n path.join(process.env.ProgramFiles || 'C:\\\\Program Files', 'Ollama', 'ollama.exe'),\n ]\n : [\n '/opt/homebrew/bin/ollama',\n '/usr/local/bin/ollama',\n '/usr/bin/ollama',\n path.join(os.homedir(), '.local', 'bin', 'ollama'),\n ];\n\n for (const c of candidates) {\n if (!c) continue;\n try {\n if (fs.existsSync(c)) return c;\n } catch {\n /* ignore */\n }\n }\n return null;\n}\n\n/** True when the Ollama CLI is on PATH or at a known install location. */\nexport function hasOllamaBinary(): boolean {\n return resolveOllamaBinary() !== null;\n}\n","/**\n * Platform-accurate *available* RAM for model fit decisions.\n *\n * Node's `os.freemem()` is wrong for this use case on several OSes:\n * - **macOS**: returns only completely unused pages. The kernel fills the rest\n * with file cache that is reclaimable under pressure — Activity Monitor's\n * \"Available\" (and what a model can actually use). Under normal load\n * `os.freemem()` often reports ~0 while many GiB are available.\n * - **Linux**: prefers `/proc/meminfo` `MemAvailable` (reclaim-aware) over\n * `MemFree`.\n * - **Windows**: `os.freemem()` already maps to available physical memory\n * (`GlobalMemoryStatusEx.ullAvailPhys`) and is fine.\n *\n * Fit/install gates must use *available* memory, not bare free pages, or\n * Spark/Flow falsely report \"0.0 GiB free after reserves\" on machines with\n * tens of GiB of reclaimable RAM.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { spawnSync } from 'node:child_process';\n\n/**\n * Parse `vm_stat` output into reclaimable/available bytes.\n * Available ≈ free + inactive + speculative + purgeable (file cache that the\n * kernel can reclaim). Returns null when the output is unparseable.\n */\nexport function parseVmStatAvailableBytes(stdout: string): number | null {\n if (!stdout || !/Pages free:/i.test(stdout)) return null;\n const pageMatch = stdout.match(/page size of (\\d+) bytes/i);\n // Apple Silicon is typically 16 KiB; Intel macOS 4 KiB. Default conservatively.\n const pageSize = pageMatch ? Number(pageMatch[1]) : 4096;\n if (!Number.isFinite(pageSize) || pageSize <= 0) return null;\n\n const pages = (label: string): number => {\n // Lines look like: \"Pages free: 4085.\"\n const m = stdout.match(new RegExp(`${label}:\\\\s+(\\\\d+)\\\\.?`, 'i'));\n return m ? Number(m[1]) : 0;\n };\n\n const free = pages('Pages free');\n const inactive = pages('Pages inactive');\n const speculative = pages('Pages speculative');\n const purgeable = pages('Pages purgeable');\n const totalPages = free + inactive + speculative + purgeable;\n if (!Number.isFinite(totalPages) || totalPages < 0) return null;\n return totalPages * pageSize;\n}\n\n/**\n * Parse `/proc/meminfo` for MemAvailable (kB). Falls back to MemFree when\n * MemAvailable is missing (very old kernels).\n */\nexport function parseMeminfoAvailableBytes(content: string): number | null {\n if (!content) return null;\n const avail = content.match(/^MemAvailable:\\s+(\\d+)\\s*kB/im);\n if (avail) {\n const n = Number(avail[1]) * 1024;\n return Number.isFinite(n) && n >= 0 ? n : null;\n }\n const free = content.match(/^MemFree:\\s+(\\d+)\\s*kB/im);\n if (free) {\n const n = Number(free[1]) * 1024;\n return Number.isFinite(n) && n >= 0 ? n : null;\n }\n return null;\n}\n\n/** Best-effort available RAM in bytes. Never throws; falls back to os.freemem(). */\nexport function availableRamBytes(\n platform: NodeJS.Platform = process.platform,\n freemem: () => number = () => os.freemem(),\n): number {\n const nodeFree = safeNonNeg(freemem());\n let platformAvail: number | null = null;\n\n if (platform === 'darwin') {\n platformAvail = readMacAvailableBytes();\n } else if (platform === 'linux') {\n platformAvail = readLinuxAvailableBytes();\n }\n // win32 and others: Node freemem is already \"available\".\n\n // Prefer the larger of the two when both exist — never under-report\n // availability because of a stale/partial platform probe.\n if (platformAvail != null && platformAvail > nodeFree) return platformAvail;\n return nodeFree;\n}\n\nfunction readMacAvailableBytes(): number | null {\n try {\n const res = spawnSync('vm_stat', [], { encoding: 'utf8', timeout: 3000 });\n if (res.status !== 0 || typeof res.stdout !== 'string') return null;\n return parseVmStatAvailableBytes(res.stdout);\n } catch {\n return null;\n }\n}\n\nfunction readLinuxAvailableBytes(): number | null {\n try {\n const content = fs.readFileSync('/proc/meminfo', 'utf8');\n return parseMeminfoAvailableBytes(content);\n } catch {\n return null;\n }\n}\n\nfunction safeNonNeg(n: number): number {\n return Number.isFinite(n) && n > 0 ? n : 0;\n}\n","/**\n * Thin I/O wrappers around the local model runtime (Ollama / GPU) for the\n * `vg code` guided flow (VG-CLI-CODE §10). The pure parsing/estimation these\n * feed lives in capability.ts and is unit-tested; this file just gathers real\n * system state and wraps the noisy `ollama pull` behind a single clean status\n * line (no raw progress spam), per the \"clean UI for devs\" requirement.\n */\n\nimport * as os from 'node:os';\nimport { spawn, spawnSync } from 'node:child_process';\nimport { availableRamBytes } from './available-memory.js';\nimport { parseOllamaPs, parseNvidiaSmi, type SystemMemory } from './capability.js';\nimport { hasOllamaBinary, resolveOllamaBinary } from '../util/resolve-ollama.js';\nimport type { Spinner } from './ui.js';\n\n/**\n * Gather current system memory, loaded models, and (best-effort) GPU VRAM.\n *\n * `freeRamBytes` is *available* RAM (reclaim-aware on macOS/Linux), not bare\n * free pages from `os.freemem()` — see `available-memory.ts`.\n */\nexport function gatherSystemMemory(): SystemMemory {\n const ollama = resolveOllamaBinary();\n const loaded = ollama ? safeRun(ollama, ['ps']).map(parseOllamaPs).flat() : [];\n const smi = safeRun('nvidia-smi', ['--query-gpu=memory.total,memory.used', '--format=csv,noheader,nounits'])\n .map(parseNvidiaSmi)\n .find(Boolean);\n const sys: SystemMemory = {\n totalRamBytes: os.totalmem(),\n freeRamBytes: availableRamBytes(),\n loaded,\n };\n if (smi) {\n sys.vramTotalBytes = smi.totalBytes;\n sys.vramFreeBytes = Math.max(0, smi.totalBytes - smi.usedBytes);\n }\n return sys;\n}\n\n/** True if the `ollama` binary is on PATH or a known install location. */\nexport function hasOllama(): boolean {\n return hasOllamaBinary();\n}\n\n/** Unload a running model to free memory. Returns true on success. */\nexport function stopModel(name: string): boolean {\n const ollama = resolveOllamaBinary();\n if (!ollama) return false;\n return spawnSync(ollama, ['stop', name], { stdio: 'ignore' }).status === 0;\n}\n\n/**\n * Pull a model, wrapping Ollama's chatty progress in one clean spinner line.\n * We read its stderr, keep only the latest human-meaningful status (e.g.\n * \"pulling manifest\", \"downloading … 42%\"), and never echo the raw stream.\n */\nexport function pullModelClean(name: string, spinner: Spinner): Promise<boolean> {\n return new Promise((resolve) => {\n const ollama = resolveOllamaBinary();\n if (!ollama) {\n resolve(false);\n return;\n }\n const child = spawn(ollama, ['pull', name]);\n const onData = (buf: Buffer): void => {\n const line = lastMeaningfulLine(buf.toString());\n if (line) spinner.update(`pulling ${name} — ${line}`);\n };\n child.stdout?.on('data', onData);\n child.stderr?.on('data', onData);\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\n/** The last non-empty, de-noised status token from an ollama progress chunk. */\nfunction lastMeaningfulLine(chunk: string): string {\n const lines = chunk\n .split(/[\\r\\n]+/)\n .map((l) => l.trim())\n // ollama redraws a progress bar with escape codes; strip them and bar glyphs.\n .map((l) => l.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '').replace(/[▏▎▍▌▋▊▉█░▒▓⣀-⣿]/g, '').trim())\n .filter(Boolean);\n const last = lines[lines.length - 1] ?? '';\n // Keep a short, meaningful summary (status + any percentage).\n const pct = last.match(/(\\d+)\\s*%/);\n const status = last.replace(/\\s{2,}.*$/, '').slice(0, 48);\n return pct ? `${status} ${pct[1]}%`.trim() : status;\n}\n\n/** Run a command and return its stdout lines (or [] if the binary is missing/fails). */\nfunction safeRun(bin: string, args: string[]): string[] {\n try {\n const res = spawnSync(bin, args, { encoding: 'utf8', timeout: 5000 });\n if (res.status !== 0 || typeof res.stdout !== 'string') return [];\n return [res.stdout];\n } catch {\n return [];\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-
|
|
2
|
-
import { recordCliCall, CLI_TOOL_ALIASES, buildCodeContext, buildTaskCapsule, capsuleToCodeContext } from './chunk-
|
|
1
|
+
import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-RZEXHDCF.js';
|
|
2
|
+
import { recordCliCall, CLI_TOOL_ALIASES, buildCodeContext, buildTaskCapsule, capsuleToCodeContext } from './chunk-US2DAKCM.js';
|
|
3
3
|
import { repositoryIdFromRoot } from './chunk-BWPBB45M.js';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import * as path from 'path';
|
|
@@ -251,5 +251,5 @@ function shortId() {
|
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
export { commitChanges, nodeCodeFs, runCodeSession, undoChanges };
|
|
254
|
-
//# sourceMappingURL=chunk-
|
|
255
|
-
//# sourceMappingURL=chunk-
|
|
254
|
+
//# sourceMappingURL=chunk-PRGCCW7D.js.map
|
|
255
|
+
//# sourceMappingURL=chunk-PRGCCW7D.js.map
|