@vibgrate/cli 2026.722.2 → 2026.727.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/DOCS.md +418 -213
- package/README.md +34 -8
- package/dist/baseline-TG4ATZGZ.js +8 -0
- package/dist/{baseline-BD3A7EXD.js.map → baseline-TG4ATZGZ.js.map} +1 -1
- package/dist/chunk-2MBL43EJ.js +82 -0
- package/dist/chunk-2MBL43EJ.js.map +1 -0
- package/dist/chunk-2XQDMLKB.js +465 -0
- package/dist/chunk-2XQDMLKB.js.map +1 -0
- package/dist/{chunk-PY3DNX5H.js → chunk-3Q7QBWFW.js} +13 -2
- package/dist/chunk-3Q7QBWFW.js.map +1 -0
- package/dist/chunk-3V24O47U.js +478 -0
- package/dist/chunk-3V24O47U.js.map +1 -0
- package/dist/chunk-5I4VSBWQ.js +764 -0
- package/dist/chunk-5I4VSBWQ.js.map +1 -0
- package/dist/{chunk-WNIIKCNF.js → chunk-6ABXHZRN.js} +59 -311
- package/dist/chunk-6ABXHZRN.js.map +1 -0
- package/dist/chunk-6AYDFFP5.js +136 -0
- package/dist/chunk-6AYDFFP5.js.map +1 -0
- package/dist/chunk-6UQMXIAG.js +122 -0
- package/dist/chunk-6UQMXIAG.js.map +1 -0
- package/dist/chunk-7N4Y3E47.js +108 -0
- package/dist/chunk-7N4Y3E47.js.map +1 -0
- package/dist/chunk-BPF3YX2U.js +64 -0
- package/dist/chunk-BPF3YX2U.js.map +1 -0
- package/dist/chunk-BWPBB45M.js +88 -0
- package/dist/chunk-BWPBB45M.js.map +1 -0
- package/dist/{chunk-6CXTPC74.js → chunk-CY4WKXB2.js} +27 -6
- package/dist/chunk-CY4WKXB2.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/{chunk-NONYJLOJ.js → chunk-EX4PQT6W.js} +3 -3
- package/dist/{chunk-NONYJLOJ.js.map → chunk-EX4PQT6W.js.map} +1 -1
- package/dist/chunk-IS7VTH2Q.js +627 -0
- package/dist/chunk-IS7VTH2Q.js.map +1 -0
- package/dist/chunk-IZDH67DX.js +289 -0
- package/dist/chunk-IZDH67DX.js.map +1 -0
- package/dist/chunk-J4RFRKZH.js +2496 -0
- package/dist/chunk-J4RFRKZH.js.map +1 -0
- package/dist/chunk-J7LKEB2R.js +51 -0
- package/dist/chunk-J7LKEB2R.js.map +1 -0
- package/dist/chunk-JIBOJTGS.js +313 -0
- package/dist/chunk-JIBOJTGS.js.map +1 -0
- package/dist/chunk-K3MZIVZW.js +88 -0
- package/dist/chunk-K3MZIVZW.js.map +1 -0
- package/dist/chunk-K7REHDQS.js +776 -0
- package/dist/chunk-K7REHDQS.js.map +1 -0
- package/dist/{chunk-2O5YZVZV.js → chunk-KCKYKDMS.js} +23 -19
- package/dist/chunk-KCKYKDMS.js.map +1 -0
- package/dist/{chunk-3MXNNBLI.js → chunk-KNELIQJO.js} +1647 -2042
- package/dist/chunk-KNELIQJO.js.map +1 -0
- package/dist/chunk-KSBHGWRV.js +613 -0
- package/dist/chunk-KSBHGWRV.js.map +1 -0
- package/dist/chunk-LKVMI67M.js +1695 -0
- package/dist/chunk-LKVMI67M.js.map +1 -0
- package/dist/chunk-NDMDSPFX.js +69 -0
- package/dist/chunk-NDMDSPFX.js.map +1 -0
- package/dist/{chunk-CS37OBE3.js → chunk-OFUC6RYN.js} +791 -783
- package/dist/chunk-OFUC6RYN.js.map +1 -0
- package/dist/chunk-OOIG3RUM.js +276 -0
- package/dist/chunk-OOIG3RUM.js.map +1 -0
- package/dist/chunk-PMYWZRRS.js +62 -0
- package/dist/chunk-PMYWZRRS.js.map +1 -0
- package/dist/chunk-PXHNTC6D.js +382 -0
- package/dist/chunk-PXHNTC6D.js.map +1 -0
- package/dist/{chunk-I7GY7MVN.js → chunk-RNP3SMTV.js} +60 -12
- package/dist/chunk-RNP3SMTV.js.map +1 -0
- package/dist/chunk-TCDAZZNP.js +843 -0
- package/dist/chunk-TCDAZZNP.js.map +1 -0
- package/dist/{chunk-5BDHQ7DD.js → chunk-WGUL45AV.js} +24 -17
- package/dist/chunk-WGUL45AV.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +3373 -617
- package/dist/cli.js.map +1 -1
- package/dist/execution-env-ZU45JZ4G.js +4 -0
- package/dist/execution-env-ZU45JZ4G.js.map +1 -0
- package/dist/federation-SZWZIFZ7.js +7 -0
- package/dist/federation-SZWZIFZ7.js.map +1 -0
- package/dist/{fs-IPY4FJKH.js → fs-B5HZ2MIU.js} +3 -2
- package/dist/fs-B5HZ2MIU.js.map +1 -0
- package/dist/{fs-KCABDURV.js → fs-O5IQYXHO.js} +3 -2
- package/dist/fs-O5IQYXHO.js.map +1 -0
- package/dist/git-ref-XDXB6JP5.js +4 -0
- package/dist/git-ref-XDXB6JP5.js.map +1 -0
- package/dist/graph-backend-73URGTFY.js +11 -0
- package/dist/graph-backend-73URGTFY.js.map +1 -0
- package/dist/index.d.ts +472 -137
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/{interactive-A4DISSIW.js → interactive-372NLI5C.js} +186 -226
- package/dist/interactive-372NLI5C.js.map +1 -0
- package/dist/llm-host-7GWDO6IX.js +9 -0
- package/dist/llm-host-7GWDO6IX.js.map +1 -0
- package/dist/load-I333TGNI.js +8 -0
- package/dist/load-I333TGNI.js.map +1 -0
- package/dist/local-runtime-5O2NN3GA.js +5 -0
- package/dist/local-runtime-5O2NN3GA.js.map +1 -0
- package/dist/mcp-tools-I7JK3S2M.js +4 -0
- package/dist/{mcp-tools-I6PME3AV.js.map → mcp-tools-I7JK3S2M.js.map} +1 -1
- package/dist/model-execution-profile-TFBKCNJG.js +4 -0
- package/dist/model-execution-profile-TFBKCNJG.js.map +1 -0
- package/dist/model-orchestrator-TVONAUPS.js +9 -0
- package/dist/model-orchestrator-TVONAUPS.js.map +1 -0
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +2 -1
- package/dist/parse-worker.js.map +1 -1
- package/dist/paths-2RAH3GME.js +6 -0
- package/dist/paths-2RAH3GME.js.map +1 -0
- package/dist/resolve-gguf-VPL4YQ6J.js +8 -0
- package/dist/resolve-gguf-VPL4YQ6J.js.map +1 -0
- package/dist/runtime-session-JRKCQUHY.js +18 -0
- package/dist/runtime-session-JRKCQUHY.js.map +1 -0
- package/dist/session-ITPYQ5XI.js +11 -0
- package/dist/{session-POJUDFPH.js.map → session-ITPYQ5XI.js.map} +1 -1
- package/dist/session-store-WFBX7HXL.js +4 -0
- package/dist/{session-store-W5RZZHA3.js.map → session-store-WFBX7HXL.js.map} +1 -1
- package/dist/{stream-json-Q2JGWPHB.js → stream-json-SLMDKLXP.js} +17 -6
- package/dist/stream-json-SLMDKLXP.js.map +1 -0
- package/dist/{types-Jl6RJ175.d.ts → types-7AHBUbFm.d.ts} +8 -2
- package/dist/ui-Q6DJ3GCU.js +5 -0
- package/dist/ui-Q6DJ3GCU.js.map +1 -0
- package/dist/vgd-7JV5KCNJ.js +17 -0
- package/dist/vgd-7JV5KCNJ.js.map +1 -0
- package/package.json +9 -6
- package/dist/baseline-BD3A7EXD.js +0 -7
- package/dist/chunk-2O5YZVZV.js.map +0 -1
- package/dist/chunk-3MXNNBLI.js.map +0 -1
- package/dist/chunk-5BDHQ7DD.js.map +0 -1
- package/dist/chunk-6CXTPC74.js.map +0 -1
- package/dist/chunk-CS37OBE3.js.map +0 -1
- package/dist/chunk-GGJZA3Q6.js +0 -961
- package/dist/chunk-GGJZA3Q6.js.map +0 -1
- package/dist/chunk-I7GY7MVN.js.map +0 -1
- package/dist/chunk-JBXNQCGE.js +0 -484
- package/dist/chunk-JBXNQCGE.js.map +0 -1
- package/dist/chunk-PY3DNX5H.js.map +0 -1
- package/dist/chunk-WNIIKCNF.js.map +0 -1
- package/dist/fs-IPY4FJKH.js.map +0 -1
- package/dist/fs-KCABDURV.js.map +0 -1
- package/dist/interactive-A4DISSIW.js.map +0 -1
- package/dist/mcp-tools-I6PME3AV.js +0 -3
- package/dist/session-POJUDFPH.js +0 -6
- package/dist/session-store-W5RZZHA3.js +0 -3
- package/dist/stream-json-Q2JGWPHB.js.map +0 -1
- package/dist/ui-HOVOPWMX.js +0 -4
- package/dist/ui-HOVOPWMX.js.map +0 -1
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { acquireHostSession, generateOnSession } from './chunk-K7REHDQS.js';
|
|
2
|
+
import { annotateUnknownIdentifiers } from './chunk-JIBOJTGS.js';
|
|
3
|
+
import { vibgrateRuntimeDir } from './chunk-BWPBB45M.js';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as net from 'net';
|
|
7
|
+
|
|
8
|
+
// src/runtime/llm-host/binding.ts
|
|
9
|
+
async function generateWithLlamaBinding(input) {
|
|
10
|
+
const lib = input.lib;
|
|
11
|
+
if (!lib || typeof lib.getLlama !== "function") {
|
|
12
|
+
throw new Error("llm-host: invalid node-llama-cpp module (getLlama missing)");
|
|
13
|
+
}
|
|
14
|
+
const llama = await lib.getLlama();
|
|
15
|
+
const model = await llama.loadModel({ modelPath: input.modelPath });
|
|
16
|
+
const ctx = await model.createContext();
|
|
17
|
+
const { LlamaChatSession } = lib;
|
|
18
|
+
if (typeof LlamaChatSession !== "function") {
|
|
19
|
+
throw new Error("llm-host: LlamaChatSession missing from node-llama-cpp module");
|
|
20
|
+
}
|
|
21
|
+
const chat = new LlamaChatSession({ contextSequence: ctx.getSequence() });
|
|
22
|
+
const prompt = input.messages.map((m) => `${m.role}: ${m.content}`).join("\n\n");
|
|
23
|
+
const temperature = input.opts?.temperature ?? 0;
|
|
24
|
+
const maxTokens = input.opts?.maxTokens;
|
|
25
|
+
const promptOpts = { temperature };
|
|
26
|
+
if (typeof maxTokens === "number") promptOpts.maxTokens = maxTokens;
|
|
27
|
+
if (input.opts?.grammar) {
|
|
28
|
+
promptOpts.grammar = input.opts.grammar;
|
|
29
|
+
}
|
|
30
|
+
const text = await chat.prompt(prompt, promptOpts);
|
|
31
|
+
return typeof text === "string" ? text : String(text ?? "");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/runtime/llm-host/embedded.ts
|
|
35
|
+
var EmbeddedLlmHost = class {
|
|
36
|
+
isolation = "embedded";
|
|
37
|
+
modelRef = null;
|
|
38
|
+
loaded = false;
|
|
39
|
+
binding = null;
|
|
40
|
+
preferGrammar = false;
|
|
41
|
+
lastReport = null;
|
|
42
|
+
/** Attach the dynamically loaded node-llama-cpp module. */
|
|
43
|
+
setBinding(lib) {
|
|
44
|
+
this.binding = lib;
|
|
45
|
+
}
|
|
46
|
+
/** Hint from MEP: attempt constrained decoding when grammar is supplied. */
|
|
47
|
+
setPreferGrammar(on) {
|
|
48
|
+
this.preferGrammar = on;
|
|
49
|
+
}
|
|
50
|
+
/** Last generate metrics (KV plan, draft accept, warm start). */
|
|
51
|
+
lastGenerateReport() {
|
|
52
|
+
return this.lastReport;
|
|
53
|
+
}
|
|
54
|
+
async load(modelRef) {
|
|
55
|
+
this.modelRef = modelRef;
|
|
56
|
+
this.loaded = true;
|
|
57
|
+
if (this.binding) {
|
|
58
|
+
await acquireHostSession(this.binding, modelRef);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async unload() {
|
|
62
|
+
this.modelRef = null;
|
|
63
|
+
this.loaded = false;
|
|
64
|
+
this.lastReport = null;
|
|
65
|
+
}
|
|
66
|
+
supportsConstrainedDecoding() {
|
|
67
|
+
return this.preferGrammar && this.binding != null;
|
|
68
|
+
}
|
|
69
|
+
memoryReport() {
|
|
70
|
+
return {
|
|
71
|
+
isolation: this.isolation,
|
|
72
|
+
modelRef: this.modelRef,
|
|
73
|
+
loaded: this.loaded
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async generate(messages, opts = {}) {
|
|
77
|
+
if (!this.loaded || !this.modelRef) {
|
|
78
|
+
throw new Error("llm-host: no model loaded \u2014 orchestrator must call load() after resolve/install");
|
|
79
|
+
}
|
|
80
|
+
if (!this.binding) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
"llm-host: node-llama-cpp binding not attached \u2014 run `vg models install` for the llama-cpp provider, then retry"
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const session = await acquireHostSession(this.binding, this.modelRef);
|
|
87
|
+
const report = await generateOnSession(session, messages, {
|
|
88
|
+
grammar: opts.grammar,
|
|
89
|
+
requireGrammar: opts.requireGrammar,
|
|
90
|
+
identifierTrie: opts.identifierTrie,
|
|
91
|
+
annotateUnknownIdentifiers: opts.annotateUnknownIdentifiers,
|
|
92
|
+
draftCandidates: opts.draftCandidates,
|
|
93
|
+
maxTokens: opts.maxTokens,
|
|
94
|
+
temperature: opts.temperature,
|
|
95
|
+
promptSegments: opts.promptSegments
|
|
96
|
+
});
|
|
97
|
+
this.lastReport = report;
|
|
98
|
+
return {
|
|
99
|
+
text: report.text,
|
|
100
|
+
model: report.model,
|
|
101
|
+
isolation: report.isolation,
|
|
102
|
+
constrained: report.constrained || !!(opts.grammar && this.preferGrammar),
|
|
103
|
+
unknownIdentifiers: report.unknownIdentifiers
|
|
104
|
+
};
|
|
105
|
+
} catch {
|
|
106
|
+
let text = await generateWithLlamaBinding({
|
|
107
|
+
lib: this.binding,
|
|
108
|
+
modelPath: this.modelRef,
|
|
109
|
+
messages,
|
|
110
|
+
opts
|
|
111
|
+
});
|
|
112
|
+
let unknownIdentifiers;
|
|
113
|
+
if (opts.identifierTrie && opts.annotateUnknownIdentifiers !== false) {
|
|
114
|
+
const ann = annotateUnknownIdentifiers(text, opts.identifierTrie);
|
|
115
|
+
text = ann.text;
|
|
116
|
+
unknownIdentifiers = ann.unknown.length ? ann.unknown : void 0;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
text,
|
|
120
|
+
model: this.modelRef,
|
|
121
|
+
isolation: this.isolation,
|
|
122
|
+
constrained: !!(opts.grammar && this.supportsConstrainedDecoding()),
|
|
123
|
+
unknownIdentifiers
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
var LLM_HOST_IPC_SCHEMA = "llm-host-ipc/0";
|
|
129
|
+
function startProcessHostServer(options) {
|
|
130
|
+
const state = {
|
|
131
|
+
modelRef: null,
|
|
132
|
+
loaded: false,
|
|
133
|
+
binding: options.binding ?? null
|
|
134
|
+
};
|
|
135
|
+
try {
|
|
136
|
+
if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);
|
|
137
|
+
} catch {
|
|
138
|
+
}
|
|
139
|
+
fs.mkdirSync(path.dirname(options.socketPath), { recursive: true });
|
|
140
|
+
return new Promise((resolve, reject) => {
|
|
141
|
+
const server = net.createServer((socket) => {
|
|
142
|
+
let buf = "";
|
|
143
|
+
socket.setEncoding("utf8");
|
|
144
|
+
socket.on("data", (chunk) => {
|
|
145
|
+
buf += chunk;
|
|
146
|
+
let nl;
|
|
147
|
+
while ((nl = buf.indexOf("\n")) >= 0) {
|
|
148
|
+
const line = buf.slice(0, nl).trim();
|
|
149
|
+
buf = buf.slice(nl + 1);
|
|
150
|
+
if (!line) continue;
|
|
151
|
+
void handleLine(line, state, (resp) => {
|
|
152
|
+
socket.write(`${JSON.stringify(resp)}
|
|
153
|
+
`);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
server.once("error", reject);
|
|
159
|
+
server.listen(options.socketPath, () => {
|
|
160
|
+
options.onListen?.(options.socketPath);
|
|
161
|
+
resolve({
|
|
162
|
+
close: () => new Promise((res, rej) => {
|
|
163
|
+
server.close((err) => {
|
|
164
|
+
try {
|
|
165
|
+
if (fs.existsSync(options.socketPath)) fs.unlinkSync(options.socketPath);
|
|
166
|
+
} catch {
|
|
167
|
+
}
|
|
168
|
+
if (err) rej(err);
|
|
169
|
+
else res();
|
|
170
|
+
});
|
|
171
|
+
})
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async function handleLine(line, state, reply) {
|
|
177
|
+
let req;
|
|
178
|
+
try {
|
|
179
|
+
req = JSON.parse(line);
|
|
180
|
+
} catch {
|
|
181
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: "?", ok: false, error: "invalid JSON" });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (req.v !== LLM_HOST_IPC_SCHEMA) {
|
|
185
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: `unsupported schema ${String(req.v)}` });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
switch (req.op) {
|
|
190
|
+
case "ping":
|
|
191
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: "ping" });
|
|
192
|
+
return;
|
|
193
|
+
case "load":
|
|
194
|
+
state.modelRef = req.modelRef;
|
|
195
|
+
state.loaded = true;
|
|
196
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: "load" });
|
|
197
|
+
return;
|
|
198
|
+
case "unload":
|
|
199
|
+
state.modelRef = null;
|
|
200
|
+
state.loaded = false;
|
|
201
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: "unload" });
|
|
202
|
+
return;
|
|
203
|
+
case "memory":
|
|
204
|
+
reply({
|
|
205
|
+
v: LLM_HOST_IPC_SCHEMA,
|
|
206
|
+
id: req.id,
|
|
207
|
+
ok: true,
|
|
208
|
+
op: "memory",
|
|
209
|
+
report: { isolation: "process", modelRef: state.modelRef, loaded: state.loaded }
|
|
210
|
+
});
|
|
211
|
+
return;
|
|
212
|
+
case "capabilities":
|
|
213
|
+
reply({
|
|
214
|
+
v: LLM_HOST_IPC_SCHEMA,
|
|
215
|
+
id: req.id,
|
|
216
|
+
ok: true,
|
|
217
|
+
op: "capabilities",
|
|
218
|
+
constrainedDecoding: state.binding != null,
|
|
219
|
+
isolation: "process"
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
case "generate": {
|
|
223
|
+
if (!state.loaded || !state.modelRef) {
|
|
224
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: "no model loaded" });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (!state.binding) {
|
|
228
|
+
reply({
|
|
229
|
+
v: LLM_HOST_IPC_SCHEMA,
|
|
230
|
+
id: req.id,
|
|
231
|
+
ok: false,
|
|
232
|
+
error: "binding not loaded in host process \u2014 start host after vg models install"
|
|
233
|
+
});
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
let result;
|
|
237
|
+
try {
|
|
238
|
+
const session = await acquireHostSession(state.binding, state.modelRef);
|
|
239
|
+
const report = await generateOnSession(session, req.messages, {
|
|
240
|
+
grammar: req.opts?.grammar,
|
|
241
|
+
requireGrammar: req.opts?.requireGrammar,
|
|
242
|
+
identifierTrie: req.opts?.identifierTrie,
|
|
243
|
+
annotateUnknownIdentifiers: req.opts?.annotateUnknownIdentifiers,
|
|
244
|
+
draftCandidates: req.opts?.draftCandidates,
|
|
245
|
+
maxTokens: req.opts?.maxTokens,
|
|
246
|
+
temperature: req.opts?.temperature,
|
|
247
|
+
promptSegments: req.opts?.promptSegments
|
|
248
|
+
});
|
|
249
|
+
result = {
|
|
250
|
+
text: report.text,
|
|
251
|
+
model: state.modelRef,
|
|
252
|
+
isolation: "process",
|
|
253
|
+
constrained: report.constrained,
|
|
254
|
+
unknownIdentifiers: report.unknownIdentifiers
|
|
255
|
+
};
|
|
256
|
+
} catch {
|
|
257
|
+
const text = await generateWithLlamaBinding({
|
|
258
|
+
lib: state.binding,
|
|
259
|
+
modelPath: state.modelRef,
|
|
260
|
+
messages: req.messages,
|
|
261
|
+
opts: req.opts
|
|
262
|
+
});
|
|
263
|
+
result = {
|
|
264
|
+
text,
|
|
265
|
+
model: state.modelRef,
|
|
266
|
+
isolation: "process",
|
|
267
|
+
constrained: !!(req.opts?.grammar && state.binding)
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: true, op: "generate", result });
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
default:
|
|
274
|
+
reply({ v: LLM_HOST_IPC_SCHEMA, id: req.id, ok: false, error: "unknown op" });
|
|
275
|
+
}
|
|
276
|
+
} catch (e) {
|
|
277
|
+
reply({
|
|
278
|
+
v: LLM_HOST_IPC_SCHEMA,
|
|
279
|
+
id: req.id,
|
|
280
|
+
ok: false,
|
|
281
|
+
error: e instanceof Error ? e.message : String(e)
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
var ProcessLlmHost = class {
|
|
286
|
+
constructor(socketPath) {
|
|
287
|
+
this.socketPath = socketPath;
|
|
288
|
+
}
|
|
289
|
+
socketPath;
|
|
290
|
+
isolation = "process";
|
|
291
|
+
seq = 0;
|
|
292
|
+
getEndpoint() {
|
|
293
|
+
return this.socketPath;
|
|
294
|
+
}
|
|
295
|
+
supportsConstrainedDecoding() {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
async load(modelRef) {
|
|
299
|
+
await this.rpc({ op: "load", modelRef });
|
|
300
|
+
}
|
|
301
|
+
async unload() {
|
|
302
|
+
await this.rpc({ op: "unload" });
|
|
303
|
+
}
|
|
304
|
+
async generate(messages, opts) {
|
|
305
|
+
const res = await this.rpc({ op: "generate", messages, opts });
|
|
306
|
+
if (!res.ok || res.op !== "generate") {
|
|
307
|
+
throw new Error(!res.ok ? res.error : "unexpected response");
|
|
308
|
+
}
|
|
309
|
+
return res.result;
|
|
310
|
+
}
|
|
311
|
+
memoryReport() {
|
|
312
|
+
return { isolation: "process", modelRef: null, loaded: false };
|
|
313
|
+
}
|
|
314
|
+
async memoryReportAsync() {
|
|
315
|
+
const res = await this.rpc({ op: "memory" });
|
|
316
|
+
if (!res.ok || res.op !== "memory") {
|
|
317
|
+
throw new Error(!res.ok ? res.error : "unexpected response");
|
|
318
|
+
}
|
|
319
|
+
return res.report;
|
|
320
|
+
}
|
|
321
|
+
rpc(body) {
|
|
322
|
+
const id = `r${++this.seq}`;
|
|
323
|
+
const req = { v: LLM_HOST_IPC_SCHEMA, id, ...body };
|
|
324
|
+
return new Promise((resolve, reject) => {
|
|
325
|
+
const socket = net.createConnection(this.socketPath);
|
|
326
|
+
let buf = "";
|
|
327
|
+
const timer = setTimeout(() => {
|
|
328
|
+
socket.destroy();
|
|
329
|
+
reject(new Error(`llm-host IPC timeout (${this.socketPath})`));
|
|
330
|
+
}, 12e4);
|
|
331
|
+
socket.setEncoding("utf8");
|
|
332
|
+
socket.on("connect", () => {
|
|
333
|
+
socket.write(`${JSON.stringify(req)}
|
|
334
|
+
`);
|
|
335
|
+
});
|
|
336
|
+
socket.on("data", (chunk) => {
|
|
337
|
+
buf += chunk;
|
|
338
|
+
const nl = buf.indexOf("\n");
|
|
339
|
+
if (nl < 0) return;
|
|
340
|
+
const line = buf.slice(0, nl).trim();
|
|
341
|
+
clearTimeout(timer);
|
|
342
|
+
socket.end();
|
|
343
|
+
try {
|
|
344
|
+
resolve(JSON.parse(line));
|
|
345
|
+
} catch (e) {
|
|
346
|
+
reject(e);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
socket.on("error", (e) => {
|
|
350
|
+
clearTimeout(timer);
|
|
351
|
+
reject(e);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
var ProcessBridgeLlmHost = class extends ProcessLlmHost {
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// src/runtime/llm-host/index.ts
|
|
360
|
+
function createLlmHost(options = {}) {
|
|
361
|
+
const isolation = options.isolation ?? "embedded";
|
|
362
|
+
if (isolation === "process") {
|
|
363
|
+
return new ProcessLlmHost(options.endpoint ?? defaultProcessEndpoint());
|
|
364
|
+
}
|
|
365
|
+
const host = new EmbeddedLlmHost();
|
|
366
|
+
if (options.binding) host.setBinding(options.binding);
|
|
367
|
+
if (options.preferGrammar) host.setPreferGrammar(true);
|
|
368
|
+
return host;
|
|
369
|
+
}
|
|
370
|
+
function defaultProcessEndpoint(env = process.env) {
|
|
371
|
+
return path.join(vibgrateRuntimeDir(env), "llm-host.sock");
|
|
372
|
+
}
|
|
373
|
+
function resolveInferenceIsolation(explicit, env = process.env) {
|
|
374
|
+
if (explicit === "embedded" || explicit === "process") return explicit;
|
|
375
|
+
const v = (env.VIBGRATE_INFERENCE_ISOLATION || env.VG_INFERENCE_ISOLATION || "").toLowerCase();
|
|
376
|
+
if (v === "process" || v === "isolated") return "process";
|
|
377
|
+
return "embedded";
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export { EmbeddedLlmHost, LLM_HOST_IPC_SCHEMA, ProcessBridgeLlmHost, ProcessLlmHost, createLlmHost, defaultProcessEndpoint, generateWithLlamaBinding, resolveInferenceIsolation, startProcessHostServer };
|
|
381
|
+
//# sourceMappingURL=chunk-PXHNTC6D.js.map
|
|
382
|
+
//# sourceMappingURL=chunk-PXHNTC6D.js.map
|
|
@@ -0,0 +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,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { MockProvider, OPENAI_COMPATIBLE, OllamaProvider, LocalLlamaProvider, OpenAiCompatibleProvider } from './chunk-CS37OBE3.js';
|
|
4
|
-
import { resolveEmbedModel, isModelReady, countPending, serializeGraph } from './chunk-WNIIKCNF.js';
|
|
5
|
-
import { canonicalize } from './chunk-JFGYT6BI.js';
|
|
1
|
+
import { resolveGgufPath } from './chunk-NDMDSPFX.js';
|
|
2
|
+
import { MockProvider, OPENAI_COMPATIBLE, OllamaProvider, LocalLlamaProvider, OpenAiCompatibleProvider } from './chunk-OFUC6RYN.js';
|
|
6
3
|
import { c, info, json, out } from './chunk-CT5BS56U.js';
|
|
4
|
+
import { usageError, buildGraph, UsageError, ResourceLimitError, CliError, ExitCode, writeSnapshot, refreshInstalledInstructions, SMALL_REPO_FILES, epistemicBreakdown, verifyDeterminism } from './chunk-KNELIQJO.js';
|
|
5
|
+
import { VERSION, brandProgressBar, resolveHead, workingTreeDirty } from './chunk-WGUL45AV.js';
|
|
6
|
+
import { discoverModels } from './chunk-OOIG3RUM.js';
|
|
7
|
+
import { resolveEmbedModel, isModelReady, countPending } from './chunk-6ABXHZRN.js';
|
|
8
|
+
import { writeArtifacts, renderHtml, renderReport, loadGraph } from './chunk-2XQDMLKB.js';
|
|
9
|
+
import { serializeGraph } from './chunk-K3MZIVZW.js';
|
|
10
|
+
import { canonicalize } from './chunk-JFGYT6BI.js';
|
|
7
11
|
import * as path from 'path';
|
|
8
12
|
import * as fs from 'fs';
|
|
9
13
|
import { spawn, execFile } from 'child_process';
|
|
@@ -357,7 +361,7 @@ function readGlobal(cmd) {
|
|
|
357
361
|
|
|
358
362
|
// src/commands/build.ts
|
|
359
363
|
function registerBuild(program) {
|
|
360
|
-
const cmd = program.command("build").description("build / update the code map (incremental, deterministic)").argument("[paths...]", "folders or files to map (default: current folder)").option("--only <langs>", "restrict to languages, e.g. ts,py,go").option("--exclude <glob>", "extra ignore glob (repeatable)", collect, []).option("--no-html", "do not write graph.html").option("--no-report", "do not write GRAPH_REPORT.md").option("--no-ground", "do not attach grounding (Phase 2)").option("--jobs <n>", "worker count (1 = single-threaded)").option("--scip <file>", "ingest a SCIP index for precise resolution (default: auto-detect index.scip)").option("--no-scip", "ignore any SCIP index").option("--no-tsc", "skip the in-process TypeScript resolver (heuristic floor only)").option("--no-warm", "do not warm the semantic index in the background after building").option("--grammars <dir>", "directory of grammar .wasm files (offline / air-gapped)").option("-o, --export <file>", "also write the map to a file (format inferred)").option("--attest", "sign the built graph \u2192 .vibgrate/attestation.intoto.jsonl").option("--verify", "verify a committed attestation against the graph (no rebuild)").option("--attest-key <path>", "signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)").option("--attestation <file>", "attestation path (out for --attest, in for --verify)").option("--pub <path>", "public key PEM to pin the signer (with --verify)").action(async function(paths, opts) {
|
|
364
|
+
const cmd = program.command("build").description("build / update the code map (incremental, deterministic)").argument("[paths...]", "folders or files to map (default: current folder)").option("--only <langs>", "restrict to languages, e.g. ts,py,go").option("--exclude <glob>", "extra ignore glob (repeatable)", collect, []).option("--no-html", "do not write graph.html").option("--no-report", "do not write GRAPH_REPORT.md").option("--no-ground", "do not attach grounding (Phase 2)").option("--jobs <n>", "worker count (1 = single-threaded)").option("--scip <file>", "ingest a SCIP index for precise resolution (default: auto-detect index.scip)").option("--no-scip", "ignore any SCIP index").option("--no-tsc", "skip the in-process TypeScript resolver (heuristic floor only)").option("--fast", "skip precise tsc resolve (heuristic only \u2014 faster XL cold builds)").option("--no-index", "do not write the SQLite serve index under .vibgrate/cache/").option("--analysis-tier <tier>", "force analysis tier: full | large | xl (default: auto)").option("--no-warm", "do not warm the semantic index in the background after building").option("--grammars <dir>", "directory of grammar .wasm files (offline / air-gapped)").option("-o, --export <file>", "also write the map to a file (format inferred)").option("--attest", "sign the built graph \u2192 .vibgrate/attestation.intoto.jsonl").option("--verify", "verify a committed attestation against the graph (no rebuild)").option("--attest-key <path>", "signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)").option("--attestation <file>", "attestation path (out for --attest, in for --verify)").option("--pub <path>", "public key PEM to pin the signer (with --verify)").action(async function(paths, opts) {
|
|
361
365
|
await runBuild(paths, opts, readGlobal(this));
|
|
362
366
|
});
|
|
363
367
|
applyGlobalOptions(cmd);
|
|
@@ -376,6 +380,11 @@ async function runBuild(paths, opts, global) {
|
|
|
376
380
|
throw usageError(`--jobs must be a positive integer (got "${opts.jobs}")`);
|
|
377
381
|
}
|
|
378
382
|
const only = opts.only ? opts.only.split(",").map((s) => s.trim()).filter(Boolean) : void 0;
|
|
383
|
+
const tierRaw = opts.analysisTier?.toLowerCase();
|
|
384
|
+
const analysisTier = tierRaw === "full" || tierRaw === "large" || tierRaw === "xl" ? tierRaw : void 0;
|
|
385
|
+
if (opts.analysisTier && !analysisTier) {
|
|
386
|
+
throw usageError(`--analysis-tier must be full, large, or xl (got "${opts.analysisTier}")`);
|
|
387
|
+
}
|
|
379
388
|
let result;
|
|
380
389
|
try {
|
|
381
390
|
result = await buildGraph({
|
|
@@ -390,6 +399,9 @@ async function runBuild(paths, opts, global) {
|
|
|
390
399
|
scip: typeof opts.scip === "string" ? opts.scip : void 0,
|
|
391
400
|
noScip: opts.scip === false,
|
|
392
401
|
noTsc: opts.tsc === false,
|
|
402
|
+
fast: opts.fast === true,
|
|
403
|
+
noIndex: opts.index === false,
|
|
404
|
+
analysisTier,
|
|
393
405
|
generatedAt: global.generatedAt,
|
|
394
406
|
onParseProgress: bar ? (done, total) => bar.update(done, total) : void 0,
|
|
395
407
|
grammarsDir: opts.grammars
|
|
@@ -777,13 +789,29 @@ function resolveProviders(opts, deps = {}) {
|
|
|
777
789
|
function buildExplicit(id, opts, env, discover) {
|
|
778
790
|
if (id === "ollama") return new OllamaProvider(resolveLocalModel(opts, discover, "ollama"), env.OLLAMA_HOST);
|
|
779
791
|
if (id === "llama-cpp") {
|
|
780
|
-
const
|
|
781
|
-
|
|
782
|
-
|
|
792
|
+
const resolved = resolveGgufPath({
|
|
793
|
+
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
794
|
+
modelRef: opts.model,
|
|
795
|
+
env,
|
|
796
|
+
discover
|
|
797
|
+
});
|
|
798
|
+
if (!resolved) {
|
|
799
|
+
throw new CliError(
|
|
800
|
+
"--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.",
|
|
801
|
+
ExitCode.USAGE_ERROR
|
|
802
|
+
);
|
|
803
|
+
}
|
|
804
|
+
return new LocalLlamaProvider(opts.model ?? basename2(resolved.path), resolved.path, void 0, !!opts.consent);
|
|
783
805
|
}
|
|
784
806
|
if (id === "lmstudio") return buildHosted("lmstudio", resolveHostedModel(opts, env, "lmstudio"));
|
|
807
|
+
if (id === "foundry-local" || id === "foundry") {
|
|
808
|
+
return buildHosted("foundry-local", resolveHostedModel(opts, env, "foundry-local"));
|
|
809
|
+
}
|
|
785
810
|
if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));
|
|
786
|
-
throw new CliError(
|
|
811
|
+
throw new CliError(
|
|
812
|
+
`unknown --provider "${id}". Known: ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,
|
|
813
|
+
ExitCode.USAGE_ERROR
|
|
814
|
+
);
|
|
787
815
|
}
|
|
788
816
|
function buildHosted(id, model) {
|
|
789
817
|
const base = OPENAI_COMPATIBLE[id];
|
|
@@ -793,10 +821,30 @@ function buildHosted(id, model) {
|
|
|
793
821
|
function localFallbacks(opts, env, discover, exclude) {
|
|
794
822
|
const out2 = [];
|
|
795
823
|
const models = safeDiscover(discover);
|
|
824
|
+
const preferOllama = env.VG_PREFER_OLLAMA === "1" || env.VIBGRATE_PREFER_OLLAMA === "1" || opts.preferEmbedded === false;
|
|
825
|
+
const gguf = exclude === "llama-cpp" ? null : resolveGgufPath({
|
|
826
|
+
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
827
|
+
modelRef: opts.model,
|
|
828
|
+
env,
|
|
829
|
+
discover: () => models
|
|
830
|
+
});
|
|
831
|
+
if (gguf && !preferOllama) {
|
|
832
|
+
out2.push(new LocalLlamaProvider(opts.model ?? basename2(gguf.path), gguf.path, void 0, !!opts.consent));
|
|
833
|
+
}
|
|
796
834
|
const ollamaModel = opts.model ?? firstOfRuntime(models, "ollama");
|
|
797
835
|
if (exclude !== "ollama" && ollamaModel) out2.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));
|
|
798
836
|
const lmModel = opts.model ?? firstOfRuntime(models, "lm-studio");
|
|
799
837
|
if (exclude !== "lmstudio" && lmModel) out2.push(buildHosted("lmstudio", lmModel));
|
|
838
|
+
if (exclude !== "foundry-local" && exclude !== "foundry" && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === "foundry-local")) {
|
|
839
|
+
try {
|
|
840
|
+
const m = opts.model || env.VG_CODE_MODEL;
|
|
841
|
+
if (m) out2.push(buildHosted("foundry-local", m));
|
|
842
|
+
} catch {
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
if (gguf && !out2.some((p) => p.id === "llama-cpp")) {
|
|
846
|
+
out2.push(new LocalLlamaProvider(opts.model ?? basename2(gguf.path), gguf.path, void 0, !!opts.consent));
|
|
847
|
+
}
|
|
800
848
|
return out2;
|
|
801
849
|
}
|
|
802
850
|
function resolveLocalModel(opts, discover, runtime) {
|
|
@@ -829,5 +877,5 @@ function basename2(p) {
|
|
|
829
877
|
}
|
|
830
878
|
|
|
831
879
|
export { DSSE_PAYLOAD_TYPE, ProgressBar, applyGlobalOptions, dssePae, fetchCatalog, generateKeypair, keyId, printCodeLogo, printLogo, readGlobal, registerBuild, resolveProviders, runBuild, sha256Hex, topProviders };
|
|
832
|
-
//# sourceMappingURL=chunk-
|
|
833
|
-
//# sourceMappingURL=chunk-
|
|
880
|
+
//# sourceMappingURL=chunk-RNP3SMTV.js.map
|
|
881
|
+
//# sourceMappingURL=chunk-RNP3SMTV.js.map
|