@vibgrate/cli 2026.727.3 → 2026.727.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/dist/baseline-ENCOSJYQ.js +8 -0
- package/dist/{baseline-ATM5MXBZ.js.map → baseline-ENCOSJYQ.js.map} +1 -1
- package/dist/chunk-3SDV6ADQ.js +78 -0
- package/dist/chunk-3SDV6ADQ.js.map +1 -0
- package/dist/{chunk-6JIKUDWM.js → chunk-6AXHLQBV.js} +219 -22
- package/dist/chunk-6AXHLQBV.js.map +1 -0
- package/dist/{chunk-C66GOHYB.js → chunk-FPEOIS7K.js} +58 -23
- package/dist/chunk-FPEOIS7K.js.map +1 -0
- package/dist/{chunk-OOIG3RUM.js → chunk-GYSOQH5C.js} +18 -79
- package/dist/chunk-GYSOQH5C.js.map +1 -0
- package/dist/{chunk-FFWGT55D.js → chunk-HYRAILGM.js} +3 -3
- package/dist/{chunk-FFWGT55D.js.map → chunk-HYRAILGM.js.map} +1 -1
- package/dist/{chunk-NDMDSPFX.js → chunk-KKRSQQ3A.js} +4 -3
- package/dist/chunk-KKRSQQ3A.js.map +1 -0
- package/dist/chunk-KUIBP3LU.js +101 -0
- package/dist/chunk-KUIBP3LU.js.map +1 -0
- package/dist/{chunk-OFUC6RYN.js → chunk-KXSKFQMI.js} +6 -99
- package/dist/chunk-KXSKFQMI.js.map +1 -0
- package/dist/{chunk-AVQSHIJ5.js → chunk-LJP2EPKM.js} +4 -4
- package/dist/{chunk-AVQSHIJ5.js.map → chunk-LJP2EPKM.js.map} +1 -1
- package/dist/{chunk-Z7GP7XTJ.js → chunk-MAUJTPQW.js} +5 -5
- package/dist/{chunk-Z7GP7XTJ.js.map → chunk-MAUJTPQW.js.map} +1 -1
- package/dist/{chunk-3V24O47U.js → chunk-PVZBYZZR.js} +19 -9
- package/dist/chunk-PVZBYZZR.js.map +1 -0
- package/dist/{chunk-2VFWXNS5.js → chunk-R6ZRVVZT.js} +3 -3
- package/dist/{chunk-2VFWXNS5.js.map → chunk-R6ZRVVZT.js.map} +1 -1
- package/dist/{chunk-Y23HMSWU.js → chunk-T3AYRS7J.js} +14 -7
- package/dist/chunk-T3AYRS7J.js.map +1 -0
- package/dist/chunk-YCJIIGLP.js +356 -0
- package/dist/chunk-YCJIIGLP.js.map +1 -0
- package/dist/{chunk-MAY5HLDH.js → chunk-YKVH2PGF.js} +68 -23
- package/dist/chunk-YKVH2PGF.js.map +1 -0
- package/dist/cli.js +68 -199
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/{interactive-INGJNSON.js → interactive-SMHVURYK.js} +44 -14
- package/dist/interactive-SMHVURYK.js.map +1 -0
- package/dist/model-manager-PN7HEDXD.js +9 -0
- package/dist/{model-orchestrator-TVONAUPS.js.map → model-manager-PN7HEDXD.js.map} +1 -1
- package/dist/{model-orchestrator-TVONAUPS.js → model-orchestrator-4VSYP4J4.js} +3 -3
- package/dist/model-orchestrator-4VSYP4J4.js.map +1 -0
- package/dist/resolve-gguf-Y6FH3CNB.js +9 -0
- package/dist/{resolve-gguf-VPL4YQ6J.js.map → resolve-gguf-Y6FH3CNB.js.map} +1 -1
- package/dist/{session-M72522AP.js → session-W3646AOV.js} +5 -4
- package/dist/{session-M72522AP.js.map → session-W3646AOV.js.map} +1 -1
- package/dist/{stream-json-6ZBUA2L3.js → stream-json-X7UQFB4T.js} +7 -6
- package/dist/stream-json-X7UQFB4T.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-ATM5MXBZ.js +0 -8
- package/dist/chunk-3V24O47U.js.map +0 -1
- package/dist/chunk-6JIKUDWM.js.map +0 -1
- package/dist/chunk-C66GOHYB.js.map +0 -1
- package/dist/chunk-MAY5HLDH.js.map +0 -1
- package/dist/chunk-NDMDSPFX.js.map +0 -1
- package/dist/chunk-OFUC6RYN.js.map +0 -1
- package/dist/chunk-OOIG3RUM.js.map +0 -1
- package/dist/chunk-Y23HMSWU.js.map +0 -1
- package/dist/interactive-INGJNSON.js.map +0 -1
- package/dist/resolve-gguf-VPL4YQ6J.js +0 -8
- package/dist/stream-json-6ZBUA2L3.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { G as GraphNode, a as GraphEdge, A as Area, R as ResolverKind, V as VgGr
|
|
|
2
2
|
export { e as AnalysisTier, C as Centrality, D as DerivedBy, f as EpistemicTier, g as FactConfidence, h as FactKind, i as GraphMeta, j as GraphSummaries, H as HubBlastSummary, N as NodeKind, P as Provenance, S as SCHEMA_VERSION, k as Span, T as Toolchain, U as Unknown } from './types-DLH-Ritr.js';
|
|
3
3
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
4
|
|
|
5
|
-
declare const VERSION = "2026.727.
|
|
5
|
+
declare const VERSION = "2026.727.4";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Analysis stage: importance, centrality, hubs, communities, and surprise.
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
export { GraphSource, createServer, exportGraph, formatForExt, serveStdio } from './chunk-
|
|
2
|
-
export { ASSISTANTS, FREE_PACK, ResourceLimitError, SKIP_DIRS, SKIP_FILES, TOOLS, UsageError, analyze, applyCoverage, assistantById, buildFacts, buildGraph, coveringTests, decodeScipIndex, detectRunner, discover, driftCount, groundGraph, hasDrift, installAssistant, loadCoverage, loadSnapshot, probeFreshness, refreshIfStale, resolveLimits, scipEdges, searchSymbols, shortestPath, testsToRun, uninstallAssistant, verifyDeterminism, writeSnapshot } from './chunk-
|
|
3
|
-
export { addLibrary, applyStaticTestLinkage, buildModuleResolver, inventory as dependencyInventory, driftFor, enrichOnline, isTestFile, libId, loadCatalog, parseJsonc, readDoc, relativeResolver, resolveLib, saveCatalog } from './chunk-
|
|
4
|
-
export { VERSION } from './chunk-
|
|
1
|
+
export { GraphSource, createServer, exportGraph, formatForExt, serveStdio } from './chunk-LJP2EPKM.js';
|
|
2
|
+
export { ASSISTANTS, FREE_PACK, ResourceLimitError, SKIP_DIRS, SKIP_FILES, TOOLS, UsageError, analyze, applyCoverage, assistantById, buildFacts, buildGraph, coveringTests, decodeScipIndex, detectRunner, discover, driftCount, groundGraph, hasDrift, installAssistant, loadCoverage, loadSnapshot, probeFreshness, refreshIfStale, resolveLimits, scipEdges, searchSymbols, shortestPath, testsToRun, uninstallAssistant, verifyDeterminism, writeSnapshot } from './chunk-YKVH2PGF.js';
|
|
3
|
+
export { addLibrary, applyStaticTestLinkage, buildModuleResolver, inventory as dependencyInventory, driftFor, enrichOnline, isTestFile, libId, loadCatalog, parseJsonc, readDoc, relativeResolver, resolveLib, saveCatalog } from './chunk-6AXHLQBV.js';
|
|
4
|
+
export { VERSION } from './chunk-T3AYRS7J.js';
|
|
5
|
+
export { CAPSULE_COMPILER_ID, CAPSULE_RANKING_VERSION, TASK_CAPSULE_SCHEMA_VERSION, buildCodeContext, buildTaskCapsule, capsuleToCodeContext, readSavings, recordSaving, savingsRecorded, summarizeCapsule } from './chunk-ZBTY6VV4.js';
|
|
5
6
|
import './chunk-CRAMOEBE.js';
|
|
6
7
|
export { findNodes, nodeById, resolveOne } from './chunk-J7LKEB2R.js';
|
|
7
|
-
export { discoverModels } from './chunk-OOIG3RUM.js';
|
|
8
|
-
export { CAPSULE_COMPILER_ID, CAPSULE_RANKING_VERSION, TASK_CAPSULE_SCHEMA_VERSION, buildCodeContext, buildTaskCapsule, capsuleToCodeContext, readSavings, recordSaving, savingsRecorded, summarizeCapsule } from './chunk-ZBTY6VV4.js';
|
|
9
8
|
export { GraphIndex, cosine, getNodeEmbeddings, identifierParts, impactOf, loadEmbedder, nodeEmbedText, queryGraph, queryGraphSemantic } from './chunk-6UK6QPTR.js';
|
|
9
|
+
export { discoverModels } from './chunk-3SDV6ADQ.js';
|
|
10
|
+
import './chunk-GYSOQH5C.js';
|
|
10
11
|
export { LANGUAGES, allLanguageIds, grammarsSourceDir, langById, langForExtension, parseSource } from './chunk-ON25BX6T.js';
|
|
11
12
|
import { redactUrlCredentials, redactSecrets } from './chunk-RXP66R2E.js';
|
|
12
13
|
export { SCHEMA_VERSION, defaultGraphPath, legacyGraphPath, loadGraph, preferInRepoGraph, renderHtml, renderReport, resolveGraphPath, vibgrateDir, writeArtifacts } from './chunk-B3YUO3NW.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/push.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/engine/push.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsBO,SAAS,aAAA,CAAc,IAAA,EAAc,KAAA,EAAgB,YAAA,EAA4C;AACtG,EAAA,MAAM,MAAM,GAAA,CAAI,IAAA,EAAM,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA,IAAK,0CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAM,CAAC,aAAa,cAAA,EAAgB,MAAM,CAAC,CAAA,IAAK,MAAA;AACnE,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,EAAM,CAAC,UAAU,OAAA,EAAS,mBAAmB,CAAC,CAAA,IAAK,MAAA;AACzE,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,cAAA;AAAA,IACf,YAAA,EAAc,OAAA;AAAA,IACd,YAAA;AAAA,IACA,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,MAAA,EAAO;AAAA,IAC/C,YAAY,SAAA,GAAY,EAAE,WAAW,oBAAA,CAAqB,SAAS,GAAE,GAAI,MAAA;AAAA,IACzE,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,KAAA,EAAO,YAAY,KAAK;AAAA,GAC1B;AACF;AAOO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5B,MAAA,MAAM,YAAY,CAAA,CAAE,SAAA,GAAY,cAAc,CAAA,CAAE,SAAS,IAAI,CAAA,CAAE,SAAA;AAC/D,MAAA,MAAM,MAAM,CAAA,CAAE,GAAA,GAAM,cAAc,CAAA,CAAE,GAAG,IAAI,CAAA,CAAE,GAAA;AAC7C,MAAA,OAAO,SAAA,KAAc,CAAA,CAAE,SAAA,IAAa,GAAA,KAAQ,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,GAAA,EAAI,GAAI,CAAA;AAAA,IACjF,CAAC;AAAA,GACH;AACF;AAEA,SAAS,GAAA,CAAI,MAAc,IAAA,EAA+B;AACxD,EAAA,IAAI;AACF,IAAA,OAAO,YAAA,CAAa,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAK,IAAK,IAAA;AAAA,EAC9E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.js","sourcesContent":["import { execFileSync } from 'node:child_process';\nimport { redactSecrets, redactUrlCredentials } from '../core-open/utils/redact.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The deferred, decoupled push envelope (VG-PACKAGE-AND-SCHEMA §7). In the open\n * CLI `vg push` is **specified but not built**: it assembles and redacts the\n * envelope and prints a notice, but performs **no network upload**. Nothing in\n * the free path depends on it. Drift-over-time/governance is the separate\n * commercial product.\n */\n\nexport interface GraphUploadEnvelope {\n schemaVersion: 'vg-graph/1.0';\n artifactType: 'graph';\n scanIngestId?: string;\n vcs: { sha: string; shortSha: string; branch: string };\n repository?: { name?: string; remoteUrl?: string };\n generatedAt: string;\n graph: VgGraph;\n}\n\nexport function buildEnvelope(root: string, graph: VgGraph, scanIngestId?: string): GraphUploadEnvelope {\n const sha = git(root, ['rev-parse', 'HEAD']) ?? '0000000000000000000000000000000000000000';\n const branch = git(root, ['rev-parse', '--abbrev-ref', 'HEAD']) ?? 'HEAD';\n const remoteUrl = git(root, ['config', '--get', 'remote.origin.url']) ?? undefined;\n return {\n schemaVersion: 'vg-graph/1.0',\n artifactType: 'graph',\n scanIngestId,\n vcs: { sha, shortSha: sha.slice(0, 12), branch },\n repository: remoteUrl ? { remoteUrl: redactUrlCredentials(remoteUrl) } : undefined,\n generatedAt: graph.generatedAt,\n graph: redactGraph(graph),\n };\n}\n\n/**\n * Redaction pass (GUARDRAILS §1: redact before storage). The graph is structure,\n * not content, but we defensively scrub any signature/name that matches a\n * credential-shaped pattern, and strip credentials from the remote URL.\n */\nexport function redactGraph(graph: VgGraph): VgGraph {\n return {\n ...graph,\n nodes: graph.nodes.map((n) => {\n const signature = n.signature ? redactSecrets(n.signature) : n.signature;\n const doc = n.doc ? redactSecrets(n.doc) : n.doc;\n return signature !== n.signature || doc !== n.doc ? { ...n, signature, doc } : n;\n }),\n };\n}\n\nfunction git(root: string, args: string[]): string | null {\n try {\n return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim() || null;\n } catch {\n return null;\n }\n}\n"]}
|
|
@@ -2,8 +2,10 @@ import { TtyPrompter, PromptCancelled } from './chunk-JYS4OBN2.js';
|
|
|
2
2
|
import { McpToolset, defaultMcpConnect } from './chunk-LEPTUB4H.js';
|
|
3
3
|
import { newSession, loadLatestSession, summarizeSession, saveSession, recordTask } from './chunk-K3SLGULW.js';
|
|
4
4
|
import { startCodeRuntimeSession } from './chunk-XPJZTSY7.js';
|
|
5
|
-
import { printCodeLogo, runBuild, fetchCatalog, resolveProviders, topProviders } from './chunk-
|
|
6
|
-
import { runAgent } from './chunk-
|
|
5
|
+
import { printCodeLogo, runBuild, fetchCatalog, resolveProviders, topProviders } from './chunk-FPEOIS7K.js';
|
|
6
|
+
import { runAgent } from './chunk-MAUJTPQW.js';
|
|
7
|
+
import { nodeCodeFs, undoChanges } from './chunk-R6ZRVVZT.js';
|
|
8
|
+
import { summarizeDiffs } from './chunk-KXSKFQMI.js';
|
|
7
9
|
import { info, c, out } from './chunk-CT5BS56U.js';
|
|
8
10
|
import { BranchGraphSession } from './chunk-77LYGXBI.js';
|
|
9
11
|
import { loadOrDiscoverFederation } from './chunk-5I4VSBWQ.js';
|
|
@@ -15,17 +17,18 @@ import { resolveGraphBackend } from './chunk-HK3AWUXH.js';
|
|
|
15
17
|
import { vgdIsRunning, vgdRequest } from './chunk-PMYWZRRS.js';
|
|
16
18
|
import './chunk-K7REHDQS.js';
|
|
17
19
|
import './chunk-JIBOJTGS.js';
|
|
18
|
-
import './chunk-
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import { refreshIfStale } from './chunk-
|
|
22
|
-
import './chunk-
|
|
23
|
-
import './chunk-
|
|
20
|
+
import './chunk-KKRSQQ3A.js';
|
|
21
|
+
import './chunk-YCJIIGLP.js';
|
|
22
|
+
import './chunk-KUIBP3LU.js';
|
|
23
|
+
import { refreshIfStale } from './chunk-YKVH2PGF.js';
|
|
24
|
+
import './chunk-6AXHLQBV.js';
|
|
25
|
+
import './chunk-T3AYRS7J.js';
|
|
26
|
+
import { readModelSavings } from './chunk-ZBTY6VV4.js';
|
|
24
27
|
import './chunk-CRAMOEBE.js';
|
|
25
28
|
import './chunk-J7LKEB2R.js';
|
|
26
|
-
import { discoverModels } from './chunk-OOIG3RUM.js';
|
|
27
|
-
import { readModelSavings } from './chunk-ZBTY6VV4.js';
|
|
28
29
|
import './chunk-6UK6QPTR.js';
|
|
30
|
+
import { discoverModels } from './chunk-3SDV6ADQ.js';
|
|
31
|
+
import './chunk-GYSOQH5C.js';
|
|
29
32
|
import './chunk-ON25BX6T.js';
|
|
30
33
|
import './chunk-RXP66R2E.js';
|
|
31
34
|
import { loadGraph, resolveGraphPath } from './chunk-B3YUO3NW.js';
|
|
@@ -265,7 +268,29 @@ async function preflightAndPull(selection, prompter) {
|
|
|
265
268
|
}
|
|
266
269
|
async function codingRepl(root, global, opts, selection, prompter) {
|
|
267
270
|
let sel = selection;
|
|
268
|
-
let route = resolveProviders({
|
|
271
|
+
let route = resolveProviders({
|
|
272
|
+
provider: sel.provider,
|
|
273
|
+
model: sel.model,
|
|
274
|
+
local: sel.kind === "local" || global.local,
|
|
275
|
+
consent: true
|
|
276
|
+
// interactive selection is consent for manager runtime deps
|
|
277
|
+
});
|
|
278
|
+
try {
|
|
279
|
+
const { ensureManagerRuntime } = await import('./model-manager-PN7HEDXD.js');
|
|
280
|
+
const ensure = await ensureManagerRuntime({
|
|
281
|
+
providerId: route.providers[0]?.id ?? sel.provider,
|
|
282
|
+
model: route.providers[0]?.model ?? sel.model,
|
|
283
|
+
offline: !!global.local,
|
|
284
|
+
consent: true
|
|
285
|
+
});
|
|
286
|
+
if (!ensure.ok) prompter.note(c.yellow(ensure.error ?? "model manager not ready"));
|
|
287
|
+
else if (ensure.installed.length || ensure.pulled.length) {
|
|
288
|
+
for (const s of ensure.installed) prompter.note(c.dim(`installed ${s}`));
|
|
289
|
+
for (const s of ensure.pulled) prompter.note(c.dim(`pulled ${s}`));
|
|
290
|
+
}
|
|
291
|
+
prompter.note(c.dim(`manager ${route.managerLine}`));
|
|
292
|
+
} catch {
|
|
293
|
+
}
|
|
269
294
|
const fsImpl = nodeCodeFs(root);
|
|
270
295
|
const meter = new SessionMeter();
|
|
271
296
|
let lastChanges = [];
|
|
@@ -365,7 +390,12 @@ async function codingRepl(root, global, opts, selection, prompter) {
|
|
|
365
390
|
const swapped = await reselectModel(root, global, prompter);
|
|
366
391
|
if (swapped) {
|
|
367
392
|
sel = swapped;
|
|
368
|
-
route = resolveProviders({
|
|
393
|
+
route = resolveProviders({
|
|
394
|
+
provider: sel.provider,
|
|
395
|
+
model: sel.model,
|
|
396
|
+
local: sel.kind === "local" || global.local,
|
|
397
|
+
consent: true
|
|
398
|
+
});
|
|
369
399
|
prompter.note(c.green(`now using ${sel.providerSlug}/${sel.model}`));
|
|
370
400
|
}
|
|
371
401
|
} else if (cmd === "cost") {
|
|
@@ -637,5 +667,5 @@ ${res.stderr}` : "");
|
|
|
637
667
|
}
|
|
638
668
|
|
|
639
669
|
export { agentTask, runInteractive };
|
|
640
|
-
//# sourceMappingURL=interactive-
|
|
641
|
-
//# sourceMappingURL=interactive-
|
|
670
|
+
//# sourceMappingURL=interactive-SMHVURYK.js.map
|
|
671
|
+
//# sourceMappingURL=interactive-SMHVURYK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/wizard.ts","../src/code/cost.ts","../src/runtime/bridge-facts.ts","../src/code/interactive.ts"],"names":["group","model","sp"],"mappings":"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","file":"interactive-SMHVURYK.js","sourcesContent":["/**\n * The `vg code` guided provider/model wizard (VG-CLI-CODE §8).\n *\n * Walks the developer from \"I want to code\" to a concrete (provider, model)\n * choice: run locally, or pick one of the current top hosted providers\n * (Claude / GPT / Grok / Gemini / …) surfaced live from the model catalog — with\n * an \"enter a slug myself\" escape hatch at every step. Pure over an injected\n * {@link Prompter} + catalog + local fleet, so the whole decision tree is\n * unit-tested with a scripted prompter and no network or TTY.\n */\n\nimport type { Prompter } from './ui.js';\nimport type { Catalog } from './catalog.js';\nimport { topProviders } from './catalog.js';\nimport type { LocalModel } from '../engine/models.js';\n\nexport interface WizardResult {\n kind: 'hosted' | 'local';\n /** The router `--provider` value: `openrouter` for hosted picks, `ollama` for local. */\n provider: 'openrouter' | 'ollama';\n /** The concrete model slug/tag to run. */\n model: string;\n /** The display provider for per-model savings attribution (e.g. `anthropic`, `ollama`). */\n providerSlug: string;\n /** For a local model not yet present on the machine → pull it first. */\n needsPull?: boolean;\n}\n\nconst ENTER_SLUG = '__enter_slug__';\nconst LOCAL = '__local__';\nconst BROWSE = '__browse__';\n\nexport interface WizardDeps {\n catalog: Catalog;\n localModels: LocalModel[];\n topN?: number;\n}\n\n/** Run the guided selection and return the resolved provider + model. */\nexport async function runProviderWizard(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const providers = topProviders(deps.catalog, deps.topN ?? 6);\n\n // Screen 1 — where should the model run?\n const choice = await prompter.select<string>('Where should the model run?', [\n { label: 'Local model (on your machine)', value: LOCAL, hint: deps.localModels.length ? `${deps.localModels.length} found` : 'nothing installed yet' },\n ...providers.map((p) => ({ label: p.label, value: p.id, hint: 'via OpenRouter' })),\n { label: 'Enter a provider or model slug myself', value: ENTER_SLUG },\n ]);\n\n if (choice === LOCAL) return pickLocal(prompter, deps);\n if (choice === ENTER_SLUG) {\n const slug = (await prompter.input('Model slug (e.g. anthropic/claude-3.5-sonnet, or a provider like openai)')).trim();\n // A full `provider/model` slug is a hosted pick; a bare provider name → show its models.\n if (slug.includes('/')) return { kind: 'hosted', provider: 'openrouter', model: slug, providerSlug: slug.split('/')[0] };\n const group = deps.catalog.providers.find((p) => p.id === slug);\n if (group && group.models.length) return pickHostedModel(prompter, group.id, group.models);\n // Unknown provider → let them type the full model slug.\n const model = (await prompter.input(`Model id for \"${slug}\"`)).trim();\n return { kind: 'hosted', provider: 'openrouter', model: model || slug, providerSlug: slug };\n }\n\n // A hosted provider was chosen → pick one of its models.\n const group = providers.find((p) => p.id === choice)!;\n return pickHostedModel(prompter, group.id, group.models);\n}\n\nasync function pickHostedModel(prompter: Prompter, providerSlug: string, models: Catalog['providers'][number]['models']) {\n if (models.length === 0) {\n const model = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n }\n const model = await prompter.select<string>('Choose a model', [\n ...models.slice(0, 12).map((m) => ({ label: m.name, value: m.id, hint: modelHint(m.contextLength, m.promptPricePerM) })),\n { label: 'Enter a model slug myself', value: ENTER_SLUG },\n ]);\n if (model === ENTER_SLUG) {\n const typed = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model: typed, providerSlug };\n }\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n}\n\nasync function pickLocal(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const installed = deps.localModels.filter((m) => m.runtime === 'ollama');\n const choices = [\n ...installed.map((m) => ({ label: m.name, value: m.name, hint: 'installed' })),\n { label: 'Browse coding models to pull (Ollama)', value: BROWSE },\n { label: 'Enter a model name to pull', value: ENTER_SLUG },\n ];\n const picked = await prompter.select<string>('Local model', choices);\n\n if (picked === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n if (picked === BROWSE) {\n // Suggest coding models from the catalog, mapped to a likely Ollama tag.\n const coding = deps.catalog.providers\n .flatMap((p) => p.models)\n .filter((m) => /cod(e|er|ing)/i.test(m.id))\n .slice(0, 10);\n if (coding.length === 0) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n const slug = await prompter.select<string>('Coding model to pull', [\n ...coding.map((m) => ({ label: m.name, value: toOllamaTag(m.id), hint: m.id })),\n { label: 'Enter a model name myself', value: ENTER_SLUG },\n ]);\n if (slug === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n return { kind: 'local', provider: 'ollama', model: slug, providerSlug: 'ollama', needsPull: true };\n }\n // An already-installed model — no pull needed.\n return { kind: 'local', provider: 'ollama', model: picked, providerSlug: 'ollama', needsPull: false };\n}\n\n/** Best-effort map an OpenRouter slug to a likely Ollama tag (`qwen/qwen-2.5-coder-7b` → `qwen2.5-coder:7b`). */\nexport function toOllamaTag(slug: string): string {\n const tail = slug.split('/').pop() ?? slug;\n const size = tail.match(/(\\d+(?:\\.\\d+)?)b\\b/i);\n const base = tail\n .replace(/-instruct\\b/i, '')\n .replace(/(\\d+(?:\\.\\d+)?)b\\b/i, '')\n .replace(/[-.]+$/g, '')\n .replace(/\\s+/g, '-');\n return size ? `${base}:${size[1]}b` : base;\n}\n\nfunction modelHint(contextLength?: number, pricePerM?: number): string {\n const parts: string[] = [];\n if (contextLength) parts.push(`${Math.round(contextLength / 1000)}k ctx`);\n if (typeof pricePerM === 'number') parts.push(pricePerM === 0 ? 'free' : `$${pricePerM}/M in`);\n return parts.join(' · ');\n}\n","/**\n * Live cost / token metering for VG Code (VG-CLI-CODE §15).\n *\n * A session meter accumulates the prompt/completion tokens providers report and\n * turns them into a running dollar estimate from the model's published price\n * (per-million, from the catalog). Local models are free, so cost is 0 and only\n * tokens are shown. Pure and unit-tested; the estimate is labelled as such.\n */\n\nexport interface TokenUsage {\n promptTokens?: number;\n completionTokens?: number;\n}\n\n/** USD per 1M tokens for the active model (from the catalog); absent for local/free. */\nexport interface ModelPricing {\n promptPerM?: number;\n completionPerM?: number;\n}\n\n/** Dollar cost of one usage sample under a pricing table (0 when unpriced/free). */\nexport function costOf(usage: TokenUsage, pricing: ModelPricing): number {\n const inCost = ((usage.promptTokens ?? 0) / 1e6) * (pricing.promptPerM ?? 0);\n const outCost = ((usage.completionTokens ?? 0) / 1e6) * (pricing.completionPerM ?? 0);\n return round4(inCost + outCost);\n}\n\n/** Accumulates usage + cost across a coding session. */\nexport class SessionMeter {\n private prompt = 0;\n private completion = 0;\n private cost = 0;\n private turns = 0;\n\n constructor(private pricing: ModelPricing = {}) {}\n\n /** Update the pricing (e.g. after `/model` switches model mid-session). */\n setPricing(pricing: ModelPricing): void {\n this.pricing = pricing;\n }\n\n /** Record one model turn; returns the incremental cost of just this turn. */\n add(usage: TokenUsage): number {\n this.prompt += usage.promptTokens ?? 0;\n this.completion += usage.completionTokens ?? 0;\n this.turns += 1;\n const delta = costOf(usage, this.pricing);\n this.cost = round4(this.cost + delta);\n return delta;\n }\n\n get totals(): { promptTokens: number; completionTokens: number; totalTokens: number; cost: number; turns: number } {\n return { promptTokens: this.prompt, completionTokens: this.completion, totalTokens: this.prompt + this.completion, cost: this.cost, turns: this.turns };\n }\n\n /** A compact one-line summary, e.g. `3.1k tok · ~$0.0042` (cost only when priced). */\n summary(): string {\n const t = this.totals;\n const tok = `${fmtTokens(t.totalTokens)} tok`;\n const priced = this.pricing.promptPerM || this.pricing.completionPerM;\n return priced ? `${tok} · ~$${t.cost.toFixed(4)}` : tok;\n }\n}\n\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction round4(x: number): number {\n return Math.round(x * 1e4) / 1e4;\n}\n","/**\n * Project federation bridge edges into capsule pinned facts (Fusion Phase 6).\n *\n * High-confidence bridges become short, secret-free facts the model can see\n * without opening every workspace root. Pure over {@link BridgeEdge}.\n */\n\nimport type { BridgeEdge } from './bridge-edges.js';\n\n/**\n * Turn bridge edges into pinned-fact lines for Task Capsules.\n * Default minConfidence 0.8 keeps only workspace/package-strong links\n * (interface bridges sit ~0.68–0.75 and stay out unless lowered).\n */\nexport function bridgePinnedFacts(\n bridges: BridgeEdge[] | undefined | null,\n options: { minConfidence?: number; maxFacts?: number } = {},\n): string[] {\n if (!bridges?.length) return [];\n const min = options.minConfidence ?? 0.8;\n const max = options.maxFacts ?? 12;\n return bridges\n .filter((b) => b.confidence >= min)\n .map((b) => {\n const from = shortLabel(b.fromRoot);\n const to = shortLabel(b.toRoot);\n const via = b.packageName ? ` package ${b.packageName}` : '';\n return `bridge ${b.kind}: ${from} → ${to}${via} (${b.confidence.toFixed(2)})`;\n })\n .sort((a, b) => a.localeCompare(b))\n .slice(0, max);\n}\n\nfunction shortLabel(root: string): string {\n const parts = root.replace(/\\\\/g, '/').split('/').filter(Boolean);\n return parts[parts.length - 1] || root;\n}\n","/**\n * The `vg code` guided, interactive mode (VG-CLI-CODE §8–§11).\n *\n * Running bare `vg code` at a terminal enters this flow: show the VG Code\n * banner, make sure the code map is built (behind a spinner, no map banner),\n * walk the developer through choosing a provider + model (local or a top hosted\n * provider), run a memory pre-flight before pulling any local model, then drop\n * into a coding REPL that proposes a diff per instruction and writes only what\n * the developer approves.\n *\n * The decision logic (catalog grouping, wizard tree, capability assessment) is\n * pure and unit-tested elsewhere; this module is the I/O shell that wires those\n * pieces to the terminal, the graph build, and the model runtime.\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { resolveGraphPath } from '../engine/artifacts.js';\nimport { BranchGraphSession } from '../runtime/branch-graph-session.js';\nimport { discoverModels } from '../engine/models.js';\nimport { runBuild } from '../commands/build.js';\nimport { printCodeLogo } from '../util/logo.js';\nimport { c, info, out } from '../util/output.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport { fetchCatalog } from './catalog.js';\nimport { runProviderWizard, type WizardResult } from './wizard.js';\nimport { TtyPrompter, PromptCancelled, type Prompter } from './ui.js';\nimport { estimateModelBytes, assessCapability, fmt } from './capability.js';\nimport { gatherSystemMemory, hasOllama, stopModel, pullModelClean } from './local-runtime.js';\nimport { spawnSync } from 'node:child_process';\nimport { resolveProviders } from './router.js';\nimport { nodeCodeFs, undoChanges } from './session.js';\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport { readModelSavings } from '../engine/savings.js';\nimport { SessionMeter } from './cost.js';\nimport { McpToolset, defaultMcpConnect, type McpConnect } from './mcp-tools.js';\nimport { loadLatestSession, saveSession, summarizeSession, newSession, recordTask, type StoredSession } from './session-store.js';\nimport type { McpServerConfig } from './config.js';\nimport type { MutatingAction, ShellResult } from './tools.js';\nimport type { FileChange, Provider } from './types.js';\nimport { startCodeRuntimeSession } from './runtime-session.js';\nimport { loadOrDiscoverFederation } from '../runtime/federation.js';\nimport { bridgePinnedFacts } from '../runtime/bridge-facts.js';\nimport { resolveExecutionEnv, type SecurityTier } from '../runtime/execution-env.js';\nimport {\n mergeModelExecutionProfile,\n resolveModelExecutionProfile,\n type ModelExecutionProfile,\n} from '../runtime/model-execution-profile.js';\nimport { vgdIsRunning, vgdRequest } from '../runtime/vgd/index.js';\nimport { resolveGraphBackend } from './graph-backend.js';\nimport { summarizeDiffs } from './diff.js';\n\nexport interface InteractiveOptions {\n provider?: string;\n model?: string;\n modelPath?: string;\n budget?: string;\n file?: string[];\n /** Auto-approve edits and commands (autonomous). */\n auto?: boolean;\n /** Cap on agent steps per instruction. */\n maxSteps?: number;\n /** Extra command-denylist rules for autonomous mode (from config). */\n denyCommands?: string[];\n /** Project test/verify command surfaced to the agent (from config). */\n testCommand?: string;\n /** Transcript compaction budget in tokens (from config / model window). */\n contextBudget?: number;\n /** Stream assistant tokens live. */\n stream?: boolean;\n /** Auto-verify: run the test command after the agent finishes and fix failures. */\n verify?: { command: string; maxRounds?: number };\n /** External MCP servers whose tools the agent may call. */\n mcpServers?: Record<string, McpServerConfig>;\n /** Which config files the MCP servers came from (for a transparent note). */\n mcpSources?: string[];\n /** Resume the most recent session (inject a recap, restore /undo). */\n continueSession?: boolean;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n /**\n * Security ladder tier for shell (ADR-002). When omitted: L1 under `--auto`,\n * otherwise L0. Explicit value always wins.\n */\n securityTier?: SecurityTier;\n /** Optional Model Execution Profile overrides from code.json. */\n modelProfile?: Partial<ModelExecutionProfile>;\n /** Injectable MCP connect (tests). */\n mcpConnect?: McpConnect;\n}\n\n/** Entry point for guided `vg code` (no instruction, at a TTY). */\nexport async function runInteractive(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter = new TtyPrompter()): Promise<void> {\n printCodeLogo(root);\n try {\n await ensureMap(root, global, prompter);\n const selection = await chooseModel(root, global, opts, prompter);\n if (!selection) return; // aborted (e.g. can't run a local model)\n await codingRepl(root, global, opts, selection, prompter);\n } catch (e) {\n if (e instanceof PromptCancelled) {\n info(c.dim('\\n cancelled — no changes were made'));\n return;\n }\n throw e;\n }\n}\n\n/** Build the code map if missing, or refresh it if the tree drifted — behind a spinner, no map banner. */\nasync function ensureMap(root: string, global: GlobalOpts, prompter: Prompter): Promise<void> {\n const existing = loadGraph(root, global.graph);\n if (!existing) {\n const sp = prompter.spinner('Building the code map…');\n try {\n // quiet:true suppresses the map's own banner/progress so our UI stays clean.\n await runBuild([root], {}, { ...global, quiet: true });\n sp.stop('Code map built');\n } catch (e) {\n sp.fail(`couldn't build the code map: ${(e as Error).message}`);\n throw e;\n }\n return;\n }\n const sp = prompter.spinner('Checking the code map is up to date…');\n const graphPath = resolveGraphPath(root);\n const refreshed = await refreshIfStale(root, { graphPath }).catch(() => null);\n if (refreshed?.status === 'refreshed') sp.stop('Code map refreshed');\n else sp.stop('Code map ready');\n}\n\n/** Resolve the provider/model — from flags if given, else via the guided wizard. */\nasync function chooseModel(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter): Promise<WizardResult | null> {\n // Explicit flags skip the wizard entirely.\n if (opts.provider && (opts.model || opts.modelPath)) {\n const local = opts.provider === 'ollama' || opts.provider === 'lmstudio' || opts.provider === 'llama-cpp' || !!global.local;\n return { kind: local ? 'local' : 'hosted', provider: opts.provider === 'ollama' ? 'ollama' : 'openrouter', model: opts.model ?? opts.modelPath ?? '', providerSlug: opts.provider, needsPull: false };\n }\n\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop(catalog.source === 'network' ? 'Model catalog loaded' : catalog.source === 'cache' ? 'Model catalog (cached)' : 'Model catalog (offline list)');\n const localModels = discoverModels();\n\n const selection = await runProviderWizard(prompter, { catalog, localModels });\n\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n if (selection.kind === 'hosted' && !process.env.OPENROUTER_API_KEY) {\n prompter.note(c.yellow('Set OPENROUTER_API_KEY in your environment to use this hosted model (keys are never passed as flags).'));\n }\n return selection;\n}\n\n/** Memory pre-flight, then a clean, wrapped `ollama pull`. Returns false if we shouldn't proceed. */\nasync function preflightAndPull(selection: WizardResult, prompter: Prompter): Promise<boolean> {\n if (!hasOllama()) {\n prompter.note(c.yellow('Ollama isn’t installed — get it from https://ollama.com, then re-run. (We never install a runtime for you.)'));\n return false;\n }\n const estimate = estimateModelBytes(selection.model);\n const report = assessCapability(estimate, gatherSystemMemory());\n\n prompter.note(`${c.bold(selection.model)} — estimated ${fmt(estimate.bytes)}${estimate.guessed ? c.dim(' (size guessed)') : ''}; ~${fmt(report.availableBytes)} free now`);\n for (const s of report.suggestions) prompter.note(c.dim(`· ${s}`));\n\n if (!report.canRun) {\n prompter.note(c.red('This machine doesn’t have enough memory for that model — not pulling it. Pick a smaller model or a lower quant.'));\n return false;\n }\n if (report.needsUnload) {\n const biggest = [...report.loaded].sort((a, b) => b.bytes - a.bytes)[0];\n if (biggest && (await prompter.confirm(`Unload ${biggest.name} to free ~${fmt(biggest.bytes)}?`, true))) {\n stopModel(biggest.name);\n }\n }\n if (!(await prompter.confirm(`Pull ${selection.model} (~${fmt(estimate.bytes)})?`, true))) return false;\n\n const sp = prompter.spinner(`Pulling ${selection.model}…`);\n const ok = await pullModelClean(selection.model, sp);\n if (ok) sp.stop(`Pulled ${selection.model}`);\n else sp.fail(`couldn’t pull ${selection.model}`);\n return ok;\n}\n\n/** The coding REPL: a graph-grounded agent per task, plus slash-commands (/help, /undo, …). */\nasync function codingRepl(root: string, global: GlobalOpts, opts: InteractiveOptions, selection: WizardResult, prompter: Prompter): Promise<void> {\n let sel = selection;\n let route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true, // interactive selection is consent for manager runtime deps\n });\n try {\n const { ensureManagerRuntime } = await import('../runtime/model-manager.js');\n const ensure = await ensureManagerRuntime({\n providerId: route.providers[0]?.id ?? sel.provider,\n model: route.providers[0]?.model ?? sel.model,\n offline: !!global.local,\n consent: true,\n });\n if (!ensure.ok) prompter.note(c.yellow(ensure.error ?? 'model manager not ready'));\n else if (ensure.installed.length || ensure.pulled.length) {\n for (const s of ensure.installed) prompter.note(c.dim(`installed ${s}`));\n for (const s of ensure.pulled) prompter.note(c.dim(`pulled ${s}`));\n }\n prompter.note(c.dim(`manager ${route.managerLine}`));\n } catch {\n /* non-fatal — route still usable */\n }\n const fsImpl = nodeCodeFs(root);\n const meter = new SessionMeter();\n let lastChanges: FileChange[] = [];\n\n // Resume the most recent session (recap for the model + restore /undo).\n let store: StoredSession = newSession(sessionId(), sel.providerSlug, sel.model, Date.now());\n let priorSummary: string | undefined;\n if (opts.continueSession) {\n const prev = loadLatestSession(root);\n if (prev) {\n store = prev;\n lastChanges = prev.lastChanges ?? [];\n priorSummary = summarizeSession(prev);\n prompter.note(c.dim(`resumed session — ${prev.tasks.length} earlier task(s); /undo restores the last change`));\n } else prompter.note(c.dim('no previous session to continue'));\n }\n\n // Connect external MCP tools (from config), if any.\n let mcp: McpToolset | undefined;\n if (opts.mcpServers && Object.keys(opts.mcpServers).length) {\n const sp = prompter.spinner('Connecting MCP tools…');\n const { toolset, warnings } = await McpToolset.connect(opts.mcpServers, opts.mcpConnect ?? defaultMcpConnect);\n mcp = toolset;\n const from = opts.mcpSources?.length ? ` (from ${opts.mcpSources.join(', ')})` : '';\n sp.stop(`MCP tools: ${toolset.specs().length} from ${Object.keys(opts.mcpServers).length} server(s)${from}`);\n for (const w of warnings) prompter.note(c.yellow(` ${w}`));\n }\n\n // Fusion Runtime: attach to (or own) a local vgd session instead of spawning\n // `vg serve` as GraphProcess. Failure degrades to in-process graph only.\n const runtime = await startCodeRuntimeSession({ root });\n // Multi-branch ActiveGraph: warm maps per gitRef; ensureCurrent on each turn\n // so `git checkout` mid-session switches the tool-visible graph (plan §4.1.1).\n const branchGraphs = new BranchGraphSession({ root, graphPath: global.graph });\n // Federated workspaces: if `.vibgrate/federation.json` exists and a daemon is\n // reachable, register every member so multi-repo graphs share one vgd session.\n const federation = loadOrDiscoverFederation(root);\n const extraPinnedFacts = bridgePinnedFacts(federation.bridges);\n if (federation.members.length > 1 && (await vgdIsRunning({ socketPath: runtime.socketPath }))) {\n try {\n await vgdRequest(\n {\n op: 'register-federation',\n primaryRoot: federation.primaryRoot,\n members: federation.members.map((m) => ({ root: m.root, label: m.label, role: m.role })),\n },\n { socketPath: runtime.socketPath },\n );\n const bridgeN = federation.bridges?.length ?? 0;\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} workspace(s) registered with vgd` +\n (bridgeN ? ` · ${bridgeN} bridge edge(s)` : ''),\n ),\n );\n } catch {\n /* federation registration is best-effort */\n }\n } else if ((federation.bridges?.length ?? 0) > 0) {\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} member(s) · ${federation.bridges!.length} bridge edge(s) (discovery)`,\n ),\n );\n }\n\n // Model Execution Profile: provider/model heuristics + code.json overrides.\n let modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier: opts.securityTier,\n }),\n opts.modelProfile,\n );\n\n // Security ladder (ADR-002): explicit flag > MEP > --auto → L1 > L0.\n // Writable roots include every federation member so multi-root sessions can\n // write into sibling workspace folders under L1/L2 isolation.\n const securityTier: SecurityTier =\n opts.securityTier ?? modelProfile.securityTier ?? (opts.auto ? 'L1' : 'L0');\n const writableRoots = federation?.members.map((m) => m.root) ?? [root];\n const executionEnv = resolveExecutionEnv(securityTier, { writableRoots });\n\n const cleanup = (): void => {\n void runtime.dispose();\n void mcp?.dispose();\n };\n process.once('SIGINT', cleanup);\n\n const autoNote = opts.auto ? c.yellow(' · auto-approve ON') : '';\n const runtimeNote = runtime.kind !== 'none' ? c.dim(` · ${runtime.label}`) : '';\n const securityNote = c.dim(` · ${executionEnv.tier}/${executionEnv.label}`);\n const mepNote = c.dim(` · mep ${modelProfile.mode}`);\n prompter.intro(`Ready — ${sel.providerSlug}/${sel.model}${runtimeNote}${securityNote}${mepNote}${autoNote}. Describe a task, or /help. Empty line to exit.`);\n\n try {\n for (;;) {\n const line = (await prompter.input('code ›')).trim();\n if (!line || /^(exit|quit)$/i.test(line) || line === '/exit' || line === '/quit') break;\n\n if (line.startsWith('/')) {\n const [cmd] = line.slice(1).split(/\\s+/);\n if (cmd === 'help') {\n prompter.note('commands: /undo /diff /model /cost /clear /exit');\n } else if (cmd === 'undo') {\n if (lastChanges.length === 0) prompter.note(c.dim('nothing to undo'));\n else {\n const restored = undoChanges(lastChanges, fsImpl);\n prompter.note(c.green(`↩ reverted ${restored.length} file(s): ${restored.join(', ')}`));\n lastChanges = [];\n store = { ...store, lastChanges: [] };\n saveSession(root, store);\n }\n } else if (cmd === 'diff') {\n if (lastChanges.length === 0) prompter.note(c.dim('no recent change'));\n else for (const ch of lastChanges) if (ch.diff) out(ch.diff);\n } else if (cmd === 'model') {\n const swapped = await reselectModel(root, global, prompter);\n if (swapped) {\n sel = swapped;\n route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true,\n });\n prompter.note(c.green(`now using ${sel.providerSlug}/${sel.model}`));\n }\n } else if (cmd === 'cost') {\n prompter.note(`this session: ${meter.summary()}`);\n printCost(root);\n } else if (cmd === 'clear') {\n prompter.note(c.dim('each task already starts fresh — nothing to clear'));\n } else {\n prompter.note(c.yellow(`unknown command /${cmd} — try /help`));\n }\n continue;\n }\n\n const branchLoad = branchGraphs.ensureCurrent();\n const graph = branchLoad.graph;\n if (!graph) {\n prompter.note(c.red('the code map disappeared — run `vg` to rebuild'));\n break;\n }\n if (branchLoad.switched) {\n prompter.note(\n c.dim(\n `branch · ${branchLoad.gitRef}${branchLoad.fromCache ? ' (warm cache)' : ' (loaded map)'}`,\n ),\n );\n }\n // Share warm slot with a running vgd (local process or long-lived daemon).\n if (runtime.socketPath && graph && branchLoad.gitRef && branchLoad.gitRef !== 'unknown') {\n void vgdRequest(\n {\n op: 'put-graph',\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef,\n graph,\n },\n { socketPath: runtime.socketPath },\n ).catch(() => {\n /* best-effort IPC */\n });\n }\n // Prefer vgd ActiveGraph for search/impact when the daemon holds this slot.\n const graphBackend = resolveGraphBackend({\n graph,\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef !== 'unknown' ? branchLoad.gitRef : null,\n socketPath: runtime.socketPath,\n });\n // Refresh MEP if the user swapped models mid-session.\n modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier,\n }),\n opts.modelProfile,\n );\n const result = await agentTask({\n root,\n graph,\n instruction: line,\n providers: route.providers,\n fsImpl,\n attribution: { client: 'vg-code', provider: sel.providerSlug, model: sel.model },\n auto: !!opts.auto,\n maxSteps: opts.maxSteps,\n budget: modelProfile.capsuleBudgetTokens,\n denyCommands: opts.denyCommands,\n testCommand: opts.testCommand,\n contextBudget: opts.contextBudget,\n stream: opts.stream,\n verify: opts.verify\n ? { ...opts.verify, maxRounds: opts.verify.maxRounds ?? modelProfile.maxRepairRounds }\n : undefined,\n priorSummary,\n externalTools: mcp ? mcpExternalTools(mcp, agentApprove(opts, prompter)) : undefined,\n meter,\n prompter,\n capsule: opts.capsule,\n executionEnv,\n graphBackend,\n modelProfile,\n extraPinnedFacts,\n });\n priorSummary = undefined; // recap only seeds the first task after --continue\n if (result.changes.length) {\n lastChanges = result.changes;\n prompter.note(c.dim(' /undo to revert · /diff to review'));\n }\n // Persist the session after each task so --continue and /undo survive a restart.\n store = recordTask(store, { instruction: line, summary: result.finalText, changes: result.changes, stopped: result.stopped }, Date.now());\n saveSession(root, store);\n }\n } finally {\n cleanup();\n process.removeListener('SIGINT', cleanup);\n }\n prompter.outro('Done.');\n}\n\n/** Approval gate closure for MCP tools (mirrors agentTask's gate). */\nfunction agentApprove(opts: InteractiveOptions, prompter: Prompter): (a: MutatingAction) => Promise<boolean> {\n return async (action) => {\n if (opts.auto) return true;\n if (action.kind === 'tool') return prompter.confirm(`Call ${action.name}?`, false);\n if (action.kind === 'patch') {\n const n = action.files.length;\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n return true;\n };\n}\n\n/** Bind an McpToolset to the agent's externalTools shape. */\nfunction mcpExternalTools(mcp: McpToolset, approve: (a: MutatingAction) => Promise<boolean>): AgentOptions['externalTools'] {\n return { specs: mcp.specs(), owns: (name) => mcp.owns(name), execute: (call) => mcp.execute(call, approve) };\n}\n\n/** A time-free-ish session id (runtime randomness is fine — not a graph artifact). */\nfunction sessionId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 10; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n\n/** Re-run the provider/model wizard mid-session (the `/model` command). */\nasync function reselectModel(root: string, global: GlobalOpts, prompter: Prompter): Promise<WizardResult | null> {\n try {\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop('Model catalog loaded');\n const selection = await runProviderWizard(prompter, { catalog, localModels: discoverModels() });\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n return selection;\n } catch (e) {\n if (e instanceof PromptCancelled) return null;\n prompter.note(c.yellow(`couldn't switch model: ${(e as Error).message}`));\n return null;\n }\n}\n\n/** Print the local per-model savings for `/cost`. */\nfunction printCost(root: string): void {\n const now = Date.now();\n const models = readModelSavings(root, 30, now);\n if (models.length === 0) {\n info(c.dim(' no usage recorded yet this session'));\n return;\n }\n info(c.bold(' savings by model (last 30 days, local)'));\n for (const m of models) info(` ${m.key.padEnd(32)} ${m.queries} call(s) · ~${m.vgTokens} tokens · saved ≈ $${m.saved}`);\n}\n\n/**\n * Run one agentic task and render it to the terminal. Shared by the guided REPL\n * and the one-shot command. Read-only tools stream as dim status lines; each\n * mutating tool (edit / create / delete / run) is gated — auto-approved under\n * `--auto`, otherwise confirmed by the developer (with the diff or command shown).\n */\nexport async function agentTask(params: {\n root: string;\n graph: import('../schema.js').VgGraph;\n instruction: string;\n providers: Provider[];\n fsImpl: ReturnType<typeof nodeCodeFs>;\n attribution: { client: string; provider?: string; model?: string };\n auto: boolean;\n maxSteps?: number;\n budget?: number;\n contextBudget?: number;\n denyCommands?: string[];\n testCommand?: string;\n stream?: boolean;\n verify?: { command: string; maxRounds?: number };\n priorSummary?: string;\n externalTools?: AgentOptions['externalTools'];\n meter?: SessionMeter;\n prompter?: Prompter;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n files?: string[];\n /** Security ladder substrate (ADR-002). */\n executionEnv?: AgentOptions['executionEnv'];\n graphBackend?: AgentOptions['graphBackend'];\n modelProfile?: AgentOptions['modelProfile'];\n advancedMode?: boolean;\n worktreeOverlay?: boolean;\n extraPinnedFacts?: string[];\n}): Promise<AgentResult> {\n const { prompter } = params;\n const approve = async (action: MutatingAction): Promise<boolean> => {\n if (params.auto) return true;\n if (!prompter) return false; // non-interactive without --auto: refuse mutations\n switch (action.kind) {\n case 'edit':\n out(action.diff);\n return prompter.confirm(`Apply edit to ${action.file}?`, true);\n case 'create':\n return prompter.confirm(`Create ${action.file} (${action.bytes} bytes)?`, true);\n case 'delete':\n return prompter.confirm(`Delete ${action.file}?`, false);\n case 'run':\n return prompter.confirm(`Run \\`${action.command}\\`?`, false);\n case 'tool':\n return prompter.confirm(`Call ${action.name}(${briefArgs(action.args)})?`, false);\n case 'patch': {\n const n = action.files.length;\n for (const f of action.files) {\n if (f.diff) out(f.diff);\n else out(`${f.op} ${f.file}`);\n }\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n }\n };\n\n // Event rendering, with live token streaming: raw tokens print inline; any\n // other event first closes the streamed line so the layout stays clean.\n let streaming = false;\n const closeStream = (): void => {\n if (streaming) {\n process.stderr.write('\\n');\n streaming = false;\n }\n };\n const onEvent = (e: AgentEvent): void => {\n if (e.type === 'token') {\n process.stderr.write(e.text);\n streaming = true;\n return;\n }\n closeStream();\n if (e.type === 'assistant') {\n if (e.text.trim()) info(e.text.trim());\n } else if (e.type === 'tool-call') {\n info(c.dim(` → ${e.name}(${briefArgs(e.args)})`));\n } else if (e.type === 'tool-result') {\n info(c.dim(` ${e.mutated ? c.green('✔ ') : ''}${e.content.split('\\n')[0].slice(0, 100)}`));\n } else if (e.type === 'compact') {\n info(c.dim(` · compacted context (${e.droppedRounds} earlier round(s) summarized)`));\n } else if (e.type === 'verify') {\n info(e.passed ? c.green(` ✔ ${e.command} passed`) : c.yellow(` ✗ ${e.command} failed — asking the model to fix it`));\n } else if (e.type === 'ladder') {\n info(e.ok ? c.green(' ✔ verification ladder passed') : c.yellow(' ✗ verification ladder failed — asking the model to fix it'));\n if (!e.ok && e.summary.trim()) {\n for (const line of e.summary.split('\\n').slice(0, 6)) info(c.dim(` ${line}`));\n }\n } else if (e.type === 'session-graph') {\n info(c.dim(` · session graph updated (${e.reparsed} reparsed, ${e.dirty} dirty)`));\n } else if (e.type === 'capsule') {\n info(c.dim(` · Task Capsule · ${e.summary.primary.length} primary · ${e.summary.sourceSliceCount} source slice(s) · ~${e.summary.tokensEstimate} tokens`));\n } else if (e.type === 'failure-capsule') {\n info(c.yellow(` · Failure Capsule · ${e.capsule.failedStep.type}${e.capsule.failedStep.command ? ` · ${e.capsule.failedStep.command}` : ''}`));\n } else if (e.type === 'metrics') {\n const m = e.metrics;\n info(c.dim(` · metrics · discovery ${m.discoveryToolCalls} · mutations ${m.mutationToolCalls}${m.znsAt1 ? ' · ZNS@1' : ''}`));\n }\n };\n\n const result = await runAgent({\n graph: params.graph,\n root: params.root,\n instruction: params.instruction,\n providers: params.providers,\n fsImpl: params.fsImpl,\n run: shellRunner(params.root),\n executionEnv: params.executionEnv,\n graphBackend: params.graphBackend,\n modelProfile: params.modelProfile,\n advancedMode: params.advancedMode,\n // Interactive sessions always prefer a worktree-correct map unless disabled.\n worktreeOverlay: params.worktreeOverlay ?? true,\n extraPinnedFacts: params.extraPinnedFacts,\n approve,\n onEvent,\n attribution: params.attribution,\n maxSteps: params.maxSteps,\n budget: params.budget,\n contextBudget: params.contextBudget,\n auto: params.auto,\n denyCommands: params.denyCommands,\n testCommand: params.testCommand,\n stream: params.stream,\n verify: params.verify,\n priorSummary: params.priorSummary,\n externalTools: params.externalTools,\n capsule: params.capsule,\n files: params.files,\n now: () => Date.now(),\n });\n closeStream();\n\n const perTask = params.meter?.add(result.usage);\n const summary = summarizeDiffs(result.changes.map((ch) => ({ file: ch.file, diff: ch.diff })));\n info('');\n info(\n result.stopped === 'finished'\n ? c.green(`✔ ${result.finalText}`)\n : result.stopped === 'max-steps'\n ? c.yellow(`stopped at the step limit — ${result.changes.length} change(s) so far`)\n : c.dim(result.finalText),\n );\n const meterNote = perTask !== undefined ? ` · ${params.meter!.summary()}` : '';\n if (result.changes.length || perTask) info(c.dim(` ${summary} · via ${result.provider.id}/${result.provider.model}${result.provider.fellBack ? ' (fell back)' : ''}${meterNote}`));\n return result;\n}\n\nfunction briefArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = typeof v === 'string' ? v : JSON.stringify(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + '…' : s}`);\n if (parts.length >= 2) break;\n }\n return parts.join(', ');\n}\n\n/** A shell runner for the agent's run_command tool, scoped to the repo root. */\nfunction shellRunner(root: string): (command: string) => ShellResult {\n return (command: string) => {\n const res = spawnSync(command, { cwd: root, shell: true, encoding: 'utf8', timeout: 120_000, maxBuffer: 10 * 1024 * 1024 });\n const stdout = (res.stdout ?? '') + (res.stderr ? `\\n${res.stderr}` : '');\n return { stdout, exitCode: res.status ?? 1 };\n };\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { ensureManagerRuntime, formatManagerBadgeLine, managerBadge, managerFromProviderId } from './chunk-YCJIIGLP.js';
|
|
2
|
+
import './chunk-KUIBP3LU.js';
|
|
3
|
+
import './chunk-GYSOQH5C.js';
|
|
4
|
+
import './chunk-BWPBB45M.js';
|
|
5
|
+
import './chunk-JFGYT6BI.js';
|
|
6
|
+
import './chunk-BPF3YX2U.js';
|
|
7
|
+
import './chunk-DGUM43GV.js';
|
|
8
|
+
//# sourceMappingURL=model-manager-PN7HEDXD.js.map
|
|
9
|
+
//# sourceMappingURL=model-manager-PN7HEDXD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"model-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"model-manager-PN7HEDXD.js"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { MODEL_ORCHESTRATOR_SCHEMA_VERSION, QUALIFIED_PACKS, activePin, buildOrchestratorStatus, fitPack, listModes, orchestratorStatePath, packById, packForMode, parseMode, pinPack, providerForBackend, readOrchestratorState, recommendMode, resolveMode, setDefaultMode, unpinPack, writeOrchestratorState } from './chunk-
|
|
1
|
+
export { MODEL_ORCHESTRATOR_SCHEMA_VERSION, QUALIFIED_PACKS, activePin, buildOrchestratorStatus, fitPack, listModes, orchestratorStatePath, packById, packForMode, parseMode, pinPack, providerForBackend, readOrchestratorState, recommendMode, resolveMode, setDefaultMode, unpinPack, writeOrchestratorState } from './chunk-PVZBYZZR.js';
|
|
2
2
|
import './chunk-7N4Y3E47.js';
|
|
3
3
|
import './chunk-IZDH67DX.js';
|
|
4
4
|
import './chunk-BWPBB45M.js';
|
|
5
5
|
import './chunk-JFGYT6BI.js';
|
|
6
6
|
import './chunk-BPF3YX2U.js';
|
|
7
7
|
import './chunk-DGUM43GV.js';
|
|
8
|
-
//# sourceMappingURL=model-orchestrator-
|
|
9
|
-
//# sourceMappingURL=model-orchestrator-
|
|
8
|
+
//# sourceMappingURL=model-orchestrator-4VSYP4J4.js.map
|
|
9
|
+
//# sourceMappingURL=model-orchestrator-4VSYP4J4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"model-orchestrator-4VSYP4J4.js"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { embeddedLlamaReady, resolveGgufPath } from './chunk-KKRSQQ3A.js';
|
|
2
|
+
import './chunk-3SDV6ADQ.js';
|
|
3
|
+
import './chunk-GYSOQH5C.js';
|
|
4
|
+
import './chunk-BWPBB45M.js';
|
|
5
|
+
import './chunk-JFGYT6BI.js';
|
|
6
|
+
import './chunk-BPF3YX2U.js';
|
|
7
|
+
import './chunk-DGUM43GV.js';
|
|
8
|
+
//# sourceMappingURL=resolve-gguf-Y6FH3CNB.js.map
|
|
9
|
+
//# sourceMappingURL=resolve-gguf-Y6FH3CNB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"resolve-gguf-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"resolve-gguf-Y6FH3CNB.js"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { commitChanges, nodeCodeFs, runCodeSession, undoChanges } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { commitChanges, nodeCodeFs, runCodeSession, undoChanges } from './chunk-R6ZRVVZT.js';
|
|
2
|
+
import './chunk-KXSKFQMI.js';
|
|
3
|
+
import './chunk-KUIBP3LU.js';
|
|
3
4
|
import './chunk-ZBTY6VV4.js';
|
|
4
5
|
import './chunk-6UK6QPTR.js';
|
|
5
6
|
import './chunk-ZKNB4YH4.js';
|
|
@@ -7,5 +8,5 @@ import './chunk-BWPBB45M.js';
|
|
|
7
8
|
import './chunk-JFGYT6BI.js';
|
|
8
9
|
import './chunk-BPF3YX2U.js';
|
|
9
10
|
import './chunk-DGUM43GV.js';
|
|
10
|
-
//# sourceMappingURL=session-
|
|
11
|
-
//# sourceMappingURL=session-
|
|
11
|
+
//# sourceMappingURL=session-W3646AOV.js.map
|
|
12
|
+
//# sourceMappingURL=session-W3646AOV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"session-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"session-W3646AOV.js"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { runAgent } from './chunk-
|
|
1
|
+
import { runAgent } from './chunk-MAUJTPQW.js';
|
|
2
|
+
import './chunk-KXSKFQMI.js';
|
|
2
3
|
import './chunk-HK3AWUXH.js';
|
|
3
4
|
import './chunk-PMYWZRRS.js';
|
|
4
5
|
import './chunk-JIBOJTGS.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-J7LKEB2R.js';
|
|
6
|
+
import './chunk-KUIBP3LU.js';
|
|
7
|
+
import './chunk-6AXHLQBV.js';
|
|
8
8
|
import './chunk-ZBTY6VV4.js';
|
|
9
|
+
import './chunk-J7LKEB2R.js';
|
|
9
10
|
import './chunk-6UK6QPTR.js';
|
|
10
11
|
import './chunk-ON25BX6T.js';
|
|
11
12
|
import './chunk-RXP66R2E.js';
|
|
@@ -72,5 +73,5 @@ async function runCodeStreamJson(options) {
|
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
export { StreamJsonSession, runCodeStreamJson };
|
|
75
|
-
//# sourceMappingURL=stream-json-
|
|
76
|
-
//# sourceMappingURL=stream-json-
|
|
76
|
+
//# sourceMappingURL=stream-json-X7UQFB4T.js.map
|
|
77
|
+
//# sourceMappingURL=stream-json-X7UQFB4T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/stream-json.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA8BO,IAAM,oBAAN,MAAwB;AAAA,EAI7B,WAAA,CACmB,IAAA,EACA,IAAA,GAAO,KAAA,EACxB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,IAAA;AAAA,EALX,MAAA,GAAS,CAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAwC;AAAA;AAAA,EAQ9D,OAAA,GAAU,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,GAAG,GAAG,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA,EAGS,OAAA,GAAU,CAAC,MAAA,KAA6C;AAC/D,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,QAAQ,CAAA;AAClD,MAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IAC7B;AAGA,IAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAC5B,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,QAAQ,CAAA;AAAA,IACpD,CAAC,CAAA;AAAA,EACH,CAAA;AAAA;AAAA,EAGA,cAAA,CAAe,IAAY,OAAA,EAAwB;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,GAAsB;AACpB,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,UAAW,KAAK,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF;AASA,eAAsB,kBAAkB,OAAA,EAAyD;AAC/F,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,GAAG,cAAa,GAAI,OAAA;AACvD,EAAA,MAAM,UAAU,IAAI,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAC,IAAI,CAAA;AAClD,EAAA,aAAA,GAAgB,OAAO,CAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,EAAE,GAAG,YAAA,EAAc,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAC3G,IAAA,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAU,CAAA,CAAY,SAAS,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,aAAA,EAAc;AAAA,EACxB;AACF","file":"stream-json-X7UQFB4T.js","sourcesContent":["/**\n * Machine-readable event protocol for `vg code --stream-json` (VG-CLI-CODE §18).\n *\n * A host UI (the VS Code VG Code panel) can't drive the agent through the human\n * TTY renderer, so this exposes the agent as a line protocol: every\n * {@link AgentEvent} is emitted as one NDJSON object on stdout, and each\n * approval is a round-trip — an `approve-request` event out, a decision line in.\n * This keeps the governance gate intact across the process boundary (the host's\n * Approve/Reject button fulfils the same `approve` contract the CLI's prompt\n * does — no quick-apply back-door), while the host stays a pure relay.\n *\n * Pure over an injected `emit` + the decision channel, so the protocol is\n * unit-tested without a process, model, or socket.\n */\n\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport type { MutatingAction } from './tools.js';\n\n/** A single line written to the host. Discriminated by `event`. */\nexport type StreamJsonOut =\n | ({ event: 'event' } & AgentEvent)\n | { event: 'approve-request'; id: number; action: MutatingAction }\n | { event: 'done'; result: AgentResult }\n | { event: 'error'; message: string };\n\n/**\n * Owns the NDJSON protocol for one run: serializes agent events, and turns each\n * approval into an `approve-request` the host answers via {@link submitDecision}.\n * Under `auto`, approvals resolve true immediately (still announced, for the log).\n */\nexport class StreamJsonSession {\n private nextId = 1;\n private readonly pending = new Map<number, (approve: boolean) => void>();\n\n constructor(\n private readonly emit: (line: StreamJsonOut) => void,\n private readonly auto = false,\n ) {}\n\n /** The agent's onEvent → one NDJSON line per event. */\n readonly onEvent = (e: AgentEvent): void => {\n this.emit({ event: 'event', ...e });\n };\n\n /** The agent's approval gate → an approve-request the host answers. */\n readonly approve = (action: MutatingAction): Promise<boolean> => {\n const id = this.nextId++;\n if (this.auto) {\n this.emit({ event: 'approve-request', id, action });\n return Promise.resolve(true);\n }\n // Register the resolver BEFORE emitting, so a host that answers synchronously\n // (or very fast) can't have its decision arrive before we're listening.\n return new Promise<boolean>((resolve) => {\n this.pending.set(id, resolve);\n this.emit({ event: 'approve-request', id, action });\n });\n };\n\n /** Host → agent: resolve a pending approval. Unknown ids are ignored. */\n submitDecision(id: number, approve: boolean): void {\n const resolve = this.pending.get(id);\n if (resolve) {\n this.pending.delete(id);\n resolve(approve);\n }\n }\n\n /** Reject any still-pending approvals (e.g. the host disconnected). */\n cancelPending(): void {\n for (const resolve of this.pending.values()) resolve(false);\n this.pending.clear();\n }\n}\n\nexport interface StreamJsonOptions extends Omit<AgentOptions, 'approve' | 'onEvent'> {\n emit: (line: StreamJsonOut) => void;\n /** Register the stdin decision reader; the returned session accepts decisions. */\n bindDecisions?: (session: StreamJsonSession) => void;\n}\n\n/** Run the agent under the NDJSON protocol; always emits a terminal `done`/`error`. */\nexport async function runCodeStreamJson(options: StreamJsonOptions): Promise<AgentResult | null> {\n const { emit, bindDecisions, auto, ...agentOptions } = options;\n const session = new StreamJsonSession(emit, !!auto);\n bindDecisions?.(session);\n try {\n const result = await runAgent({ ...agentOptions, auto, approve: session.approve, onEvent: session.onEvent });\n emit({ event: 'done', result });\n return result;\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n return null;\n } finally {\n session.cancelPending();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibgrate/cli",
|
|
3
|
-
"version": "2026.727.
|
|
3
|
+
"version": "2026.727.4",
|
|
4
4
|
"description": "vg — local codebase intelligence CLI + MCP server for AI coding agents: deterministic code graph, drift reporting, and version-correct library docs (Apache-2.0)",
|
|
5
5
|
"//mcpName": "Official MCP registry ownership proof: the registry fetches the published npm package and requires this field to match the com.vibgrate/ai-context server entry (see docs/marketing/mcp-registry/README.md). Must ship in the published @vibgrate/cli package.json.",
|
|
6
6
|
"mcpName": "com.vibgrate/ai-context",
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { baselineCommand, runBaseline } from './chunk-FFWGT55D.js';
|
|
2
|
-
import './chunk-Y23HMSWU.js';
|
|
3
|
-
import './chunk-CRAMOEBE.js';
|
|
4
|
-
import './chunk-RXP66R2E.js';
|
|
5
|
-
import './chunk-GI6W53LM.js';
|
|
6
|
-
import './chunk-DGUM43GV.js';
|
|
7
|
-
//# sourceMappingURL=baseline-ATM5MXBZ.js.map
|
|
8
|
-
//# sourceMappingURL=baseline-ATM5MXBZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/model-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-3V24O47U.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 * 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 /** 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 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 };\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.3';\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.3 — Approach B default: GGUF primary, PatchIR grammar fail-closed, Ollama fallback',\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.3 — Approach B default GGUF when fit allows; Ollama fallback for machines without store',\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: '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 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 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: 'ollama',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 16, minVramGb: 12, estimatedKvPer1kContext: 8 * 1024 * 1024 },\n provenance: { notes: 'Forge@2026.07.2 — deep work; PatchIR-oriented edits without forced grammar yet' },\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 // 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 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 /** 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): { fit: FitResult; underlying: PackWeightsRef } {\n const trial: QualifiedPack = { ...pack, primary: weights };\n return { fit: fitPack({ system, pack: trial, repo, taskClass }), underlying: weights };\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);\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 = best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass);\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 /** 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 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 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 installed: installedHit,\n pinned: resolved.pinned,\n };\n });\n\n const recResolved = resolveMode({\n mode: recommended,\n autoFit: false,\n system: opts.system,\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 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"]}
|