@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/llm-host/binding-capabilities.ts","../src/runtime/llm-host/compose-constraints.ts","../src/runtime/llm-host/grammar.ts","../src/runtime/llm-host/identifier-sampler.ts","../src/runtime/llm-host/logit-mask.ts","../src/runtime/llm-host/speculative.ts","../src/runtime/llm-host/session.ts"],"names":["COMPLETE_IDENT","dropped","tokens"],"mappings":"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","file":"chunk-K7REHDQS.js","sourcesContent":["/**\n * Binding capability matrix for Approach B (P2).\n *\n * Probes an injected node-llama-cpp module + loaded model without assuming a\n * pinned minor version. Host code branches on these flags so CI can mock a\n * full matrix and production degrades gracefully.\n */\n\nexport interface BindingCapabilities {\n /** `TokenBias` class on the module. */\n tokenBias: boolean;\n /** `LlamaGrammar` class on the module. */\n llamaGrammar: boolean;\n /** model.iterateAllTokens + detokenize for vocab suppress. */\n vocabIterate: boolean;\n /** model.tokenize for draft/prefix evaluate. */\n tokenize: boolean;\n /** sequence.evaluateWithoutGeneratingNewTokens. */\n evaluateWithoutGenerate: boolean;\n /** prompt opts may include onToken (declared by env or model feature flag). */\n onTokenCallback: boolean;\n /** prompt opts may include customSampler.accept. */\n customSampler: boolean;\n /** Human summary for doctor / host-status. */\n summary: string[];\n}\n\nexport interface ProbeBindingOptions {\n /**\n * Force-enable onToken / customSampler when the operator knows the binding\n * version supports them (node-llama-cpp does not always expose flags).\n */\n assumeOnToken?: boolean;\n assumeCustomSampler?: boolean;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Probe lib + model (+ optional sequence) for Approach B features.\n */\nexport function probeBindingCapabilities(\n lib: unknown,\n model?: unknown,\n sequence?: unknown,\n options: ProbeBindingOptions = {},\n): BindingCapabilities {\n const l: any = lib;\n const m: any = model;\n const seq: any = sequence;\n const env = options.env ?? process.env;\n\n const tokenBias = !!(l && typeof l.TokenBias === 'function');\n const llamaGrammar = !!(l && typeof l.LlamaGrammar === 'function');\n const vocabIterate = !!(m && typeof m.iterateAllTokens === 'function' && typeof m.detokenize === 'function');\n const tokenize = !!(m && typeof m.tokenize === 'function');\n const evaluateWithoutGenerate = !!(seq && typeof seq.evaluateWithoutGeneratingNewTokens === 'function');\n\n const envOnToken = /^(1|true|yes)$/i.test(String(env.VG_LLM_ON_TOKEN ?? env.VIBGRATE_LLM_ON_TOKEN ?? ''));\n const envCustom = /^(1|true|yes)$/i.test(String(env.VG_LLM_CUSTOM_SAMPLER ?? ''));\n const onTokenCallback = !!(options.assumeOnToken || envOnToken);\n const customSampler = !!(options.assumeCustomSampler || envCustom);\n\n const summary: string[] = [];\n if (tokenBias) summary.push('TokenBias');\n if (llamaGrammar) summary.push('LlamaGrammar');\n if (vocabIterate) summary.push('vocabIterate');\n if (tokenize) summary.push('tokenize');\n if (evaluateWithoutGenerate) summary.push('evaluateWithoutGenerate');\n if (onTokenCallback) summary.push('onToken');\n if (customSampler) summary.push('customSampler');\n if (summary.length === 0) summary.push('none');\n\n return {\n tokenBias,\n llamaGrammar,\n vocabIterate,\n tokenize,\n evaluateWithoutGenerate,\n onTokenCallback,\n customSampler,\n summary,\n };\n}\n\n/** True when we can run the P2 dynamic ident filter path. */\nexport function supportsDynamicIdentSampler(caps: BindingCapabilities): boolean {\n return caps.onTokenCallback || caps.customSampler;\n}\n\n/** True when warm prefix evaluate is available. */\nexport function supportsKvPrefixEvaluate(caps: BindingCapabilities): boolean {\n return caps.tokenize && caps.evaluateWithoutGenerate;\n}\n","/**\n * Compose grammar + TokenBias + dynamic sampler onto one prompt() options bag (P2).\n *\n * Order of application (documented for operators / binding authors):\n * 1. Grammar (GBNF) — hard structure (PatchIR)\n * 2. Static TokenBias — graph id boost / unknown suppress\n * 3. Dynamic onToken/customSampler — open-identifier stream filter\n *\n * Bindings that reject unknown keys are protected: we only set keys we intend.\n */\n\nexport interface ComposeConstraintsInput {\n grammar?: unknown | null;\n tokenBias?: unknown | null;\n /** Already-mutated base opts (temperature, maxTokens, …). */\n base?: Record<string, unknown>;\n /** Extra keys from dynamic sampler attach (onToken / customSampler). */\n dynamic?: Record<string, unknown> | null;\n}\n\nexport interface ComposeConstraintsResult {\n promptOpts: Record<string, unknown>;\n /** Which layers are present. */\n layers: {\n grammar: boolean;\n tokenBias: boolean;\n dynamic: boolean;\n };\n}\n\nexport function composePromptConstraints(input: ComposeConstraintsInput): ComposeConstraintsResult {\n const promptOpts: Record<string, unknown> = { ...(input.base ?? {}) };\n if (input.grammar != null) promptOpts.grammar = input.grammar;\n if (input.tokenBias != null) promptOpts.tokenBias = input.tokenBias;\n if (input.dynamic) {\n for (const [k, v] of Object.entries(input.dynamic)) {\n if (v !== undefined) promptOpts[k] = v;\n }\n }\n return {\n promptOpts,\n layers: {\n grammar: input.grammar != null,\n tokenBias: input.tokenBias != null,\n dynamic: !!(input.dynamic && Object.keys(input.dynamic).length > 0),\n },\n };\n}\n","/**\n * Grammar construction for constrained decoding (Approach B / B2).\n *\n * Fail-closed policy: when a pack requires constrained decoding\n * (`requireGrammar: true`), generation must not proceed with free text if the\n * binding cannot attach a grammar object (or an accepted string form).\n */\n\nexport type GrammarAttachMethod = 'LlamaGrammar' | 'createGrammar' | 'string-fallback' | 'none';\n\nexport interface GrammarAttachResult {\n /** Object or string passed to the chat API as `grammar`. */\n value: unknown | null;\n method: GrammarAttachMethod;\n /** True when decoding is actually constrained (not a silent free-text fallback). */\n applied: boolean;\n /** Human reason when not applied. */\n reason?: string;\n}\n\n/**\n * Try to build a grammar object for the injected node-llama-cpp module.\n * Pure best-effort; callers enforce fail-closed via {@link assertGrammarOrThrow}.\n */\nexport async function attachGrammar(lib: unknown, gbnf: string | undefined): Promise<GrammarAttachResult> {\n if (!gbnf?.trim()) {\n return { value: null, method: 'none', applied: false, reason: 'no GBNF provided' };\n }\n const l: any = lib;\n if (!l) {\n return { value: null, method: 'none', applied: false, reason: 'no llama binding loaded' };\n }\n\n // Preferred: LlamaGrammar class (node-llama-cpp 3.x patterns).\n if (l.LlamaGrammar) {\n try {\n if (typeof l.LlamaGrammar === 'function') {\n let llama: unknown;\n try {\n llama = typeof l.getLlama === 'function' ? await l.getLlama() : undefined;\n } catch {\n llama = undefined;\n }\n // Common ctor shapes across versions.\n const attempts: Array<() => unknown> = [\n () => new l.LlamaGrammar(llama, { grammar: gbnf }),\n () => new l.LlamaGrammar({ grammar: gbnf }),\n () => new l.LlamaGrammar(gbnf),\n ];\n for (const attempt of attempts) {\n try {\n const g = attempt();\n if (g) return { value: g, method: 'LlamaGrammar', applied: true };\n } catch {\n /* try next */\n }\n }\n }\n if (typeof l.LlamaGrammar.fromString === 'function') {\n const g = await l.LlamaGrammar.fromString(gbnf);\n if (g) return { value: g, method: 'LlamaGrammar', applied: true };\n }\n } catch (e) {\n return {\n value: null,\n method: 'none',\n applied: false,\n reason: `LlamaGrammar failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n\n if (typeof l.createGrammar === 'function') {\n try {\n const g = await l.createGrammar(gbnf);\n if (g) return { value: g, method: 'createGrammar', applied: true };\n } catch (e) {\n return {\n value: null,\n method: 'none',\n applied: false,\n reason: `createGrammar failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n\n // Last resort: some bindings accept a raw GBNF string on prompt opts.\n // We mark applied=true only when the caller opts into string fallback for tests\n // or known-good bindings — production fail-closed should not rely on this alone.\n return {\n value: gbnf,\n method: 'string-fallback',\n applied: false,\n reason:\n 'binding has no LlamaGrammar/createGrammar; raw GBNF string is available but not verified as constrained',\n };\n}\n\n/**\n * Fail-closed: throw when constrained decoding is required but grammar did not attach.\n */\nexport function assertGrammarOrThrow(\n result: GrammarAttachResult,\n opts: { requireGrammar?: boolean; allowStringFallback?: boolean } = {},\n): void {\n if (!opts.requireGrammar) return;\n if (result.applied) return;\n if (opts.allowStringFallback && result.method === 'string-fallback' && result.value) {\n // Explicit opt-in for environments that document string GBNF support.\n return;\n }\n throw new Error(\n `constrained decoding required but grammar could not be attached (${result.method}` +\n `${result.reason ? `: ${result.reason}` : ''}). ` +\n `Use a node-llama-cpp build with LlamaGrammar, or choose a Code Mode without constrainedDecoding (e.g. Flow), ` +\n `or set VG_ALLOW_GRAMMAR_STRING_FALLBACK=1 only if your binding documents raw GBNF support.`,\n );\n}\n\n/** Env gate for string GBNF fallback (off by default — fail-closed). */\nexport function allowGrammarStringFallback(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.VG_ALLOW_GRAMMAR_STRING_FALLBACK === '1' || env.VIBGRATE_ALLOW_GRAMMAR_STRING_FALLBACK === '1';\n}\n","/**\n * Open-identifier dynamic sampler (Approach B / P2).\n *\n * Tracks whether generation is inside a code identifier and rejects **whole\n * tokens** that invent graph-unknown names (not char-by-char keyword traps —\n * BPE may emit `return` as one token; that must stay legal).\n *\n * Used for:\n * - Per-token `onToken` / `customSampler` hooks when the binding supports them\n * - Unit-test invent-resistance without a native model\n * - `allowedNextChars` planning while an open prefix is in flight\n */\n\nimport { maskAllowedNextChars } from '../identifier-mask.js';\nimport { trieHas, trieHasPrefix, type TrieNode } from '../identifier-trie.js';\n\nconst IDENT_START = /[A-Za-z_]/;\nconst IDENT_CONT = /[A-Za-z0-9_]/;\nconst COMPLETE_IDENT = /^[A-Za-z_][A-Za-z0-9_]{2,}$/;\n\n/** Language / common tokens never treated as “invented symbols”. */\nconst STOP = new Set([\n 'the', 'and', 'for', 'var', 'let', 'const', 'function', 'class', 'return',\n 'import', 'export', 'from', 'async', 'await', 'true', 'false', 'null',\n 'undefined', 'this', 'new', 'typeof', 'interface', 'type', 'string',\n 'number', 'boolean', 'void', 'any', 'unknown', 'Promise', 'Array', 'Object',\n 'Error', 'console', 'process', 'require', 'module', 'exports', 'default',\n 'extends', 'implements', 'public', 'private', 'protected', 'static',\n 'readonly', 'if', 'else', 'while', 'switch', 'case', 'break', 'continue',\n 'try', 'catch', 'finally', 'throw', 'with', 'yield', 'of', 'in', 'as',\n 'is', 'get', 'set', 'super', 'delete', 'void', 'enum', 'package',\n]);\n\nexport type IdentStreamMode = 'free' | 'in_ident';\n\nexport interface IdentStreamState {\n mode: IdentStreamMode;\n /** Accumulated identifier prefix when mode === 'in_ident'. */\n prefix: string;\n}\n\nexport interface IdentStepResult {\n next: IdentStreamState;\n /** False when the token would invent an identifier not in the trie. */\n allowed: boolean;\n reason?: string;\n /** When in_ident after the step, next legal chars (null when free). */\n allowedNextChars: string[] | null;\n}\n\nexport function createIdentStreamState(): IdentStreamState {\n return { mode: 'free', prefix: '' };\n}\n\nfunction isStop(s: string): boolean {\n return STOP.has(s) || STOP.has(s.toLowerCase());\n}\n\n/**\n * Advance the stream with one decoded token string.\n */\nexport function stepIdentStream(\n state: IdentStreamState,\n tokenText: string,\n trie: TrieNode | null | undefined,\n): IdentStepResult {\n if (!tokenText) {\n return { next: state, allowed: true, allowedNextChars: allowedChars(state, trie) };\n }\n if (!trie) {\n return { next: trackOnly(state, tokenText), allowed: true, allowedNextChars: null };\n }\n\n // Invent check: whole-token (or open-prefix + token) against the graph trie.\n if (state.mode === 'in_ident') {\n const joined = state.prefix + tokenText;\n // Extract the identifier head of joined (up to first non-ident).\n const m = joined.match(/^[A-Za-z_][A-Za-z0-9_]*/);\n const head = m?.[0] ?? '';\n if (head.length >= 3 && !isStop(head) && !trieHas(trie, head) && !trieHasPrefix(trie, head)) {\n return {\n next: state,\n allowed: false,\n reason: `identifier '${head}' not in graph trie`,\n allowedNextChars: maskAllowedNextChars(trie, state.prefix),\n };\n }\n } else if (COMPLETE_IDENT.test(tokenText) && !isStop(tokenText)) {\n if (!trieHas(trie, tokenText) && !trieHasPrefix(trie, tokenText)) {\n return {\n next: state,\n allowed: false,\n reason: `identifier '${tokenText}' not in graph trie`,\n allowedNextChars: null,\n };\n }\n }\n\n const next = trackOnly(state, tokenText);\n return {\n next,\n allowed: true,\n allowedNextChars: allowedChars(next, trie),\n };\n}\n\n/** Update free/in_ident bookkeeping without invent checks. */\nfunction trackOnly(state: IdentStreamState, tokenText: string): IdentStreamState {\n let mode = state.mode;\n let prefix = state.prefix;\n for (const ch of tokenText) {\n if (mode === 'free') {\n if (IDENT_START.test(ch)) {\n mode = 'in_ident';\n prefix = ch;\n }\n } else if (IDENT_CONT.test(ch)) {\n prefix += ch;\n } else {\n mode = 'free';\n prefix = '';\n }\n }\n return { mode, prefix };\n}\n\nfunction allowedChars(state: IdentStreamState, trie: TrieNode | null | undefined): string[] | null {\n if (!trie || state.mode !== 'in_ident') return null;\n return maskAllowedNextChars(trie, state.prefix);\n}\n\n/**\n * Filter candidate next-token *texts* under the current stream state.\n */\nexport function filterTokenTexts(\n state: IdentStreamState,\n candidates: string[],\n trie: TrieNode,\n): string[] {\n return candidates.filter((t) => stepIdentStream(state, t, trie).allowed);\n}\n\n/**\n * Build a prompt-time allowlist of next chars for an open identifier.\n */\nexport function dynamicAllowedNextChars(\n state: IdentStreamState,\n trie: TrieNode | null | undefined,\n): string[] | null {\n return allowedChars(state, trie);\n}\n\n/**\n * Attach a best-effort dynamic filter to prompt options when the binding\n * supports `onToken` / `customSampler`.\n */\nexport function attachDynamicIdentFilter(\n promptOpts: Record<string, unknown>,\n trie: TrieNode | null | undefined,\n capabilities: { onTokenCallback?: boolean; customSampler?: boolean },\n): { attached: boolean; method: 'onToken' | 'customSampler' | 'none'; state: IdentStreamState } {\n const state = createIdentStreamState();\n if (!trie) return { attached: false, method: 'none', state };\n\n if (capabilities.onTokenCallback) {\n let stream = createIdentStreamState();\n promptOpts.onToken = (tokenText: string) => {\n const step = stepIdentStream(stream, tokenText, trie);\n if (!step.allowed) return false;\n stream = step.next;\n return true;\n };\n return { attached: true, method: 'onToken', state: stream };\n }\n\n if (capabilities.customSampler) {\n let stream = createIdentStreamState();\n promptOpts.customSampler = {\n accept: (tokenText: string) => {\n const step = stepIdentStream(stream, tokenText, trie);\n if (!step.allowed) return false;\n stream = step.next;\n return true;\n },\n };\n return { attached: true, method: 'customSampler', state: stream };\n }\n\n return { attached: false, method: 'none', state };\n}\n","/**\n * Native logit mask / TokenBias construction for Approach B (P1).\n *\n * When node-llama-cpp exposes {@link TokenBias} + model tokenizer APIs, we:\n * 1. **Boost** tokens that spell graph identifiers (positive bias)\n * 2. Optionally **suppress** vocabulary tokens that are complete identifiers\n * absent from the trie (`\"never\"` / strong negative)\n *\n * Without a binding, this module still exposes pure helpers for tests and for\n * char-level mask planning ({@link maskAllowedNextChars}).\n *\n * Full dynamic per-step trie masking (only-allow next chars of an open\n * identifier) needs a custom sampler callback; TokenBias is the portable\n * production path across node-llama-cpp versions.\n */\n\nimport {\n maskAllowedNextChars,\n extractIdentifiers,\n} from '../identifier-mask.js';\nimport {\n trieEnumerateWords,\n trieHas,\n trieHasPrefix,\n type TrieNode,\n} from '../identifier-trie.js';\n\nexport type SamplerHookMethod =\n | 'none'\n | 'TokenBias'\n | 'TokenBias-boost'\n | 'dynamic-onToken'\n | 'dynamic-customSampler'\n | 'TokenBias+dynamic'\n | 'capability';\n\nexport interface LogitMaskBuildResult {\n applied: boolean;\n method: SamplerHookMethod;\n /** TokenBias instance (or compatible) to pass as `tokenBias` on prompt(). */\n tokenBias: unknown | null;\n boostedTokens: number;\n suppressedTokens: number;\n reason?: string;\n}\n\nexport interface BuildLogitMaskOptions {\n /** Soft boost for tokens that encode known graph identifiers (default 0.35). */\n boost?: number;\n /**\n * When true, scan vocabulary (capped) and mark complete unknown identifiers\n * as `\"never\"`. Expensive; cached by callers per session+trie.\n */\n suppressUnknown?: boolean;\n /** Max vocab tokens to scan for suppress (default 50_000). */\n maxVocabScan?: number;\n /** Max graph identifiers to boost (default 2048). */\n maxBoostIds?: number;\n}\n\n/** Identifier-shaped token text (whole token is one ident). */\nconst COMPLETE_IDENT = /^[A-Za-z_][A-Za-z0-9_]{2,}$/;\n\n/**\n * Build a node-llama-cpp TokenBias for the given trie, or report why not.\n * Safe on missing APIs — never throws for capability gaps.\n */\nexport function buildIdentifierTokenBias(\n lib: unknown,\n model: unknown,\n trie: TrieNode | null | undefined,\n options: BuildLogitMaskOptions = {},\n): LogitMaskBuildResult {\n if (!trie) {\n return { applied: false, method: 'none', tokenBias: null, boostedTokens: 0, suppressedTokens: 0, reason: 'no trie' };\n }\n const l: any = lib;\n const m: any = model;\n if (!l || typeof l.TokenBias !== 'function') {\n // Capability probe: model may still expose iterateAllTokens for future hooks.\n if (m && typeof m.iterateAllTokens === 'function') {\n return {\n applied: false,\n method: 'capability',\n tokenBias: null,\n boostedTokens: 0,\n suppressedTokens: 0,\n reason: 'TokenBias class missing (binding can iterate tokens)',\n };\n }\n return {\n applied: false,\n method: 'none',\n tokenBias: null,\n boostedTokens: 0,\n suppressedTokens: 0,\n reason: 'TokenBias unavailable',\n };\n }\n const tokenizer = m?.tokenizer ?? m;\n if (!tokenizer) {\n return {\n applied: false,\n method: 'none',\n tokenBias: null,\n boostedTokens: 0,\n suppressedTokens: 0,\n reason: 'model.tokenizer missing',\n };\n }\n\n let bias: any;\n try {\n bias = new l.TokenBias(tokenizer);\n } catch (e) {\n return {\n applied: false,\n method: 'none',\n tokenBias: null,\n boostedTokens: 0,\n suppressedTokens: 0,\n reason: e instanceof Error ? e.message : 'TokenBias construct failed',\n };\n }\n\n const boost = options.boost ?? 0.35;\n const maxBoostIds = options.maxBoostIds ?? 2048;\n const words = trieEnumerateWords(trie, maxBoostIds);\n let boostedTokens = 0;\n\n for (const word of words) {\n if (word.length < 3) continue;\n const tokens = tokenizeBestEffort(m, word);\n for (const tok of tokens) {\n try {\n // Prefer probability-scale bias; fall back to logit form.\n if (typeof bias.set === 'function') {\n try {\n bias.set(tok, boost);\n } catch {\n bias.set(tok, { logit: boost });\n }\n boostedTokens++;\n }\n } catch {\n /* skip undecodable */\n }\n }\n }\n\n let suppressedTokens = 0;\n if (options.suppressUnknown !== false && typeof m.iterateAllTokens === 'function' && typeof m.detokenize === 'function') {\n const maxScan = options.maxVocabScan ?? 50_000;\n let scanned = 0;\n try {\n for (const token of m.iterateAllTokens()) {\n if (scanned++ >= maxScan) break;\n let text = '';\n try {\n text = m.detokenize([token]);\n } catch {\n continue;\n }\n if (!text || !COMPLETE_IDENT.test(text)) continue;\n if (trieHas(trie, text) || trieHasPrefix(trie, text)) continue;\n // Stopwords / language keywords already filtered by COMPLETE_IDENT min length;\n // extractIdentifiers would drop many — still suppress bare unknown idents.\n try {\n bias.set(token, 'never');\n suppressedTokens++;\n } catch {\n try {\n bias.set(token, -0.95);\n suppressedTokens++;\n } catch {\n /* ignore */\n }\n }\n }\n } catch {\n /* iterate may throw on some bindings — keep boost-only bias */\n }\n }\n\n const method: SamplerHookMethod =\n boostedTokens > 0 || suppressedTokens > 0\n ? suppressedTokens > 0\n ? 'TokenBias'\n : 'TokenBias-boost'\n : 'none';\n\n return {\n applied: method !== 'none',\n method: method === 'none' ? 'none' : method,\n tokenBias: method === 'none' ? null : bias,\n boostedTokens,\n suppressedTokens,\n reason: method === 'none' ? 'no tokens adjusted' : undefined,\n };\n}\n\nfunction tokenizeBestEffort(model: any, text: string): unknown[] {\n try {\n if (typeof model.tokenize === 'function') {\n const t = model.tokenize(text);\n if (Array.isArray(t)) return t;\n if (t && typeof t[Symbol.iterator] === 'function') return [...t];\n }\n } catch {\n /* fall through */\n }\n try {\n if (model.tokenizer && typeof model.tokenizer.encode === 'function') {\n const t = model.tokenizer.encode(text);\n if (Array.isArray(t)) return t;\n }\n } catch {\n /* ignore */\n }\n return [];\n}\n\n/**\n * Pure planner: which next characters are legal for an open identifier under the trie.\n * Used by tests and future custom-sampler callbacks.\n */\nexport function planNextCharMask(trie: TrieNode, partialIdent: string): string[] {\n return maskAllowedNextChars(trie, partialIdent);\n}\n\n/**\n * Whether a generated token string would open or continue an illegal identifier.\n * Pure helper for sampler unit tests (no binding).\n */\nexport function tokenCompatibleWithTrie(tokenText: string, trie: TrieNode, openPrefix = ''): boolean {\n const joined = openPrefix + tokenText;\n // If the join is still a prefix of some graph word, or is a known word, ok.\n if (trieHas(trie, joined) || trieHasPrefix(trie, joined)) return true;\n // Multi-ident tokens: each complete identifier must be known or a stopword-ish short token.\n const ids = extractIdentifiers(joined);\n if (ids.length === 0) return true;\n return ids.every((id) => trieHas(trie, id) || trieHasPrefix(trie, id));\n}\n\n/** Cache key for session-level TokenBias reuse (trie word set fingerprint). */\nexport function trieFingerprint(trie: TrieNode, limit = 256): string {\n const words = trieEnumerateWords(trie, limit);\n return `${words.length}:${words.slice(0, 32).join('|')}`;\n}\n","/**\n * Speculative draft ranking + multi-candidate accept (Approach B / P2).\n *\n * Graph-verbatim drafts (signatures, imports) are ranked against the last user\n * turn; the host tries accept in rank order until one evaluates cleanly.\n */\n\nimport type { LlmChatMessage } from './types.js';\n\nexport interface RankedDraft {\n text: string;\n score: number;\n reason: string;\n}\n\n/**\n * Rank draft candidates for the current user ask. Higher score first.\n */\nexport function rankDraftCandidates(\n candidates: string[] | undefined,\n messages: LlmChatMessage[],\n max = 3,\n): RankedDraft[] {\n if (!candidates?.length) return [];\n const last = messages[messages.length - 1]?.content?.toLowerCase() ?? '';\n const ranked: RankedDraft[] = [];\n\n for (const raw of candidates) {\n const d = raw.trim();\n if (d.length < 8) continue;\n let score = 0;\n const reasons: string[] = [];\n const head = d.slice(0, 48).toLowerCase().replace(/\\s+/g, ' ');\n const tokens = head.split(/[^a-z0-9_]+/).filter((t) => t.length > 3);\n for (const t of tokens) {\n if (last.includes(t)) {\n score += 3;\n reasons.push(`token:${t}`);\n }\n }\n if (/\\b(signature|import|export function|export class|implements|extends)\\b/i.test(last)) {\n score += 2;\n reasons.push('quotational-ask');\n }\n if (/^export\\s+(async\\s+)?(function|class|const|type|interface)\\b/.test(d)) {\n score += 1;\n reasons.push('export-shape');\n }\n if (score > 0) {\n ranked.push({ text: d, score, reason: reasons.join(',') || 'match' });\n }\n }\n\n // If nothing scored but ask looks quotational, keep top candidates at low score.\n if (ranked.length === 0 && /\\b(signature|import|export function|export class)\\b/i.test(last)) {\n for (const d of candidates.slice(0, max)) {\n if (d.trim().length >= 8) ranked.push({ text: d.trim(), score: 1, reason: 'fallback-quotational' });\n }\n }\n\n return ranked.sort((a, b) => b.score - a.score || b.text.length - a.text.length).slice(0, max);\n}\n\n/** Pick a single best draft (back-compat with P1 pickDraft). */\nexport function pickBestDraft(candidates: string[] | undefined, messages: LlmChatMessage[]): string | null {\n return rankDraftCandidates(candidates, messages, 1)[0]?.text ?? null;\n}\n","/**\n * Pooled, warm llama.cpp sessions — the production hot path for Approach B.\n *\n * Best-in-breed requirements vs the old one-shot load-per-chat path:\n * - Model + context stay resident across turns (TTFT collapses after first load)\n * - GBNF grammar when the binding exposes LlamaGrammar\n * - Graph draft speculative acceptance (multi-candidate rank, P2)\n * - KV multi-turn cursor + optional evaluate-only reuse of warm prefixes\n * - Static TokenBias + dynamic open-identifier filter (P1/P2)\n *\n * Binding is always injected (never a static import of node-llama-cpp).\n */\n\nimport { annotateUnknownIdentifiers, scanIdentifiersAgainstTrie } from '../identifier-mask.js';\nimport type { TrieNode } from '../identifier-trie.js';\nimport {\n contentHash,\n KvBlockRegistry,\n longestWarmPrefix,\n SessionPrefixCursor,\n type KvAssemblyPlan,\n} from '../kv-cache.js';\nimport {\n probeBindingCapabilities,\n supportsDynamicIdentSampler,\n type BindingCapabilities,\n} from './binding-capabilities.js';\nimport { composePromptConstraints } from './compose-constraints.js';\nimport {\n allowGrammarStringFallback,\n assertGrammarOrThrow,\n attachGrammar,\n type GrammarAttachMethod,\n} from './grammar.js';\nimport { attachDynamicIdentFilter } from './identifier-sampler.js';\nimport {\n buildIdentifierTokenBias,\n trieFingerprint,\n type LogitMaskBuildResult,\n type SamplerHookMethod,\n} from './logit-mask.js';\nimport { rankDraftCandidates } from './speculative.js';\nimport type { LlmChatMessage, LlmGenerateResult } from './types.js';\n\nexport interface HostSessionKey {\n modelPath: string;\n isolation: 'embedded' | 'process';\n}\n\nexport interface HostGenerateExtras {\n grammar?: string;\n /**\n * When true (Spark / constrained packs), fail if grammar cannot be attached.\n * Default false for Flow/Forge free-form tool calling.\n */\n requireGrammar?: boolean;\n identifierTrie?: TrieNode;\n annotateUnknownIdentifiers?: boolean;\n /** Verbatim spans the graph already knows — speculative draft candidates. */\n draftCandidates?: string[];\n /** Soft token cap. */\n maxTokens?: number;\n temperature?: number;\n /** Ordered prompt segments for KV hit/miss planning (system, capsule, …). */\n promptSegments?: Array<{ kind: string; text: string }>;\n env?: NodeJS.ProcessEnv;\n /**\n * When true (default), suppress vocab tokens that are complete unknown\n * identifiers. Set false for faster bias build (boost-only).\n */\n suppressUnknownLogits?: boolean;\n /** Force dynamic sampler capability for tests. */\n assumeOnToken?: boolean;\n assumeCustomSampler?: boolean;\n}\n\nexport interface HostGenerateReport extends LlmGenerateResult {\n /** Speculative draft tokens accepted (0 when none). */\n draftAcceptedChars: number;\n /** How many draft candidates were ranked/tried. */\n draftCandidatesTried?: number;\n /** KV assembly plan for this turn (if segments provided). */\n kvPlan?: KvAssemblyPlan;\n /** Grammar object was constructed and applied. */\n grammarApplied: boolean;\n grammarMethod?: GrammarAttachMethod;\n /** Logit bias / custom sampler path engaged. */\n samplerHook: boolean;\n /** How the sampler hook was applied (P1/P2). */\n samplerMethod?: SamplerHookMethod;\n /** Tokens boosted / suppressed on TokenBias. */\n samplerBoostedTokens?: number;\n samplerSuppressedTokens?: number;\n /** Dynamic open-identifier filter attached. */\n dynamicSampler?: boolean;\n /** Approx tokens skipped via warm-prefix evaluate (RoPE reuse path). */\n kvPrefixReusedTokens?: number;\n /** P2: tokens still evaluated after multi-turn cursor skip. */\n kvDeltaTokens?: number;\n /** Binding capability summary for this generate. */\n bindingCaps?: string[];\n /** Constraint layers composed onto prompt(). */\n constraintLayers?: { grammar: boolean; tokenBias: boolean; dynamic: boolean };\n /** Session was warm (model already loaded). */\n warmStart: boolean;\n /** Wall-clock ms for this generate (best-effort). */\n latencyMs: number;\n}\n\ninterface WarmSession {\n key: string;\n lib: any;\n modelPath: string;\n model: any;\n context: any;\n sequence: any;\n chat: any;\n kv: KvBlockRegistry;\n cursor: SessionPrefixCursor;\n lastUsed: number;\n loads: number;\n /** Cached TokenBias keyed by trie fingerprint. */\n logitMaskCache: Map<string, LogitMaskBuildResult>;\n caps: BindingCapabilities | null;\n}\n\nconst globalPool = new Map<string, WarmSession>();\n\nexport function sessionKey(modelPath: string): string {\n return `embedded:${modelPath}`;\n}\n\n/** Test/harness: drop all warm sessions. */\nexport function clearHostSessionPool(): void {\n globalPool.clear();\n}\n\nexport function hostSessionPoolSize(): number {\n return globalPool.size;\n}\n\nexport interface HostSessionInfo {\n key: string;\n modelPath: string;\n loads: number;\n lastUsed: number;\n /** Warm KV blocks in the session registry. */\n kvBlocks: number;\n /** Leading cursor chain length (multi-turn prefix). */\n cursorBlocks: number;\n bindingCaps: string[] | null;\n}\n\n/** Snapshot of warm sessions for doctor / host-status (no secrets). */\nexport function listHostSessions(): HostSessionInfo[] {\n return [...globalPool.values()]\n .map((s) => ({\n key: s.key,\n modelPath: s.modelPath,\n loads: s.loads,\n lastUsed: s.lastUsed,\n kvBlocks: s.kv.size(),\n cursorBlocks: s.cursor.evaluatedHashes.length,\n bindingCaps: s.caps?.summary ?? null,\n }))\n .sort((a, b) => b.lastUsed - a.lastUsed);\n}\n\n/** Drop one session by model path (or key). Returns true if removed. */\nexport function dropHostSession(modelPathOrKey: string): boolean {\n const key = modelPathOrKey.startsWith('embedded:') ? modelPathOrKey : sessionKey(modelPathOrKey);\n return globalPool.delete(key);\n}\n\n/**\n * Obtain or create a warm session for modelPath. Reuses model/context/chat.\n */\nexport async function acquireHostSession(lib: unknown, modelPath: string): Promise<WarmSession> {\n const key = sessionKey(modelPath);\n const existing = globalPool.get(key);\n if (existing) {\n existing.lastUsed = Date.now();\n return existing;\n }\n const l: any = lib;\n if (!l || typeof l.getLlama !== 'function') {\n throw new Error('llm-host session: invalid node-llama-cpp module (getLlama missing)');\n }\n const llama = await l.getLlama();\n const model = await llama.loadModel({ modelPath });\n const context = await model.createContext();\n const sequence = context.getSequence();\n const { LlamaChatSession } = l;\n if (typeof LlamaChatSession !== 'function') {\n throw new Error('llm-host session: LlamaChatSession missing');\n }\n const chat = new LlamaChatSession({ contextSequence: sequence });\n const sess: WarmSession = {\n key,\n lib: l,\n modelPath,\n model,\n context,\n sequence,\n chat,\n kv: new KvBlockRegistry(),\n cursor: new SessionPrefixCursor(),\n lastUsed: Date.now(),\n loads: 1,\n logitMaskCache: new Map(),\n caps: null,\n };\n globalPool.set(key, sess);\n return sess;\n}\n\n/** Evict idle sessions (LRU) when over cap. */\nexport function evictIdleSessions(maxSessions = 2, maxIdleMs = 30 * 60_000, now = Date.now()): number {\n if (globalPool.size <= maxSessions) {\n let dropped = 0;\n for (const [k, s] of globalPool) {\n if (now - s.lastUsed > maxIdleMs) {\n globalPool.delete(k);\n dropped++;\n }\n }\n return dropped;\n }\n const ordered = [...globalPool.entries()].sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n let dropped = 0;\n while (globalPool.size > maxSessions && ordered.length) {\n const [k] = ordered.shift()!;\n globalPool.delete(k);\n dropped++;\n }\n return dropped;\n}\n\n/**\n * Best-in-breed generate on a warm session.\n */\nexport async function generateOnSession(\n session: WarmSession,\n messages: LlmChatMessage[],\n extras: HostGenerateExtras = {},\n): Promise<HostGenerateReport> {\n const t0 = Date.now();\n const warmStart = session.loads > 0 && session.lastUsed > 0;\n session.loads++;\n session.lastUsed = Date.now();\n\n const env = extras.env ?? process.env;\n const caps =\n session.caps ??\n probeBindingCapabilities(session.lib, session.model, session.sequence, {\n assumeOnToken: extras.assumeOnToken,\n assumeCustomSampler: extras.assumeCustomSampler,\n env,\n });\n session.caps = caps;\n\n const segments =\n extras.promptSegments ??\n messages.map((m, i) => ({\n kind: m.role === 'system' ? 'system' : i === messages.length - 1 ? 'user' : 'context',\n text: m.content,\n }));\n const kvPlan = session.kv.plan(segments, session.cursor);\n\n // Multi-turn delta evaluate (P2) — only re-evaluate from fork when possible.\n const prefixReuse = await tryReuseWarmPrefix(session, segments, kvPlan, caps);\n\n const ranked = rankDraftCandidates(extras.draftCandidates, messages, 3);\n let draftAcceptedChars = 0;\n let draftCandidatesTried = 0;\n let text = '';\n\n const stringOk = allowGrammarStringFallback(env);\n const grammar = await attachGrammar(session.lib, extras.grammar);\n assertGrammarOrThrow(grammar, {\n requireGrammar: extras.requireGrammar,\n allowStringFallback: stringOk,\n });\n let promptGrammar: unknown | null = null;\n if (grammar.applied) promptGrammar = grammar.value;\n else if (grammar.method === 'string-fallback' && grammar.value && (stringOk || !extras.requireGrammar)) {\n promptGrammar = grammar.value;\n }\n\n const mask = resolveLogitMask(session, extras.identifierTrie, extras.suppressUnknownLogits !== false);\n\n const baseOpts: Record<string, unknown> = {\n temperature: extras.temperature ?? 0,\n };\n if (typeof extras.maxTokens === 'number') baseOpts.maxTokens = extras.maxTokens;\n\n // Dynamic open-identifier filter (P2) — only when capability declared.\n const dynBag: Record<string, unknown> = {};\n let dynamicAttached = false;\n let dynMethod: 'onToken' | 'customSampler' | 'none' = 'none';\n if (extras.identifierTrie && supportsDynamicIdentSampler(caps)) {\n const dyn = attachDynamicIdentFilter(dynBag, extras.identifierTrie, {\n onTokenCallback: caps.onTokenCallback,\n customSampler: caps.customSampler,\n });\n dynamicAttached = dyn.attached;\n dynMethod = dyn.method;\n }\n\n const composed = composePromptConstraints({\n base: baseOpts,\n grammar: promptGrammar,\n tokenBias: mask.tokenBias,\n dynamic: dynamicAttached ? dynBag : null,\n });\n\n const samplerMethod = resolveSamplerMethod(mask, dynamicAttached, dynMethod);\n\n if (ranked.length) {\n let accepted: string | null = null;\n for (const d of ranked) {\n draftCandidatesTried++;\n if (await tryAcceptDraft(session, d.text, caps)) {\n accepted = d.text;\n break;\n }\n }\n if (accepted) {\n draftAcceptedChars = accepted.length;\n text = accepted;\n const continueMsgs = [\n ...messages,\n { role: 'assistant' as const, content: accepted },\n { role: 'user' as const, content: 'Continue from the draft above without repeating it.' },\n ];\n const cont = await sessionPrompt(session, continueMsgs, composed.promptOpts);\n text = accepted + (cont.startsWith(accepted) ? cont.slice(accepted.length) : cont);\n } else {\n text = await sessionPrompt(session, messages, composed.promptOpts);\n }\n } else {\n text = await sessionPrompt(session, messages, composed.promptOpts);\n }\n\n session.kv.commit(segments);\n session.cursor.commit(kvPlan.order);\n\n let unknownIdentifiers: string[] | undefined;\n if (extras.identifierTrie) {\n if (extras.annotateUnknownIdentifiers !== false) {\n const ann = annotateUnknownIdentifiers(text, extras.identifierTrie);\n text = ann.text;\n unknownIdentifiers = ann.unknown.length ? ann.unknown : undefined;\n } else {\n const scan = scanIdentifiersAgainstTrie(text, extras.identifierTrie);\n unknownIdentifiers = scan.unknown.length ? scan.unknown : undefined;\n }\n }\n\n return {\n text,\n model: session.modelPath,\n isolation: 'embedded',\n constrained: grammar.applied || (!!promptGrammar && stringOk) || dynamicAttached,\n unknownIdentifiers,\n draftAcceptedChars,\n draftCandidatesTried,\n kvPlan,\n grammarApplied: grammar.applied || (!!promptGrammar && stringOk && grammar.method === 'string-fallback'),\n grammarMethod: grammar.method,\n samplerHook: mask.applied || dynamicAttached,\n samplerMethod,\n samplerBoostedTokens: mask.boostedTokens,\n samplerSuppressedTokens: mask.suppressedTokens,\n dynamicSampler: dynamicAttached,\n kvPrefixReusedTokens: prefixReuse.tokens,\n kvDeltaTokens: kvPlan.deltaTokens,\n bindingCaps: caps.summary,\n constraintLayers: composed.layers,\n warmStart,\n latencyMs: Date.now() - t0,\n };\n}\n\nfunction resolveSamplerMethod(\n mask: LogitMaskBuildResult,\n dynamicAttached: boolean,\n dynMethod: 'onToken' | 'customSampler' | 'none',\n): SamplerHookMethod {\n if (mask.applied && dynamicAttached) return 'TokenBias+dynamic';\n if (dynamicAttached && dynMethod === 'onToken') return 'dynamic-onToken';\n if (dynamicAttached && dynMethod === 'customSampler') return 'dynamic-customSampler';\n return mask.method;\n}\n\nfunction resolveLogitMask(\n session: WarmSession,\n trie: TrieNode | undefined,\n suppressUnknown: boolean,\n): LogitMaskBuildResult {\n if (!trie) {\n return { applied: false, method: 'none', tokenBias: null, boostedTokens: 0, suppressedTokens: 0 };\n }\n const fp = `${trieFingerprint(trie)}|sup=${suppressUnknown ? 1 : 0}`;\n const cached = session.logitMaskCache.get(fp);\n if (cached) return cached;\n const built = buildIdentifierTokenBias(session.lib, session.model, trie, {\n suppressUnknown,\n });\n if (session.logitMaskCache.size > 8) session.logitMaskCache.clear();\n session.logitMaskCache.set(fp, built);\n return built;\n}\n\nasync function sessionPrompt(session: WarmSession, messages: LlmChatMessage[], promptOpts: Record<string, unknown>): Promise<string> {\n const prompt = messages.map((m) => `${m.role}: ${m.content}`).join('\\n\\n');\n const text: string = await session.chat.prompt(prompt, promptOpts);\n return typeof text === 'string' ? text : String(text ?? '');\n}\n\nasync function tryAcceptDraft(session: WarmSession, draft: string, caps: BindingCapabilities): Promise<boolean> {\n try {\n const seq = session.sequence;\n if (caps.evaluateWithoutGenerate && caps.tokenize && seq && typeof seq.evaluateWithoutGeneratingNewTokens === 'function') {\n const model = session.model;\n if (model && typeof model.tokenize === 'function') {\n const tokens = model.tokenize(draft);\n await seq.evaluateWithoutGeneratingNewTokens(tokens);\n return true;\n }\n }\n } catch {\n /* fall through */\n }\n return session.kv.isWarm(contentHash(draft));\n}\n\n/**\n * RoPE-friendly prefix reuse with multi-turn cursor (P2).\n * Prefer evaluating only the delta after the last committed chain.\n */\nasync function tryReuseWarmPrefix(\n session: WarmSession,\n segments: Array<{ kind: string; text: string }>,\n plan: KvAssemblyPlan,\n caps: BindingCapabilities,\n): Promise<{ tokens: number; method: 'evaluate-delta' | 'evaluate-prefix' | 'plan-only' | 'none' }> {\n const prefix = longestWarmPrefix(session.kv, segments);\n if (prefix.count === 0 && (plan.cursorSkipBlocks ?? 0) === 0) {\n return { tokens: 0, method: 'none' };\n }\n\n const canEval = caps.tokenize && caps.evaluateWithoutGenerate;\n try {\n const seq = session.sequence;\n const model = session.model;\n if (canEval && seq && typeof seq.evaluateWithoutGeneratingNewTokens === 'function' && model && typeof model.tokenize === 'function') {\n // Prefer delta text from cursor when we skipped leading blocks.\n const delta = session.cursor.delta(plan.order, segments);\n if (delta.skipBlocks > 0 && delta.evaluateText) {\n const tokens = model.tokenize(delta.evaluateText);\n await seq.evaluateWithoutGeneratingNewTokens(tokens);\n return { tokens: plan.hitTokens, method: 'evaluate-delta' };\n }\n if (prefix.text) {\n const tokens = model.tokenize(prefix.text);\n await seq.evaluateWithoutGeneratingNewTokens(tokens);\n return { tokens: prefix.tokens, method: 'evaluate-prefix' };\n }\n }\n } catch {\n /* plan-only */\n }\n\n const tokens = prefix.tokens || plan.hitTokens;\n if (tokens > 0) return { tokens, method: 'plan-only' };\n return { tokens: 0, method: 'none' };\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { refreshIfStale, TOOLS, renderToolResult, warmEmbedderInBackground, countTokens
|
|
2
|
-
import { VERSION } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { refreshIfStale, TOOLS, renderToolResult, warmEmbedderInBackground, countTokens } from './chunk-KNELIQJO.js';
|
|
2
|
+
import { VERSION } from './chunk-WGUL45AV.js';
|
|
3
|
+
import { sanitizeClient, recordSaving, SAVINGS_TOOLS, PER_FILE_TOKENS } from './chunk-KSBHGWRV.js';
|
|
4
|
+
import { loadGraphPreferIndex, renderHtml, renderReport } from './chunk-2XQDMLKB.js';
|
|
5
|
+
import { parseGraph, serializeGraph } from './chunk-K3MZIVZW.js';
|
|
4
6
|
import * as fs from 'fs';
|
|
5
7
|
import * as path from 'path';
|
|
6
8
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
@@ -10,32 +12,36 @@ import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprot
|
|
|
10
12
|
var PROBE_INTERVAL_MS = 2e3;
|
|
11
13
|
var MAX_PROBE_INTERVAL_MS = 3e4;
|
|
12
14
|
var PROBE_DUTY_FACTOR = 20;
|
|
13
|
-
var REFRESH_BUDGET_MS =
|
|
15
|
+
var REFRESH_BUDGET_MS = 100;
|
|
14
16
|
var FAILURE_COOLDOWN_MS = 6e4;
|
|
15
17
|
var GraphSource = class {
|
|
16
18
|
constructor(graphPath, refresh = false, tuning = {}) {
|
|
17
19
|
this.graphPath = graphPath;
|
|
18
20
|
this.refresh = refresh;
|
|
19
21
|
this.tuning = tuning;
|
|
20
|
-
this.root = path.dirname(path.dirname(graphPath));
|
|
22
|
+
this.root = tuning.root ?? path.dirname(path.dirname(graphPath));
|
|
23
|
+
this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;
|
|
21
24
|
}
|
|
22
25
|
graphPath;
|
|
23
26
|
refresh;
|
|
24
27
|
tuning;
|
|
25
28
|
cachedMtimeMs = -1;
|
|
26
29
|
cached = null;
|
|
30
|
+
/** Project root used for freshness probes and rebuilds. */
|
|
27
31
|
root;
|
|
28
32
|
lastProbeAt = 0;
|
|
29
33
|
failedUntil = 0;
|
|
30
34
|
inflight = null;
|
|
31
|
-
/** Self-tuned: grows with measured probe cost so huge repos aren't penalized. */
|
|
35
|
+
/** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */
|
|
32
36
|
probeIntervalMs = PROBE_INTERVAL_MS;
|
|
37
|
+
refreshImpl;
|
|
33
38
|
/** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */
|
|
34
39
|
async get() {
|
|
35
40
|
if (this.refresh) await this.maybeRefresh();
|
|
36
41
|
const stat = fs.statSync(this.graphPath);
|
|
37
42
|
if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {
|
|
38
|
-
|
|
43
|
+
const preferred = loadGraphPreferIndex(this.root, this.graphPath);
|
|
44
|
+
this.cached = preferred ? preferred.graph : parseGraph(fs.readFileSync(this.graphPath, "utf8"));
|
|
39
45
|
this.cachedMtimeMs = stat.mtimeMs;
|
|
40
46
|
}
|
|
41
47
|
return this.cached;
|
|
@@ -50,15 +56,13 @@ var GraphSource = class {
|
|
|
50
56
|
const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;
|
|
51
57
|
if (now < this.failedUntil || now - this.lastProbeAt < interval) return;
|
|
52
58
|
this.lastProbeAt = now;
|
|
53
|
-
this.inflight =
|
|
59
|
+
this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath }).then((r) => {
|
|
54
60
|
if (r.status === "error") this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
);
|
|
61
|
-
}
|
|
61
|
+
const cost = r.status === "refreshed" && typeof r.ms === "number" ? Math.max(r.ms, Date.now() - now) : Date.now() - now;
|
|
62
|
+
this.probeIntervalMs = Math.min(
|
|
63
|
+
MAX_PROBE_INTERVAL_MS,
|
|
64
|
+
Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR)
|
|
65
|
+
);
|
|
62
66
|
}).catch(() => {
|
|
63
67
|
this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;
|
|
64
68
|
}).finally(() => {
|
|
@@ -71,7 +75,7 @@ var GraphSource = class {
|
|
|
71
75
|
function createServer(source, opts = {}) {
|
|
72
76
|
const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;
|
|
73
77
|
const record = savings || shareStats;
|
|
74
|
-
const root =
|
|
78
|
+
const root = opts.root ?? source.root;
|
|
75
79
|
const seen = /* @__PURE__ */ new Set();
|
|
76
80
|
const server = new Server(
|
|
77
81
|
{ name: "vg", version: VERSION },
|
|
@@ -127,7 +131,7 @@ function createServer(source, opts = {}) {
|
|
|
127
131
|
return server;
|
|
128
132
|
}
|
|
129
133
|
async function serveStdio(graphPath, opts = {}) {
|
|
130
|
-
const source = new GraphSource(graphPath, opts.refresh !== false);
|
|
134
|
+
const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });
|
|
131
135
|
const server = createServer(source, opts);
|
|
132
136
|
warmEmbedderInBackground(opts.local);
|
|
133
137
|
await server.connect(new StdioServerTransport());
|
|
@@ -413,5 +417,5 @@ function spdx(ctx) {
|
|
|
413
417
|
}
|
|
414
418
|
|
|
415
419
|
export { GraphSource, createServer, exportGraph, formatForExt, serveStdio };
|
|
416
|
-
//# sourceMappingURL=chunk-
|
|
417
|
-
//# sourceMappingURL=chunk-
|
|
420
|
+
//# sourceMappingURL=chunk-KCKYKDMS.js.map
|
|
421
|
+
//# sourceMappingURL=chunk-KCKYKDMS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp/server.ts","../src/engine/export.ts"],"names":[],"mappings":"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","file":"chunk-KCKYKDMS.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { loadGraphPreferIndex } from '../engine/index-db.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { TOOLS, warmEmbedderInBackground } from './tools.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits only a **micro-budget** so a warm probe can\n * land without stalling MCP tools — otherwise it answers from the current\n * map while the rebuild finishes for a later call (hot-reload picks it up).\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty tool calls. */\nconst PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nconst MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe/rebuild may consume at most ~1/PROBE_DUTY_FACTOR of serve wall-time (20 → ≤5%). */\nconst PROBE_DUTY_FACTOR = 20;\n/**\n * How long a tool call waits for an in-flight refresh before answering from\n * the current map. Kept deliberately small: MCP tool latency is sub-10ms on\n * warm maps, and a multi-second budget (the previous 5s ceiling matched\n * `git rev-parse`'s spawn timeout) turned every sequential tool call during a\n * large-repo rebuild into a multi-second stall — measured as TypeScript p50\n * ~5.2s on the release benchmark for the `vg-cli-public` corpus entry.\n * Warm probes still finish inside this window; heavy rebuilds never should.\n */\nexport const REFRESH_BUDGET_MS = 100;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nconst FAILURE_COOLDOWN_MS = 60_000;\n\nexport type RefreshImpl = typeof refreshIfStale;\n\nexport interface GraphSourceTuning {\n probeIntervalMs?: number;\n refreshBudgetMs?: number;\n /**\n * Workspace root for freshness probes. Prefer passing this explicitly —\n * deriving it from `graphPath` via `dirname` twice only works for the legacy\n * `root/.vibgrate/graph.json` layout, not the global branch-keyed store.\n */\n root?: string;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n}\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * Workspace root (project directory). When set, freshness probes and tools\n * use this instead of inferring root from the graph path.\n */\n root?: string;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n /** Project root used for freshness probes and rebuilds. */\n readonly root: string;\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */\n private probeIntervalMs = PROBE_INTERVAL_MS;\n private readonly refreshImpl: RefreshImpl;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing / root overrides (production passes `root`; tests may pass more). */\n private readonly tuning: GraphSourceTuning = {},\n ) {\n // Prefer an explicit root. Fallback assumes legacy `root/.vibgrate/graph.json`\n // (dirname twice); wrong for the global store — callers should pass `root`.\n this.root = tuning.root ?? path.dirname(path.dirname(graphPath));\n this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n const stat = fs.statSync(this.graphPath); // throws if missing → surfaced as tool error\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n // Prefer SQLite reconstruct when corpusHash matches (scale past JSON parse).\n const preferred = loadGraphPreferIndex(this.root, this.graphPath);\n this.cached = preferred\n ? preferred.graph\n : parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh. Never throws — a refresh problem must\n * degrade to \"answer from the current map\", not break the tool call.\n */\n private async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;\n if (now < this.failedUntil || now - this.lastProbeAt < interval) return;\n this.lastProbeAt = now;\n this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath })\n .then((r) => {\n if (r.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n // Self-tune off the full wall cost of *every* outcome — including a\n // multi-second incremental rebuild. Previously only probe-only\n // outcomes (fresh/no-snapshot/locked) backed off, so a 20s rebuild\n // of a large repo re-armed after the 2s floor and every sequential\n // tool call blocked on the refresh budget for the whole suite.\n const cost =\n r.status === 'refreshed' && typeof r.ms === 'number' ? Math.max(r.ms, Date.now() - now) : Date.now() - now;\n this.probeIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.tuning.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // Prefer GraphSource's explicit root (set by serve from the project cwd).\n const root = opts.root ?? source.root;\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n return renderToolResult(result);\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.(); // never keep the server process alive just for the budget timer\n });\n}\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n switch (format) {\n case 'json':\n return serializeGraph(ctx.graph);\n case 'md':\n return renderReport(ctx.graph);\n case 'html':\n return renderHtml(ctx.graph);\n case 'ndjson':\n return ndjson(ctx.graph);\n case 'graphml':\n return graphml(ctx.graph);\n case 'dot':\n return dot(ctx.graph);\n case 'cypher':\n return cypher(ctx.graph);\n case 'sql':\n return sql(ctx);\n case 'cyclonedx':\n return cyclonedx(ctx);\n case 'spdx':\n return spdx(ctx);\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) — only with a --deep build.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
|