@vibgrate/cli 2026.722.1 → 2026.727.1

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.
Files changed (125) hide show
  1. package/DOCS.md +418 -196
  2. package/README.md +34 -7
  3. package/dist/baseline-K7YBFKZI.js +7 -0
  4. package/dist/{baseline-J44M7MWP.js.map → baseline-K7YBFKZI.js.map} +1 -1
  5. package/dist/chunk-3BVSDMHV.js +2496 -0
  6. package/dist/chunk-3BVSDMHV.js.map +1 -0
  7. package/dist/{chunk-PY3DNX5H.js → chunk-3Q7QBWFW.js} +13 -2
  8. package/dist/chunk-3Q7QBWFW.js.map +1 -0
  9. package/dist/chunk-4CQ3MGNN.js +136 -0
  10. package/dist/chunk-4CQ3MGNN.js.map +1 -0
  11. package/dist/chunk-5I4VSBWQ.js +764 -0
  12. package/dist/chunk-5I4VSBWQ.js.map +1 -0
  13. package/dist/chunk-5Q54GEHM.js +29 -0
  14. package/dist/chunk-5Q54GEHM.js.map +1 -0
  15. package/dist/{chunk-XKXKWYJF.js → chunk-65MEOA4E.js} +21 -18
  16. package/dist/chunk-65MEOA4E.js.map +1 -0
  17. package/dist/{chunk-WNIIKCNF.js → chunk-6IOQJGFT.js} +29 -238
  18. package/dist/chunk-6IOQJGFT.js.map +1 -0
  19. package/dist/{chunk-CS37OBE3.js → chunk-7JHPQ6WF.js} +791 -783
  20. package/dist/chunk-7JHPQ6WF.js.map +1 -0
  21. package/dist/chunk-BPF3YX2U.js +64 -0
  22. package/dist/chunk-BPF3YX2U.js.map +1 -0
  23. package/dist/chunk-BWPBB45M.js +88 -0
  24. package/dist/chunk-BWPBB45M.js.map +1 -0
  25. package/dist/chunk-C4CKTAZP.js +1695 -0
  26. package/dist/chunk-C4CKTAZP.js.map +1 -0
  27. package/dist/chunk-EDAAG7BL.js +612 -0
  28. package/dist/chunk-EDAAG7BL.js.map +1 -0
  29. package/dist/chunk-EDBV33B7.js +57 -0
  30. package/dist/chunk-EDBV33B7.js.map +1 -0
  31. package/dist/chunk-HABUT7HW.js +233 -0
  32. package/dist/chunk-HABUT7HW.js.map +1 -0
  33. package/dist/{chunk-EXQV26MF.js → chunk-HYZVHJ3Q.js} +3 -3
  34. package/dist/{chunk-EXQV26MF.js.map → chunk-HYZVHJ3Q.js.map} +1 -1
  35. package/dist/chunk-IS7VTH2Q.js +627 -0
  36. package/dist/chunk-IS7VTH2Q.js.map +1 -0
  37. package/dist/chunk-IZDH67DX.js +289 -0
  38. package/dist/chunk-IZDH67DX.js.map +1 -0
  39. package/dist/chunk-J7LKEB2R.js +51 -0
  40. package/dist/chunk-J7LKEB2R.js.map +1 -0
  41. package/dist/chunk-JIBOJTGS.js +313 -0
  42. package/dist/chunk-JIBOJTGS.js.map +1 -0
  43. package/dist/chunk-JZYGEZTU.js +82 -0
  44. package/dist/chunk-JZYGEZTU.js.map +1 -0
  45. package/dist/chunk-K7REHDQS.js +776 -0
  46. package/dist/chunk-K7REHDQS.js.map +1 -0
  47. package/dist/chunk-KHJO4D5N.js +108 -0
  48. package/dist/chunk-KHJO4D5N.js.map +1 -0
  49. package/dist/chunk-NDMDSPFX.js +69 -0
  50. package/dist/chunk-NDMDSPFX.js.map +1 -0
  51. package/dist/chunk-OOIG3RUM.js +276 -0
  52. package/dist/chunk-OOIG3RUM.js.map +1 -0
  53. package/dist/{chunk-6CXTPC74.js → chunk-OXQNQW5J.js} +27 -6
  54. package/dist/chunk-OXQNQW5J.js.map +1 -0
  55. package/dist/chunk-PMYWZRRS.js +62 -0
  56. package/dist/chunk-PMYWZRRS.js.map +1 -0
  57. package/dist/chunk-PXHNTC6D.js +382 -0
  58. package/dist/chunk-PXHNTC6D.js.map +1 -0
  59. package/dist/{chunk-VXT6LUGP.js → chunk-S6CYDZEW.js} +1395 -1975
  60. package/dist/chunk-S6CYDZEW.js.map +1 -0
  61. package/dist/chunk-SZLF66FJ.js +843 -0
  62. package/dist/chunk-SZLF66FJ.js.map +1 -0
  63. package/dist/chunk-VXGV6NTD.js +476 -0
  64. package/dist/chunk-VXGV6NTD.js.map +1 -0
  65. package/dist/{chunk-JSNHZCIV.js → chunk-WLETRGAC.js} +16 -9
  66. package/dist/chunk-WLETRGAC.js.map +1 -0
  67. package/dist/{chunk-2EVQKZTO.js → chunk-YDAT7LD2.js} +190 -13
  68. package/dist/chunk-YDAT7LD2.js.map +1 -0
  69. package/dist/cli.js +3451 -509
  70. package/dist/cli.js.map +1 -1
  71. package/dist/execution-env-3BN7Z737.js +3 -0
  72. package/dist/execution-env-3BN7Z737.js.map +1 -0
  73. package/dist/federation-EPZDUWCK.js +6 -0
  74. package/dist/federation-EPZDUWCK.js.map +1 -0
  75. package/dist/git-ref-HPRLUFFW.js +3 -0
  76. package/dist/git-ref-HPRLUFFW.js.map +1 -0
  77. package/dist/graph-backend-ZMSYOZMW.js +10 -0
  78. package/dist/graph-backend-ZMSYOZMW.js.map +1 -0
  79. package/dist/index.d.ts +432 -126
  80. package/dist/index.js +14 -7
  81. package/dist/index.js.map +1 -1
  82. package/dist/{interactive-736PBC7J.js → interactive-ICL7D7LO.js} +185 -365
  83. package/dist/interactive-ICL7D7LO.js.map +1 -0
  84. package/dist/llm-host-2RAYQSDQ.js +8 -0
  85. package/dist/llm-host-2RAYQSDQ.js.map +1 -0
  86. package/dist/load-OHVKDX4R.js +7 -0
  87. package/dist/load-OHVKDX4R.js.map +1 -0
  88. package/dist/local-runtime-OJFLX2HI.js +4 -0
  89. package/dist/local-runtime-OJFLX2HI.js.map +1 -0
  90. package/dist/model-execution-profile-MQ2QCP24.js +3 -0
  91. package/dist/model-execution-profile-MQ2QCP24.js.map +1 -0
  92. package/dist/model-orchestrator-FFTZI3U2.js +8 -0
  93. package/dist/model-orchestrator-FFTZI3U2.js.map +1 -0
  94. package/dist/parse-worker.d.ts +1 -1
  95. package/dist/parse-worker.js +1 -1
  96. package/dist/paths-MCH75O3G.js +5 -0
  97. package/dist/paths-MCH75O3G.js.map +1 -0
  98. package/dist/resolve-gguf-4UPIGPEE.js +7 -0
  99. package/dist/resolve-gguf-4UPIGPEE.js.map +1 -0
  100. package/dist/runtime-session-IDU5BDUJ.js +17 -0
  101. package/dist/runtime-session-IDU5BDUJ.js.map +1 -0
  102. package/dist/session-L2OSDRPI.js +10 -0
  103. package/dist/{session-POJUDFPH.js.map → session-L2OSDRPI.js.map} +1 -1
  104. package/dist/{stream-json-Q2JGWPHB.js → stream-json-F74W5FCK.js} +16 -6
  105. package/dist/stream-json-F74W5FCK.js.map +1 -0
  106. package/dist/{types-Jl6RJ175.d.ts → types-ZMg1mSuu.d.ts} +3 -1
  107. package/dist/vgd-EGBQD7BW.js +16 -0
  108. package/dist/vgd-EGBQD7BW.js.map +1 -0
  109. package/package.json +9 -6
  110. package/dist/baseline-J44M7MWP.js +0 -7
  111. package/dist/chunk-2EVQKZTO.js.map +0 -1
  112. package/dist/chunk-6CXTPC74.js.map +0 -1
  113. package/dist/chunk-CS37OBE3.js.map +0 -1
  114. package/dist/chunk-GGJZA3Q6.js +0 -961
  115. package/dist/chunk-GGJZA3Q6.js.map +0 -1
  116. package/dist/chunk-JBXNQCGE.js +0 -484
  117. package/dist/chunk-JBXNQCGE.js.map +0 -1
  118. package/dist/chunk-JSNHZCIV.js.map +0 -1
  119. package/dist/chunk-PY3DNX5H.js.map +0 -1
  120. package/dist/chunk-VXT6LUGP.js.map +0 -1
  121. package/dist/chunk-WNIIKCNF.js.map +0 -1
  122. package/dist/chunk-XKXKWYJF.js.map +0 -1
  123. package/dist/interactive-736PBC7J.js.map +0 -1
  124. package/dist/session-POJUDFPH.js +0 -6
  125. package/dist/stream-json-Q2JGWPHB.js.map +0 -1
