@vibgrate/cli 2026.727.4 → 2026.728.2
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-MRUM2P6H.js +8 -0
- package/dist/{baseline-ENCOSJYQ.js.map → baseline-MRUM2P6H.js.map} +1 -1
- package/dist/{chunk-K7REHDQS.js → chunk-6HX47EBL.js} +25 -19
- package/dist/chunk-6HX47EBL.js.map +1 -0
- package/dist/{chunk-MAUJTPQW.js → chunk-A2IYFNCQ.js} +24 -62
- package/dist/chunk-A2IYFNCQ.js.map +1 -0
- package/dist/{chunk-YKVH2PGF.js → chunk-GQTWDKMJ.js} +93 -141
- package/dist/chunk-GQTWDKMJ.js.map +1 -0
- package/dist/{chunk-FPEOIS7K.js → chunk-IWP7MYIA.js} +10 -7
- package/dist/chunk-IWP7MYIA.js.map +1 -0
- package/dist/{chunk-77LYGXBI.js → chunk-JRAGO6OB.js} +3 -3
- package/dist/{chunk-77LYGXBI.js.map → chunk-JRAGO6OB.js.map} +1 -1
- package/dist/{chunk-HYRAILGM.js → chunk-NTW5UEKT.js} +3 -3
- package/dist/{chunk-HYRAILGM.js.map → chunk-NTW5UEKT.js.map} +1 -1
- package/dist/chunk-OSD546W7.js +167 -0
- package/dist/chunk-OSD546W7.js.map +1 -0
- package/dist/{chunk-XPJZTSY7.js → chunk-R2QNFXE5.js} +3 -3
- package/dist/{chunk-XPJZTSY7.js.map → chunk-R2QNFXE5.js.map} +1 -1
- package/dist/{chunk-PXHNTC6D.js → chunk-SIPGDJT4.js} +3 -3
- package/dist/{chunk-PXHNTC6D.js.map → chunk-SIPGDJT4.js.map} +1 -1
- package/dist/{chunk-YCJIIGLP.js → chunk-UIOBFLE6.js} +3 -3
- package/dist/{chunk-YCJIIGLP.js.map → chunk-UIOBFLE6.js.map} +1 -1
- package/dist/chunk-UZJS7GMK.js +57 -0
- package/dist/chunk-UZJS7GMK.js.map +1 -0
- package/dist/{chunk-R6ZRVVZT.js → chunk-WH2N22S3.js} +3 -3
- package/dist/{chunk-R6ZRVVZT.js.map → chunk-WH2N22S3.js.map} +1 -1
- package/dist/{chunk-LJP2EPKM.js → chunk-WY6DGTBP.js} +4 -4
- package/dist/{chunk-LJP2EPKM.js.map → chunk-WY6DGTBP.js.map} +1 -1
- package/dist/{chunk-KXSKFQMI.js → chunk-YF43FOPP.js} +5 -5
- package/dist/chunk-YF43FOPP.js.map +1 -0
- package/dist/{chunk-T3AYRS7J.js → chunk-ZFTFCM7B.js} +3 -3
- package/dist/{chunk-T3AYRS7J.js.map → chunk-ZFTFCM7B.js.map} +1 -1
- package/dist/cli.js +129 -32
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/{interactive-SMHVURYK.js → interactive-36ZZ64WL.js} +15 -14
- package/dist/interactive-36ZZ64WL.js.map +1 -0
- package/dist/{llm-host-7GWDO6IX.js → llm-host-XYBT4267.js} +4 -4
- package/dist/{llm-host-7GWDO6IX.js.map → llm-host-XYBT4267.js.map} +1 -1
- package/dist/model-manager-OEPY4I7W.js +10 -0
- package/dist/{model-manager-PN7HEDXD.js.map → model-manager-OEPY4I7W.js.map} +1 -1
- package/dist/{runtime-session-4AMZIAAG.js → runtime-session-EJQZXANB.js} +5 -5
- package/dist/{runtime-session-4AMZIAAG.js.map → runtime-session-EJQZXANB.js.map} +1 -1
- package/dist/{session-W3646AOV.js → session-ZJGENHKX.js} +6 -5
- package/dist/{session-W3646AOV.js.map → session-ZJGENHKX.js.map} +1 -1
- package/dist/{stream-json-X7UQFB4T.js → stream-json-Z5KC2DM3.js} +6 -5
- package/dist/stream-json-Z5KC2DM3.js.map +1 -0
- package/dist/{vgd-CVLKBS7K.js → vgd-3MHSB4KA.js} +4 -4
- package/dist/vgd-3MHSB4KA.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-ENCOSJYQ.js +0 -8
- package/dist/chunk-FPEOIS7K.js.map +0 -1
- package/dist/chunk-K7REHDQS.js.map +0 -1
- package/dist/chunk-KUIBP3LU.js +0 -101
- package/dist/chunk-KUIBP3LU.js.map +0 -1
- package/dist/chunk-KXSKFQMI.js.map +0 -1
- package/dist/chunk-MAUJTPQW.js.map +0 -1
- package/dist/chunk-YKVH2PGF.js.map +0 -1
- package/dist/interactive-SMHVURYK.js.map +0 -1
- package/dist/model-manager-PN7HEDXD.js +0 -9
- package/dist/stream-json-X7UQFB4T.js.map +0 -1
- package/dist/vgd-CVLKBS7K.js.map +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { whichOnPath } from './chunk-UZJS7GMK.js';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { spawnSync } from 'child_process';
|
|
6
|
+
import { createRequire } from 'module';
|
|
7
|
+
import { pathToFileURL } from 'url';
|
|
8
|
+
|
|
9
|
+
function runtimeCacheDir() {
|
|
10
|
+
const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), ".cache");
|
|
11
|
+
return path.join(base, "vibgrate", "runtime");
|
|
12
|
+
}
|
|
13
|
+
function isPackageInstalled(spec) {
|
|
14
|
+
const name = packageName(spec);
|
|
15
|
+
try {
|
|
16
|
+
const req = createRequire(path.join(runtimeCacheDir(), "package.json"));
|
|
17
|
+
req.resolve(name);
|
|
18
|
+
return true;
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function ensureUnavailableMessage(reason, spec, detail) {
|
|
24
|
+
const name = packageName(spec);
|
|
25
|
+
switch (reason) {
|
|
26
|
+
case "offline":
|
|
27
|
+
return `${name} is needed for this backend but --local/offline is set \u2014 using a backend that needs no install, or drop --local to allow a one-time install.`;
|
|
28
|
+
case "no-consent":
|
|
29
|
+
return `${name} is needed for this backend and isn't installed yet. Run \`vg models install\` (or \`vg models pull\`) to install runtime deps for the provider into ${runtimeCacheDir()} (nothing is written into the CLI itself), or pick a backend that needs no install (e.g. --provider ollama).`;
|
|
30
|
+
case "install-failed":
|
|
31
|
+
if (detail?.trim()) {
|
|
32
|
+
return `couldn't install ${name}: ${detail.trim()}`;
|
|
33
|
+
}
|
|
34
|
+
return `couldn't install ${name} (offline, or npm unavailable) \u2014 using a backend that needs no install. It will try again next time.`;
|
|
35
|
+
case "load-failed":
|
|
36
|
+
default:
|
|
37
|
+
return `${name} installed but couldn't be loaded here \u2014 using a backend that needs no install.`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function ensurePackage(spec, options = {}) {
|
|
41
|
+
const dir = runtimeCacheDir();
|
|
42
|
+
const fail = (reason, detail) => {
|
|
43
|
+
options.onUnavailable?.(reason, spec);
|
|
44
|
+
return { module: null, dir, reason, detail };
|
|
45
|
+
};
|
|
46
|
+
if (isPackageInstalled(spec)) {
|
|
47
|
+
const mod2 = await load(spec, dir);
|
|
48
|
+
return mod2 ? { module: mod2, dir } : fail("load-failed");
|
|
49
|
+
}
|
|
50
|
+
if (options.local) return fail("offline");
|
|
51
|
+
const interactive = options.interactive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);
|
|
52
|
+
if (!options.consent && !interactive) return fail("no-consent");
|
|
53
|
+
if (!options.consent && interactive) return fail("no-consent");
|
|
54
|
+
try {
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
ensureRuntimeManifest(dir);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
return fail("install-failed", cacheWriteFailureDetail(dir, err));
|
|
59
|
+
}
|
|
60
|
+
if (options.install) {
|
|
61
|
+
const ok = options.install(spec, dir);
|
|
62
|
+
if (!ok || !isPackageInstalled(spec)) {
|
|
63
|
+
return fail("install-failed", !ok ? "installer returned failure" : `${packageName(spec)} not resolvable after install`);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
const inst = runDefaultInstaller(spec, dir);
|
|
67
|
+
if (!inst.ok || !isPackageInstalled(spec)) {
|
|
68
|
+
return fail(
|
|
69
|
+
"install-failed",
|
|
70
|
+
inst.detail ?? (!inst.ok ? "npm install failed" : `${packageName(spec)} not resolvable after install`)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const mod = await load(spec, dir);
|
|
75
|
+
return mod ? { module: mod, dir } : fail("load-failed");
|
|
76
|
+
}
|
|
77
|
+
function ensureRuntimeManifest(dir) {
|
|
78
|
+
const manifest = path.join(dir, "package.json");
|
|
79
|
+
if (!fs.existsSync(manifest)) {
|
|
80
|
+
fs.writeFileSync(
|
|
81
|
+
manifest,
|
|
82
|
+
JSON.stringify({ name: "vibgrate-runtime-deps", private: true, description: "On-demand vg runtime packages" }, null, 2)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function load(spec, dir) {
|
|
87
|
+
const name = packageName(spec);
|
|
88
|
+
try {
|
|
89
|
+
const req = createRequire(path.join(dir, "package.json"));
|
|
90
|
+
const resolved = req.resolve(name);
|
|
91
|
+
const mod = await import(pathToFileURL(resolved).href);
|
|
92
|
+
return mod?.default ?? mod;
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function cacheWriteFailureDetail(dir, err) {
|
|
98
|
+
const code = err && typeof err === "object" && "code" in err ? String(err.code) : "";
|
|
99
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
100
|
+
const parent = path.dirname(dir);
|
|
101
|
+
return `cannot write runtime cache at ${dir} (permission denied). If ${parent} is root-owned (often from a past sudo run), fix with: sudo chown -R "$(whoami)" ${parent} \u2014 then re-run \`vg models install\``;
|
|
102
|
+
}
|
|
103
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
104
|
+
return `cannot prepare runtime cache at ${dir}: ${msg}`;
|
|
105
|
+
}
|
|
106
|
+
function resolveNpmBinary() {
|
|
107
|
+
const names = process.platform === "win32" ? ["npm.cmd", "npm"] : ["npm"];
|
|
108
|
+
for (const name of names) {
|
|
109
|
+
const hit = whichOnPath(name);
|
|
110
|
+
if (hit) return hit;
|
|
111
|
+
}
|
|
112
|
+
const candidates = process.platform === "win32" ? [] : [
|
|
113
|
+
"/opt/homebrew/bin/npm",
|
|
114
|
+
"/usr/local/bin/npm",
|
|
115
|
+
path.join(os.homedir(), ".npm-global", "bin", "npm"),
|
|
116
|
+
path.join(os.homedir(), ".local", "bin", "npm")
|
|
117
|
+
];
|
|
118
|
+
for (const c of candidates) {
|
|
119
|
+
try {
|
|
120
|
+
if (fs.existsSync(c)) return c;
|
|
121
|
+
} catch {
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
function runDefaultInstaller(spec, dir) {
|
|
127
|
+
const npm = resolveNpmBinary();
|
|
128
|
+
if (!npm) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
detail: "npm not found on PATH (common when VS Code is launched from the Dock). Install Node.js, or run `vg models install` from a terminal where `npm` works"
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const res = spawnSync(npm, ["install", "--prefix", dir, "--no-audit", "--no-fund", "--ignore-scripts", spec], {
|
|
135
|
+
encoding: "utf8",
|
|
136
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
137
|
+
timeout: 18e4
|
|
138
|
+
});
|
|
139
|
+
if (res.error) {
|
|
140
|
+
const code = "code" in res.error ? String(res.error.code ?? "") : "";
|
|
141
|
+
if (code === "ENOENT") {
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
detail: `npm binary not executable at ${npm} \u2014 install Node.js or fix PATH, then re-run \`vg models install\``
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return { ok: false, detail: res.error.message };
|
|
148
|
+
}
|
|
149
|
+
if (res.status === 0) return { ok: true };
|
|
150
|
+
const tail = [res.stderr, res.stdout].filter(Boolean).join("\n").split(/\r?\n/).map((l) => l.trim()).filter(Boolean).slice(-4).join(" \xB7 ");
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
detail: tail || `npm install exited ${res.status ?? "null"} (offline network, or registry error)`
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function packageName(spec) {
|
|
157
|
+
if (spec.startsWith("@")) {
|
|
158
|
+
const at2 = spec.indexOf("@", 1);
|
|
159
|
+
return at2 === -1 ? spec : spec.slice(0, at2);
|
|
160
|
+
}
|
|
161
|
+
const at = spec.indexOf("@");
|
|
162
|
+
return at === -1 ? spec : spec.slice(0, at);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { ensurePackage, ensureUnavailableMessage, isPackageInstalled };
|
|
166
|
+
//# sourceMappingURL=chunk-OSD546W7.js.map
|
|
167
|
+
//# sourceMappingURL=chunk-OSD546W7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/ensure.ts"],"names":["mod","at"],"mappings":"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","file":"chunk-OSD546W7.js","sourcesContent":["/**\n * Lazy, consent-gated runtime dependency install (VG-CLI-CODE §6).\n *\n * The code capability must stay lean by default: we ship **no** model weights\n * and **no** heavyweight inference runtime in the published package, and we do\n * not pull anything until the `code`/`models` commands are actually used for the\n * first time — and even then only with explicit consent. This mirrors the\n * existing optional-embedder pattern (a host-side install into its own storage\n * on consent), generalized so any provider backend that needs an out-of-tree\n * package can request it.\n *\n * Guarantees:\n * - `--local`/offline never installs (air-gapped stays air-gapped).\n * - Non-interactive runs never install silently — they require `--yes`.\n * - Nothing is written into the published package tree; installs live under a\n * per-user runtime cache and load via `createRequire` from there.\n * - The installer is injectable, so tests exercise every branch without ever\n * shelling out to npm.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { whichOnPath } from '../util/cli-invocation.js';\n\n/** Why a package could not be made available — for calm, actionable messaging. */\nexport type EnsureFailure = 'offline' | 'no-consent' | 'install-failed' | 'load-failed';\n\nexport interface EnsureOptions {\n /** `--local`: never touch the network, never install. */\n local?: boolean;\n /** `--yes`/`--install`: consent to install without an interactive prompt. */\n consent?: boolean;\n /** Whether the caller is attached to an interactive TTY (defaults to a real check). */\n interactive?: boolean;\n /** Injectable installer — defaults to `npm install --prefix <dir> <spec>`. Returns true on success. */\n install?: (spec: string, dir: string) => boolean;\n /** Called (not thrown) with the reason when the package can't be provided. */\n onUnavailable?: (reason: EnsureFailure, spec: string) => void;\n}\n\nexport interface EnsureResult {\n /** The loaded module, or null when unavailable. */\n module: unknown | null;\n /** The runtime dir the package was resolved from (for diagnostics). */\n dir: string;\n reason?: EnsureFailure;\n /**\n * Optional one-line cause when `reason` is install-failed (EACCES, npm\n * missing, npm stderr tail). Prefer {@link ensureUnavailableMessage} so\n * callers always get the full actionable line.\n */\n detail?: string;\n}\n\n/**\n * The per-user runtime cache for on-demand packages. XDG-standard, shared across\n * repos (like the model cache), never inside the published package.\n * `$XDG_CACHE_HOME/vibgrate/runtime` (or `~/.cache/vibgrate/runtime`).\n */\nexport function runtimeCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'runtime');\n}\n\n/** Whether `spec`'s package is already resolvable from the runtime cache. */\nexport function isPackageInstalled(spec: string): boolean {\n const name = packageName(spec);\n try {\n const req = createRequire(path.join(runtimeCacheDir(), 'package.json'));\n req.resolve(name);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * A one-line, actionable explanation of why a runtime dependency isn't available\n * — always names the off switch and the fix, never alarms (GUARDRAILS §1.3).\n */\nexport function ensureUnavailableMessage(reason: EnsureFailure, spec: string, detail?: string): string {\n const name = packageName(spec);\n switch (reason) {\n case 'offline':\n return `${name} is needed for this backend but --local/offline is set — using a backend that needs no install, or drop --local to allow a one-time install.`;\n case 'no-consent':\n return `${name} is needed for this backend and isn't installed yet. Run \\`vg models install\\` (or \\`vg models pull\\`) to install runtime deps for the provider into ${runtimeCacheDir()} (nothing is written into the CLI itself), or pick a backend that needs no install (e.g. --provider ollama).`;\n case 'install-failed':\n if (detail?.trim()) {\n return `couldn't install ${name}: ${detail.trim()}`;\n }\n return `couldn't install ${name} (offline, or npm unavailable) — using a backend that needs no install. It will try again next time.`;\n case 'load-failed':\n default:\n return `${name} installed but couldn't be loaded here — using a backend that needs no install.`;\n }\n}\n\n/**\n * Ensure `spec` (e.g. `node-llama-cpp@^3`) is available, installing it once into\n * the runtime cache with consent if needed, then load and return it. Returns\n * `{ module: null, reason }` on any refusal/failure — the caller degrades to a\n * backend that needs no install; it never throws for an unavailable optional\n * package.\n */\nexport async function ensurePackage(spec: string, options: EnsureOptions = {}): Promise<EnsureResult> {\n const dir = runtimeCacheDir();\n const fail = (reason: EnsureFailure, detail?: string): EnsureResult => {\n options.onUnavailable?.(reason, spec);\n return { module: null, dir, reason, detail };\n };\n\n // Already present → just load it (no network, no consent needed).\n if (isPackageInstalled(spec)) {\n const mod = await load(spec, dir);\n return mod ? { module: mod, dir } : fail('load-failed');\n }\n\n // Not present. `--local`/offline forbids install outright.\n if (options.local) return fail('offline');\n\n // Non-interactive without consent must not install silently.\n const interactive = options.interactive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);\n if (!options.consent && !interactive) return fail('no-consent');\n if (!options.consent && interactive) return fail('no-consent'); // caller prompts, then re-invokes with consent\n\n // Install into the runtime cache.\n try {\n fs.mkdirSync(dir, { recursive: true });\n ensureRuntimeManifest(dir);\n } catch (err) {\n return fail('install-failed', cacheWriteFailureDetail(dir, err));\n }\n\n if (options.install) {\n const ok = options.install(spec, dir);\n if (!ok || !isPackageInstalled(spec)) {\n return fail('install-failed', !ok ? 'installer returned failure' : `${packageName(spec)} not resolvable after install`);\n }\n } else {\n const inst = runDefaultInstaller(spec, dir);\n if (!inst.ok || !isPackageInstalled(spec)) {\n return fail(\n 'install-failed',\n inst.detail ?? (!inst.ok ? 'npm install failed' : `${packageName(spec)} not resolvable after install`),\n );\n }\n }\n\n const mod = await load(spec, dir);\n return mod ? { module: mod, dir } : fail('load-failed');\n}\n\n/** A minimal manifest so npm has a project to install into. */\nfunction ensureRuntimeManifest(dir: string): void {\n const manifest = path.join(dir, 'package.json');\n if (!fs.existsSync(manifest)) {\n fs.writeFileSync(\n manifest,\n JSON.stringify({ name: 'vibgrate-runtime-deps', private: true, description: 'On-demand vg runtime packages' }, null, 2),\n );\n }\n}\n\nasync function load(spec: string, dir: string): Promise<unknown | null> {\n const name = packageName(spec);\n try {\n const req = createRequire(path.join(dir, 'package.json'));\n const resolved = req.resolve(name);\n const mod: any = await import(pathToFileURL(resolved).href);\n return mod?.default ?? mod;\n } catch {\n return null;\n }\n}\n\n/** Human detail when the runtime cache cannot be created or written. */\nexport function cacheWriteFailureDetail(dir: string, err: unknown): string {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as { code?: unknown }).code) : '';\n if (code === 'EACCES' || code === 'EPERM') {\n const parent = path.dirname(dir);\n return (\n `cannot write runtime cache at ${dir} (permission denied). ` +\n `If ${parent} is root-owned (often from a past sudo run), fix with: ` +\n `sudo chown -R \"$(whoami)\" ${parent} — then re-run \\`vg models install\\``\n );\n }\n const msg = err instanceof Error ? err.message : String(err);\n return `cannot prepare runtime cache at ${dir}: ${msg}`;\n}\n\n/**\n * Resolve `npm` for install. GUI apps (Dock-launched VS Code) often have a\n * stripped PATH without Homebrew; fall back to common install locations.\n */\nexport function resolveNpmBinary(): string | null {\n const names = process.platform === 'win32' ? ['npm.cmd', 'npm'] : ['npm'];\n for (const name of names) {\n const hit = whichOnPath(name);\n if (hit) return hit;\n }\n const candidates =\n process.platform === 'win32'\n ? []\n : [\n '/opt/homebrew/bin/npm',\n '/usr/local/bin/npm',\n path.join(os.homedir(), '.npm-global', 'bin', 'npm'),\n path.join(os.homedir(), '.local', 'bin', 'npm'),\n ];\n for (const c of candidates) {\n try {\n if (fs.existsSync(c)) return c;\n } catch {\n /* ignore */\n }\n }\n return null;\n}\n\n/** `npm install --prefix <dir> <spec>` with no scripts; capture failure detail. */\nfunction runDefaultInstaller(spec: string, dir: string): { ok: boolean; detail?: string } {\n const npm = resolveNpmBinary();\n if (!npm) {\n return {\n ok: false,\n detail:\n 'npm not found on PATH (common when VS Code is launched from the Dock). ' +\n 'Install Node.js, or run `vg models install` from a terminal where `npm` works',\n };\n }\n const res = spawnSync(npm, ['install', '--prefix', dir, '--no-audit', '--no-fund', '--ignore-scripts', spec], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: 180_000,\n });\n if (res.error) {\n const code = 'code' in res.error ? String((res.error as NodeJS.ErrnoException).code ?? '') : '';\n if (code === 'ENOENT') {\n return {\n ok: false,\n detail: `npm binary not executable at ${npm} — install Node.js or fix PATH, then re-run \\`vg models install\\``,\n };\n }\n return { ok: false, detail: res.error.message };\n }\n if (res.status === 0) return { ok: true };\n const tail = [res.stderr, res.stdout]\n .filter(Boolean)\n .join('\\n')\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .slice(-4)\n .join(' · ');\n return {\n ok: false,\n detail: tail || `npm install exited ${res.status ?? 'null'} (offline network, or registry error)`,\n };\n}\n\n/** Strip a version range from a spec → the bare package name (scoped-safe). */\nexport function packageName(spec: string): string {\n if (spec.startsWith('@')) {\n const at = spec.indexOf('@', 1);\n return at === -1 ? spec : spec.slice(0, at);\n }\n const at = spec.indexOf('@');\n return at === -1 ? spec : spec.slice(0, at);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { startVgdServer } from './chunk-
|
|
1
|
+
import { startVgdServer } from './chunk-JRAGO6OB.js';
|
|
2
2
|
import { vgdIsRunning, vgdRequest } from './chunk-PMYWZRRS.js';
|
|
3
3
|
|
|
4
4
|
// src/code/runtime-session.ts
|
|
@@ -78,5 +78,5 @@ function noneSession() {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export { startCodeRuntimeSession };
|
|
81
|
-
//# sourceMappingURL=chunk-
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-R2QNFXE5.js.map
|
|
82
|
+
//# sourceMappingURL=chunk-R2QNFXE5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-R2QNFXE5.js","sourcesContent":["/**\n * Session boundary between VG Code and the Fusion Runtime daemon (`vgd`).\n *\n * Replaces the old {@link GraphProcess} (`vg serve` child) for the interactive\n * coding REPL. Behaviour:\n *\n * 1. If a local vgd is already running — register this workspace and leave the\n * daemon running when the session ends (unregister only).\n * 2. Otherwise — start an **in-process** vgd for the life of the session and\n * tear it down on dispose. No second OS process, no `vg serve` spawn.\n *\n * Never throws: a failure to attach degrades to “no runtime session” and the\n * agent continues with the in-process graph only (same safety as GraphProcess).\n */\n\nimport { startVgdServer, vgdIsRunning, vgdRequest, type VgdServer } from '../runtime/vgd/index.js';\nimport type { WorkspaceRecord } from '../runtime/vgd/protocol.js';\n\nexport type RuntimeSessionKind = 'attached' | 'owned' | 'none';\n\nexport interface RuntimeSessionOptions {\n root: string;\n /** Override socket path (tests). */\n socketPath?: string;\n /** Injectable connect/start hooks (tests). */\n isRunning?: (socketPath?: string) => Promise<boolean>;\n request?: typeof vgdRequest;\n startServer?: (opts: { socketPath?: string }) => Promise<VgdServer>;\n}\n\nexport interface CodeRuntimeSession {\n readonly kind: RuntimeSessionKind;\n /** Daemon pid when known (attached status or owned process). */\n readonly pid: number | undefined;\n readonly workspace: WorkspaceRecord | undefined;\n readonly socketPath: string | undefined;\n /** Human label for the REPL intro line. */\n readonly label: string;\n dispose(): Promise<void>;\n}\n\n/**\n * Attach VG Code to vgd for one coding session. Always resolves (never throws).\n */\nexport async function startCodeRuntimeSession(options: RuntimeSessionOptions): Promise<CodeRuntimeSession> {\n const socketPath = options.socketPath;\n const isRunning = options.isRunning ?? ((sp?: string) => vgdIsRunning({ socketPath: sp }));\n const request = options.request ?? vgdRequest;\n const startServer = options.startServer ?? ((opts: { socketPath?: string }) => startVgdServer(opts));\n\n try {\n if (await isRunning(socketPath)) {\n return await attachExisting(options.root, socketPath, request);\n }\n return await startOwned(options.root, socketPath, startServer, request);\n } catch {\n return noneSession();\n }\n}\n\nasync function attachExisting(\n root: string,\n socketPath: string | undefined,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const clientOpts = { socketPath };\n const reg = await request({ op: 'register', root }, clientOpts);\n if (!reg.ok || !('workspace' in reg)) return noneSession();\n const status = await request({ op: 'status' }, clientOpts).catch(() => null);\n const pid = status && status.ok && 'pid' in status ? status.pid : undefined;\n let disposed = false;\n return {\n kind: 'attached',\n pid,\n workspace: reg.workspace,\n socketPath: status && status.ok && 'socketPath' in status ? status.socketPath : socketPath,\n label: pid != null ? `vgd ${pid}` : 'vgd',\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await request({ op: 'unregister', root }, clientOpts);\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nasync function startOwned(\n root: string,\n socketPath: string | undefined,\n startServer: (opts: { socketPath?: string }) => Promise<VgdServer>,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const server = await startServer({ socketPath });\n const clientOpts = { socketPath: server.socketPath };\n let workspace: WorkspaceRecord | undefined;\n try {\n const reg = await request({ op: 'register', root }, clientOpts);\n if (reg.ok && 'workspace' in reg) workspace = reg.workspace;\n } catch {\n /* registry optional for an empty session */\n }\n let disposed = false;\n return {\n kind: 'owned',\n pid: process.pid,\n workspace,\n socketPath: server.socketPath,\n label: `vgd (session)`,\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await server.close();\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nfunction noneSession(): CodeRuntimeSession {\n return {\n kind: 'none',\n pid: undefined,\n workspace: undefined,\n socketPath: undefined,\n label: '',\n async dispose() {\n /* no-op */\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { acquireHostSession, generateOnSession } from './chunk-
|
|
1
|
+
import { acquireHostSession, generateOnSession } from './chunk-6HX47EBL.js';
|
|
2
2
|
import { annotateUnknownIdentifiers } from './chunk-JIBOJTGS.js';
|
|
3
3
|
import { vibgrateRuntimeDir } from './chunk-BWPBB45M.js';
|
|
4
4
|
import * as path from 'path';
|
|
@@ -378,5 +378,5 @@ function resolveInferenceIsolation(explicit, env = process.env) {
|
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
export { EmbeddedLlmHost, LLM_HOST_IPC_SCHEMA, ProcessBridgeLlmHost, ProcessLlmHost, createLlmHost, defaultProcessEndpoint, generateWithLlamaBinding, resolveInferenceIsolation, startProcessHostServer };
|
|
381
|
-
//# sourceMappingURL=chunk-
|
|
382
|
-
//# sourceMappingURL=chunk-
|
|
381
|
+
//# sourceMappingURL=chunk-SIPGDJT4.js.map
|
|
382
|
+
//# sourceMappingURL=chunk-SIPGDJT4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/llm-host/binding.ts","../src/runtime/llm-host/embedded.ts","../src/runtime/llm-host/process-bridge.ts","../src/runtime/llm-host/index.ts"],"names":["path2"],"mappings":"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","file":"chunk-PXHNTC6D.js","sourcesContent":["/**\n * node-llama-cpp binding adapter — pure glue so embedded + process hosts share\n * one code path. The module is injected (from ensurePackage); never imported\n * statically so the published CLI stays free of native deps.\n */\n\nimport type { LlmChatMessage, LlmGenerateOptions } from './types.js';\n\nexport interface LlamaBindingGenerateInput {\n /** Loaded node-llama-cpp module (dynamic). */\n lib: unknown;\n modelPath: string;\n messages: LlmChatMessage[];\n opts?: LlmGenerateOptions;\n}\n\n/**\n * Run one chat completion via node-llama-cpp. Throws on binding/model errors\n * (callers wrap with redaction).\n */\nexport async function generateWithLlamaBinding(input: LlamaBindingGenerateInput): Promise<string> {\n const lib: any = input.lib;\n if (!lib || typeof lib.getLlama !== 'function') {\n throw new Error('llm-host: invalid node-llama-cpp module (getLlama missing)');\n }\n const llama = await lib.getLlama();\n const model = await llama.loadModel({ modelPath: input.modelPath });\n const ctx = await model.createContext();\n const { LlamaChatSession } = lib;\n if (typeof LlamaChatSession !== 'function') {\n throw new Error('llm-host: LlamaChatSession missing from node-llama-cpp module');\n }\n const chat = new LlamaChatSession({ contextSequence: ctx.getSequence() });\n const prompt = input.messages.map((m) => `${m.role}: ${m.content}`).join('\\n\\n');\n const temperature = input.opts?.temperature ?? 0;\n const maxTokens = input.opts?.maxTokens;\n // Grammar: pass through when binding supports it (future constrained PatchIR).\n const promptOpts: Record<string, unknown> = { temperature };\n if (typeof maxTokens === 'number') promptOpts.maxTokens = maxTokens;\n if (input.opts?.grammar) {\n // Best-effort: node-llama-cpp versions differ on the grammar API surface.\n promptOpts.grammar = input.opts.grammar;\n }\n const text: string = await chat.prompt(prompt, promptOpts);\n return typeof text === 'string' ? text : String(text ?? '');\n}\n","/**\n * Embedded llm-host (Approach B default) — same address space as the agent.\n *\n * Production path: warm session pool ({@link acquireHostSession}) so models are\n * not reloaded every chat turn. Binding is injected via {@link setBinding}.\n */\n\nimport { annotateUnknownIdentifiers } from '../identifier-mask.js';\nimport { generateWithLlamaBinding } from './binding.js';\nimport {\n acquireHostSession,\n generateOnSession,\n type HostGenerateReport,\n} from './session.js';\nimport type {\n LlmChatMessage,\n LlmGenerateOptions,\n LlmGenerateResult,\n LlmHost,\n LlmMemoryReport,\n} from './types.js';\n\nexport class EmbeddedLlmHost implements LlmHost {\n readonly isolation = 'embedded' as const;\n private modelRef: string | null = null;\n private loaded = false;\n private binding: unknown | null = null;\n private preferGrammar = false;\n private lastReport: HostGenerateReport | null = null;\n\n /** Attach the dynamically loaded node-llama-cpp module. */\n setBinding(lib: unknown): void {\n this.binding = lib;\n }\n\n /** Hint from MEP: attempt constrained decoding when grammar is supplied. */\n setPreferGrammar(on: boolean): void {\n this.preferGrammar = on;\n }\n\n /** Last generate metrics (KV plan, draft accept, warm start). */\n lastGenerateReport(): HostGenerateReport | null {\n return this.lastReport;\n }\n\n async load(modelRef: string): Promise<void> {\n this.modelRef = modelRef;\n this.loaded = true;\n // Eagerly warm the session when binding is already available.\n if (this.binding) {\n await acquireHostSession(this.binding, modelRef);\n }\n }\n\n async unload(): Promise<void> {\n this.modelRef = null;\n this.loaded = false;\n this.lastReport = null;\n }\n\n supportsConstrainedDecoding(): boolean {\n return this.preferGrammar && this.binding != null;\n }\n\n memoryReport(): LlmMemoryReport {\n return {\n isolation: this.isolation,\n modelRef: this.modelRef,\n loaded: this.loaded,\n };\n }\n\n async generate(messages: LlmChatMessage[], opts: LlmGenerateOptions = {}): Promise<LlmGenerateResult> {\n if (!this.loaded || !this.modelRef) {\n throw new Error('llm-host: no model loaded — orchestrator must call load() after resolve/install');\n }\n if (!this.binding) {\n throw new Error(\n 'llm-host: node-llama-cpp binding not attached — run `vg models install` for the llama-cpp provider, then retry',\n );\n }\n\n // Production path: pooled warm session.\n try {\n const session = await acquireHostSession(this.binding, this.modelRef);\n const report = await generateOnSession(session, messages, {\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: opts.annotateUnknownIdentifiers,\n draftCandidates: opts.draftCandidates,\n maxTokens: opts.maxTokens,\n temperature: opts.temperature,\n promptSegments: opts.promptSegments,\n });\n this.lastReport = report;\n return {\n text: report.text,\n model: report.model,\n isolation: report.isolation,\n constrained: report.constrained || !!(opts.grammar && this.preferGrammar),\n unknownIdentifiers: report.unknownIdentifiers,\n };\n } catch {\n // Fallback one-shot (tests / minimal bindings).\n let text = await generateWithLlamaBinding({\n lib: this.binding,\n modelPath: this.modelRef,\n messages,\n opts,\n });\n let unknownIdentifiers: string[] | undefined;\n if (opts.identifierTrie && opts.annotateUnknownIdentifiers !== false) {\n const ann = annotateUnknownIdentifiers(text, opts.identifierTrie);\n text = ann.text;\n unknownIdentifiers = ann.unknown.length ? ann.unknown : undefined;\n }\n return {\n text,\n model: this.modelRef,\n isolation: this.isolation,\n constrained: !!(opts.grammar && this.supportsConstrainedDecoding()),\n unknownIdentifiers,\n };\n }\n }\n}\n","/**\n * Process-isolation llm-host: client + server over a Unix/local socket.\n *\n * Management (Code Modes, fit, packs, install) stays in vgd / the CLI.\n * This process only loads weights and decodes (ADR-005).\n */\n\nimport * as fs from 'node:fs';\nimport * as net from 'node:net';\nimport * as path from 'node:path';\nimport { generateWithLlamaBinding } from './binding.js';\nimport { acquireHostSession, generateOnSession } from './session.js';\nimport type {\n LlmChatMessage,\n LlmGenerateOptions,\n LlmGenerateResult,\n LlmHost,\n LlmMemoryReport,\n} from './types.js';\n\nexport const LLM_HOST_IPC_SCHEMA = 'llm-host-ipc/0' as const;\n\nexport type LlmHostIpcRequest =\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'load'; modelRef: string }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'unload' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'generate'; messages: LlmChatMessage[]; opts?: LlmGenerateOptions }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'memory' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'capabilities' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'ping' };\n\nexport type LlmHostIpcResponse =\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'load' | 'unload' | 'ping' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'generate'; result: LlmGenerateResult }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'memory'; report: LlmMemoryReport }\n | {\n v: typeof LLM_HOST_IPC_SCHEMA;\n id: string;\n ok: true;\n op: 'capabilities';\n constrainedDecoding: boolean;\n isolation: 'process';\n }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: false; error: string };\n\n/** Request body without envelope — distribute Omit over the union (keyof union is only common keys). */\nexport type LlmHostIpcBody = LlmHostIpcRequest extends infer R\n ? R extends { v: typeof LLM_HOST_IPC_SCHEMA; id: string }\n ? Omit<R, 'v' | 'id'>\n : never\n : never;\n\nexport interface ProcessHostServerOptions {\n socketPath: string;\n /** node-llama-cpp module (optional until first generate). */\n binding?: unknown;\n onListen?: (socketPath: string) => void;\n}\n\n/**\n * Serve llm-host IPC on a local socket. Resolves when the server is listening;\n * call the returned `close` to stop.\n */\nexport function startProcessHostServer(options: ProcessHostServerOptions): Promise<{ close: () => Promise<void> }> {\n const state = {\n modelRef: null as string | null,\n loaded: false,\n binding: options.binding ?? null,\n };\n\n try {\n if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);\n } catch {\n /* ignore */\n }\n fs.mkdirSync(path.dirname(options.socketPath), { recursive: true });\n\n return new Promise((resolve, reject) => {\n const server = net.createServer((socket) => {\n let buf = '';\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n buf += chunk;\n let nl: number;\n while ((nl = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, nl).trim();\n buf = buf.slice(nl + 1);\n if (!line) continue;\n void handleLine(line, state, (resp) => {\n socket.write(`${JSON.stringify(resp)}\\n`);\n });\n }\n });\n });\n\n server.once('error', reject);\n server.listen(options.socketPath, () => {\n options.onListen?.(options.socketPath);\n resolve({\n close: () =>\n new Promise((res, rej) => {\n server.close((err) => {\n try {\n if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);\n } catch {\n /* ignore */\n }\n if (err) rej(err);\n else res();\n });\n }),\n });\n });\n });\n}\n\n/** Attach binding after server start (e.g. after ensurePackage). */\nexport type ProcessHostState = {\n modelRef: string | null;\n loaded: boolean;\n binding: unknown | null;\n};\n\nasync function handleLine(\n line: string,\n state: ProcessHostState,\n reply: (r: LlmHostIpcResponse) => void,\n): Promise<void> {\n let req: LlmHostIpcRequest;\n try {\n req = JSON.parse(line) as LlmHostIpcRequest;\n } catch {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: '?', ok: false, error: 'invalid JSON' });\n return;\n }\n if (req.v !== LLM_HOST_IPC_SCHEMA) {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: `unsupported schema ${String((req as { v?: string }).v)}` });\n return;\n }\n\n try {\n switch (req.op) {\n case 'ping':\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'ping' });\n return;\n case 'load':\n state.modelRef = req.modelRef;\n state.loaded = true;\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'load' });\n return;\n case 'unload':\n state.modelRef = null;\n state.loaded = false;\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'unload' });\n return;\n case 'memory':\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: true,\n op: 'memory',\n report: { isolation: 'process', modelRef: state.modelRef, loaded: state.loaded },\n });\n return;\n case 'capabilities':\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: true,\n op: 'capabilities',\n constrainedDecoding: state.binding != null,\n isolation: 'process',\n });\n return;\n case 'generate': {\n if (!state.loaded || !state.modelRef) {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: 'no model loaded' });\n return;\n }\n if (!state.binding) {\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: false,\n error: 'binding not loaded in host process — start host after vg models install',\n });\n return;\n }\n // Same warm session path as embedded (Approach B parity for enterprise isolation).\n let result: LlmGenerateResult;\n try {\n const session = await acquireHostSession(state.binding, state.modelRef);\n const report = await generateOnSession(session, req.messages, {\n grammar: req.opts?.grammar,\n requireGrammar: req.opts?.requireGrammar,\n identifierTrie: req.opts?.identifierTrie,\n annotateUnknownIdentifiers: req.opts?.annotateUnknownIdentifiers,\n draftCandidates: req.opts?.draftCandidates,\n maxTokens: req.opts?.maxTokens,\n temperature: req.opts?.temperature,\n promptSegments: req.opts?.promptSegments,\n });\n result = {\n text: report.text,\n model: state.modelRef,\n isolation: 'process',\n constrained: report.constrained,\n unknownIdentifiers: report.unknownIdentifiers,\n };\n } catch {\n const text = await generateWithLlamaBinding({\n lib: state.binding,\n modelPath: state.modelRef,\n messages: req.messages,\n opts: req.opts,\n });\n result = {\n text,\n model: state.modelRef,\n isolation: 'process',\n constrained: !!(req.opts?.grammar && state.binding),\n };\n }\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'generate', result });\n return;\n }\n default:\n reply({ v: LLM_HOST_IPC_SCHEMA, id: (req as { id: string }).id, ok: false, error: 'unknown op' });\n }\n } catch (e) {\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/** Client: full {@link LlmHost} over the process socket. */\nexport class ProcessLlmHost implements LlmHost {\n readonly isolation = 'process' as const;\n private seq = 0;\n\n constructor(private readonly socketPath: string) {}\n\n getEndpoint(): string {\n return this.socketPath;\n }\n\n supportsConstrainedDecoding(): boolean {\n return true; // host may apply grammar when binding is present\n }\n\n async load(modelRef: string): Promise<void> {\n await this.rpc({ op: 'load', modelRef });\n }\n\n async unload(): Promise<void> {\n await this.rpc({ op: 'unload' });\n }\n\n async generate(messages: LlmChatMessage[], opts?: LlmGenerateOptions): Promise<LlmGenerateResult> {\n const res = await this.rpc({ op: 'generate', messages, opts });\n if (!res.ok || res.op !== 'generate') {\n throw new Error(!res.ok ? res.error : 'unexpected response');\n }\n return res.result;\n }\n\n memoryReport(): LlmMemoryReport {\n // Sync surface required by LlmHost; use last known or empty (async memory via rpc elsewhere).\n return { isolation: 'process', modelRef: null, loaded: false };\n }\n\n async memoryReportAsync(): Promise<LlmMemoryReport> {\n const res = await this.rpc({ op: 'memory' });\n if (!res.ok || res.op !== 'memory') {\n throw new Error(!res.ok ? res.error : 'unexpected response');\n }\n return res.report;\n }\n\n private rpc(body: LlmHostIpcBody): Promise<LlmHostIpcResponse> {\n const id = `r${++this.seq}`;\n const req = { v: LLM_HOST_IPC_SCHEMA, id, ...body } as LlmHostIpcRequest;\n return new Promise((resolve, reject) => {\n const socket = net.createConnection(this.socketPath);\n let buf = '';\n const timer = setTimeout(() => {\n socket.destroy();\n reject(new Error(`llm-host IPC timeout (${this.socketPath})`));\n }, 120_000);\n socket.setEncoding('utf8');\n socket.on('connect', () => {\n socket.write(`${JSON.stringify(req)}\\n`);\n });\n socket.on('data', (chunk: string) => {\n buf += chunk;\n const nl = buf.indexOf('\\n');\n if (nl < 0) return;\n const line = buf.slice(0, nl).trim();\n clearTimeout(timer);\n socket.end();\n try {\n resolve(JSON.parse(line) as LlmHostIpcResponse);\n } catch (e) {\n reject(e);\n }\n });\n socket.on('error', (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n }\n}\n\n/** @deprecated use ProcessLlmHost */\nexport class ProcessBridgeLlmHost extends ProcessLlmHost {}\n","/**\n * Factory for the dual-mode llm-host (ADR-005).\n *\n * `createLlmHost({ isolation: 'embedded' })` — default Approach B.\n * `createLlmHost({ isolation: 'process', endpoint })` — enterprise shell.\n */\n\nimport * as path from 'node:path';\nimport { vibgrateRuntimeDir } from '../paths.js';\nimport { EmbeddedLlmHost } from './embedded.js';\nimport { ProcessLlmHost } from './process-bridge.js';\nimport type { LlmHost, LlmHostIsolation } from './types.js';\n\nexport type {\n LlmHost,\n LlmHostConfig,\n LlmHostIsolation,\n LlmChatMessage,\n LlmGenerateResult,\n LlmGenerateOptions,\n LlmMemoryReport,\n} from './types.js';\nexport { EmbeddedLlmHost } from './embedded.js';\nexport {\n ProcessLlmHost,\n ProcessBridgeLlmHost,\n LLM_HOST_IPC_SCHEMA,\n startProcessHostServer,\n} from './process-bridge.js';\nexport type { LlmHostIpcRequest, LlmHostIpcResponse, ProcessHostServerOptions } from './process-bridge.js';\nexport { generateWithLlamaBinding } from './binding.js';\nexport {\n acquireHostSession,\n generateOnSession,\n clearHostSessionPool,\n hostSessionPoolSize,\n listHostSessions,\n dropHostSession,\n evictIdleSessions,\n sessionKey,\n} from './session.js';\nexport type { HostGenerateExtras, HostGenerateReport, HostSessionInfo } from './session.js';\nexport { attachGrammar, assertGrammarOrThrow, allowGrammarStringFallback } from './grammar.js';\nexport type { GrammarAttachResult, GrammarAttachMethod } from './grammar.js';\nexport {\n buildIdentifierTokenBias,\n planNextCharMask,\n tokenCompatibleWithTrie,\n trieFingerprint,\n} from './logit-mask.js';\nexport type { LogitMaskBuildResult, SamplerHookMethod, BuildLogitMaskOptions } from './logit-mask.js';\nexport {\n createIdentStreamState,\n stepIdentStream,\n filterTokenTexts,\n attachDynamicIdentFilter,\n dynamicAllowedNextChars,\n} from './identifier-sampler.js';\nexport type { IdentStreamState, IdentStepResult } from './identifier-sampler.js';\nexport { probeBindingCapabilities, supportsDynamicIdentSampler, supportsKvPrefixEvaluate } from './binding-capabilities.js';\nexport type { BindingCapabilities, ProbeBindingOptions } from './binding-capabilities.js';\nexport { composePromptConstraints } from './compose-constraints.js';\nexport { rankDraftCandidates, pickBestDraft } from './speculative.js';\nexport type { RankedDraft } from './speculative.js';\n\nexport interface CreateLlmHostOptions {\n isolation?: LlmHostIsolation;\n /** Socket path when isolation is `process`. Defaults under vibgrate runtime dir. */\n endpoint?: string;\n /** Pre-attach binding for embedded hosts (avoids a second ensure). */\n binding?: unknown;\n preferGrammar?: boolean;\n}\n\nexport function createLlmHost(options: CreateLlmHostOptions = {}): LlmHost {\n const isolation = options.isolation ?? 'embedded';\n if (isolation === 'process') {\n return new ProcessLlmHost(options.endpoint ?? defaultProcessEndpoint());\n }\n const host = new EmbeddedLlmHost();\n if (options.binding) host.setBinding(options.binding);\n if (options.preferGrammar) host.setPreferGrammar(true);\n return host;\n}\n\n/** Default IPC socket path for the isolated llm-host process. */\nexport function defaultProcessEndpoint(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(vibgrateRuntimeDir(env), 'llm-host.sock');\n}\n\n/** Resolve isolation from env / explicit override (MEP / config later). */\nexport function resolveInferenceIsolation(\n explicit?: LlmHostIsolation,\n env: NodeJS.ProcessEnv = process.env,\n): LlmHostIsolation {\n if (explicit === 'embedded' || explicit === 'process') return explicit;\n const v = (env.VIBGRATE_INFERENCE_ISOLATION || env.VG_INFERENCE_ISOLATION || '').toLowerCase();\n if (v === 'process' || v === 'isolated') return 'process';\n return 'embedded';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/llm-host/binding.ts","../src/runtime/llm-host/embedded.ts","../src/runtime/llm-host/process-bridge.ts","../src/runtime/llm-host/index.ts"],"names":["path2"],"mappings":"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","file":"chunk-SIPGDJT4.js","sourcesContent":["/**\n * node-llama-cpp binding adapter — pure glue so embedded + process hosts share\n * one code path. The module is injected (from ensurePackage); never imported\n * statically so the published CLI stays free of native deps.\n */\n\nimport type { LlmChatMessage, LlmGenerateOptions } from './types.js';\n\nexport interface LlamaBindingGenerateInput {\n /** Loaded node-llama-cpp module (dynamic). */\n lib: unknown;\n modelPath: string;\n messages: LlmChatMessage[];\n opts?: LlmGenerateOptions;\n}\n\n/**\n * Run one chat completion via node-llama-cpp. Throws on binding/model errors\n * (callers wrap with redaction).\n */\nexport async function generateWithLlamaBinding(input: LlamaBindingGenerateInput): Promise<string> {\n const lib: any = input.lib;\n if (!lib || typeof lib.getLlama !== 'function') {\n throw new Error('llm-host: invalid node-llama-cpp module (getLlama missing)');\n }\n const llama = await lib.getLlama();\n const model = await llama.loadModel({ modelPath: input.modelPath });\n const ctx = await model.createContext();\n const { LlamaChatSession } = lib;\n if (typeof LlamaChatSession !== 'function') {\n throw new Error('llm-host: LlamaChatSession missing from node-llama-cpp module');\n }\n const chat = new LlamaChatSession({ contextSequence: ctx.getSequence() });\n const prompt = input.messages.map((m) => `${m.role}: ${m.content}`).join('\\n\\n');\n const temperature = input.opts?.temperature ?? 0;\n const maxTokens = input.opts?.maxTokens;\n // Grammar: pass through when binding supports it (future constrained PatchIR).\n const promptOpts: Record<string, unknown> = { temperature };\n if (typeof maxTokens === 'number') promptOpts.maxTokens = maxTokens;\n if (input.opts?.grammar) {\n // Best-effort: node-llama-cpp versions differ on the grammar API surface.\n promptOpts.grammar = input.opts.grammar;\n }\n const text: string = await chat.prompt(prompt, promptOpts);\n return typeof text === 'string' ? text : String(text ?? '');\n}\n","/**\n * Embedded llm-host (Approach B default) — same address space as the agent.\n *\n * Production path: warm session pool ({@link acquireHostSession}) so models are\n * not reloaded every chat turn. Binding is injected via {@link setBinding}.\n */\n\nimport { annotateUnknownIdentifiers } from '../identifier-mask.js';\nimport { generateWithLlamaBinding } from './binding.js';\nimport {\n acquireHostSession,\n generateOnSession,\n type HostGenerateReport,\n} from './session.js';\nimport type {\n LlmChatMessage,\n LlmGenerateOptions,\n LlmGenerateResult,\n LlmHost,\n LlmMemoryReport,\n} from './types.js';\n\nexport class EmbeddedLlmHost implements LlmHost {\n readonly isolation = 'embedded' as const;\n private modelRef: string | null = null;\n private loaded = false;\n private binding: unknown | null = null;\n private preferGrammar = false;\n private lastReport: HostGenerateReport | null = null;\n\n /** Attach the dynamically loaded node-llama-cpp module. */\n setBinding(lib: unknown): void {\n this.binding = lib;\n }\n\n /** Hint from MEP: attempt constrained decoding when grammar is supplied. */\n setPreferGrammar(on: boolean): void {\n this.preferGrammar = on;\n }\n\n /** Last generate metrics (KV plan, draft accept, warm start). */\n lastGenerateReport(): HostGenerateReport | null {\n return this.lastReport;\n }\n\n async load(modelRef: string): Promise<void> {\n this.modelRef = modelRef;\n this.loaded = true;\n // Eagerly warm the session when binding is already available.\n if (this.binding) {\n await acquireHostSession(this.binding, modelRef);\n }\n }\n\n async unload(): Promise<void> {\n this.modelRef = null;\n this.loaded = false;\n this.lastReport = null;\n }\n\n supportsConstrainedDecoding(): boolean {\n return this.preferGrammar && this.binding != null;\n }\n\n memoryReport(): LlmMemoryReport {\n return {\n isolation: this.isolation,\n modelRef: this.modelRef,\n loaded: this.loaded,\n };\n }\n\n async generate(messages: LlmChatMessage[], opts: LlmGenerateOptions = {}): Promise<LlmGenerateResult> {\n if (!this.loaded || !this.modelRef) {\n throw new Error('llm-host: no model loaded — orchestrator must call load() after resolve/install');\n }\n if (!this.binding) {\n throw new Error(\n 'llm-host: node-llama-cpp binding not attached — run `vg models install` for the llama-cpp provider, then retry',\n );\n }\n\n // Production path: pooled warm session.\n try {\n const session = await acquireHostSession(this.binding, this.modelRef);\n const report = await generateOnSession(session, messages, {\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: opts.annotateUnknownIdentifiers,\n draftCandidates: opts.draftCandidates,\n maxTokens: opts.maxTokens,\n temperature: opts.temperature,\n promptSegments: opts.promptSegments,\n });\n this.lastReport = report;\n return {\n text: report.text,\n model: report.model,\n isolation: report.isolation,\n constrained: report.constrained || !!(opts.grammar && this.preferGrammar),\n unknownIdentifiers: report.unknownIdentifiers,\n };\n } catch {\n // Fallback one-shot (tests / minimal bindings).\n let text = await generateWithLlamaBinding({\n lib: this.binding,\n modelPath: this.modelRef,\n messages,\n opts,\n });\n let unknownIdentifiers: string[] | undefined;\n if (opts.identifierTrie && opts.annotateUnknownIdentifiers !== false) {\n const ann = annotateUnknownIdentifiers(text, opts.identifierTrie);\n text = ann.text;\n unknownIdentifiers = ann.unknown.length ? ann.unknown : undefined;\n }\n return {\n text,\n model: this.modelRef,\n isolation: this.isolation,\n constrained: !!(opts.grammar && this.supportsConstrainedDecoding()),\n unknownIdentifiers,\n };\n }\n }\n}\n","/**\n * Process-isolation llm-host: client + server over a Unix/local socket.\n *\n * Management (Code Modes, fit, packs, install) stays in vgd / the CLI.\n * This process only loads weights and decodes (ADR-005).\n */\n\nimport * as fs from 'node:fs';\nimport * as net from 'node:net';\nimport * as path from 'node:path';\nimport { generateWithLlamaBinding } from './binding.js';\nimport { acquireHostSession, generateOnSession } from './session.js';\nimport type {\n LlmChatMessage,\n LlmGenerateOptions,\n LlmGenerateResult,\n LlmHost,\n LlmMemoryReport,\n} from './types.js';\n\nexport const LLM_HOST_IPC_SCHEMA = 'llm-host-ipc/0' as const;\n\nexport type LlmHostIpcRequest =\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'load'; modelRef: string }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'unload' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'generate'; messages: LlmChatMessage[]; opts?: LlmGenerateOptions }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'memory' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'capabilities' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; op: 'ping' };\n\nexport type LlmHostIpcResponse =\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'load' | 'unload' | 'ping' }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'generate'; result: LlmGenerateResult }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: true; op: 'memory'; report: LlmMemoryReport }\n | {\n v: typeof LLM_HOST_IPC_SCHEMA;\n id: string;\n ok: true;\n op: 'capabilities';\n constrainedDecoding: boolean;\n isolation: 'process';\n }\n | { v: typeof LLM_HOST_IPC_SCHEMA; id: string; ok: false; error: string };\n\n/** Request body without envelope — distribute Omit over the union (keyof union is only common keys). */\nexport type LlmHostIpcBody = LlmHostIpcRequest extends infer R\n ? R extends { v: typeof LLM_HOST_IPC_SCHEMA; id: string }\n ? Omit<R, 'v' | 'id'>\n : never\n : never;\n\nexport interface ProcessHostServerOptions {\n socketPath: string;\n /** node-llama-cpp module (optional until first generate). */\n binding?: unknown;\n onListen?: (socketPath: string) => void;\n}\n\n/**\n * Serve llm-host IPC on a local socket. Resolves when the server is listening;\n * call the returned `close` to stop.\n */\nexport function startProcessHostServer(options: ProcessHostServerOptions): Promise<{ close: () => Promise<void> }> {\n const state = {\n modelRef: null as string | null,\n loaded: false,\n binding: options.binding ?? null,\n };\n\n try {\n if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);\n } catch {\n /* ignore */\n }\n fs.mkdirSync(path.dirname(options.socketPath), { recursive: true });\n\n return new Promise((resolve, reject) => {\n const server = net.createServer((socket) => {\n let buf = '';\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n buf += chunk;\n let nl: number;\n while ((nl = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, nl).trim();\n buf = buf.slice(nl + 1);\n if (!line) continue;\n void handleLine(line, state, (resp) => {\n socket.write(`${JSON.stringify(resp)}\\n`);\n });\n }\n });\n });\n\n server.once('error', reject);\n server.listen(options.socketPath, () => {\n options.onListen?.(options.socketPath);\n resolve({\n close: () =>\n new Promise((res, rej) => {\n server.close((err) => {\n try {\n if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);\n } catch {\n /* ignore */\n }\n if (err) rej(err);\n else res();\n });\n }),\n });\n });\n });\n}\n\n/** Attach binding after server start (e.g. after ensurePackage). */\nexport type ProcessHostState = {\n modelRef: string | null;\n loaded: boolean;\n binding: unknown | null;\n};\n\nasync function handleLine(\n line: string,\n state: ProcessHostState,\n reply: (r: LlmHostIpcResponse) => void,\n): Promise<void> {\n let req: LlmHostIpcRequest;\n try {\n req = JSON.parse(line) as LlmHostIpcRequest;\n } catch {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: '?', ok: false, error: 'invalid JSON' });\n return;\n }\n if (req.v !== LLM_HOST_IPC_SCHEMA) {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: `unsupported schema ${String((req as { v?: string }).v)}` });\n return;\n }\n\n try {\n switch (req.op) {\n case 'ping':\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'ping' });\n return;\n case 'load':\n state.modelRef = req.modelRef;\n state.loaded = true;\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'load' });\n return;\n case 'unload':\n state.modelRef = null;\n state.loaded = false;\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'unload' });\n return;\n case 'memory':\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: true,\n op: 'memory',\n report: { isolation: 'process', modelRef: state.modelRef, loaded: state.loaded },\n });\n return;\n case 'capabilities':\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: true,\n op: 'capabilities',\n constrainedDecoding: state.binding != null,\n isolation: 'process',\n });\n return;\n case 'generate': {\n if (!state.loaded || !state.modelRef) {\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: 'no model loaded' });\n return;\n }\n if (!state.binding) {\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: false,\n error: 'binding not loaded in host process — start host after vg models install',\n });\n return;\n }\n // Same warm session path as embedded (Approach B parity for enterprise isolation).\n let result: LlmGenerateResult;\n try {\n const session = await acquireHostSession(state.binding, state.modelRef);\n const report = await generateOnSession(session, req.messages, {\n grammar: req.opts?.grammar,\n requireGrammar: req.opts?.requireGrammar,\n identifierTrie: req.opts?.identifierTrie,\n annotateUnknownIdentifiers: req.opts?.annotateUnknownIdentifiers,\n draftCandidates: req.opts?.draftCandidates,\n maxTokens: req.opts?.maxTokens,\n temperature: req.opts?.temperature,\n promptSegments: req.opts?.promptSegments,\n });\n result = {\n text: report.text,\n model: state.modelRef,\n isolation: 'process',\n constrained: report.constrained,\n unknownIdentifiers: report.unknownIdentifiers,\n };\n } catch {\n const text = await generateWithLlamaBinding({\n lib: state.binding,\n modelPath: state.modelRef,\n messages: req.messages,\n opts: req.opts,\n });\n result = {\n text,\n model: state.modelRef,\n isolation: 'process',\n constrained: !!(req.opts?.grammar && state.binding),\n };\n }\n reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: 'generate', result });\n return;\n }\n default:\n reply({ v: LLM_HOST_IPC_SCHEMA, id: (req as { id: string }).id, ok: false, error: 'unknown op' });\n }\n } catch (e) {\n reply({\n v: LLM_HOST_IPC_SCHEMA,\n id: req.id,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n}\n\n/** Client: full {@link LlmHost} over the process socket. */\nexport class ProcessLlmHost implements LlmHost {\n readonly isolation = 'process' as const;\n private seq = 0;\n\n constructor(private readonly socketPath: string) {}\n\n getEndpoint(): string {\n return this.socketPath;\n }\n\n supportsConstrainedDecoding(): boolean {\n return true; // host may apply grammar when binding is present\n }\n\n async load(modelRef: string): Promise<void> {\n await this.rpc({ op: 'load', modelRef });\n }\n\n async unload(): Promise<void> {\n await this.rpc({ op: 'unload' });\n }\n\n async generate(messages: LlmChatMessage[], opts?: LlmGenerateOptions): Promise<LlmGenerateResult> {\n const res = await this.rpc({ op: 'generate', messages, opts });\n if (!res.ok || res.op !== 'generate') {\n throw new Error(!res.ok ? res.error : 'unexpected response');\n }\n return res.result;\n }\n\n memoryReport(): LlmMemoryReport {\n // Sync surface required by LlmHost; use last known or empty (async memory via rpc elsewhere).\n return { isolation: 'process', modelRef: null, loaded: false };\n }\n\n async memoryReportAsync(): Promise<LlmMemoryReport> {\n const res = await this.rpc({ op: 'memory' });\n if (!res.ok || res.op !== 'memory') {\n throw new Error(!res.ok ? res.error : 'unexpected response');\n }\n return res.report;\n }\n\n private rpc(body: LlmHostIpcBody): Promise<LlmHostIpcResponse> {\n const id = `r${++this.seq}`;\n const req = { v: LLM_HOST_IPC_SCHEMA, id, ...body } as LlmHostIpcRequest;\n return new Promise((resolve, reject) => {\n const socket = net.createConnection(this.socketPath);\n let buf = '';\n const timer = setTimeout(() => {\n socket.destroy();\n reject(new Error(`llm-host IPC timeout (${this.socketPath})`));\n }, 120_000);\n socket.setEncoding('utf8');\n socket.on('connect', () => {\n socket.write(`${JSON.stringify(req)}\\n`);\n });\n socket.on('data', (chunk: string) => {\n buf += chunk;\n const nl = buf.indexOf('\\n');\n if (nl < 0) return;\n const line = buf.slice(0, nl).trim();\n clearTimeout(timer);\n socket.end();\n try {\n resolve(JSON.parse(line) as LlmHostIpcResponse);\n } catch (e) {\n reject(e);\n }\n });\n socket.on('error', (e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n }\n}\n\n/** @deprecated use ProcessLlmHost */\nexport class ProcessBridgeLlmHost extends ProcessLlmHost {}\n","/**\n * Factory for the dual-mode llm-host (ADR-005).\n *\n * `createLlmHost({ isolation: 'embedded' })` — default Approach B.\n * `createLlmHost({ isolation: 'process', endpoint })` — enterprise shell.\n */\n\nimport * as path from 'node:path';\nimport { vibgrateRuntimeDir } from '../paths.js';\nimport { EmbeddedLlmHost } from './embedded.js';\nimport { ProcessLlmHost } from './process-bridge.js';\nimport type { LlmHost, LlmHostIsolation } from './types.js';\n\nexport type {\n LlmHost,\n LlmHostConfig,\n LlmHostIsolation,\n LlmChatMessage,\n LlmGenerateResult,\n LlmGenerateOptions,\n LlmMemoryReport,\n} from './types.js';\nexport { EmbeddedLlmHost } from './embedded.js';\nexport {\n ProcessLlmHost,\n ProcessBridgeLlmHost,\n LLM_HOST_IPC_SCHEMA,\n startProcessHostServer,\n} from './process-bridge.js';\nexport type { LlmHostIpcRequest, LlmHostIpcResponse, ProcessHostServerOptions } from './process-bridge.js';\nexport { generateWithLlamaBinding } from './binding.js';\nexport {\n acquireHostSession,\n generateOnSession,\n clearHostSessionPool,\n hostSessionPoolSize,\n listHostSessions,\n dropHostSession,\n evictIdleSessions,\n sessionKey,\n} from './session.js';\nexport type { HostGenerateExtras, HostGenerateReport, HostSessionInfo } from './session.js';\nexport { attachGrammar, assertGrammarOrThrow, allowGrammarStringFallback } from './grammar.js';\nexport type { GrammarAttachResult, GrammarAttachMethod } from './grammar.js';\nexport {\n buildIdentifierTokenBias,\n planNextCharMask,\n tokenCompatibleWithTrie,\n trieFingerprint,\n} from './logit-mask.js';\nexport type { LogitMaskBuildResult, SamplerHookMethod, BuildLogitMaskOptions } from './logit-mask.js';\nexport {\n createIdentStreamState,\n stepIdentStream,\n filterTokenTexts,\n attachDynamicIdentFilter,\n dynamicAllowedNextChars,\n} from './identifier-sampler.js';\nexport type { IdentStreamState, IdentStepResult } from './identifier-sampler.js';\nexport { probeBindingCapabilities, supportsDynamicIdentSampler, supportsKvPrefixEvaluate } from './binding-capabilities.js';\nexport type { BindingCapabilities, ProbeBindingOptions } from './binding-capabilities.js';\nexport { composePromptConstraints } from './compose-constraints.js';\nexport { rankDraftCandidates, pickBestDraft } from './speculative.js';\nexport type { RankedDraft } from './speculative.js';\n\nexport interface CreateLlmHostOptions {\n isolation?: LlmHostIsolation;\n /** Socket path when isolation is `process`. Defaults under vibgrate runtime dir. */\n endpoint?: string;\n /** Pre-attach binding for embedded hosts (avoids a second ensure). */\n binding?: unknown;\n preferGrammar?: boolean;\n}\n\nexport function createLlmHost(options: CreateLlmHostOptions = {}): LlmHost {\n const isolation = options.isolation ?? 'embedded';\n if (isolation === 'process') {\n return new ProcessLlmHost(options.endpoint ?? defaultProcessEndpoint());\n }\n const host = new EmbeddedLlmHost();\n if (options.binding) host.setBinding(options.binding);\n if (options.preferGrammar) host.setPreferGrammar(true);\n return host;\n}\n\n/** Default IPC socket path for the isolated llm-host process. */\nexport function defaultProcessEndpoint(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(vibgrateRuntimeDir(env), 'llm-host.sock');\n}\n\n/** Resolve isolation from env / explicit override (MEP / config later). */\nexport function resolveInferenceIsolation(\n explicit?: LlmHostIsolation,\n env: NodeJS.ProcessEnv = process.env,\n): LlmHostIsolation {\n if (explicit === 'embedded' || explicit === 'process') return explicit;\n const v = (env.VIBGRATE_INFERENCE_ISOLATION || env.VG_INFERENCE_ISOLATION || '').toLowerCase();\n if (v === 'process' || v === 'isolated') return 'process';\n return 'embedded';\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isPackageInstalled, ensurePackage } from './chunk-
|
|
1
|
+
import { isPackageInstalled, ensurePackage } from './chunk-OSD546W7.js';
|
|
2
2
|
import { isWeightCached, lookupCatalog } from './chunk-GYSOQH5C.js';
|
|
3
3
|
import { spawnSync } from 'child_process';
|
|
4
4
|
|
|
@@ -352,5 +352,5 @@ async function ensureManagerRuntime(opts) {
|
|
|
352
352
|
}
|
|
353
353
|
|
|
354
354
|
export { buildModelInstallPlan, ensureManagerRuntime, formatManagerBadgeLine, managerBadge, managerFromProviderId };
|
|
355
|
-
//# sourceMappingURL=chunk-
|
|
356
|
-
//# sourceMappingURL=chunk-
|
|
355
|
+
//# sourceMappingURL=chunk-UIOBFLE6.js.map
|
|
356
|
+
//# sourceMappingURL=chunk-UIOBFLE6.js.map
|