@vibgrate/cli 2026.727.4 → 2026.728.3
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 +3 -3
- package/dist/baseline-PPZJBYAJ.js +8 -0
- package/dist/{baseline-ENCOSJYQ.js.map → baseline-PPZJBYAJ.js.map} +1 -1
- package/dist/{chunk-T3AYRS7J.js → chunk-3BIRGSRS.js} +3 -3
- package/dist/{chunk-T3AYRS7J.js.map → chunk-3BIRGSRS.js.map} +1 -1
- package/dist/{chunk-YKVH2PGF.js → chunk-57QU36P6.js} +94 -142
- package/dist/chunk-57QU36P6.js.map +1 -0
- package/dist/{chunk-FPEOIS7K.js → chunk-6GRLZ4Z2.js} +12 -9
- package/dist/chunk-6GRLZ4Z2.js.map +1 -0
- package/dist/{chunk-K7REHDQS.js → chunk-6HX47EBL.js} +25 -19
- package/dist/chunk-6HX47EBL.js.map +1 -0
- package/dist/{chunk-KKRSQQ3A.js → chunk-7AVYKZEM.js} +4 -4
- package/dist/{chunk-KKRSQQ3A.js.map → chunk-7AVYKZEM.js.map} +1 -1
- package/dist/{chunk-MAUJTPQW.js → chunk-A2IYFNCQ.js} +24 -62
- package/dist/chunk-A2IYFNCQ.js.map +1 -0
- package/dist/{chunk-3SDV6ADQ.js → chunk-CQDUBAQY.js} +3 -3
- package/dist/{chunk-3SDV6ADQ.js.map → chunk-CQDUBAQY.js.map} +1 -1
- package/dist/{chunk-77LYGXBI.js → chunk-JRAGO6OB.js} +3 -3
- package/dist/{chunk-77LYGXBI.js.map → chunk-JRAGO6OB.js.map} +1 -1
- package/dist/{chunk-PVZBYZZR.js → chunk-NZELMYT4.js} +27 -6
- package/dist/chunk-NZELMYT4.js.map +1 -0
- package/dist/chunk-OSD546W7.js +167 -0
- package/dist/chunk-OSD546W7.js.map +1 -0
- package/dist/{chunk-GYSOQH5C.js → chunk-OV4KGXPD.js} +30 -4
- package/dist/chunk-OV4KGXPD.js.map +1 -0
- package/dist/{chunk-XPJZTSY7.js → chunk-R2QNFXE5.js} +3 -3
- package/dist/{chunk-XPJZTSY7.js.map → chunk-R2QNFXE5.js.map} +1 -1
- package/dist/{chunk-PXHNTC6D.js → chunk-SIPGDJT4.js} +3 -3
- package/dist/{chunk-PXHNTC6D.js.map → chunk-SIPGDJT4.js.map} +1 -1
- package/dist/{chunk-YCJIIGLP.js → chunk-SZSNPXSW.js} +4 -4
- package/dist/{chunk-YCJIIGLP.js.map → chunk-SZSNPXSW.js.map} +1 -1
- package/dist/chunk-UZJS7GMK.js +57 -0
- package/dist/chunk-UZJS7GMK.js.map +1 -0
- package/dist/{chunk-LJP2EPKM.js → chunk-VI4ITXHQ.js} +4 -4
- package/dist/{chunk-LJP2EPKM.js.map → chunk-VI4ITXHQ.js.map} +1 -1
- package/dist/{chunk-HYRAILGM.js → chunk-VYGEOOLY.js} +3 -3
- package/dist/{chunk-HYRAILGM.js.map → chunk-VYGEOOLY.js.map} +1 -1
- package/dist/{chunk-R6ZRVVZT.js → chunk-WH2N22S3.js} +3 -3
- package/dist/{chunk-R6ZRVVZT.js.map → chunk-WH2N22S3.js.map} +1 -1
- package/dist/{chunk-KXSKFQMI.js → chunk-YF43FOPP.js} +5 -5
- package/dist/chunk-YF43FOPP.js.map +1 -0
- package/dist/cli.js +531 -142
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/{interactive-SMHVURYK.js → interactive-OCWQ326U.js} +18 -17
- package/dist/interactive-OCWQ326U.js.map +1 -0
- package/dist/{llm-host-7GWDO6IX.js → llm-host-XYBT4267.js} +4 -4
- package/dist/{llm-host-7GWDO6IX.js.map → llm-host-XYBT4267.js.map} +1 -1
- package/dist/model-manager-LB54VSV7.js +10 -0
- package/dist/{model-manager-PN7HEDXD.js.map → model-manager-LB54VSV7.js.map} +1 -1
- package/dist/{model-orchestrator-4VSYP4J4.js → model-orchestrator-4M5FG6MN.js} +3 -3
- package/dist/{model-orchestrator-4VSYP4J4.js.map → model-orchestrator-4M5FG6MN.js.map} +1 -1
- package/dist/resolve-gguf-4AFRN4CP.js +9 -0
- package/dist/{resolve-gguf-Y6FH3CNB.js.map → resolve-gguf-4AFRN4CP.js.map} +1 -1
- package/dist/{runtime-session-4AMZIAAG.js → runtime-session-EJQZXANB.js} +5 -5
- package/dist/{runtime-session-4AMZIAAG.js.map → runtime-session-EJQZXANB.js.map} +1 -1
- package/dist/{session-W3646AOV.js → session-ZJGENHKX.js} +6 -5
- package/dist/{session-W3646AOV.js.map → session-ZJGENHKX.js.map} +1 -1
- package/dist/{stream-json-X7UQFB4T.js → stream-json-Z5KC2DM3.js} +6 -5
- package/dist/stream-json-Z5KC2DM3.js.map +1 -0
- package/dist/{vgd-CVLKBS7K.js → vgd-3MHSB4KA.js} +4 -4
- package/dist/vgd-3MHSB4KA.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-ENCOSJYQ.js +0 -8
- package/dist/chunk-FPEOIS7K.js.map +0 -1
- package/dist/chunk-GYSOQH5C.js.map +0 -1
- package/dist/chunk-K7REHDQS.js.map +0 -1
- package/dist/chunk-KUIBP3LU.js +0 -101
- package/dist/chunk-KUIBP3LU.js.map +0 -1
- package/dist/chunk-KXSKFQMI.js.map +0 -1
- package/dist/chunk-MAUJTPQW.js.map +0 -1
- package/dist/chunk-PVZBYZZR.js.map +0 -1
- package/dist/chunk-YKVH2PGF.js.map +0 -1
- package/dist/interactive-SMHVURYK.js.map +0 -1
- package/dist/model-manager-PN7HEDXD.js +0 -9
- package/dist/resolve-gguf-Y6FH3CNB.js +0 -9
- package/dist/stream-json-X7UQFB4T.js.map +0 -1
- package/dist/vgd-CVLKBS7K.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-
|
|
1
|
+
import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-YF43FOPP.js';
|
|
2
2
|
import { c, info, json, out } from './chunk-CT5BS56U.js';
|
|
3
|
-
import { resolveGgufPath } from './chunk-
|
|
4
|
-
import { managerFromProviderId, formatManagerBadgeLine } from './chunk-
|
|
5
|
-
import { usageError, buildGraph, UsageError, ResourceLimitError, CliError, ExitCode, writeSnapshot, refreshInstalledInstructions, SMALL_REPO_FILES, epistemicBreakdown, verifyDeterminism } from './chunk-
|
|
6
|
-
import { VERSION, brandProgressBar, resolveHead, workingTreeDirty } from './chunk-
|
|
3
|
+
import { resolveGgufPath } from './chunk-7AVYKZEM.js';
|
|
4
|
+
import { managerFromProviderId, formatManagerBadgeLine } from './chunk-SZSNPXSW.js';
|
|
5
|
+
import { usageError, buildGraph, UsageError, ResourceLimitError, CliError, ExitCode, writeSnapshot, refreshInstalledInstructions, SMALL_REPO_FILES, epistemicBreakdown, verifyDeterminism } from './chunk-57QU36P6.js';
|
|
6
|
+
import { VERSION, brandProgressBar, resolveHead, workingTreeDirty } from './chunk-3BIRGSRS.js';
|
|
7
7
|
import { resolveEmbedModel, isModelReady, countPending } from './chunk-6UK6QPTR.js';
|
|
8
|
-
import { discoverModels } from './chunk-
|
|
8
|
+
import { discoverModels } from './chunk-CQDUBAQY.js';
|
|
9
9
|
import { writeArtifacts, renderHtml, renderReport, loadGraph } from './chunk-B3YUO3NW.js';
|
|
10
10
|
import { serializeGraph } from './chunk-ZKNB4YH4.js';
|
|
11
11
|
import { canonicalize } from './chunk-JFGYT6BI.js';
|
|
@@ -754,7 +754,7 @@ function resolveProviders(opts, deps = {}) {
|
|
|
754
754
|
const providers = [new MockProvider(opts.model ?? "mock-1", opts.mockReply)];
|
|
755
755
|
return finish(providers, "mock provider (scripted, offline)");
|
|
756
756
|
}
|
|
757
|
-
if (opts.codeMode && !opts.provider) {
|
|
757
|
+
if (opts.codeMode && (!opts.provider || opts.provider === "llama-cpp" || opts.provider === "vibgrate")) {
|
|
758
758
|
const gguf = resolveGgufPath({
|
|
759
759
|
modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,
|
|
760
760
|
modelRef: opts.model,
|
|
@@ -774,6 +774,9 @@ function resolveProviders(opts, deps = {}) {
|
|
|
774
774
|
}
|
|
775
775
|
if (opts.provider) {
|
|
776
776
|
const provider = buildExplicit(opts.provider, opts, env, discover);
|
|
777
|
+
if (opts.codeMode) {
|
|
778
|
+
return finish([provider], `Code Mode \u2192 explicit --provider ${opts.provider} (no auto-fallback)`);
|
|
779
|
+
}
|
|
777
780
|
const fallbacks = opts.local || provider.local ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === "lmstudio" }) : [];
|
|
778
781
|
return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);
|
|
779
782
|
}
|
|
@@ -912,5 +915,5 @@ function basename2(p) {
|
|
|
912
915
|
}
|
|
913
916
|
|
|
914
917
|
export { DSSE_PAYLOAD_TYPE, ProgressBar, applyGlobalOptions, dssePae, fetchCatalog, generateKeypair, keyId, printCodeLogo, printLogo, readGlobal, registerBuild, resolveProviders, runBuild, sha256Hex, topProviders };
|
|
915
|
-
//# sourceMappingURL=chunk-
|
|
916
|
-
//# sourceMappingURL=chunk-
|
|
918
|
+
//# sourceMappingURL=chunk-6GRLZ4Z2.js.map
|
|
919
|
+
//# sourceMappingURL=chunk-6GRLZ4Z2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/logo.ts","../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts","../src/code/catalog.ts","../src/code/router.ts"],"names":["crypto2","resolve","path2","rel","fs2","path3","out","fs3","basename","locals"],"mappings":"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","file":"chunk-6GRLZ4Z2.js","sourcesContent":["import { c } from './output.js';\nimport { VERSION } from '../version.js';\n\n/**\n * The `vg` brand banner — the same boxy robot mark and brand colours (teal/mint)\n * as the Vibgrate scanner (`vibgrate-cli/src/ui/progress.ts`), replicated here so\n * the open graph package stays standalone.\n *\n * The wordmark is stacked BELOW the mark rather than beside it: the robot's eye\n * (`◼`) and arrow (`➜`) glyphs are East-Asian \"ambiguous\"/wide, so terminals that\n * render them double-width make the rows unequal — text placed to their right\n * (the scanner's layout) then misaligns. Nothing sits beside the art here, so the\n * banner lines up in every terminal. Shown on `vg build` for a human at a TTY;\n * never on `--json`, `--quiet`, or under a pipe.\n */\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\n// ── Boxy robot mark — identical glyphs/colours to the scanner's ROBOT ──\nconst ROBOT = [\n ' ' + teal('╭──────╮') + mint('➜'),\n ' ' + c.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + c.dim('├'),\n ' ' + c.dim('┤') + teal('│') + ' ' + c.dim('▁▁') + ' ' + teal('│') + c.dim('├'),\n ' ' + teal('╰──────╯'),\n] as const;\n\n/**\n * The banner as lines (no I/O) so it is unit-testable. The robot mark is a\n * self-contained block; the wordmark/tagline sit on their OWN lines beneath it\n * (never beside the variable-width glyphs), so the banner aligns in any terminal.\n */\nexport function logoLines(root?: string, opts: { product?: string; tagline?: string } = {}): string[] {\n const product = opts.product ?? 'Graph';\n const tagline = opts.tagline ?? 'Code Intelligence Engine';\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('Vibgrate')} ${teal(product)} ${c.dim(`· ${tagline} · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the banner to stderr, only for an interactive human (TTY). */\nexport function printLogo(root?: string, opts: { product?: string; tagline?: string } = {}): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${logoLines(root, opts).join('\\n')}\\n`);\n}\n\n/**\n * The **VG Code** banner (the approved marketing name for the code-editing\n * capability; see docs/NAMING-AND-MARKETING-STRATEGY.md). Same robot mark, but\n * the wordmark reads \"VG Code\" rather than \"Vibgrate Graph\".\n */\nexport function codeLogoLines(root?: string): string[] {\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('VG')} ${teal('Code')} ${c.dim(`· graph-grounded coding · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the VG Code banner to stderr, only for an interactive human (TTY). */\nexport function printCodeLogo(root?: string): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${codeLogoLines(root).join('\\n')}\\n`);\n}\n","import * as crypto from 'node:crypto';\nimport { canonicalize } from './hash.js';\nimport { VERSION } from '../version.js';\nimport type { Toolchain, VgGraph } from '../schema.js';\n\n/**\n * `vg attest` — a signed, reproducible attestation over the code graph.\n *\n * This is the moat made load-bearing: a consumer can cryptographically verify,\n * offline, that a graph was produced by a named toolchain over a named commit and\n * has not changed since. We sign an in-toto Statement wrapped in a DSSE envelope\n * with Ed25519 (`node:crypto`, zero dependencies) — interoperable with\n * `cosign verify-blob-attestation`. Ed25519 signatures are deterministic\n * (RFC 8032), so the same graph + key produce a byte-identical envelope.\n *\n * The subject digest excludes the graph's volatile `generatedAt`, so it is\n * reproducible across rebuilds of identical content — which is exactly what makes\n * the attestation verifiable rather than a timestamped snapshot.\n */\n\nexport const DSSE_PAYLOAD_TYPE = 'application/vnd.in-toto+json';\nexport const IN_TOTO_STATEMENT_TYPE = 'https://in-toto.io/Statement/v1';\nexport const VG_PREDICATE_TYPE = 'https://vibgrate.com/attestation/code-graph/v1';\n\nexport interface CommitInfo {\n sha?: string;\n shortSha?: string;\n branch?: string;\n dirty?: boolean; // uncommitted changes vs sha — never verified-clean when true\n}\n\nexport interface AttestPredicate {\n tool: { name: 'vg'; version: string };\n toolchain?: Toolchain;\n corpusHash: string;\n graphDigest: string; // sha256 of the canonical graph (generatedAt excluded)\n counts: VgGraph['meta']['counts'];\n commit?: CommitInfo;\n sbomDigest?: string; // sha256 of an accompanying SBOM, if attested together\n timestamp?: string; // optional, opt-in (omitted by default for determinism)\n}\n\nexport interface InTotoStatement {\n _type: string;\n subject: { name: string; digest: { sha256: string } }[];\n predicateType: string;\n predicate: AttestPredicate;\n}\n\nexport interface DsseSignature {\n keyid: string;\n sig: string; // base64\n publicKey?: string; // PEM, embedded so the envelope self-verifies for integrity\n}\n\nexport interface DsseEnvelope {\n payloadType: string;\n payload: string; // base64 of the Statement JSON\n signatures: DsseSignature[];\n}\n\nexport function sha256Hex(input: string | Uint8Array): string {\n return crypto.createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * sha256 over the canonical graph with the volatile `generatedAt` excluded, so\n * two builds of identical content attest to the same digest.\n */\nexport function graphSubjectDigest(graph: VgGraph): string {\n const { generatedAt: _omit, ...rest } = graph;\n return sha256Hex(canonicalize(rest));\n}\n\n/** The 16-hex key id: a truncated sha256 over the SPKI DER public key. */\nexport function keyId(publicKey: crypto.KeyObject): string {\n return sha256Hex(publicKey.export({ type: 'spki', format: 'der' })).slice(0, 16);\n}\n\nexport interface StatementInput {\n commit?: CommitInfo;\n sbomDigest?: string;\n timestamp?: string;\n}\n\nexport function buildStatement(graph: VgGraph, input: StatementInput = {}): InTotoStatement {\n const graphDigest = graphSubjectDigest(graph);\n const predicate: AttestPredicate = {\n tool: { name: 'vg', version: VERSION },\n toolchain: graph.provenance.toolchain,\n corpusHash: graph.provenance.corpusHash,\n graphDigest,\n counts: graph.meta.counts,\n };\n if (input.commit) predicate.commit = input.commit;\n if (input.sbomDigest) predicate.sbomDigest = input.sbomDigest;\n if (input.timestamp) predicate.timestamp = input.timestamp;\n return {\n _type: IN_TOTO_STATEMENT_TYPE,\n subject: [{ name: 'graph.json', digest: { sha256: graphDigest } }],\n predicateType: VG_PREDICATE_TYPE,\n predicate,\n };\n}\n\n/**\n * DSSE Pre-Authentication Encoding:\n * \"DSSEv1\" SP len(type) SP type SP len(body) SP body\n * with lengths as ASCII decimal byte counts. Signing the PAE (not the raw body)\n * is what binds the payloadType to the signature.\n */\nexport function dssePae(payloadType: string, body: Uint8Array): Buffer {\n const typeBytes = Buffer.from(payloadType, 'utf8');\n const header = Buffer.from(\n `DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `,\n 'utf8',\n );\n return Buffer.concat([header, Buffer.from(body)]);\n}\n\n/** Sign a statement, returning a self-contained DSSE envelope. */\nexport function signStatement(statement: InTotoStatement, privateKey: crypto.KeyObject): DsseEnvelope {\n const body = Buffer.from(JSON.stringify(statement), 'utf8');\n const pae = dssePae(DSSE_PAYLOAD_TYPE, body);\n const sig = crypto.sign(null, pae, privateKey);\n // Derive the public key from the private key (via its PEM, for @types/node compat).\n const publicKey = crypto.createPublicKey(privateKey.export({ type: 'pkcs8', format: 'pem' }).toString());\n return {\n payloadType: DSSE_PAYLOAD_TYPE,\n payload: body.toString('base64'),\n signatures: [\n {\n keyid: keyId(publicKey),\n sig: sig.toString('base64'),\n publicKey: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n },\n ],\n };\n}\n\nexport type AttestStatus = 'verified' | 'signature-valid' | 'failed';\n\nexport interface VerifyResult {\n status: AttestStatus;\n signatureValid: boolean;\n signerPinned: boolean; // signature verified against a caller-supplied trusted key\n digestMatches?: boolean; // recomputed graph digest matches the attested one\n dirty?: boolean; // the attested commit had uncommitted changes\n keyid: string;\n reason: string;\n statement: InTotoStatement;\n}\n\n/**\n * Verify an envelope. Honest states, never a fabricated pass:\n * failed — bad signature, or the on-disk graph no longer matches.\n * signature-valid — cryptographically intact, but signer not pinned (or dirty).\n * verified — pinned signer + matching digest + clean tree.\n */\n/** An empty statement for results where the envelope could not even be parsed. */\nfunction emptyStatement(): InTotoStatement {\n return {\n _type: '',\n subject: [],\n predicateType: '',\n predicate: {\n tool: { name: 'vg', version: '' },\n corpusHash: '',\n graphDigest: '',\n counts: { nodes: 0, edges: 0, areas: 0, tests: 0, untested: 0 },\n },\n };\n}\n\nfunction failedResult(reason: string): VerifyResult {\n return {\n status: 'failed',\n signatureValid: false,\n signerPinned: false,\n keyid: '',\n reason,\n statement: emptyStatement(),\n };\n}\n\nexport function verifyEnvelope(\n env: DsseEnvelope,\n opts: { publicKeyPem?: string; graph?: VgGraph } = {},\n): VerifyResult {\n // A `.intoto.jsonl` is attacker-supplied input: every decode/parse/key step\n // must degrade to an honest `failed`, never crash the command.\n let body: Buffer;\n let statement: InTotoStatement;\n try {\n body = Buffer.from(env?.payload ?? '', 'base64');\n const parsed = JSON.parse(body.toString('utf8')) as InTotoStatement;\n if (!parsed || typeof parsed !== 'object' || !parsed.predicate) {\n throw new Error('missing predicate');\n }\n statement = parsed;\n } catch {\n return failedResult('malformed attestation payload (not a valid in-toto statement)');\n }\n\n const pae = dssePae(env.payloadType, body);\n const sig0 = env.signatures?.[0];\n const keyid = sig0?.keyid ?? '';\n const sig = sig0?.sig ? Buffer.from(sig0.sig, 'base64') : Buffer.alloc(0);\n\n let signatureValid = false;\n let signerPinned = false;\n try {\n if (sig0 && sig.length) {\n if (opts.publicKeyPem) {\n const pinnedKey = crypto.createPublicKey(opts.publicKeyPem);\n signatureValid = crypto.verify(null, pae, pinnedKey, sig);\n signerPinned = signatureValid;\n } else if (sig0.publicKey) {\n const embeddedKey = crypto.createPublicKey(sig0.publicKey);\n signatureValid = crypto.verify(null, pae, embeddedKey, sig);\n }\n }\n } catch {\n // Malformed key or signature bytes → not a valid signature (not a crash).\n signatureValid = false;\n signerPinned = false;\n }\n\n const digestMatches = opts.graph\n ? graphSubjectDigest(opts.graph) === statement.predicate.graphDigest\n : undefined;\n const dirty = statement.predicate.commit?.dirty;\n\n let status: AttestStatus;\n let reason: string;\n if (!signatureValid) {\n status = 'failed';\n reason = sig0 ? 'signature verification failed' : 'no signature in envelope';\n } else if (digestMatches === false) {\n status = 'failed';\n reason = 'graph.json no longer matches the attested digest (content changed since signing)';\n } else if (signerPinned && !dirty) {\n status = 'verified';\n reason =\n digestMatches === true\n ? 'signature valid, signer trusted, graph digest matches'\n : 'signature valid, signer trusted';\n } else {\n status = 'signature-valid';\n reason = dirty\n ? 'signature valid but the attested tree was dirty (uncommitted changes)'\n : 'signature valid but signer not pinned — pass --pub to establish trust';\n }\n\n return { status, signatureValid, signerPinned, digestMatches, dirty, keyid, reason, statement };\n}\n\nexport interface GeneratedKeypair {\n privatePem: string;\n publicPem: string;\n keyid: string;\n}\n\n/** Mint a fresh Ed25519 keypair for signing attestations. */\nexport function generateKeypair(): GeneratedKeypair {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');\n return {\n privatePem: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),\n publicPem: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n keyid: keyId(publicKey),\n };\n}\n\n/** Serialize an envelope as a single-line `.intoto.jsonl` record (deterministic). */\nexport function serializeEnvelope(env: DsseEnvelope): string {\n return `${JSON.stringify(env)}\\n`;\n}\n\nexport function parseEnvelope(text: string): DsseEnvelope {\n const line = text.trim().split('\\n')[0];\n return JSON.parse(line) as DsseEnvelope;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { execFile } from 'node:child_process';\nimport { loadGraph } from '../engine/load.js';\nimport { resolveHead, workingTreeDirty } from '../core-open/utils/git-history.js';\nimport {\n buildStatement,\n signStatement,\n verifyEnvelope,\n generateKeypair,\n serializeEnvelope,\n parseEnvelope,\n type CommitInfo,\n type VerifyResult,\n} from '../engine/attest.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Attestation actions folded into the graph lifecycle: `vg build --attest` signs\n * the graph it just built; `vg build --verify` checks a committed attestation.\n * The crypto lives in engine/attest.ts; this is the file/key/git glue + output.\n */\n\nconst DEFAULT_ATTESTATION = 'attestation.intoto.jsonl';\nconst DEFAULT_KEY = 'attest-key.pem';\n\nexport interface SignOpts {\n /** Signing key PEM path; else $VG_ATTEST_KEY; else .vibgrate/attest-key.pem (auto-minted). */\n key?: string;\n /** Output path for the attestation (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n}\n\nexport interface SignSummary {\n keyid: string;\n graphDigest: string;\n fingerprint?: string;\n commit?: CommitInfo;\n out: string;\n keyGeneratedAt?: string;\n}\n\n/** Sign an already-built graph, writing a DSSE attestation. Returns a summary +\n * human notices (the caller decides how to render them alongside build output). */\nexport async function signGraphAttestation(\n root: string,\n graph: VgGraph,\n opts: SignOpts,\n): Promise<{ summary: SignSummary; notices: string[] }> {\n const notices: string[] = [];\n const explicitKey = opts.key ?? process.env.VG_ATTEST_KEY;\n const keyPath = explicitKey ? path.resolve(explicitKey) : path.join(root, '.vibgrate', DEFAULT_KEY);\n\n let keyGeneratedAt: string | undefined;\n if (!fs.existsSync(keyPath)) {\n if (explicitKey) {\n throw new CliError(`signing key not found: ${explicitKey}`, ExitCode.USAGE_ERROR);\n }\n // First use with no key: mint one at the default path (loud — it must be kept\n // and gitignored to re-sign reproducibly).\n const kp = generateKeypair();\n fs.mkdirSync(path.dirname(keyPath), { recursive: true });\n fs.writeFileSync(keyPath, kp.privatePem, { mode: 0o600 });\n fs.writeFileSync(`${keyPath}.pub`, kp.publicPem);\n keyGeneratedAt = keyPath;\n notices.push(\n `minted a new Ed25519 signing key at ${rel(root, keyPath)} (keyid ${kp.keyid}) — ` +\n `keep it, add it to .gitignore, and reuse it to re-sign reproducibly`,\n );\n }\n\n let privateKey: crypto.KeyObject;\n try {\n privateKey = crypto.createPrivateKey(fs.readFileSync(keyPath, 'utf8'));\n } catch {\n throw new CliError(`could not read an Ed25519 private key from ${rel(root, keyPath)}`, ExitCode.USAGE_ERROR);\n }\n if (privateKey.asymmetricKeyType !== 'ed25519') {\n throw new CliError(\n `attest requires an Ed25519 key, but ${rel(root, keyPath)} is ${privateKey.asymmetricKeyType ?? 'unknown'}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const commit = await gitCommitInfo(root);\n const statement = buildStatement(graph, { commit });\n const envelope = signStatement(statement, privateKey);\n const outPath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, serializeEnvelope(envelope));\n\n return {\n summary: {\n keyid: envelope.signatures[0]?.keyid ?? '',\n graphDigest: statement.predicate.graphDigest,\n fingerprint: statement.predicate.toolchain?.fingerprint,\n commit,\n out: rel(root, outPath),\n keyGeneratedAt: keyGeneratedAt ? rel(root, keyGeneratedAt) : undefined,\n },\n notices,\n };\n}\n\nexport interface VerifyOpts {\n /** Attestation path (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n /** Public key PEM to pin the signer (else integrity-only verification). */\n pub?: string;\n}\n\nexport interface AttestVerifyOutcome {\n bundlePath: string;\n /** True when no attestation exists at the default path (and none was required). */\n missing: boolean;\n result?: VerifyResult;\n}\n\n/** Verify a committed attestation against the on-disk graph. Returns the outcome\n * (the caller renders + decides the exit code). Throws only when an attestation\n * was explicitly requested but is absent. */\nexport function verifyGraphAttestation(root: string, opts: VerifyOpts): AttestVerifyOutcome {\n const bundlePath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n if (!fs.existsSync(bundlePath)) {\n if (opts.attestation || opts.pub) {\n throw new CliError(\n `no attestation at ${rel(root, bundlePath)} — sign one with \\`vg build --attest\\``,\n ExitCode.NOT_FOUND,\n );\n }\n return { bundlePath, missing: true };\n }\n const envelope = parseEnvelope(fs.readFileSync(bundlePath, 'utf8'));\n const publicKeyPem = opts.pub ? fs.readFileSync(path.resolve(opts.pub), 'utf8') : undefined;\n const graph = loadGraph(root) ?? undefined;\n return { bundlePath, missing: false, result: verifyEnvelope(envelope, { publicKeyPem, graph }) };\n}\n\nasync function gitCommitInfo(root: string): Promise<CommitInfo | undefined> {\n const sha = await resolveHead(root);\n if (!sha) return undefined;\n const dirty = await workingTreeDirty(root);\n const branch = await gitBranch(root);\n return { sha, shortSha: sha.slice(0, 7), branch, dirty: dirty === true ? true : dirty === false ? false : undefined };\n}\n\n/** Best-effort current branch name; undefined on detached HEAD or no git. */\nfunction gitBranch(root: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { cwd: root, timeout: 5000, windowsHide: true, encoding: 'utf8' },\n (err, stdout) => {\n if (err) return resolve(undefined);\n const name = String(stdout).trim();\n resolve(name && name !== 'HEAD' ? name : undefined);\n },\n );\n });\n}\n\nfunction rel(root: string, p: string): string {\n const r = path.relative(root, p);\n return r.startsWith('..') ? p : r;\n}\n","import { c } from './output.js';\nimport { brandProgressBar } from '../core-open/ui/bar.js';\n\n/**\n * A small progress bar matching the scanner's style\n * (`vibgrate-core-open/src/ui/progress.ts`): a smooth sub-cell gradient bar\n * (shared `brandProgressBar`), a braille spinner, percent, elapsed and ETA.\n * Renders to **stderr** in place, and only when stderr is a TTY — under a\n * pipe/CI it stays silent so logs aren't polluted.\n */\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst WIDTH = 30;\n\nfunction fmtDuration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n}\n\n/**\n * Pure render of one progress line (no I/O, no clock) so it is unit-testable.\n * `elapsedMs` and `frame` are passed in by the caller.\n */\nexport function formatProgressLine(\n label: string,\n done: number,\n total: number,\n elapsedMs: number,\n frame: number,\n): string {\n const ratio = total > 0 ? Math.min(done / total, 1) : 0;\n const bar = brandProgressBar(ratio, WIDTH);\n const pct = Math.round(ratio * 100);\n const spin = c.cyan(FRAMES[((frame % FRAMES.length) + FRAMES.length) % FRAMES.length]);\n const eta = ratio > 0.02 && ratio < 1 ? ` · eta ${fmtDuration((elapsedMs / ratio) * (1 - ratio))}` : '';\n return ` ${spin} ${label} ${bar} ${c.bold(`${pct}%`)} ${c.dim(`${done}/${total} · ${fmtDuration(elapsedMs)}${eta}`)}`;\n}\n\n/** Live, in-place progress bar on stderr (no-op when stderr isn't a TTY). */\nexport class ProgressBar {\n private readonly start = Date.now();\n private frame = 0;\n private readonly tty = Boolean(process.stderr.isTTY);\n\n constructor(private readonly label: string) {}\n\n update(done: number, total: number): void {\n if (!this.tty) return;\n const line = formatProgressLine(this.label, done, total, Date.now() - this.start, this.frame++);\n process.stderr.write(`\\r\\x1b[2K${line}`);\n }\n\n /** Clear the bar; optionally print a final summary line. */\n done(summary?: string): void {\n if (!this.tty) return;\n process.stderr.write('\\r\\x1b[2K');\n if (summary) process.stderr.write(`${summary}\\n`);\n }\n}\n","import type { Command } from 'commander';\n\n/** Global flags shared across all `vg` commands (VG-CLI-SPEC §1.1). */\nexport interface GlobalOpts {\n /** -C, --cwd <dir> */\n cwd?: string;\n /** --deep */\n deep?: boolean;\n /** --json */\n json?: boolean;\n /** --generated-at <iso> */\n generatedAt?: string;\n /** --graph <file> (override the map path) */\n graph?: string;\n /** --no-cache (commander exposes this as `cache: false`) */\n noCache?: boolean;\n /** --local (never touch the network) */\n local?: boolean;\n /** --quiet */\n quiet?: boolean;\n /**\n * --client <name> — the AI on the other end (e.g. `claude`, `cursor`). When an\n * AI host runs `vg`, passing this lets navigation calls be counted in the local\n * savings ledger with the command-vs-MCP split, so `vg savings` and the opt-in\n * share-stats upload can attribute usage. Counts only; a coarse label, not\n * identity (sanitized before it's recorded). Absent for human-run commands.\n */\n client?: string;\n}\n\n/**\n * Attach the global flags to a command. They live on every subcommand (rather\n * than only the program) so the \"simple as Google\" dispatch can put the command\n * token first and let flags appear in any order after it.\n */\nexport function applyGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>', '.')\n .option('--deep', 'do more: precise resolution, all edges, semantic links')\n .option('--json', 'machine-readable JSON on stdout')\n .option('--generated-at <iso>', 'pin the artifact timestamp for byte-deterministic output')\n .option('--graph <file>', 'override the map path')\n .option('--no-cache', 'full rebuild (ignore the incremental cache)')\n .option('--local', 'never touch the network (lexical-only semantic)')\n .option('--quiet', 'suppress progress output')\n .option('--client <name>', 'identify the AI client (e.g. claude) so navigation calls are counted in vg savings')\n .option('--no-color', 'disable colored output');\n}\n\n/** Read the global subset from a command's parsed options. */\nexport function readGlobal(cmd: Command): GlobalOpts {\n // `optsWithGlobals()`, not `opts()`: a global flag (e.g. `--json`) declared on\n // both a command and its parent binds to the parent in commander, so a nested\n // subcommand (`vg models uninstall … --json`) would otherwise never see it.\n const o = cmd.optsWithGlobals() as Record<string, unknown>;\n return {\n cwd: o.cwd as string | undefined,\n deep: o.deep as boolean | undefined,\n json: o.json as boolean | undefined,\n generatedAt: o.generatedAt as string | undefined,\n graph: o.graph as string | undefined,\n noCache: o.cache === false,\n local: o.local as boolean | undefined,\n quiet: o.quiet as boolean | undefined,\n client: o.client as string | undefined,\n };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { verifyDeterminism } from '../engine/verify.js';\nimport { epistemicBreakdown } from '../engine/epistemic.js';\nimport { signGraphAttestation, verifyGraphAttestation, type SignSummary } from './attest-actions.js';\nimport { isModelReady, countPending, resolveEmbedModel } from '../engine/embeddings.js';\nimport type { VgGraph } from '../schema.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshInstalledInstructions, SMALL_REPO_FILES } from '../install/registry.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { renderReport } from '../engine/report.js';\nimport { renderHtml } from '../engine/html.js';\nimport { UsageError } from '../engine/discover.js';\nimport { ResourceLimitError } from '../engine/limits.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, out, json } from '../util/output.js';\nimport { printLogo } from '../util/logo.js';\nimport { ProgressBar } from '../util/progress.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\ninterface BuildCmdOpts {\n only?: string;\n exclude?: string[];\n html?: boolean;\n report?: boolean;\n ground?: boolean;\n jobs?: string;\n scip?: string | boolean;\n tsc?: boolean;\n export?: string;\n warm?: boolean;\n grammars?: string;\n fast?: boolean;\n index?: boolean;\n analysisTier?: string;\n attest?: boolean;\n verify?: boolean;\n attestKey?: string;\n attestation?: string;\n pub?: string;\n}\n\nexport function registerBuild(program: Command): void {\n const cmd = program\n .command('build')\n .description('build / update the code map (incremental, deterministic)')\n .argument('[paths...]', 'folders or files to map (default: current folder)')\n .option('--only <langs>', 'restrict to languages, e.g. ts,py,go')\n .option('--exclude <glob>', 'extra ignore glob (repeatable)', collect, [])\n .option('--no-html', 'do not write graph.html')\n .option('--no-report', 'do not write GRAPH_REPORT.md')\n .option('--no-ground', 'do not attach grounding (Phase 2)')\n .option('--jobs <n>', 'worker count (1 = single-threaded)')\n .option('--scip <file>', 'ingest a SCIP index for precise resolution (default: auto-detect index.scip)')\n .option('--no-scip', 'ignore any SCIP index')\n .option('--no-tsc', 'skip the in-process TypeScript resolver (heuristic floor only)')\n .option('--fast', 'skip precise tsc resolve (heuristic only — faster XL cold builds)')\n .option('--no-index', 'do not write the SQLite serve index under .vibgrate/cache/')\n .option('--analysis-tier <tier>', 'force analysis tier: full | large | xl (default: auto)')\n .option('--no-warm', 'do not warm the semantic index in the background after building')\n .option('--grammars <dir>', 'directory of grammar .wasm files (offline / air-gapped)')\n .option('-o, --export <file>', 'also write the map to a file (format inferred)')\n .option('--attest', 'sign the built graph → .vibgrate/attestation.intoto.jsonl')\n .option('--verify', 'verify a committed attestation against the graph (no rebuild)')\n .option('--attest-key <path>', 'signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)')\n .option('--attestation <file>', 'attestation path (out for --attest, in for --verify)')\n .option('--pub <path>', 'public key PEM to pin the signer (with --verify)')\n .action(async function (this: Command, paths: string[], opts: BuildCmdOpts) {\n await runBuild(paths, opts, readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n\n // `vg build --verify`: the single verification entry point — determinism\n // self-check plus (if present) attestation verification.\n if (opts.verify) {\n await verifyGraph(root, opts, global);\n return;\n }\n\n // Brand banner + live parse progress for an interactive human while the index\n // builds (TTY only; both are no-ops under --json/--quiet/pipe so machine output\n // stays clean).\n const interactive = !global.json && !global.quiet;\n if (interactive) printLogo(path.basename(root) || root);\n const bar = interactive ? new ProgressBar(c.dim('parsing')) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n if (jobs !== undefined && (!Number.isInteger(jobs) || jobs < 1)) {\n throw usageError(`--jobs must be a positive integer (got \"${opts.jobs}\")`);\n }\n\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const tierRaw = opts.analysisTier?.toLowerCase();\n const analysisTier =\n tierRaw === 'full' || tierRaw === 'large' || tierRaw === 'xl' ? tierRaw : undefined;\n if (opts.analysisTier && !analysisTier) {\n throw usageError(`--analysis-tier must be full, large, or xl (got \"${opts.analysisTier}\")`);\n }\n let result;\n try {\n result = await buildGraph({\n root,\n paths: paths.length ? paths : undefined,\n only,\n exclude: opts.exclude,\n jobs,\n noCache: global.noCache,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n fast: opts.fast === true,\n noIndex: opts.index === false,\n analysisTier,\n generatedAt: global.generatedAt,\n onParseProgress: bar ? (done, total) => bar.update(done, total) : undefined,\n grammarsDir: opts.grammars,\n });\n } catch (err) {\n bar?.done();\n if (err instanceof UsageError) throw usageError(err.message);\n // A resource safeguard fired (file-count cap, heap budget, worker OOM) —\n // the message already carries the remedy; surface it without a stack.\n if (err instanceof ResourceLimitError) throw new CliError(err.message, ExitCode.ERROR);\n throw err;\n }\n bar?.done();\n\n const written = writeArtifacts(result.graph, {\n root,\n html: opts.html,\n report: opts.report,\n graphPath: global.graph,\n });\n\n // Record the freshness snapshot (stat+hash per corpus file, plus this build's\n // scope) so `vg serve`/`vg ask` can auto-refresh the map when the tree drifts.\n // Skipped for a custom --graph target: that is an explicit artifact the\n // auto-refresh machinery must not manage.\n if (!global.graph) {\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, {\n only,\n exclude: opts.exclude,\n paths: paths.length ? paths : undefined,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n grammarsDir: opts.grammars,\n });\n }\n\n if (opts.export) writeExport(result.graph, opts.export);\n\n // Bring previously-installed assistant instructions (skill/nudge files from\n // `vg install`) up to the current content version — so evolved instructions\n // reach this repo the first time a new CLI builds here. Only files carrying\n // vg's own version marker (or the exact legacy generated content) are\n // touched; a custom --graph build is an explicit artifact and skips this.\n if (!global.graph) {\n const fileCount = result.graph.nodes.filter((n) => n.kind === 'file').length;\n const refreshed = refreshInstalledInstructions(root, fileCount > 0 && fileCount < SMALL_REPO_FILES);\n if (interactive) {\n for (const r of refreshed) {\n info(c.dim(`vg · refreshed assistant instructions ${r.file} (v${r.from} → v${r.to})`));\n }\n }\n }\n\n // `--attest`: sign the freshly-built graph → .vibgrate/attestation.intoto.jsonl.\n let attestation: SignSummary | undefined;\n const attestNotices: string[] = [];\n if (opts.attest) {\n const signed = await signGraphAttestation(root, result.graph, {\n key: opts.attestKey,\n attestation: opts.attestation,\n });\n attestation = signed.summary;\n attestNotices.push(...signed.notices);\n }\n\n if (global.json) {\n json({\n ok: true,\n counts: result.graph.meta.counts,\n languages: result.graph.meta.languages,\n reparsed: result.reparsed,\n reused: result.reused,\n totalFiles: result.totalFiles,\n resolve: result.resolveStats,\n tsc: result.tsc,\n scip: result.scip,\n epistemic: epistemicBreakdown(result.graph.edges),\n artifacts: written,\n corpusHash: result.graph.provenance.corpusHash,\n toolchain: result.graph.provenance.toolchain,\n attestation,\n timingMs: result.timing.totalMs,\n warnings: result.warnings,\n });\n return;\n }\n\n const { counts } = result.graph.meta;\n const incremental =\n result.reused > 0\n ? `incremental: ${result.reparsed} of ${result.totalFiles} files re-parsed`\n : `${result.totalFiles} files parsed`;\n const seconds = (result.timing.totalMs / 1000).toFixed(2);\n info(`${c.cyan('vg')} · mapped ${rel(root)} in ${seconds}s (${incremental})`);\n info(\n ` nodes ${c.bold(String(counts.nodes))} edges ${c.bold(String(counts.edges))} ` +\n `areas ${counts.areas} langs ${result.graph.meta.languages.join(',') || '—'}`,\n );\n const callPct =\n result.resolveStats.callsResolved + result.resolveStats.callsUnresolved > 0\n ? Math.round(\n (100 * result.resolveStats.callsResolved) /\n (result.resolveStats.callsResolved + result.resolveStats.callsUnresolved),\n )\n : 100;\n // When a precise rung ran it is authoritative; callPct is only the heuristic\n // floor (label it so, to avoid understating the precise result below).\n const precise = result.tsc || result.scip;\n const callLabel = precise ? `heuristic floor ${callPct}%` : `calls resolved ${callPct}%`;\n info(c.dim(` ${callLabel} · resolver ${result.graph.provenance.resolver.join(',')}`));\n if (result.tsc) {\n const jsx = result.tsc.jsx > 0 ? `, ${result.tsc.jsx} JSX` : '';\n info(c.dim(` tsc: ${result.tsc.resolved} precise edges across ${result.tsc.files} TS/JS files (${result.tsc.calls} calls${jsx})`));\n }\n if (result.scip) {\n info(c.dim(` scip: ${result.scip.resolved} precise edges from ${result.scip.tool ?? 'index'} (${result.scip.documents} docs)`));\n }\n const ep = epistemicBreakdown(result.graph.edges);\n info(\n c.dim(\n ` edges by evidence · observed ${ep.observed} · name-matched ${ep['name-matched']} · declared ${ep.declared}`,\n ),\n );\n const artifactList = [written.graphPath, written.htmlPath, written.reportPath]\n .filter(Boolean)\n .map((p) => path.relative(root, p as string))\n .join(' ');\n info(` → ${artifactList}`);\n if (result.warnings.length) {\n info(c.yellow(` ${result.warnings.length} parse warning(s) — run with --json for detail`));\n }\n if (attestation) {\n for (const n of attestNotices) info(c.yellow(` ${n}`));\n info(\n c.dim(\n ` attested · keyid ${attestation.keyid} · digest ${attestation.graphDigest.slice(0, 16)}… → ${attestation.out}`,\n ),\n );\n }\n\n maybeWarmEmbeddings(root, result.graph, global, opts.warm !== false);\n}\n\n/**\n * `vg build --verify` — the single verification entry point. Runs the determinism\n * self-check (byte-identical rebuilds + toolchain fingerprint) and, when an\n * attestation is present, verifies it against the on-disk graph. Exit 4 on a\n * determinism failure, exit 2 on an attestation failure.\n */\nasync function verifyGraph(root: string, opts: BuildCmdOpts, global: GlobalOpts): Promise<void> {\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n const det = await verifyDeterminism({ root, only, exclude: opts.exclude, jobs });\n const attest = verifyGraphAttestation(root, { attestation: opts.attestation, pub: opts.pub });\n const attestFailed = !attest.missing && attest.result?.status === 'failed';\n\n if (global.json) {\n json({\n ok: det.ok && !attestFailed,\n determinism: { ok: det.ok, checks: det.checks, digest: det.digest },\n attestation: attest.missing\n ? null\n : {\n status: attest.result?.status,\n signatureValid: attest.result?.signatureValid,\n signerPinned: attest.result?.signerPinned,\n digestMatches: attest.result?.digestMatches,\n dirty: attest.result?.dirty,\n keyid: attest.result?.keyid,\n reason: attest.result?.reason,\n },\n });\n } else {\n info(`${c.cyan('vg build --verify')} · ${path.relative(process.cwd(), root) || '.'}`);\n for (const check of det.checks) {\n const mark = check.ok ? c.green('✔') : c.red('✘');\n const detail = check.detail ? c.dim(` (${check.detail})`) : '';\n info(` ${mark} ${check.name}${detail}`);\n }\n info(det.ok ? c.green(` deterministic · digest ${det.digest.slice(0, 16)}…`) : c.red(' NON-DETERMINISTIC'));\n if (attest.missing) {\n info(c.dim(` attestation: none (sign one with \\`vg build --attest\\`)`));\n } else {\n const r = attest.result;\n const badge =\n r?.status === 'verified'\n ? c.green('✔ attestation verified')\n : r?.status === 'signature-valid'\n ? c.yellow('~ attestation signature valid')\n : c.red('✘ attestation failed');\n info(` ${badge}${r?.keyid ? c.dim(` · keyid ${r.keyid}`) : ''}`);\n info(c.dim(` ${r?.reason ?? ''}`));\n }\n }\n\n if (!det.ok) throw new CliError('determinism self-check failed', ExitCode.NON_DETERMINISTIC);\n if (attestFailed) throw new CliError('attestation verification failed', ExitCode.GATE_FAILED);\n}\n\n/**\n * After an interactive build we have just committed to a code graph, so the\n * user is likely to run `vg ask`/`vg serve` next — start warming the semantic\n * index in the background now so that first semantic call is instant instead of\n * paying a cold model load. If the model isn't downloaded yet, the background\n * warm fetches it (once, centrally) rather than deferring the whole cost to the\n * first `ask`. Disabled with `--no-warm`; skipped under --json/--quiet/--local\n * and when not at a TTY (so CI never auto-downloads). The detached child runs\n * `vg embed --bg [--download]`; a lock prevents it racing a foreground `ask`.\n */\nfunction maybeWarmEmbeddings(root: string, graph: VgGraph, global: GlobalOpts, warm: boolean): void {\n if (!warm || global.json || global.quiet || global.local) return;\n if (!process.stdout.isTTY && !process.stderr.isTTY) return;\n const cli = process.argv[1];\n if (!cli) return;\n const modelId = resolveEmbedModel();\n const ready = isModelReady(modelId);\n // Already fully warm: model present and every node embedded → nothing to do.\n if (ready && countPending(graph, root, modelId) === 0) return;\n // When the model isn't on this machine yet, start the one-time download now\n // (the graph is built; the next semantic call shouldn't wait for it).\n const args = ready\n ? [cli, 'embed', '-C', root, '--bg']\n : [cli, 'embed', '-C', root, '--bg', '--download'];\n try {\n const child = spawn(process.execPath, args, { detached: true, stdio: 'ignore' });\n child.unref();\n info(\n c.dim(\n ready\n ? ' warming the semantic index in the background — `vg ask` will be instant'\n : ' downloading the semantic model in the background (once) — `vg ask`/`vg serve` will be instant; disable with --no-warm',\n ),\n );\n } catch {\n /* warm-up is best-effort */\n }\n}\n\nfunction writeExport(graph: Parameters<typeof serializeGraph>[0], target: string): void {\n if (target === '-') {\n out(serializeGraph(graph).trimEnd());\n return;\n }\n const ext = path.extname(target).toLowerCase();\n let content: string;\n switch (ext) {\n case '.json':\n content = serializeGraph(graph);\n break;\n case '.md':\n content = renderReport(graph);\n break;\n case '.html':\n content = renderHtml(graph);\n break;\n default:\n throw new CliError(\n `cannot export to \"${ext || target}\" yet — supported in Phase 0: .json, .md, .html, \"-\" (stdout). ` +\n `More formats (graphml, dot, cypher) arrive with \\`vg export\\` in Phase 1.`,\n ExitCode.USAGE_ERROR,\n );\n }\n fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });\n fs.writeFileSync(target, content);\n}\n\nfunction collect(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nfunction rel(root: string): string {\n const r = path.relative(process.cwd(), root);\n return r === '' ? '.' : r;\n}\n","/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['openrouter', 'litellm', 'openai', 'together']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) A configured hosted router key (OpenRouter is the reference best-in-breed router).\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 2) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 3) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(providers: Provider[], reason: string): RouteResult {\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'));\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'));\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));\n throw new CliError(\n `unknown --provider \"${id}\". Known: ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n const config: OpenAiCompatibleConfig = { ...base, id };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
|
|
@@ -63,7 +63,7 @@ function composePromptConstraints(input) {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// src/runtime/llm-host/grammar.ts
|
|
66
|
-
async function attachGrammar(lib, gbnf) {
|
|
66
|
+
async function attachGrammar(lib, gbnf, options = {}) {
|
|
67
67
|
if (!gbnf?.trim()) {
|
|
68
68
|
return { value: null, method: "none", applied: false, reason: "no GBNF provided" };
|
|
69
69
|
}
|
|
@@ -71,14 +71,17 @@ async function attachGrammar(lib, gbnf) {
|
|
|
71
71
|
if (!l) {
|
|
72
72
|
return { value: null, method: "none", applied: false, reason: "no llama binding loaded" };
|
|
73
73
|
}
|
|
74
|
+
const ctorErrors = [];
|
|
74
75
|
if (l.LlamaGrammar) {
|
|
75
76
|
try {
|
|
76
77
|
if (typeof l.LlamaGrammar === "function") {
|
|
77
|
-
let llama;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
let llama = options.llama;
|
|
79
|
+
if (llama === void 0) {
|
|
80
|
+
try {
|
|
81
|
+
llama = typeof l.getLlama === "function" ? await l.getLlama() : void 0;
|
|
82
|
+
} catch {
|
|
83
|
+
llama = void 0;
|
|
84
|
+
}
|
|
82
85
|
}
|
|
83
86
|
const attempts = [
|
|
84
87
|
() => new l.LlamaGrammar(llama, { grammar: gbnf }),
|
|
@@ -89,13 +92,18 @@ async function attachGrammar(lib, gbnf) {
|
|
|
89
92
|
try {
|
|
90
93
|
const g = attempt();
|
|
91
94
|
if (g) return { value: g, method: "LlamaGrammar", applied: true };
|
|
92
|
-
} catch {
|
|
95
|
+
} catch (e) {
|
|
96
|
+
ctorErrors.push(e instanceof Error ? e.message : String(e));
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
if (typeof l.LlamaGrammar.fromString === "function") {
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
try {
|
|
102
|
+
const g = await l.LlamaGrammar.fromString(gbnf);
|
|
103
|
+
if (g) return { value: g, method: "LlamaGrammar", applied: true };
|
|
104
|
+
} catch (e) {
|
|
105
|
+
ctorErrors.push(e instanceof Error ? e.message : String(e));
|
|
106
|
+
}
|
|
99
107
|
}
|
|
100
108
|
} catch (e) {
|
|
101
109
|
return {
|
|
@@ -111,19 +119,16 @@ async function attachGrammar(lib, gbnf) {
|
|
|
111
119
|
const g = await l.createGrammar(gbnf);
|
|
112
120
|
if (g) return { value: g, method: "createGrammar", applied: true };
|
|
113
121
|
} catch (e) {
|
|
114
|
-
|
|
115
|
-
value: null,
|
|
116
|
-
method: "none",
|
|
117
|
-
applied: false,
|
|
118
|
-
reason: `createGrammar failed: ${e instanceof Error ? e.message : String(e)}`
|
|
119
|
-
};
|
|
122
|
+
ctorErrors.push(`createGrammar: ${e instanceof Error ? e.message : String(e)}`);
|
|
120
123
|
}
|
|
121
124
|
}
|
|
125
|
+
const hadApi = !!(l?.LlamaGrammar || typeof l?.createGrammar === "function");
|
|
126
|
+
const reason = hadApi ? `LlamaGrammar/createGrammar present but GBNF was rejected` + (ctorErrors[0] ? ` (${ctorErrors[0].split("\n")[0]})` : "") : "binding has no LlamaGrammar/createGrammar; raw GBNF string is available but not verified as constrained";
|
|
122
127
|
return {
|
|
123
128
|
value: gbnf,
|
|
124
129
|
method: "string-fallback",
|
|
125
130
|
applied: false,
|
|
126
|
-
reason
|
|
131
|
+
reason
|
|
127
132
|
};
|
|
128
133
|
}
|
|
129
134
|
function assertGrammarOrThrow(result, opts = {}) {
|
|
@@ -549,6 +554,7 @@ async function acquireHostSession(lib, modelPath) {
|
|
|
549
554
|
const sess = {
|
|
550
555
|
key,
|
|
551
556
|
lib: l,
|
|
557
|
+
llama,
|
|
552
558
|
modelPath,
|
|
553
559
|
model,
|
|
554
560
|
context,
|
|
@@ -607,7 +613,7 @@ async function generateOnSession(session, messages, extras = {}) {
|
|
|
607
613
|
let draftCandidatesTried = 0;
|
|
608
614
|
let text = "";
|
|
609
615
|
const stringOk = allowGrammarStringFallback(env);
|
|
610
|
-
const grammar = await attachGrammar(session.lib, extras.grammar);
|
|
616
|
+
const grammar = await attachGrammar(session.lib, extras.grammar, { llama: session.llama });
|
|
611
617
|
assertGrammarOrThrow(grammar, {
|
|
612
618
|
requireGrammar: extras.requireGrammar,
|
|
613
619
|
allowStringFallback: stringOk
|
|
@@ -772,5 +778,5 @@ async function tryReuseWarmPrefix(session, segments, plan, caps) {
|
|
|
772
778
|
}
|
|
773
779
|
|
|
774
780
|
export { acquireHostSession, allowGrammarStringFallback, assertGrammarOrThrow, attachDynamicIdentFilter, attachGrammar, buildIdentifierTokenBias, clearHostSessionPool, composePromptConstraints, createIdentStreamState, dropHostSession, dynamicAllowedNextChars, evictIdleSessions, filterTokenTexts, generateOnSession, hostSessionPoolSize, listHostSessions, pickBestDraft, planNextCharMask, probeBindingCapabilities, rankDraftCandidates, sessionKey, stepIdentStream, supportsDynamicIdentSampler, supportsKvPrefixEvaluate, tokenCompatibleWithTrie, trieFingerprint };
|
|
775
|
-
//# sourceMappingURL=chunk-
|
|
776
|
-
//# sourceMappingURL=chunk-
|
|
781
|
+
//# sourceMappingURL=chunk-6HX47EBL.js.map
|
|
782
|
+
//# sourceMappingURL=chunk-6HX47EBL.js.map
|
|
@@ -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-6HX47EBL.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\nexport interface AttachGrammarOptions {\n /**\n * Prefer this llama instance (from the warm session that loaded the model).\n * node-llama-cpp requires LlamaGrammar and the model to share the same instance.\n */\n llama?: unknown;\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(\n lib: unknown,\n gbnf: string | undefined,\n options: AttachGrammarOptions = {},\n): 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 const ctorErrors: string[] = [];\n if (l.LlamaGrammar) {\n try {\n if (typeof l.LlamaGrammar === 'function') {\n let llama: unknown = options.llama;\n if (llama === undefined) {\n try {\n llama = typeof l.getLlama === 'function' ? await l.getLlama() : undefined;\n } catch {\n llama = undefined;\n }\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 (e) {\n ctorErrors.push(e instanceof Error ? e.message : String(e));\n }\n }\n }\n if (typeof l.LlamaGrammar.fromString === 'function') {\n try {\n const g = await l.LlamaGrammar.fromString(gbnf);\n if (g) return { value: g, method: 'LlamaGrammar', applied: true };\n } catch (e) {\n ctorErrors.push(e instanceof Error ? e.message : String(e));\n }\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 ctorErrors.push(`createGrammar: ${e instanceof Error ? e.message : String(e)}`);\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 const hadApi = !!(l?.LlamaGrammar || typeof l?.createGrammar === 'function');\n const reason = hadApi\n ? `LlamaGrammar/createGrammar present but GBNF was rejected` +\n (ctorErrors[0] ? ` (${ctorErrors[0].split('\\n')[0]})` : '')\n : 'binding has no LlamaGrammar/createGrammar; raw GBNF string is available but not verified as constrained';\n return {\n value: gbnf,\n method: 'string-fallback',\n applied: false,\n reason,\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 /** Same getLlama() instance used to load the model — required for LlamaGrammar. */\n llama: 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 llama,\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 // Pass the session's llama instance — LlamaGrammar must share it with the model.\n const grammar = await attachGrammar(session.lib, extras.grammar, { llama: session.llama });\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,5 +1,5 @@
|
|
|
1
|
-
import { discoverModels } from './chunk-
|
|
2
|
-
import { isWeightCached, weightPathForRef, lookupCatalog, listCachedWeights } from './chunk-
|
|
1
|
+
import { discoverModels } from './chunk-CQDUBAQY.js';
|
|
2
|
+
import { isWeightCached, weightPathForRef, lookupCatalog, listCachedWeights } from './chunk-OV4KGXPD.js';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
|
|
@@ -66,5 +66,5 @@ function embeddedLlamaReady(opts = {}) {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
export { embeddedLlamaReady, resolveGgufPath };
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-7AVYKZEM.js.map
|
|
70
|
+
//# sourceMappingURL=chunk-7AVYKZEM.js.map
|