@@ -0,0 +1,313 @@
1
+ import { createHash } from 'crypto';
2
+
3
+ // src/runtime/identifier-trie.ts
4
+ function createTrieNode() {
5
+ return { children: /* @__PURE__ */ new Map(), terminal: false };
6
+ }
7
+ function trieInsert(root, word) {
8
+ let node = root;
9
+ for (const ch of word) {
10
+ let next = node.children.get(ch);
11
+ if (!next) {
12
+ next = createTrieNode();
13
+ node.children.set(ch, next);
14
+ }
15
+ node = next;
16
+ }
17
+ node.terminal = true;
18
+ }
19
+ function trieHas(root, word) {
20
+ let node = root;
21
+ for (const ch of word) {
22
+ const next = node.children.get(ch);
23
+ if (!next) return false;
24
+ node = next;
25
+ }
26
+ return node.terminal;
27
+ }
28
+ function trieHasPrefix(root, prefix) {
29
+ let node = root;
30
+ for (const ch of prefix) {
31
+ const next = node.children.get(ch);
32
+ if (!next) return false;
33
+ node = next;
34
+ }
35
+ return true;
36
+ }
37
+ function buildIdentifierTrieFromGraph(graph) {
38
+ const root = createTrieNode();
39
+ const seen = /* @__PURE__ */ new Set();
40
+ const add = (s) => {
41
+ const t = (s ?? "").trim();
42
+ if (!t || seen.has(t)) return;
43
+ seen.add(t);
44
+ trieInsert(root, t);
45
+ for (const part of t.split(/[./:#]/)) {
46
+ const p = part.trim();
47
+ if (!p || seen.has(p)) continue;
48
+ seen.add(p);
49
+ trieInsert(root, p);
50
+ }
51
+ };
52
+ for (const n of graph.nodes) {
53
+ add(n.name);
54
+ add(n.qualifiedName);
55
+ add(n.id);
56
+ }
57
+ return root;
58
+ }
59
+ function trieAllowedNextChars(root, prefix) {
60
+ let node = root;
61
+ for (const ch of prefix) {
62
+ const next = node.children.get(ch);
63
+ if (!next) return [];
64
+ node = next;
65
+ }
66
+ return [...node.children.keys()].sort();
67
+ }
68
+ function trieEnumerateWords(root, limit = 4096) {
69
+ const out = [];
70
+ const walk = (n, acc) => {
71
+ if (out.length >= limit) return;
72
+ if (n.terminal && acc.length > 0) out.push(acc);
73
+ for (const [ch, child] of [...n.children.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {
74
+ walk(child, acc + ch);
75
+ if (out.length >= limit) return;
76
+ }
77
+ };
78
+ walk(root, "");
79
+ return out;
80
+ }
81
+
82
+ // src/runtime/identifier-mask.ts
83
+ var IDENT_RE = /\b[A-Za-z_][A-Za-z0-9_]{2,}\b/g;
84
+ var STOP = /* @__PURE__ */ new Set([
85
+ "the",
86
+ "and",
87
+ "for",
88
+ "var",
89
+ "let",
90
+ "const",
91
+ "function",
92
+ "class",
93
+ "return",
94
+ "import",
95
+ "export",
96
+ "from",
97
+ "async",
98
+ "await",
99
+ "true",
100
+ "false",
101
+ "null",
102
+ "undefined",
103
+ "this",
104
+ "new",
105
+ "typeof",
106
+ "interface",
107
+ "type",
108
+ "string",
109
+ "number",
110
+ "boolean",
111
+ "void",
112
+ "any",
113
+ "unknown",
114
+ "Promise",
115
+ "Array",
116
+ "Object",
117
+ "Error",
118
+ "console",
119
+ "process",
120
+ "require",
121
+ "module",
122
+ "exports",
123
+ "default",
124
+ "extends",
125
+ "implements",
126
+ "public",
127
+ "private",
128
+ "protected",
129
+ "static",
130
+ "readonly",
131
+ "if",
132
+ "else",
133
+ "while",
134
+ "switch",
135
+ "case",
136
+ "break",
137
+ "continue",
138
+ "try",
139
+ "catch",
140
+ "finally",
141
+ "throw",
142
+ "with",
143
+ "yield",
144
+ "of",
145
+ "in",
146
+ "as",
147
+ "is",
148
+ "get",
149
+ "set"
150
+ ]);
151
+ function extractIdentifiers(text) {
152
+ const out = /* @__PURE__ */ new Set();
153
+ for (const m of text.matchAll(IDENT_RE)) {
154
+ const t = m[0];
155
+ if (STOP.has(t) || STOP.has(t.toLowerCase())) continue;
156
+ out.add(t);
157
+ }
158
+ return [...out].sort();
159
+ }
160
+ function scanIdentifiersAgainstTrie(text, trie) {
161
+ const known = [];
162
+ const unknown = [];
163
+ for (const id of extractIdentifiers(text)) {
164
+ if (trieHas(trie, id) || trieHasPrefix(trie, id)) known.push(id);
165
+ else unknown.push(id);
166
+ }
167
+ return { known, unknown, clean: unknown.length === 0 };
168
+ }
169
+ function maskAllowedNextChars(trie, partialIdent) {
170
+ return trieAllowedNextChars(trie, partialIdent);
171
+ }
172
+ function annotateUnknownIdentifiers(text, trie) {
173
+ const scan = scanIdentifiersAgainstTrie(text, trie);
174
+ if (scan.clean) return { text, unknown: [] };
175
+ const note = `
176
+
177
+ /* vg: unknown identifiers vs graph (not rewritten): ${scan.unknown.slice(0, 12).join(", ")}${scan.unknown.length > 12 ? "\u2026" : ""} */`;
178
+ return { text: text + note, unknown: scan.unknown };
179
+ }
180
+ var KV_CACHE_SCHEMA = "kv-cache/0";
181
+ function contentHash(text) {
182
+ return createHash("sha256").update(text, "utf8").digest("hex");
183
+ }
184
+ function approxTokens(text) {
185
+ return Math.max(1, Math.ceil(text.length / 4));
186
+ }
187
+ function blockMeta(kind, text, now = Date.now()) {
188
+ return {
189
+ hash: contentHash(text),
190
+ kind,
191
+ bytes: Buffer.byteLength(text, "utf8"),
192
+ approxTokens: approxTokens(text),
193
+ createdAt: now
194
+ };
195
+ }
196
+ var KvBlockRegistry = class {
197
+ warm = /* @__PURE__ */ new Map();
198
+ markWarm(meta) {
199
+ this.warm.set(meta.hash, meta);
200
+ }
201
+ isWarm(hash) {
202
+ return this.warm.has(hash);
203
+ }
204
+ get(hash) {
205
+ return this.warm.get(hash);
206
+ }
207
+ clear() {
208
+ this.warm.clear();
209
+ }
210
+ size() {
211
+ return this.warm.size;
212
+ }
213
+ /**
214
+ * Plan assembly for ordered text segments. Hits reuse warm blocks; misses
215
+ * need prefill. After a successful forward pass, call {@link commit} on miss hashes.
216
+ */
217
+ plan(segments, cursor) {
218
+ const order = [];
219
+ const hit = [];
220
+ const miss = [];
221
+ let hitTokens = 0;
222
+ let totalTokens = 0;
223
+ for (const seg of segments) {
224
+ const meta = blockMeta(seg.kind, seg.text);
225
+ order.push(meta.hash);
226
+ totalTokens += meta.approxTokens;
227
+ if (this.isWarm(meta.hash)) {
228
+ hit.push(meta.hash);
229
+ hitTokens += meta.approxTokens;
230
+ } else {
231
+ miss.push({ hash: meta.hash, kind: meta.kind, approxTokens: meta.approxTokens });
232
+ }
233
+ }
234
+ let cursorSkipBlocks = 0;
235
+ let deltaTokens = totalTokens;
236
+ if (cursor) {
237
+ const d = cursor.delta(order, segments);
238
+ cursorSkipBlocks = d.skipBlocks;
239
+ deltaTokens = d.evaluateTokens;
240
+ }
241
+ return {
242
+ schemaVersion: KV_CACHE_SCHEMA,
243
+ hit,
244
+ miss,
245
+ order,
246
+ hitTokens,
247
+ totalTokens,
248
+ cursorSkipBlocks,
249
+ deltaTokens
250
+ };
251
+ }
252
+ /** After prefill, mark miss segments warm. */
253
+ commit(segments) {
254
+ for (const seg of segments) {
255
+ this.markWarm(blockMeta(seg.kind, seg.text));
256
+ }
257
+ }
258
+ };
259
+ var SessionPrefixCursor = class {
260
+ chain = [];
261
+ /** Hashes currently considered evaluated on the sequence. */
262
+ get evaluatedHashes() {
263
+ return this.chain;
264
+ }
265
+ /**
266
+ * Compute how many leading blocks match the previous chain and how many
267
+ * approx tokens still need evaluate (from the fork point).
268
+ */
269
+ delta(order, segments) {
270
+ let skip = 0;
271
+ while (skip < order.length && skip < this.chain.length && order[skip] === this.chain[skip]) {
272
+ skip++;
273
+ }
274
+ let evaluateTokens = 0;
275
+ const parts = [];
276
+ for (let i = skip; i < segments.length; i++) {
277
+ const meta = blockMeta(segments[i].kind, segments[i].text);
278
+ evaluateTokens += meta.approxTokens;
279
+ parts.push(segments[i].text);
280
+ }
281
+ return { skipBlocks: skip, evaluateTokens, evaluateText: parts.join("\n") };
282
+ }
283
+ /** After successful evaluate of full ordered hashes, advance the cursor. */
284
+ commit(order) {
285
+ this.chain = [...order];
286
+ }
287
+ /** Reset after sequence dispose / model reload. */
288
+ reset() {
289
+ this.chain = [];
290
+ }
291
+ };
292
+ function longestWarmPrefix(registry, segments) {
293
+ let count = 0;
294
+ let tokens = 0;
295
+ const hashes = [];
296
+ const parts = [];
297
+ for (const seg of segments) {
298
+ const meta = blockMeta(seg.kind, seg.text);
299
+ if (!registry.isWarm(meta.hash)) break;
300
+ count++;
301
+ tokens += meta.approxTokens;
302
+ hashes.push(meta.hash);
303
+ parts.push(seg.text);
304
+ }
305
+ return { count, tokens, text: parts.join("\n"), hashes };
306
+ }
307
+ function graphDraftCandidates(knownVerbatim, max = 8) {
308
+ return knownVerbatim.map((s) => s.trim()).filter((s) => s.length >= 8 && s.length <= 400).slice(0, max);
309
+ }
310
+
311
+ export { KvBlockRegistry, SessionPrefixCursor, annotateUnknownIdentifiers, buildIdentifierTrieFromGraph, contentHash, extractIdentifiers, graphDraftCandidates, longestWarmPrefix, maskAllowedNextChars, scanIdentifiersAgainstTrie, trieEnumerateWords, trieHas, trieHasPrefix };
312
+ //# sourceMappingURL=chunk-JIBOJTGS.js.map
313
+ //# sourceMappingURL=chunk-JIBOJTGS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/identifier-trie.ts","../src/runtime/identifier-mask.ts","../src/runtime/kv-cache.ts"],"names":[],"mappings":"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","file":"chunk-JIBOJTGS.js","sourcesContent":["/**\n * Identifier trie for future logit masking (Approach B sampler hooks).\n *\n * Built from ActiveGraph symbol short/qualified names so constrained generation\n * can refuse identifiers that do not exist in the repo. Pure data structure —\n * no model binding required to unit-test.\n */\n\nexport interface TrieNode {\n children: Map<string, TrieNode>;\n terminal: boolean;\n}\n\nexport function createTrieNode(): TrieNode {\n return { children: new Map(), terminal: false };\n}\n\nexport function trieInsert(root: TrieNode, word: string): void {\n let node = root;\n for (const ch of word) {\n let next = node.children.get(ch);\n if (!next) {\n next = createTrieNode();\n node.children.set(ch, next);\n }\n node = next;\n }\n node.terminal = true;\n}\n\nexport function trieHas(root: TrieNode, word: string): boolean {\n let node = root;\n for (const ch of word) {\n const next = node.children.get(ch);\n if (!next) return false;\n node = next;\n }\n return node.terminal;\n}\n\nexport function trieHasPrefix(root: TrieNode, prefix: string): boolean {\n let node = root;\n for (const ch of prefix) {\n const next = node.children.get(ch);\n if (!next) return false;\n node = next;\n }\n return true;\n}\n\n/** Completions that extend `prefix` (capped). */\nexport function trieComplete(root: TrieNode, prefix: string, limit = 32): string[] {\n let node = root;\n for (const ch of prefix) {\n const next = node.children.get(ch);\n if (!next) return [];\n node = next;\n }\n const out: string[] = [];\n const walk = (n: TrieNode, acc: string): void => {\n if (out.length >= limit) return;\n if (n.terminal) out.push(acc);\n for (const [ch, child] of [...n.children.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n walk(child, acc + ch);\n if (out.length >= limit) return;\n }\n };\n walk(node, prefix);\n return out;\n}\n\nexport interface GraphLikeForTrie {\n nodes: Array<{ name?: string; qualifiedName?: string; id?: string }>;\n}\n\n/**\n * Build a trie of symbol identifiers from a graph. Includes short names and\n * the last segment of qualified names (e.g. `Foo` from `pkg.Foo`).\n */\nexport function buildIdentifierTrieFromGraph(graph: GraphLikeForTrie): TrieNode {\n const root = createTrieNode();\n const seen = new Set<string>();\n const add = (s: string | undefined): void => {\n const t = (s ?? '').trim();\n if (!t || seen.has(t)) return;\n seen.add(t);\n trieInsert(root, t);\n // Path segments for dotted / slash-qualified names (e.g. pkg.util.Foo → util, Foo).\n for (const part of t.split(/[./:#]/)) {\n const p = part.trim();\n if (!p || seen.has(p)) continue;\n seen.add(p);\n trieInsert(root, p);\n }\n };\n for (const n of graph.nodes) {\n add(n.name);\n add(n.qualifiedName);\n add(n.id);\n }\n return root;\n}\n\n/** Characters allowed to continue after `prefix` under the trie (for logit mask). */\nexport function trieAllowedNextChars(root: TrieNode, prefix: string): string[] {\n let node = root;\n for (const ch of prefix) {\n const next = node.children.get(ch);\n if (!next) return [];\n node = next;\n }\n return [...node.children.keys()].sort();\n}\n\n/**\n * Enumerate terminal words in the trie (capped). Used to positively bias known\n * graph identifiers when building a TokenBias without scanning the full vocab.\n */\nexport function trieEnumerateWords(root: TrieNode, limit = 4096): string[] {\n const out: string[] = [];\n const walk = (n: TrieNode, acc: string): void => {\n if (out.length >= limit) return;\n if (n.terminal && acc.length > 0) out.push(acc);\n for (const [ch, child] of [...n.children.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n walk(child, acc + ch);\n if (out.length >= limit) return;\n }\n };\n walk(root, '');\n return out;\n}\n","/**\n * Identifier masking helpers for Approach B sampler integration.\n *\n * Full logit masking needs the llama.cpp binding's token callback. Until that\n * hook is universal across binding versions, we:\n * 1. Expose allowed-next-char sets from the trie (for native mask hooks)\n * 2. Post-validate free-text model output for repo identifiers\n * 3. Optionally rewrite / flag unknown identifiers in code-like spans\n */\n\nimport type { TrieNode } from './identifier-trie.js';\nimport { trieAllowedNextChars, trieHas, trieHasPrefix } from './identifier-trie.js';\n\n/** JS/TS-ish identifier token (conservative). */\nconst IDENT_RE = /\\b[A-Za-z_][A-Za-z0-9_]{2,}\\b/g;\n\n/** Tokens we never treat as \"must exist in the graph\". */\nconst STOP = new Set([\n 'the',\n 'and',\n 'for',\n 'var',\n 'let',\n 'const',\n 'function',\n 'class',\n 'return',\n 'import',\n 'export',\n 'from',\n 'async',\n 'await',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'this',\n 'new',\n 'typeof',\n 'interface',\n 'type',\n 'string',\n 'number',\n 'boolean',\n 'void',\n 'any',\n 'unknown',\n 'Promise',\n 'Array',\n 'Object',\n 'Error',\n 'console',\n 'process',\n 'require',\n 'module',\n 'exports',\n 'default',\n 'extends',\n 'implements',\n 'public',\n 'private',\n 'protected',\n 'static',\n 'readonly',\n 'if',\n 'else',\n 'while',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'with',\n 'yield',\n 'of',\n 'in',\n 'as',\n 'is',\n 'get',\n 'set',\n]);\n\nexport interface IdentifierScanResult {\n /** Identifiers that appear in text and exist in the trie. */\n known: string[];\n /** Identifiers that appear in text but are absent from the trie. */\n unknown: string[];\n /** True when every scanned identifier is known (or stopword). */\n clean: boolean;\n}\n\n/** Extract candidate identifiers from model text. */\nexport function extractIdentifiers(text: string): string[] {\n const out = new Set<string>();\n for (const m of text.matchAll(IDENT_RE)) {\n const t = m[0];\n if (STOP.has(t) || STOP.has(t.toLowerCase())) continue;\n out.add(t);\n }\n return [...out].sort();\n}\n\nexport function scanIdentifiersAgainstTrie(text: string, trie: TrieNode): IdentifierScanResult {\n const known: string[] = [];\n const unknown: string[] = [];\n for (const id of extractIdentifiers(text)) {\n if (trieHas(trie, id) || trieHasPrefix(trie, id)) known.push(id);\n else unknown.push(id);\n }\n return { known, unknown, clean: unknown.length === 0 };\n}\n\n/**\n * Allowed next characters for a partial identifier under the trie — the hook\n * surface for real logit masks when the binding supports custom samplers.\n */\nexport function maskAllowedNextChars(trie: TrieNode, partialIdent: string): string[] {\n return trieAllowedNextChars(trie, partialIdent);\n}\n\n/**\n * Annotate model output when unknown identifiers appear (non-destructive).\n * Returns original text when clean; otherwise appends a short warning block the\n * agent/tools can surface without rewriting the patch body blindly.\n */\nexport function annotateUnknownIdentifiers(text: string, trie: TrieNode): { text: string; unknown: string[] } {\n const scan = scanIdentifiersAgainstTrie(text, trie);\n if (scan.clean) return { text, unknown: [] };\n const note = `\\n\\n/* vg: unknown identifiers vs graph (not rewritten): ${scan.unknown.slice(0, 12).join(', ')}${scan.unknown.length > 12 ? '…' : ''} */`;\n return { text: text + note, unknown: scan.unknown };\n}\n","/**\n * Block-level KV / prompt prefix cache keyed by content hash (Approach B).\n *\n * Pure planning layer + multi-turn prefix cursor (P1/P2). The warm host uses\n * {@link longestWarmPrefix} / {@link SessionPrefixCursor} and may call the\n * binding's `evaluateWithoutGeneratingNewTokens` so RoPE state for warm\n * system/capsule blocks is not rebuilt every turn.\n *\n * schemaVersion: kv-cache/0\n */\n\nimport { createHash } from 'node:crypto';\n\nexport const KV_CACHE_SCHEMA = 'kv-cache/0' as const;\n\nexport interface KvBlockMeta {\n /** Content hash (sha256 hex, truncated in keys for path safety). */\n hash: string;\n /** Human label (system, capsule, tools, …). */\n kind: string;\n /** UTF-8 byte length of the source text. */\n bytes: number;\n /** Approx token count (chars/4 heuristic when unknown). */\n approxTokens: number;\n /** When this block entered the registry. */\n createdAt: number;\n}\n\nexport interface KvAssemblyPlan {\n schemaVersion: typeof KV_CACHE_SCHEMA;\n /** Blocks to reuse from cache (hashes). */\n hit: string[];\n /** Blocks that must be prefilled (hash + kind). */\n miss: Array<{ hash: string; kind: string; approxTokens: number }>;\n /** Ordered sequence of block hashes for the full prompt. */\n order: string[];\n /** Estimated tokens already “warm” vs total. */\n hitTokens: number;\n totalTokens: number;\n /**\n * P2: tokens that must be re-evaluated because the multi-turn cursor\n * diverged (subset of miss + trailing hits after fork).\n */\n deltaTokens?: number;\n /** How many leading blocks the session cursor already has evaluated. */\n cursorSkipBlocks?: number;\n}\n\nexport function contentHash(text: string): string {\n return createHash('sha256').update(text, 'utf8').digest('hex');\n}\n\nexport function approxTokens(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nexport function blockMeta(kind: string, text: string, now = Date.now()): KvBlockMeta {\n return {\n hash: contentHash(text),\n kind,\n bytes: Buffer.byteLength(text, 'utf8'),\n approxTokens: approxTokens(text),\n createdAt: now,\n };\n}\n\n/** In-memory registry of which content hashes are considered warm. */\nexport class KvBlockRegistry {\n private readonly warm = new Map<string, KvBlockMeta>();\n\n markWarm(meta: KvBlockMeta): void {\n this.warm.set(meta.hash, meta);\n }\n\n isWarm(hash: string): boolean {\n return this.warm.has(hash);\n }\n\n get(hash: string): KvBlockMeta | undefined {\n return this.warm.get(hash);\n }\n\n clear(): void {\n this.warm.clear();\n }\n\n size(): number {\n return this.warm.size;\n }\n\n /**\n * Plan assembly for ordered text segments. Hits reuse warm blocks; misses\n * need prefill. After a successful forward pass, call {@link commit} on miss hashes.\n */\n plan(segments: Array<{ kind: string; text: string }>, cursor?: SessionPrefixCursor): KvAssemblyPlan {\n const order: string[] = [];\n const hit: string[] = [];\n const miss: KvAssemblyPlan['miss'] = [];\n let hitTokens = 0;\n let totalTokens = 0;\n for (const seg of segments) {\n const meta = blockMeta(seg.kind, seg.text);\n order.push(meta.hash);\n totalTokens += meta.approxTokens;\n if (this.isWarm(meta.hash)) {\n hit.push(meta.hash);\n hitTokens += meta.approxTokens;\n } else {\n miss.push({ hash: meta.hash, kind: meta.kind, approxTokens: meta.approxTokens });\n }\n }\n let cursorSkipBlocks = 0;\n let deltaTokens = totalTokens;\n if (cursor) {\n const d = cursor.delta(order, segments);\n cursorSkipBlocks = d.skipBlocks;\n deltaTokens = d.evaluateTokens;\n }\n return {\n schemaVersion: KV_CACHE_SCHEMA,\n hit,\n miss,\n order,\n hitTokens,\n totalTokens,\n cursorSkipBlocks,\n deltaTokens,\n };\n }\n\n /** After prefill, mark miss segments warm. */\n commit(segments: Array<{ kind: string; text: string }>): void {\n for (const seg of segments) {\n this.markWarm(blockMeta(seg.kind, seg.text));\n }\n }\n}\n\n/**\n * Multi-turn cursor: remembers the hash chain last evaluated on the sequence\n * so we only re-evaluate from the first divergence (P2 RoPE-friendly delta).\n */\nexport class SessionPrefixCursor {\n private chain: string[] = [];\n\n /** Hashes currently considered evaluated on the sequence. */\n get evaluatedHashes(): readonly string[] {\n return this.chain;\n }\n\n /**\n * Compute how many leading blocks match the previous chain and how many\n * approx tokens still need evaluate (from the fork point).\n */\n delta(\n order: string[],\n segments: Array<{ kind: string; text: string }>,\n ): { skipBlocks: number; evaluateTokens: number; evaluateText: string } {\n let skip = 0;\n while (skip < order.length && skip < this.chain.length && order[skip] === this.chain[skip]) {\n skip++;\n }\n let evaluateTokens = 0;\n const parts: string[] = [];\n for (let i = skip; i < segments.length; i++) {\n const meta = blockMeta(segments[i].kind, segments[i].text);\n evaluateTokens += meta.approxTokens;\n parts.push(segments[i].text);\n }\n return { skipBlocks: skip, evaluateTokens, evaluateText: parts.join('\\n') };\n }\n\n /** After successful evaluate of full ordered hashes, advance the cursor. */\n commit(order: string[]): void {\n this.chain = [...order];\n }\n\n /** Reset after sequence dispose / model reload. */\n reset(): void {\n this.chain = [];\n }\n}\n\n/**\n * Longest leading run of warm segments (stable system/capsule prefix).\n * Host can skip re-prefilling these when the sequence API allows evaluate-only.\n */\nexport function longestWarmPrefix(\n registry: KvBlockRegistry,\n segments: Array<{ kind: string; text: string }>,\n): {\n count: number;\n tokens: number;\n text: string;\n hashes: string[];\n} {\n let count = 0;\n let tokens = 0;\n const hashes: string[] = [];\n const parts: string[] = [];\n for (const seg of segments) {\n const meta = blockMeta(seg.kind, seg.text);\n if (!registry.isWarm(meta.hash)) break;\n count++;\n tokens += meta.approxTokens;\n hashes.push(meta.hash);\n parts.push(seg.text);\n }\n return { count, tokens, text: parts.join('\\n'), hashes };\n}\n\n/**\n * Speculative draft tokens for quotational spans the graph already knows\n * verbatim (signatures / imports). The big model verifies; high acceptance\n * expected on code. Pure: returns candidate draft strings, does not call a model.\n */\nexport function graphDraftCandidates(\n knownVerbatim: string[],\n max = 8,\n): string[] {\n return knownVerbatim\n .map((s) => s.trim())\n .filter((s) => s.length >= 8 && s.length <= 400)\n .slice(0, max);\n}\n"]}
@@ -0,0 +1,82 @@
1
+ import { startVgdServer } from './chunk-SZLF66FJ.js';
2
+ import { vgdIsRunning, vgdRequest } from './chunk-PMYWZRRS.js';
3
+
4
+ // src/code/runtime-session.ts
5
+ async function startCodeRuntimeSession(options) {
6
+ const socketPath = options.socketPath;
7
+ const isRunning = options.isRunning ?? ((sp) => vgdIsRunning({ socketPath: sp }));
8
+ const request = options.request ?? vgdRequest;
9
+ const startServer = options.startServer ?? ((opts) => startVgdServer(opts));
10
+ try {
11
+ if (await isRunning(socketPath)) {
12
+ return await attachExisting(options.root, socketPath, request);
13
+ }
14
+ return await startOwned(options.root, socketPath, startServer, request);
15
+ } catch {
16
+ return noneSession();
17
+ }
18
+ }
19
+ async function attachExisting(root, socketPath, request) {
20
+ const clientOpts = { socketPath };
21
+ const reg = await request({ op: "register", root }, clientOpts);
22
+ if (!reg.ok || !("workspace" in reg)) return noneSession();
23
+ const status = await request({ op: "status" }, clientOpts).catch(() => null);
24
+ const pid = status && status.ok && "pid" in status ? status.pid : void 0;
25
+ let disposed = false;
26
+ return {
27
+ kind: "attached",
28
+ pid,
29
+ workspace: reg.workspace,
30
+ socketPath: status && status.ok && "socketPath" in status ? status.socketPath : socketPath,
31
+ label: pid != null ? `vgd ${pid}` : "vgd",
32
+ async dispose() {
33
+ if (disposed) return;
34
+ disposed = true;
35
+ try {
36
+ await request({ op: "unregister", root }, clientOpts);
37
+ } catch {
38
+ }
39
+ }
40
+ };
41
+ }
42
+ async function startOwned(root, socketPath, startServer, request) {
43
+ const server = await startServer({ socketPath });
44
+ const clientOpts = { socketPath: server.socketPath };
45
+ let workspace;
46
+ try {
47
+ const reg = await request({ op: "register", root }, clientOpts);
48
+ if (reg.ok && "workspace" in reg) workspace = reg.workspace;
49
+ } catch {
50
+ }
51
+ let disposed = false;
52
+ return {
53
+ kind: "owned",
54
+ pid: process.pid,
55
+ workspace,
56
+ socketPath: server.socketPath,
57
+ label: `vgd (session)`,
58
+ async dispose() {
59
+ if (disposed) return;
60
+ disposed = true;
61
+ try {
62
+ await server.close();
63
+ } catch {
64
+ }
65
+ }
66
+ };
67
+ }
68
+ function noneSession() {
69
+ return {
70
+ kind: "none",
71
+ pid: void 0,
72
+ workspace: void 0,
73
+ socketPath: void 0,
74
+ label: "",
75
+ async dispose() {
76
+ }
77
+ };
78
+ }
79
+
80
+ export { startCodeRuntimeSession };
81
+ //# sourceMappingURL=chunk-JZYGEZTU.js.map
82
+ //# sourceMappingURL=chunk-JZYGEZTU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-JZYGEZTU.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"]}