@vibgrate/cli 2026.729.2 → 2026.730.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/DOCS.md +5 -1
  2. package/dist/agent-33BMKWJC.js +22 -0
  3. package/dist/agent-33BMKWJC.js.map +1 -0
  4. package/dist/baseline-V6MYDEMS.js +9 -0
  5. package/dist/{baseline-UOTGTJYT.js.map → baseline-V6MYDEMS.js.map} +1 -1
  6. package/dist/checkpoint-4WFZMKEO.js +56 -0
  7. package/dist/checkpoint-4WFZMKEO.js.map +1 -0
  8. package/dist/chunk-543E6WDJ.js +61 -0
  9. package/dist/chunk-543E6WDJ.js.map +1 -0
  10. package/dist/{chunk-P3QIO4ZU.js → chunk-5G7C6H2G.js} +14 -204
  11. package/dist/chunk-5G7C6H2G.js.map +1 -0
  12. package/dist/{chunk-JIBOJTGS.js → chunk-5HYCB55P.js} +101 -101
  13. package/dist/chunk-5HYCB55P.js.map +1 -0
  14. package/dist/{chunk-67YG3R5F.js → chunk-6D4BCGRQ.js} +6 -62
  15. package/dist/chunk-6D4BCGRQ.js.map +1 -0
  16. package/dist/{chunk-F6ZPUKED.js → chunk-6WNJJXFY.js} +4 -4
  17. package/dist/{chunk-F6ZPUKED.js.map → chunk-6WNJJXFY.js.map} +1 -1
  18. package/dist/{chunk-PXXVLX7K.js → chunk-CFL3QQQZ.js} +7 -6
  19. package/dist/chunk-CFL3QQQZ.js.map +1 -0
  20. package/dist/{chunk-74ZMAOVF.js → chunk-CQDCZQFV.js} +55 -9
  21. package/dist/chunk-CQDCZQFV.js.map +1 -0
  22. package/dist/{chunk-VZRQUI54.js → chunk-DBMYWNLC.js} +4 -4
  23. package/dist/{chunk-VZRQUI54.js.map → chunk-DBMYWNLC.js.map} +1 -1
  24. package/dist/{chunk-QDZ47G45.js → chunk-EKCNSRNJ.js} +20 -11
  25. package/dist/chunk-EKCNSRNJ.js.map +1 -0
  26. package/dist/{chunk-SIPGDJT4.js → chunk-EVLS2M5G.js} +4 -4
  27. package/dist/{chunk-SIPGDJT4.js.map → chunk-EVLS2M5G.js.map} +1 -1
  28. package/dist/{chunk-G4HTI4ZM.js → chunk-FHJBGPJZ.js} +3 -2
  29. package/dist/chunk-FHJBGPJZ.js.map +1 -0
  30. package/dist/{chunk-CYC3ZI32.js → chunk-GLT3N7T2.js} +9 -6
  31. package/dist/chunk-GLT3N7T2.js.map +1 -0
  32. package/dist/chunk-HTLDXEHW.js +60 -0
  33. package/dist/chunk-HTLDXEHW.js.map +1 -0
  34. package/dist/{chunk-GI6W53LM.js → chunk-IDAQV3NQ.js} +4 -2
  35. package/dist/chunk-IDAQV3NQ.js.map +1 -0
  36. package/dist/{chunk-2ZHWF7C6.js → chunk-KGWEBM2J.js} +43 -68
  37. package/dist/chunk-KGWEBM2J.js.map +1 -0
  38. package/dist/{chunk-RZEXHDCF.js → chunk-MYM5VIJ4.js} +14 -3
  39. package/dist/chunk-MYM5VIJ4.js.map +1 -0
  40. package/dist/{chunk-HDQG3QYV.js → chunk-ON7PZNYV.js} +42 -26
  41. package/dist/chunk-ON7PZNYV.js.map +1 -0
  42. package/dist/chunk-Q4UQ73NA.js +6 -0
  43. package/dist/{chunk-WQE4OIZS.js.map → chunk-Q4UQ73NA.js.map} +1 -1
  44. package/dist/{chunk-PMYWZRRS.js → chunk-RBIRXQR6.js} +21 -3
  45. package/dist/chunk-RBIRXQR6.js.map +1 -0
  46. package/dist/{chunk-TCJTQGAO.js → chunk-RGEVBSLK.js} +3 -3
  47. package/dist/{chunk-TCJTQGAO.js.map → chunk-RGEVBSLK.js.map} +1 -1
  48. package/dist/chunk-TJ3WIJ7H.js +216 -0
  49. package/dist/chunk-TJ3WIJ7H.js.map +1 -0
  50. package/dist/chunk-VOEYUAER.js +203 -0
  51. package/dist/chunk-VOEYUAER.js.map +1 -0
  52. package/dist/{chunk-PRGCCW7D.js → chunk-WBMMRERH.js} +3 -3
  53. package/dist/{chunk-PRGCCW7D.js.map → chunk-WBMMRERH.js.map} +1 -1
  54. package/dist/{chunk-6HX47EBL.js → chunk-X634FZVG.js} +3 -3
  55. package/dist/{chunk-6HX47EBL.js.map → chunk-X634FZVG.js.map} +1 -1
  56. package/dist/cli.js +563 -340
  57. package/dist/cli.js.map +1 -1
  58. package/dist/{fs-6JKZNQ3U.js → fs-HNR6LAI7.js} +3 -3
  59. package/dist/fs-HNR6LAI7.js.map +1 -0
  60. package/dist/{graph-backend-GBL33GMW.js → graph-backend-G5Y6QQV4.js} +4 -4
  61. package/dist/{graph-backend-GBL33GMW.js.map → graph-backend-G5Y6QQV4.js.map} +1 -1
  62. package/dist/index.d.ts +1 -1
  63. package/dist/index.js +12 -10
  64. package/dist/index.js.map +1 -1
  65. package/dist/{interactive-HLGJJFLI.js → interactive-NJG6467J.js} +27 -24
  66. package/dist/interactive-NJG6467J.js.map +1 -0
  67. package/dist/{llm-host-5RE34322.js → llm-host-DZBD5D36.js} +5 -5
  68. package/dist/{llm-host-5RE34322.js.map → llm-host-DZBD5D36.js.map} +1 -1
  69. package/dist/load-YPSEDYIW.js +10 -0
  70. package/dist/{load-4MLIHGXF.js.map → load-YPSEDYIW.js.map} +1 -1
  71. package/dist/rules-ASYEUNB5.js +74 -0
  72. package/dist/rules-ASYEUNB5.js.map +1 -0
  73. package/dist/run-outcome-5FQWHWYK.js +253 -0
  74. package/dist/run-outcome-5FQWHWYK.js.map +1 -0
  75. package/dist/runtime-session-Y4ZD3QDO.js +20 -0
  76. package/dist/{runtime-session-5M6QZZOS.js.map → runtime-session-Y4ZD3QDO.js.map} +1 -1
  77. package/dist/{session-2JT4AUZT.js → session-3OBIQLE4.js} +5 -5
  78. package/dist/{session-2JT4AUZT.js.map → session-3OBIQLE4.js.map} +1 -1
  79. package/dist/{stream-json-Y45JBNYP.js → stream-json-3YOPU3LF.js} +82 -10
  80. package/dist/stream-json-3YOPU3LF.js.map +1 -0
  81. package/dist/{vg-mcp-bridge-ZCKBYQ2D.js → vg-mcp-bridge-PZFGTZSA.js} +8 -7
  82. package/dist/vg-mcp-bridge-PZFGTZSA.js.map +1 -0
  83. package/dist/{vgd-TGGEAGQZ.js → vgd-DH7AHQ23.js} +9 -8
  84. package/dist/vgd-DH7AHQ23.js.map +1 -0
  85. package/package.json +1 -1
  86. package/dist/baseline-UOTGTJYT.js +0 -9
  87. package/dist/chunk-2ZHWF7C6.js.map +0 -1
  88. package/dist/chunk-67YG3R5F.js.map +0 -1
  89. package/dist/chunk-74ZMAOVF.js.map +0 -1
  90. package/dist/chunk-CYC3ZI32.js.map +0 -1
  91. package/dist/chunk-G4HTI4ZM.js.map +0 -1
  92. package/dist/chunk-GI6W53LM.js.map +0 -1
  93. package/dist/chunk-HDQG3QYV.js.map +0 -1
  94. package/dist/chunk-JIBOJTGS.js.map +0 -1
  95. package/dist/chunk-P3QIO4ZU.js.map +0 -1
  96. package/dist/chunk-PMYWZRRS.js.map +0 -1
  97. package/dist/chunk-PXXVLX7K.js.map +0 -1
  98. package/dist/chunk-QDZ47G45.js.map +0 -1
  99. package/dist/chunk-RZEXHDCF.js.map +0 -1
  100. package/dist/chunk-WQE4OIZS.js +0 -6
  101. package/dist/fs-6JKZNQ3U.js.map +0 -1
  102. package/dist/interactive-HLGJJFLI.js.map +0 -1
  103. package/dist/load-4MLIHGXF.js +0 -9
  104. package/dist/runtime-session-5M6QZZOS.js +0 -19
  105. package/dist/stream-json-Y45JBNYP.js.map +0 -1
  106. package/dist/vg-mcp-bridge-ZCKBYQ2D.js.map +0 -1
  107. package/dist/vgd-TGGEAGQZ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts","../src/engine/index-db.ts","../src/engine/load.ts"],"names":[],"mappings":"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","file":"chunk-VOEYUAER.js","sourcesContent":["/**\n * The `vg-graph/1.0` on-disk schema.\n *\n * This is vg's own open schema (VG-PACKAGE-AND-SCHEMA.md §4) — informed by good\n * ideas (content-hashed ids, epistemic typing of facts) but standalone and\n * self-contained. Every collection is deterministically serialized\n * (sorted keys, stable element order). These TypeScript shapes are normative.\n */\n\nexport const SCHEMA_VERSION = 'vg-graph/1.0' as const;\n\nexport type ResolverKind = 'scip' | 'stackgraph' | 'tsc' | 'heuristic';\n\n/** Coarse, honest resolution tier for an edge (see engine/epistemic.ts). */\nexport type EpistemicTier = 'observed' | 'name-matched' | 'declared';\n\n/**\n * The toolchain that produced this graph — the reproducibility fingerprint.\n * Everything here deterministically affects graph *content* (parse trees change\n * between grammar releases; resolvers change which edges resolve), so a CI run\n * and a laptop run that disagree can be caught by comparing `fingerprint`.\n * Deliberately excludes the Node/OS version so the graph stays byte-stable\n * across host runtimes; `fingerprint` pins the parse/resolve toolchain only.\n */\nexport interface Toolchain {\n schema: string; // SCHEMA_VERSION\n tool: string; // vg calendar version\n grammars: string; // tree-sitter grammar set version string\n resolvers: ResolverKind[]; // resolver kinds available, sorted\n fingerprint: string; // shortId over the fields above — the value `vg attest` signs\n}\n\nexport interface Provenance {\n tool: 'vg';\n version: string; // calendar version\n grammars: Record<string, string>; // lang → grammar version (determinism input)\n resolver: ResolverKind[];\n deep: boolean; // did the heavier open passes run\n semanticModel?: string; // embedding model id+version if --deep semantic links\n corpusHash: string; // blake3 over the included file set + hashes\n toolchain?: Toolchain; // reproducibility fingerprint (checked by `vg verify`)\n}\n\n/** Analysis cost tier — auto-selected by node count (or forced). Reported honestly. */\nexport type AnalysisTier = 'full' | 'large' | 'xl';\n\nexport interface GraphMeta {\n root: string; // relative; portable across machines\n languages: string[];\n counts: {\n nodes: number;\n edges: number;\n areas: number;\n tests: number;\n untested: number;\n };\n cluster: 'leiden' | 'louvain' | 'none';\n /** Auto-selected (or forced) analysis tier for large maps. */\n analysisTier?: AnalysisTier;\n edgeKinds: EdgeKind[];\n}\n\nexport type NodeKind =\n | 'file'\n | 'module'\n | 'package'\n | 'class'\n | 'interface'\n | 'function'\n | 'method'\n | 'property'\n | 'test'\n | 'route'\n | 'component'\n /** Documentation / config text ingested for semantic ask (markdown, txt, env examples). */\n | 'document'\n | 'external';\n\nexport interface Span {\n start: number; // 1-based start line\n end: number; // 1-based end line\n}\n\nexport interface Centrality {\n degree: number;\n pagerank: number;\n betweenness: number;\n eigenvector: number;\n}\n\nexport interface GraphNode {\n id: string; // blake3(canonical(kind, qualifiedName, file, signature))\n kind: NodeKind;\n name: string; // short name\n qualifiedName: string;\n file: string; // relative path\n span: Span; // line range (excluded from id hash)\n lang: string;\n visibility?: 'public' | 'private' | 'protected' | 'internal';\n signature?: string;\n doc?: string; // short leading doc-comment / docstring summary (deterministic; not a full body)\n importance: number; // 0..1 blended centrality\n centrality: Centrality;\n area: number; // area id (the node's community); -1 = unassigned (cluster \"none\")\n isHub: boolean; // centrality outlier — surfaced by `vg hubs`\n tested: boolean | null; // null = not analyzable (e.g. external)\n coverage?: number; // 0..1 line coverage if a coverage report was ingested\n changeCoupling?: string[]; // node ids that historically change together\n}\n\nexport type EdgeKind =\n | 'call'\n | 'import'\n | 'contains'\n | 'extends'\n | 'implements'\n | 'references'\n | 'test'\n | 'coverage';\n\nexport interface GraphEdge {\n id: string; // blake3(canonical(kind, src, dst))\n kind: EdgeKind;\n src: string; // node id\n dst: string; // node id\n resolution: ResolverKind; // how the edge was resolved\n confidence: number; // 0..1 (1.0 for scip/declared; lower for heuristic/dynamic)\n epistemic?: EpistemicTier; // coarse honesty tier derived from resolution+kind\n surprise?: number; // 0..1 improbability under the area model (`vg oddities`)\n count?: number; // call-site multiplicity\n}\n\nexport interface Area {\n id: number; // stable across runs (remapped to previous committed map)\n label: string; // most-central member's name (editable via `vg label`)\n size: number;\n members: string[]; // node ids, sorted\n cohesion: number; // 0..1\n externalEdges: number; // cross-area edge count\n}\n\nexport type FactKind = 'contract' | 'invariant' | 'characterization';\nexport type DerivedBy = 'declared' | 'static';\nexport type FactConfidence = 'Observed' | 'Derived';\n\nexport interface Fact {\n id: string; // blake3(canonical(kind, subjectIds, predicate))\n kind: FactKind;\n subjectIds: string[]; // node ids this fact constrains\n predicate: unknown; // the constraint\n derivedBy: DerivedBy;\n confidence: FactConfidence;\n evidence: { file: string; span: Span }[];\n}\n\n/**\n * A reference the graph could not resolve — surfaced by `vg unknowns`. Reporting\n * what it *cannot* connect (ranked by blast radius) is the honest inverse of a\n * scanner that hides its unknowns. Only unknowns the precise rungs (tsc/scip)\n * did not supersede are recorded, so a compiler-resolved file never shows here.\n */\nexport interface Unknown {\n from: string; // node id where the unresolved reference occurs\n name: string; // the callee/type name that could not be resolved\n kind: 'call' | 'extends' | 'implements';\n count: number; // occurrences at this site\n}\n\nexport type GroundingKind = 'should_follow' | 'smells_like' | 'relevant_to';\n\nexport interface GroundingEdge {\n src: string; // node id\n packEntryId: string;\n kind: GroundingKind;\n confidence: number; // 0..1\n rationale: 'recommended' | 'conjectured';\n citation: { title: string; url: string };\n}\n\n/** Precomputed hub blast-radius counts for fast agent answers (optional). */\nexport interface HubBlastSummary {\n id: string;\n name: string;\n kind: string;\n file: string;\n importance: number;\n direct: number;\n depth2: number;\n files: number;\n tested: boolean | null;\n}\n\nexport interface GraphSummaries {\n hubs: HubBlastSummary[];\n}\n\nexport interface VgGraph {\n schemaVersion: typeof SCHEMA_VERSION;\n generatedAt: string; // ISO; the ONLY nondeterministic field (pinned by --generated-at)\n provenance: Provenance;\n meta: GraphMeta;\n nodes: GraphNode[]; // sorted by id\n edges: GraphEdge[]; // sorted by (kind, src, dst)\n areas: Area[]; // sorted by id\n facts?: Fact[]; // open facts (contract/invariant/characterization); sorted by id\n grounding?: GroundingEdge[]; // free-pack grounding (default on; omit with --no-ground)\n unknowns?: Unknown[]; // heuristic references left unresolved; sorted by (from, kind, name)\n /** Build-time hub blast-radius summaries (always on; tiny). */\n summaries?: GraphSummaries;\n}\n","/**\n * SQLite serve index for large maps (scale past flat-JSON-only serve).\n *\n * The canonical artifact remains `graph.json` (determinism / git). The index\n * at `.vibgrate/cache/graph.db` is a derived, gitignored structure built after\n * every successful build:\n * - denormalized name/edge columns for O(log n) lookup\n * - full node/edge/area JSON for reconstructing a `VgGraph` without parsing\n * the pretty-printed graph.json (faster cold serve on XL maps)\n *\n * Uses Node's built-in `node:sqlite` (Node ≥22) — no native npm dependency.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from './cache.js';\nimport { loadGraphFileWithSnapshot } from './snapshot.js';\nimport type {\n Area,\n EpistemicTier,\n GraphEdge,\n GraphNode,\n ResolverKind,\n VgGraph,\n} from '../schema.js';\nimport { SCHEMA_VERSION } from '../schema.js';\n\nexport interface IndexWriteResult {\n path: string;\n nodes: number;\n edges: number;\n /** False when node:sqlite is unavailable — callers should not fail the build. */\n ok: boolean;\n reason?: string;\n}\n\nexport function indexDbPath(root: string): string {\n return path.join(cacheDir(root), 'graph.db');\n}\n\n/** Write (replace) the SQLite index from a built graph. Never throws to callers. */\nexport function writeGraphIndex(root: string, graph: VgGraph): IndexWriteResult {\n const file = indexDbPath(root);\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.${process.pid}.tmp`;\n try {\n if (fs.existsSync(tmp)) fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n\n const db = new DatabaseSync(tmp);\n db.exec(`\n PRAGMA journal_mode = OFF;\n PRAGMA synchronous = OFF;\n CREATE TABLE meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE nodes (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n qualified_name TEXT NOT NULL,\n kind TEXT NOT NULL,\n file TEXT NOT NULL,\n line INTEGER NOT NULL,\n importance REAL NOT NULL,\n area INTEGER NOT NULL,\n is_hub INTEGER NOT NULL,\n lang TEXT NOT NULL,\n json TEXT NOT NULL\n );\n CREATE TABLE edges (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n src TEXT NOT NULL,\n dst TEXT NOT NULL,\n resolution TEXT NOT NULL,\n confidence REAL NOT NULL,\n epistemic TEXT NOT NULL,\n json TEXT NOT NULL\n );\n CREATE TABLE areas (\n id INTEGER PRIMARY KEY,\n json TEXT NOT NULL\n );\n CREATE INDEX idx_nodes_name ON nodes(name);\n CREATE INDEX idx_nodes_qn ON nodes(qualified_name);\n CREATE INDEX idx_nodes_file ON nodes(file);\n CREATE INDEX idx_edges_src ON edges(src);\n CREATE INDEX idx_edges_dst ON edges(dst);\n CREATE INDEX idx_edges_kind ON edges(kind);\n `);\n\n const insMeta = db.prepare('INSERT INTO meta(key, value) VALUES (?, ?)');\n insMeta.run('corpusHash', graph.provenance.corpusHash);\n insMeta.run('schemaVersion', graph.schemaVersion);\n insMeta.run('generatedAt', graph.generatedAt);\n insMeta.run('nodeCount', String(graph.nodes.length));\n insMeta.run('edgeCount', String(graph.edges.length));\n insMeta.run('analysisTier', graph.meta.analysisTier ?? 'full');\n insMeta.run('indexVersion', 'vg-graph-index/2');\n // Full meta + provenance for reconstruct without graph.json parse.\n insMeta.run('graphMeta', JSON.stringify(graph.meta));\n insMeta.run('graphProvenance', JSON.stringify(graph.provenance));\n if (graph.facts) insMeta.run('factsJson', JSON.stringify(graph.facts));\n if (graph.grounding) insMeta.run('groundingJson', JSON.stringify(graph.grounding));\n if (graph.summaries) insMeta.run('summariesJson', JSON.stringify(graph.summaries));\n if (graph.unknowns) insMeta.run('unknownsJson', JSON.stringify(graph.unknowns));\n\n const insNode = db.prepare(\n `INSERT INTO nodes(id, name, qualified_name, kind, file, line, importance, area, is_hub, lang, json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const n of graph.nodes) {\n insNode.run(\n n.id,\n n.name,\n n.qualifiedName,\n n.kind,\n n.file,\n n.span.start,\n n.importance,\n n.area,\n n.isHub ? 1 : 0,\n n.lang,\n JSON.stringify(n),\n );\n }\n\n const insEdge = db.prepare(\n `INSERT INTO edges(id, kind, src, dst, resolution, confidence, epistemic, json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const e of graph.edges) {\n insEdge.run(\n e.id,\n e.kind,\n e.src,\n e.dst,\n e.resolution,\n e.confidence,\n e.epistemic ?? 'observed',\n JSON.stringify(e),\n );\n }\n\n const insArea = db.prepare('INSERT INTO areas(id, json) VALUES (?, ?)');\n for (const a of graph.areas) {\n insArea.run(a.id, JSON.stringify(a));\n }\n\n db.close();\n fs.renameSync(tmp, file);\n return { path: file, nodes: graph.nodes.length, edges: graph.edges.length, ok: true };\n } catch (err) {\n return {\n path: file,\n nodes: 0,\n edges: 0,\n ok: false,\n reason: (err as Error).message,\n };\n }\n}\n\nexport interface NameHit {\n id: string;\n name: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n importance: number;\n}\n\n/** Fast name / prefix lookup against the index. Empty if index missing. */\nexport function lookupNameIndex(root: string, query: string, limit = 20): NameHit[] {\n const file = indexDbPath(root);\n if (!fs.existsSync(file) || !query.trim()) return [];\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const db = new DatabaseSync(file, { readOnly: true });\n const q = query.trim();\n const rows = db\n .prepare(\n `SELECT id, name, qualified_name, kind, file, line, importance\n FROM nodes\n WHERE name = ? OR qualified_name = ? OR name LIKE ? OR qualified_name LIKE ?\n ORDER BY\n CASE WHEN name = ? OR qualified_name = ? THEN 0\n WHEN name LIKE ? THEN 1\n ELSE 2 END,\n importance DESC\n LIMIT ?`,\n )\n .all(q, q, `${q}%`, `%${q}%`, q, q, `${q}%`, limit) as Record<string, unknown>[];\n db.close();\n return rows.map((r) => ({\n id: String(r.id),\n name: String(r.name),\n qualifiedName: String(r.qualified_name),\n kind: String(r.kind),\n file: String(r.file),\n line: Number(r.line),\n importance: Number(r.importance),\n }));\n } catch {\n return [];\n }\n}\n\n/** Neighbor edges for a node id (src or dst). Empty if index missing. */\nexport function lookupNeighbors(\n root: string,\n nodeId: string,\n direction: 'out' | 'in' | 'both' = 'both',\n limit = 50,\n): GraphEdge[] {\n const file = indexDbPath(root);\n if (!fs.existsSync(file) || !nodeId) return [];\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const db = new DatabaseSync(file, { readOnly: true });\n let rows: Record<string, unknown>[] = [];\n if (direction === 'out' || direction === 'both') {\n rows = rows.concat(\n db\n .prepare(`SELECT json FROM edges WHERE src = ? LIMIT ?`)\n .all(nodeId, limit) as Record<string, unknown>[],\n );\n }\n if (direction === 'in' || direction === 'both') {\n rows = rows.concat(\n db\n .prepare(`SELECT json FROM edges WHERE dst = ? LIMIT ?`)\n .all(nodeId, limit) as Record<string, unknown>[],\n );\n }\n db.close();\n const byId = new Map<string, GraphEdge>();\n for (const r of rows) {\n try {\n const e = JSON.parse(String(r.json)) as GraphEdge;\n byId.set(e.id, e);\n } catch {\n /* skip bad row */\n }\n }\n return [...byId.values()];\n } catch {\n return [];\n }\n}\n\n/** Read index meta (corpusHash etc.) or null if missing. */\nexport function readIndexMeta(root: string): Record<string, string> | null {\n const file = indexDbPath(root);\n if (!fs.existsSync(file)) return null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const db = new DatabaseSync(file, { readOnly: true });\n const rows = db.prepare('SELECT key, value FROM meta').all() as { key: string; value: string }[];\n db.close();\n const out: Record<string, string> = {};\n for (const r of rows) out[r.key] = r.value;\n return out;\n } catch {\n return null;\n }\n}\n\n/**\n * Reconstruct a full `VgGraph` from the SQLite index (indexVersion ≥ 2).\n * Returns null if the index is missing, stale schema, or incomplete.\n * Prefer this over JSON.parse of pretty graph.json for cold serve on large maps.\n */\nexport function loadGraphFromIndex(root: string): VgGraph | null {\n const file = indexDbPath(root);\n if (!fs.existsSync(file)) return null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { DatabaseSync } = require('node:sqlite') as typeof import('node:sqlite');\n const db = new DatabaseSync(file, { readOnly: true });\n const metaRows = db.prepare('SELECT key, value FROM meta').all() as {\n key: string;\n value: string;\n }[];\n const meta: Record<string, string> = {};\n for (const r of metaRows) meta[r.key] = r.value;\n\n if (meta.indexVersion !== 'vg-graph-index/2' || !meta.graphMeta || !meta.graphProvenance) {\n db.close();\n return null;\n }\n\n const nodeRows = db.prepare('SELECT json FROM nodes ORDER BY id').all() as {\n json: string;\n }[];\n const edgeRows = db.prepare('SELECT json FROM edges ORDER BY id').all() as {\n json: string;\n }[];\n const areaRows = db.prepare('SELECT json FROM areas ORDER BY id').all() as {\n json: string;\n }[];\n db.close();\n\n const nodes = nodeRows.map((r) => JSON.parse(r.json) as GraphNode);\n const edges = edgeRows.map((r) => JSON.parse(r.json) as GraphEdge);\n const areas = areaRows.map((r) => JSON.parse(r.json) as Area);\n\n // Stable sorts match serialize contract (ids already ordered by SQL, re-sort for safety).\n nodes.sort((a, b) => a.id.localeCompare(b.id));\n edges.sort(\n (a, b) =>\n a.kind.localeCompare(b.kind) || a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst),\n );\n areas.sort((a, b) => a.id - b.id);\n\n const graph: VgGraph = {\n schemaVersion: (meta.schemaVersion as typeof SCHEMA_VERSION) || SCHEMA_VERSION,\n generatedAt: meta.generatedAt ?? new Date(0).toISOString(),\n provenance: JSON.parse(meta.graphProvenance),\n meta: JSON.parse(meta.graphMeta),\n nodes,\n edges,\n areas,\n };\n if (meta.factsJson) graph.facts = JSON.parse(meta.factsJson);\n if (meta.groundingJson) graph.grounding = JSON.parse(meta.groundingJson);\n if (meta.summariesJson) graph.summaries = JSON.parse(meta.summariesJson);\n if (meta.unknownsJson) graph.unknowns = JSON.parse(meta.unknownsJson);\n\n // Lightweight integrity: edge resolution types stay valid.\n for (const e of edges) {\n if (!e.resolution) e.resolution = 'heuristic' as ResolverKind;\n if (!e.epistemic) e.epistemic = 'observed' as EpistemicTier;\n }\n return graph;\n } catch {\n return null;\n }\n}\n\n/**\n * Load the graph preferring the SQLite index when its corpusHash matches the\n * committed graph.json provenance (or when only the index exists). Falls back\n * to graph.json. Returns null if neither is usable.\n */\nexport function loadGraphPreferIndex(\n root: string,\n graphJsonPath: string,\n): { graph: VgGraph; source: 'index' | 'json' } | null {\n // Snapshot-first: skips the large-string JSON.parse when a fresh binary\n // snapshot exists (sidecar or store-mode standalone), and self-heals the\n // sidecar when not (see engine/snapshot.ts).\n const jsonGraph: VgGraph | null = loadGraphFileWithSnapshot(graphJsonPath);\n\n const fromIndex = loadGraphFromIndex(root);\n if (fromIndex) {\n if (!jsonGraph || fromIndex.provenance.corpusHash === jsonGraph.provenance.corpusHash) {\n return { graph: fromIndex, source: 'index' };\n }\n // Index stale vs graph.json — prefer canonical JSON and let next build refresh.\n }\n if (jsonGraph) return { graph: jsonGraph, source: 'json' };\n return null;\n}\n","import * as fs from 'node:fs';\nimport { resolveGraphPath } from './artifacts.js';\nimport { loadGraphFileWithSnapshot } from './snapshot.js';\nimport { loadGraphPreferIndex } from './index-db.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Load the code map for a repository.\n *\n * When `graphPath` is omitted, prefers an existing global-store snapshot, then\n * the legacy `.vibgrate/graph.json`, matching {@link resolveGraphPath}.\n * Prefers the SQLite index when its corpusHash matches the committed map\n * (faster cold serve on large repos). Returns null if none exists.\n */\nexport function loadGraph(root: string, graphPath?: string): VgGraph | null {\n const file = resolveGraphPath(root, graphPath);\n // Index is always rooted at the project root; only use it when loading the\n // default map for that root (not an arbitrary --graph path).\n if (!graphPath) {\n const preferred = loadGraphPreferIndex(root, file);\n if (preferred) return preferred.graph;\n }\n return loadGraphFileWithSnapshot(file);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-RZEXHDCF.js';
1
+ import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-MYM5VIJ4.js';
2
2
  import { recordCliCall, CLI_TOOL_ALIASES, buildCodeContext, buildTaskCapsule, capsuleToCodeContext } from './chunk-US2DAKCM.js';
3
3
  import { repositoryIdFromRoot } from './chunk-BWPBB45M.js';
4
4
  import * as fs from 'fs';
@@ -251,5 +251,5 @@ function shortId() {
251
251
  }
252
252
 
253
253
  export { commitChanges, nodeCodeFs, runCodeSession, undoChanges };
254
- //# sourceMappingURL=chunk-PRGCCW7D.js.map
255
- //# sourceMappingURL=chunk-PRGCCW7D.js.map
254
+ //# sourceMappingURL=chunk-WBMMRERH.js.map
255
+ //# sourceMappingURL=chunk-WBMMRERH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/session.ts"],"names":["resolve"],"mappings":"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","file":"chunk-PRGCCW7D.js","sourcesContent":["/**\n * The `vg code` governance session (VG-CLI-CODE §7).\n *\n * This is the load-bearing rule the whole platform is built on, applied to code\n * edits: a state-altering change goes **through** the lifecycle, never around it\n * (GUARDRAILS §5). One run walks inspect → assess → dry-run → approve → execute\n * → verify → log:\n *\n * inspect build the graph-grounded context for the instruction\n * assess ask the routed model for a terse edit; apply it deterministically\n * (in memory); compute the diff and the blast radius\n * dry-run the DEFAULT terminal state — propose the change, write nothing\n * approve writing requires explicit consent; without it we stop at dry-run\n * execute write the approved changes to disk\n * verify confirm the files on disk match what was approved (+ optional cmd)\n * log append an immutable, secret-free audit record with a correlation id\n *\n * Everything is deterministic except the single model call, which is isolated\n * behind the provider list (tried in order, falling back on transport failure).\n * The filesystem and clock are injectable so the whole session is testable\n * offline with no writes escaping a temp dir.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { buildCodeContext } from './context.js';\nimport { buildTaskCapsule, capsuleToCodeContext } from './capsule.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\nimport { parseEdits, applyEdits, type SymbolSpan } from './apply.js';\nimport { unifiedDiff } from './diff.js';\nimport { buildMessages } from './prompt.js';\nimport { redactSecrets } from './providers.js';\nimport type { ChatOptions, CodeContext, CodeSessionResult, FileChange, LifecyclePhase, Provider, ProviderResult } from './types.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Minimal filesystem seam so the session is testable without touching real disk. */\nexport interface CodeFs {\n read(file: string): string | null;\n write(file: string, content: string): void;\n remove(file: string): void;\n appendAudit(line: string): void;\n}\n\nexport interface RunSessionOptions {\n graph: VgGraph;\n root: string;\n instruction: string;\n /** Providers to try in order (from the router); the first that answers wins. */\n providers: Provider[];\n /** Write to disk? Default false — dry-run is the safe default (GUARDRAILS §3.2). */\n apply?: boolean;\n /** Explicit consent for the write (`--yes`); without it, a requested apply stops at dry-run. */\n consent?: boolean;\n /** Restrict the edit surface to these files. */\n files?: string[];\n /** Context token budget. */\n budget?: number;\n chatOptions?: ChatOptions;\n /** Injectable filesystem (defaults to a real, root-scoped fs). */\n fsImpl?: CodeFs;\n /** Injectable clock (ms) for the audit timestamp. */\n now?: () => number;\n /** Injectable correlation id (defaults to a random short id). */\n correlationId?: string;\n /** Progress callback per phase. */\n onPhase?: (phase: LifecyclePhase, detail: string) => void;\n /** Skip appending to the audit log (used by tests/dry programmatic calls). */\n noAudit?: boolean;\n /**\n * Who is making the graph-backed call, for per-model savings auditing. When\n * `client` is set, the context-assembly step (a `query_graph`-equivalent) is\n * recorded to the local savings ledger tagged with the provider + model, so\n * `vg savings` can break usage down per model. VG Code always sets this.\n */\n attribution?: { client: string; provider?: string; model?: string };\n /**\n * Use a source-bearing Task Capsule for the inspect context (Fusion Runtime\n * Phase 0 A/B). Default false keeps the metadata-only path.\n */\n capsule?: boolean;\n}\n\nexport async function runCodeSession(options: RunSessionOptions): Promise<CodeSessionResult> {\n const {\n graph,\n root,\n instruction,\n providers,\n apply = false,\n consent = false,\n files,\n budget,\n chatOptions,\n now = () => 0,\n onPhase = () => {},\n } = options;\n const fsImpl = options.fsImpl ?? nodeCodeFs(root);\n const correlationId = options.correlationId ?? shortId();\n const phasesRun: LifecyclePhase[] = [];\n const phase = (p: LifecyclePhase, detail: string): void => {\n phasesRun.push(p);\n onPhase(p, detail);\n };\n\n // ── inspect ──────────────────────────────────────────────────────────────\n phase('inspect', options.capsule ? 'building source-bearing task capsule' : 'building graph-grounded context');\n const context = buildSessionContext(graph, instruction, {\n budget,\n files,\n capsule: options.capsule,\n root,\n fsImpl,\n });\n\n // Per-model savings: the context build is VG Code's `query_graph`-equivalent.\n // Record it (counts only — never code or the instruction) tagged with the\n // model, so `vg savings` audits usage per model. Local-only, best-effort.\n if (options.attribution?.client) {\n const seedFiles = new Set(context.seeds.map((s) => s.node.file).filter(Boolean));\n recordCliCall(\n root,\n {\n tool: CLI_TOOL_ALIASES.ask,\n client: options.attribution.client,\n provider: options.attribution.provider,\n model: options.attribution.model,\n outcome: context.seeds.length ? 'complete' : 'miss',\n vgTokens: context.tokensEstimate,\n baselineFiles: seedFiles.size,\n },\n now(),\n );\n }\n\n // ── assess ──────────────────────────────────────────────────────────────\n phase('assess', 'asking the routed model for a minimal edit');\n const messages = buildMessages(context);\n const { result, provider, fellBack } = await complete(providers, messages, chatOptions, correlationId);\n\n const edits = parseEdits(result.text);\n const spans = spanIndex(graph);\n const applied = applyEdits(\n edits,\n (file) => fsImpl.read(file),\n (file) => spans.get(normalize(file)) ?? [],\n );\n\n const changes: FileChange[] = [];\n for (const [file, entry] of [...applied.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n changes.push({\n file,\n before: entry.before,\n after: entry.after,\n outcomes: entry.outcomes,\n diff: unifiedDiff(entry.before, entry.after, file),\n });\n }\n\n // ── dry-run (always produced) ─────────────────────────────────────────────\n phase('dry-run', `${changes.length} file(s) would change`);\n\n const anyApplicable = changes.some((c) => c.diff !== '' && c.outcomes.some((o) => o.status === 'applied'));\n const base: CodeSessionResult = {\n instruction,\n provider: { id: provider.id, model: provider.model, local: provider.local, fellBack },\n phasesRun,\n changes,\n applied: false,\n verification: { ran: false, ok: false, detail: 'dry-run — no changes written' },\n correlationId,\n };\n\n // ── approve ───────────────────────────────────────────────────────────────\n // Writing is opt-in AND consent-gated. A requested apply without consent is\n // not an error — it degrades to a dry-run so the caller can review, then\n // re-run with --yes. This is the \"never destructive-by-default\" guardrail.\n if (!apply) {\n if (!options.noAudit) writeAudit(fsImpl, base, now());\n return base;\n }\n if (!consent) {\n const stopped = { ...base, verification: { ran: false, ok: false, detail: 'apply requested without consent — re-run with --yes to write these changes' } };\n if (!options.noAudit) writeAudit(fsImpl, stopped, now());\n return stopped;\n }\n if (!anyApplicable) {\n const nothing = { ...base, verification: { ran: false, ok: false, detail: 'nothing to write — no edit applied cleanly' } };\n if (!options.noAudit) writeAudit(fsImpl, nothing, now());\n return nothing;\n }\n phase('approve', 'consent given (--yes)');\n\n // ── execute ───────────────────────────────────────────────────────────────\n phase('execute', 'writing approved changes');\n for (const change of changes) {\n if (change.diff === '') continue; // no-op file\n if (!change.outcomes.some((o) => o.status === 'applied')) continue; // nothing applied cleanly here\n if (change.after === null) fsImpl.remove(change.file);\n else fsImpl.write(change.file, change.after);\n }\n\n // ── verify ────────────────────────────────────────────────────────────────\n phase('verify', 'confirming on-disk content matches the approved change');\n const verification = verifyWrites(fsImpl, changes);\n\n // ── log ───────────────────────────────────────────────────────────────────\n phase('log', 'recording an audit entry');\n const final: CodeSessionResult = { ...base, applied: true, verification };\n if (!options.noAudit) writeAudit(fsImpl, final, now());\n return final;\n}\n\n/**\n * Commit an already-computed dry-run result: write the cleanly-applied changes,\n * verify them on disk, and append the audit record — the \"approve → execute →\n * verify → log\" tail of the lifecycle, run against a proposal the caller has\n * already shown and had approved (the interactive REPL uses this so it never\n * calls the model twice or writes something different from what was reviewed).\n */\nexport function commitChanges(result: CodeSessionResult, fsImpl: CodeFs, now: () => number = () => 0): CodeSessionResult {\n const anyApplicable = result.changes.some((c) => c.diff !== '' && c.outcomes.some((o) => o.status === 'applied'));\n if (!anyApplicable) {\n return { ...result, applied: false, verification: { ran: false, ok: false, detail: 'nothing to write — no edit applied cleanly' } };\n }\n for (const change of result.changes) {\n if (change.diff === '' || !change.outcomes.some((o) => o.status === 'applied')) continue;\n if (change.after === null) fsImpl.remove(change.file);\n else fsImpl.write(change.file, change.after);\n }\n const verification = verifyWrites(fsImpl, result.changes);\n const final: CodeSessionResult = { ...result, applied: true, verification, phasesRun: [...result.phasesRun, 'approve', 'execute', 'verify', 'log'] };\n writeAudit(fsImpl, final, now());\n return final;\n}\n\n/**\n * Undo a set of applied changes by restoring each file's prior content — the\n * `/undo` command. A created file (before === null) is removed; an edited or\n * deleted file is restored to its `before`. Only cleanly-applied changes are\n * reverted. Returns the files it restored.\n */\nexport function undoChanges(changes: FileChange[], fsImpl: CodeFs): string[] {\n const restored: string[] = [];\n for (const ch of changes) {\n if (!ch.outcomes.some((o) => o.status === 'applied')) continue;\n if (ch.before === null) fsImpl.remove(ch.file);\n else fsImpl.write(ch.file, ch.before);\n restored.push(ch.file);\n }\n return restored;\n}\n\nfunction buildSessionContext(\n graph: VgGraph,\n instruction: string,\n opts: { budget?: number; files?: string[]; capsule?: boolean; root: string; fsImpl: CodeFs },\n): CodeContext {\n const budget = opts.budget;\n const files = opts.files;\n if (!opts.capsule) {\n return buildCodeContext(graph, instruction, { budget, files });\n }\n const capsule = buildTaskCapsule(graph, instruction, {\n budget,\n files,\n readFile: (rel) => opts.fsImpl.read(rel),\n repositoryId: repositoryIdFromRoot(opts.root),\n });\n return capsuleToCodeContext(capsule);\n}\n\n/** Try each provider in order; fall back on transport failure. Throws the last actionable error. */\nasync function complete(\n providers: Provider[],\n messages: ReturnType<typeof buildMessages>,\n chatOptions: ChatOptions | undefined,\n correlationId: string,\n): Promise<{ result: ProviderResult; provider: Provider; fellBack: boolean }> {\n if (providers.length === 0) throw new Error(`no model provider available (ref ${correlationId})`);\n let lastErr: unknown;\n for (let i = 0; i < providers.length; i++) {\n const provider = providers[i];\n try {\n const result = await provider.chat(messages, { temperature: 0, ...chatOptions });\n return { result, provider, fellBack: i > 0 };\n } catch (e) {\n lastErr = e;\n }\n }\n const message = lastErr instanceof Error ? redactSecrets(lastErr.message) : String(lastErr);\n throw new Error(`${message} (ref ${correlationId})`);\n}\n\n/** Confirm each written file's on-disk content equals what we approved. */\nfunction verifyWrites(fsImpl: CodeFs, changes: FileChange[]): { ran: boolean; ok: boolean; detail: string } {\n let checked = 0;\n const mismatches: string[] = [];\n for (const change of changes) {\n if (change.diff === '' || !change.outcomes.some((o) => o.status === 'applied')) continue;\n checked++;\n const onDisk = fsImpl.read(change.file);\n if (onDisk !== change.after) mismatches.push(change.file);\n }\n if (mismatches.length) return { ran: true, ok: false, detail: `on-disk content differs for: ${mismatches.join(', ')}` };\n return { ran: true, ok: true, detail: `wrote and verified ${checked} file(s)` };\n}\n\n/** An append-only, secret-free audit record (GUARDRAILS §2.6 / §5). No file contents, no keys. */\nfunction writeAudit(fsImpl: CodeFs, r: CodeSessionResult, ts: number): void {\n const record = {\n ts,\n correlationId: r.correlationId,\n instruction: r.instruction.slice(0, 500),\n provider: r.provider.id,\n model: r.provider.model,\n local: r.provider.local,\n applied: r.applied,\n files: r.changes.map((c) => ({ file: c.file, statuses: c.outcomes.map((o) => o.status) })),\n verification: r.verification,\n phases: r.phasesRun,\n };\n try {\n fsImpl.appendAudit(JSON.stringify(record));\n } catch {\n /* audit is best-effort; never fail the run on a logging problem */\n }\n}\n\n/** Build a per-file map of symbol spans for graph-scoped edit disambiguation. */\nfunction spanIndex(graph: VgGraph): Map<string, SymbolSpan[]> {\n const map = new Map<string, SymbolSpan[]>();\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const file = normalize(n.file);\n const list = map.get(file) ?? [];\n list.push({ qualifiedName: n.qualifiedName, file, start: n.span.start, end: n.span.end });\n map.set(file, list);\n }\n return map;\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\n/** Default filesystem impl, scoped to `root`. Refuses paths that escape the root. */\nexport function nodeCodeFs(root: string): CodeFs {\n const resolve = (file: string): string => {\n const abs = path.resolve(root, file);\n const rel = path.relative(root, abs);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(`edit path escapes the project root: ${file} — refusing to touch files outside ${root}`);\n }\n return abs;\n };\n return {\n read(file) {\n try {\n return fs.readFileSync(resolve(file), 'utf8');\n } catch {\n return null;\n }\n },\n write(file, content) {\n const abs = resolve(file);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content);\n },\n remove(file) {\n try {\n fs.rmSync(resolve(file));\n } catch {\n /* already gone */\n }\n },\n appendAudit(line) {\n const dir = path.join(root, '.vibgrate');\n fs.mkdirSync(dir, { recursive: true });\n fs.appendFileSync(path.join(dir, 'code-audit.jsonl'), line + '\\n');\n },\n };\n}\n\n/** Short, URL-safe correlation id. Not a graph artifact, so runtime randomness is fine here. */\nfunction shortId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 8; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n"]}
1
+ {"version":3,"sources":["../src/code/session.ts"],"names":["resolve"],"mappings":"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","file":"chunk-WBMMRERH.js","sourcesContent":["/**\n * The `vg code` governance session (VG-CLI-CODE §7).\n *\n * This is the load-bearing rule the whole platform is built on, applied to code\n * edits: a state-altering change goes **through** the lifecycle, never around it\n * (GUARDRAILS §5). One run walks inspect → assess → dry-run → approve → execute\n * → verify → log:\n *\n * inspect build the graph-grounded context for the instruction\n * assess ask the routed model for a terse edit; apply it deterministically\n * (in memory); compute the diff and the blast radius\n * dry-run the DEFAULT terminal state — propose the change, write nothing\n * approve writing requires explicit consent; without it we stop at dry-run\n * execute write the approved changes to disk\n * verify confirm the files on disk match what was approved (+ optional cmd)\n * log append an immutable, secret-free audit record with a correlation id\n *\n * Everything is deterministic except the single model call, which is isolated\n * behind the provider list (tried in order, falling back on transport failure).\n * The filesystem and clock are injectable so the whole session is testable\n * offline with no writes escaping a temp dir.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { buildCodeContext } from './context.js';\nimport { buildTaskCapsule, capsuleToCodeContext } from './capsule.js';\nimport { recordCliCall, CLI_TOOL_ALIASES } from '../engine/savings.js';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\nimport { parseEdits, applyEdits, type SymbolSpan } from './apply.js';\nimport { unifiedDiff } from './diff.js';\nimport { buildMessages } from './prompt.js';\nimport { redactSecrets } from './providers.js';\nimport type { ChatOptions, CodeContext, CodeSessionResult, FileChange, LifecyclePhase, Provider, ProviderResult } from './types.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Minimal filesystem seam so the session is testable without touching real disk. */\nexport interface CodeFs {\n read(file: string): string | null;\n write(file: string, content: string): void;\n remove(file: string): void;\n appendAudit(line: string): void;\n}\n\nexport interface RunSessionOptions {\n graph: VgGraph;\n root: string;\n instruction: string;\n /** Providers to try in order (from the router); the first that answers wins. */\n providers: Provider[];\n /** Write to disk? Default false — dry-run is the safe default (GUARDRAILS §3.2). */\n apply?: boolean;\n /** Explicit consent for the write (`--yes`); without it, a requested apply stops at dry-run. */\n consent?: boolean;\n /** Restrict the edit surface to these files. */\n files?: string[];\n /** Context token budget. */\n budget?: number;\n chatOptions?: ChatOptions;\n /** Injectable filesystem (defaults to a real, root-scoped fs). */\n fsImpl?: CodeFs;\n /** Injectable clock (ms) for the audit timestamp. */\n now?: () => number;\n /** Injectable correlation id (defaults to a random short id). */\n correlationId?: string;\n /** Progress callback per phase. */\n onPhase?: (phase: LifecyclePhase, detail: string) => void;\n /** Skip appending to the audit log (used by tests/dry programmatic calls). */\n noAudit?: boolean;\n /**\n * Who is making the graph-backed call, for per-model savings auditing. When\n * `client` is set, the context-assembly step (a `query_graph`-equivalent) is\n * recorded to the local savings ledger tagged with the provider + model, so\n * `vg savings` can break usage down per model. VG Code always sets this.\n */\n attribution?: { client: string; provider?: string; model?: string };\n /**\n * Use a source-bearing Task Capsule for the inspect context (Fusion Runtime\n * Phase 0 A/B). Default false keeps the metadata-only path.\n */\n capsule?: boolean;\n}\n\nexport async function runCodeSession(options: RunSessionOptions): Promise<CodeSessionResult> {\n const {\n graph,\n root,\n instruction,\n providers,\n apply = false,\n consent = false,\n files,\n budget,\n chatOptions,\n now = () => 0,\n onPhase = () => {},\n } = options;\n const fsImpl = options.fsImpl ?? nodeCodeFs(root);\n const correlationId = options.correlationId ?? shortId();\n const phasesRun: LifecyclePhase[] = [];\n const phase = (p: LifecyclePhase, detail: string): void => {\n phasesRun.push(p);\n onPhase(p, detail);\n };\n\n // ── inspect ──────────────────────────────────────────────────────────────\n phase('inspect', options.capsule ? 'building source-bearing task capsule' : 'building graph-grounded context');\n const context = buildSessionContext(graph, instruction, {\n budget,\n files,\n capsule: options.capsule,\n root,\n fsImpl,\n });\n\n // Per-model savings: the context build is VG Code's `query_graph`-equivalent.\n // Record it (counts only — never code or the instruction) tagged with the\n // model, so `vg savings` audits usage per model. Local-only, best-effort.\n if (options.attribution?.client) {\n const seedFiles = new Set(context.seeds.map((s) => s.node.file).filter(Boolean));\n recordCliCall(\n root,\n {\n tool: CLI_TOOL_ALIASES.ask,\n client: options.attribution.client,\n provider: options.attribution.provider,\n model: options.attribution.model,\n outcome: context.seeds.length ? 'complete' : 'miss',\n vgTokens: context.tokensEstimate,\n baselineFiles: seedFiles.size,\n },\n now(),\n );\n }\n\n // ── assess ──────────────────────────────────────────────────────────────\n phase('assess', 'asking the routed model for a minimal edit');\n const messages = buildMessages(context);\n const { result, provider, fellBack } = await complete(providers, messages, chatOptions, correlationId);\n\n const edits = parseEdits(result.text);\n const spans = spanIndex(graph);\n const applied = applyEdits(\n edits,\n (file) => fsImpl.read(file),\n (file) => spans.get(normalize(file)) ?? [],\n );\n\n const changes: FileChange[] = [];\n for (const [file, entry] of [...applied.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n changes.push({\n file,\n before: entry.before,\n after: entry.after,\n outcomes: entry.outcomes,\n diff: unifiedDiff(entry.before, entry.after, file),\n });\n }\n\n // ── dry-run (always produced) ─────────────────────────────────────────────\n phase('dry-run', `${changes.length} file(s) would change`);\n\n const anyApplicable = changes.some((c) => c.diff !== '' && c.outcomes.some((o) => o.status === 'applied'));\n const base: CodeSessionResult = {\n instruction,\n provider: { id: provider.id, model: provider.model, local: provider.local, fellBack },\n phasesRun,\n changes,\n applied: false,\n verification: { ran: false, ok: false, detail: 'dry-run — no changes written' },\n correlationId,\n };\n\n // ── approve ───────────────────────────────────────────────────────────────\n // Writing is opt-in AND consent-gated. A requested apply without consent is\n // not an error — it degrades to a dry-run so the caller can review, then\n // re-run with --yes. This is the \"never destructive-by-default\" guardrail.\n if (!apply) {\n if (!options.noAudit) writeAudit(fsImpl, base, now());\n return base;\n }\n if (!consent) {\n const stopped = { ...base, verification: { ran: false, ok: false, detail: 'apply requested without consent — re-run with --yes to write these changes' } };\n if (!options.noAudit) writeAudit(fsImpl, stopped, now());\n return stopped;\n }\n if (!anyApplicable) {\n const nothing = { ...base, verification: { ran: false, ok: false, detail: 'nothing to write — no edit applied cleanly' } };\n if (!options.noAudit) writeAudit(fsImpl, nothing, now());\n return nothing;\n }\n phase('approve', 'consent given (--yes)');\n\n // ── execute ───────────────────────────────────────────────────────────────\n phase('execute', 'writing approved changes');\n for (const change of changes) {\n if (change.diff === '') continue; // no-op file\n if (!change.outcomes.some((o) => o.status === 'applied')) continue; // nothing applied cleanly here\n if (change.after === null) fsImpl.remove(change.file);\n else fsImpl.write(change.file, change.after);\n }\n\n // ── verify ────────────────────────────────────────────────────────────────\n phase('verify', 'confirming on-disk content matches the approved change');\n const verification = verifyWrites(fsImpl, changes);\n\n // ── log ───────────────────────────────────────────────────────────────────\n phase('log', 'recording an audit entry');\n const final: CodeSessionResult = { ...base, applied: true, verification };\n if (!options.noAudit) writeAudit(fsImpl, final, now());\n return final;\n}\n\n/**\n * Commit an already-computed dry-run result: write the cleanly-applied changes,\n * verify them on disk, and append the audit record — the \"approve → execute →\n * verify → log\" tail of the lifecycle, run against a proposal the caller has\n * already shown and had approved (the interactive REPL uses this so it never\n * calls the model twice or writes something different from what was reviewed).\n */\nexport function commitChanges(result: CodeSessionResult, fsImpl: CodeFs, now: () => number = () => 0): CodeSessionResult {\n const anyApplicable = result.changes.some((c) => c.diff !== '' && c.outcomes.some((o) => o.status === 'applied'));\n if (!anyApplicable) {\n return { ...result, applied: false, verification: { ran: false, ok: false, detail: 'nothing to write — no edit applied cleanly' } };\n }\n for (const change of result.changes) {\n if (change.diff === '' || !change.outcomes.some((o) => o.status === 'applied')) continue;\n if (change.after === null) fsImpl.remove(change.file);\n else fsImpl.write(change.file, change.after);\n }\n const verification = verifyWrites(fsImpl, result.changes);\n const final: CodeSessionResult = { ...result, applied: true, verification, phasesRun: [...result.phasesRun, 'approve', 'execute', 'verify', 'log'] };\n writeAudit(fsImpl, final, now());\n return final;\n}\n\n/**\n * Undo a set of applied changes by restoring each file's prior content — the\n * `/undo` command. A created file (before === null) is removed; an edited or\n * deleted file is restored to its `before`. Only cleanly-applied changes are\n * reverted. Returns the files it restored.\n */\nexport function undoChanges(changes: FileChange[], fsImpl: CodeFs): string[] {\n const restored: string[] = [];\n for (const ch of changes) {\n if (!ch.outcomes.some((o) => o.status === 'applied')) continue;\n if (ch.before === null) fsImpl.remove(ch.file);\n else fsImpl.write(ch.file, ch.before);\n restored.push(ch.file);\n }\n return restored;\n}\n\nfunction buildSessionContext(\n graph: VgGraph,\n instruction: string,\n opts: { budget?: number; files?: string[]; capsule?: boolean; root: string; fsImpl: CodeFs },\n): CodeContext {\n const budget = opts.budget;\n const files = opts.files;\n if (!opts.capsule) {\n return buildCodeContext(graph, instruction, { budget, files });\n }\n const capsule = buildTaskCapsule(graph, instruction, {\n budget,\n files,\n readFile: (rel) => opts.fsImpl.read(rel),\n repositoryId: repositoryIdFromRoot(opts.root),\n });\n return capsuleToCodeContext(capsule);\n}\n\n/** Try each provider in order; fall back on transport failure. Throws the last actionable error. */\nasync function complete(\n providers: Provider[],\n messages: ReturnType<typeof buildMessages>,\n chatOptions: ChatOptions | undefined,\n correlationId: string,\n): Promise<{ result: ProviderResult; provider: Provider; fellBack: boolean }> {\n if (providers.length === 0) throw new Error(`no model provider available (ref ${correlationId})`);\n let lastErr: unknown;\n for (let i = 0; i < providers.length; i++) {\n const provider = providers[i];\n try {\n const result = await provider.chat(messages, { temperature: 0, ...chatOptions });\n return { result, provider, fellBack: i > 0 };\n } catch (e) {\n lastErr = e;\n }\n }\n const message = lastErr instanceof Error ? redactSecrets(lastErr.message) : String(lastErr);\n throw new Error(`${message} (ref ${correlationId})`);\n}\n\n/** Confirm each written file's on-disk content equals what we approved. */\nfunction verifyWrites(fsImpl: CodeFs, changes: FileChange[]): { ran: boolean; ok: boolean; detail: string } {\n let checked = 0;\n const mismatches: string[] = [];\n for (const change of changes) {\n if (change.diff === '' || !change.outcomes.some((o) => o.status === 'applied')) continue;\n checked++;\n const onDisk = fsImpl.read(change.file);\n if (onDisk !== change.after) mismatches.push(change.file);\n }\n if (mismatches.length) return { ran: true, ok: false, detail: `on-disk content differs for: ${mismatches.join(', ')}` };\n return { ran: true, ok: true, detail: `wrote and verified ${checked} file(s)` };\n}\n\n/** An append-only, secret-free audit record (GUARDRAILS §2.6 / §5). No file contents, no keys. */\nfunction writeAudit(fsImpl: CodeFs, r: CodeSessionResult, ts: number): void {\n const record = {\n ts,\n correlationId: r.correlationId,\n instruction: r.instruction.slice(0, 500),\n provider: r.provider.id,\n model: r.provider.model,\n local: r.provider.local,\n applied: r.applied,\n files: r.changes.map((c) => ({ file: c.file, statuses: c.outcomes.map((o) => o.status) })),\n verification: r.verification,\n phases: r.phasesRun,\n };\n try {\n fsImpl.appendAudit(JSON.stringify(record));\n } catch {\n /* audit is best-effort; never fail the run on a logging problem */\n }\n}\n\n/** Build a per-file map of symbol spans for graph-scoped edit disambiguation. */\nfunction spanIndex(graph: VgGraph): Map<string, SymbolSpan[]> {\n const map = new Map<string, SymbolSpan[]>();\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const file = normalize(n.file);\n const list = map.get(file) ?? [];\n list.push({ qualifiedName: n.qualifiedName, file, start: n.span.start, end: n.span.end });\n map.set(file, list);\n }\n return map;\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\n/** Default filesystem impl, scoped to `root`. Refuses paths that escape the root. */\nexport function nodeCodeFs(root: string): CodeFs {\n const resolve = (file: string): string => {\n const abs = path.resolve(root, file);\n const rel = path.relative(root, abs);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(`edit path escapes the project root: ${file} — refusing to touch files outside ${root}`);\n }\n return abs;\n };\n return {\n read(file) {\n try {\n return fs.readFileSync(resolve(file), 'utf8');\n } catch {\n return null;\n }\n },\n write(file, content) {\n const abs = resolve(file);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, content);\n },\n remove(file) {\n try {\n fs.rmSync(resolve(file));\n } catch {\n /* already gone */\n }\n },\n appendAudit(line) {\n const dir = path.join(root, '.vibgrate');\n fs.mkdirSync(dir, { recursive: true });\n fs.appendFileSync(path.join(dir, 'code-audit.jsonl'), line + '\\n');\n },\n };\n}\n\n/** Short, URL-safe correlation id. Not a graph artifact, so runtime randomness is fine here. */\nfunction shortId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 8; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { trieHas, trieHasPrefix, maskAllowedNextChars, trieEnumerateWords, extractIdentifiers, SessionPrefixCursor, KvBlockRegistry, annotateUnknownIdentifiers, scanIdentifiersAgainstTrie, contentHash, longestWarmPrefix } from './chunk-JIBOJTGS.js';
1
+ import { trieHas, trieHasPrefix, maskAllowedNextChars, trieEnumerateWords, extractIdentifiers, SessionPrefixCursor, KvBlockRegistry, annotateUnknownIdentifiers, scanIdentifiersAgainstTrie, contentHash, longestWarmPrefix } from './chunk-5HYCB55P.js';
2
2
 
3
3
  // src/runtime/llm-host/binding-capabilities.ts
4
4
  function probeBindingCapabilities(lib, model, sequence, options = {}) {
@@ -778,5 +778,5 @@ async function tryReuseWarmPrefix(session, segments, plan, caps) {
778
778
  }
779
779
 
780
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 };
781
- //# sourceMappingURL=chunk-6HX47EBL.js.map
782
- //# sourceMappingURL=chunk-6HX47EBL.js.map
781
+ //# sourceMappingURL=chunk-X634FZVG.js.map
782
+ //# sourceMappingURL=chunk-X634FZVG.js.map
@@ -1 +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":";;;AAwCO,SAAS,yBACd,GAAA,EACA,KAAA,EACA,QAAA,EACA,OAAA,GAA+B,EAAC,EACX;AACrB,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,MAAM,CAAA,GAAS,KAAA;AACf,EAAA,MAAM,GAAA,GAAW,QAAA;AACjB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AAEnC,EAAA,MAAM,YAAY,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,SAAA,KAAc,UAAA,CAAA;AACjD,EAAA,MAAM,eAAe,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,YAAA,KAAiB,UAAA,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,gBAAA,KAAqB,UAAA,IAAc,OAAO,CAAA,CAAE,UAAA,KAAe,UAAA,CAAA;AACjG,EAAA,MAAM,WAAW,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,QAAA,KAAa,UAAA,CAAA;AAC/C,EAAA,MAAM,0BAA0B,CAAC,EAAE,GAAA,IAAO,OAAO,IAAI,kCAAA,KAAuC,UAAA,CAAA;AAE5F,EAAA,MAAM,UAAA,GAAa,kBAAkB,IAAA,CAAK,MAAA,CAAO,IAAI,eAAA,IAAmB,GAAA,CAAI,qBAAA,IAAyB,EAAE,CAAC,CAAA;AACxG,EAAA,MAAM,YAAY,iBAAA,CAAkB,IAAA,CAAK,OAAO,GAAA,CAAI,qBAAA,IAAyB,EAAE,CAAC,CAAA;AAChF,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAE,OAAA,CAAQ,aAAA,IAAiB,UAAA,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAE,OAAA,CAAQ,mBAAA,IAAuB,SAAA,CAAA;AAExD,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AACvC,EAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACrC,EAAA,IAAI,uBAAA,EAAyB,OAAA,CAAQ,IAAA,CAAK,yBAAyB,CAAA;AACnE,EAAA,IAAI,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAC3C,EAAA,IAAI,aAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,uBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,4BAA4B,IAAA,EAAoC;AAC9E,EAAA,OAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,aAAA;AACtC;AAGO,SAAS,yBAAyB,IAAA,EAAoC;AAC3E,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,uBAAA;AAC/B;;;AC9DO,SAAS,yBAAyB,KAAA,EAA0D;AACjG,EAAA,MAAM,aAAsC,EAAE,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAG;AACpE,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,EAAM,UAAA,CAAW,UAAU,KAAA,CAAM,OAAA;AACtD,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,IAAA,EAAM,UAAA,CAAW,YAAY,KAAA,CAAM,SAAA;AAC1D,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,CAAA,KAAM,MAAA,EAAW,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,MAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,MAC9B,OAAA,EAAS,CAAC,EAAE,KAAA,CAAM,OAAA,IAAW,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA;AACnE,GACF;AACF;;;ACfA,eAAsB,aAAA,CACpB,GAAA,EACA,IAAA,EACA,OAAA,GAAgC,EAAC,EACH;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,EAAK,EAAG;AACjB,IAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,kBAAA,EAAmB;AAAA,EACnF;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,yBAAA,EAA0B;AAAA,EAC1F;AAGA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,EAAE,YAAA,EAAc;AAClB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,CAAA,CAAE,YAAA,KAAiB,UAAA,EAAY;AACxC,QAAA,IAAI,QAAiB,OAAA,CAAQ,KAAA;AAC7B,QAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,UAAA,IAAI;AACF,YAAA,KAAA,GAAQ,OAAO,CAAA,CAAE,QAAA,KAAa,aAAa,MAAM,CAAA,CAAE,UAAS,GAAI,KAAA,CAAA;AAAA,UAClE,CAAA,CAAA,MAAQ;AACN,YAAA,KAAA,GAAQ,KAAA,CAAA;AAAA,UACV;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAiC;AAAA,UACrC,MAAM,IAAI,CAAA,CAAE,YAAA,CAAa,OAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,UACjD,MAAM,IAAI,CAAA,CAAE,aAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,UAC1C,MAAM,IAAI,CAAA,CAAE,YAAA,CAAa,IAAI;AAAA,SAC/B;AACA,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAI;AACF,YAAA,MAAM,IAAI,OAAA,EAAQ;AAClB,YAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,cAAA,EAAgB,SAAS,IAAA,EAAK;AAAA,UAClE,SAAS,CAAA,EAAG;AACV,YAAA,UAAA,CAAW,KAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,CAAA,CAAE,YAAA,CAAa,UAAA,KAAe,UAAA,EAAY;AACnD,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,MAAM,CAAA,CAAE,YAAA,CAAa,WAAW,IAAI,CAAA;AAC9C,UAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,cAAA,EAAgB,SAAS,IAAA,EAAK;AAAA,QAClE,SAAS,CAAA,EAAG;AACV,UAAA,UAAA,CAAW,KAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,wBAAwB,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,OAC5E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,CAAA,CAAE,aAAA,KAAkB,UAAA,EAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,CAAA,CAAE,aAAA,CAAc,IAAI,CAAA;AACpC,MAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,eAAA,EAAiB,SAAS,IAAA,EAAK;AAAA,IACnE,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAChF;AAAA,EACF;AAKA,EAAA,MAAM,SAAS,CAAC,EAAE,GAAG,YAAA,IAAgB,OAAO,GAAG,aAAA,KAAkB,UAAA,CAAA;AACjE,EAAA,MAAM,SAAS,MAAA,GACX,CAAA,wDAAA,CAAA,IACC,UAAA,CAAW,CAAC,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,CAAC,CAAC,MAAM,EAAA,CAAA,GACxD,yGAAA;AACJ,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAS,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAKO,SAAS,oBAAA,CACd,MAAA,EACA,IAAA,GAAoE,EAAC,EAC/D;AACN,EAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,EAAA,IAAI,OAAO,OAAA,EAAS;AACpB,EAAA,IAAI,KAAK,mBAAA,IAAuB,MAAA,CAAO,MAAA,KAAW,iBAAA,IAAqB,OAAO,KAAA,EAAO;AAEnF,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,iEAAA,EAAoE,MAAA,CAAO,MAAM,CAAA,EAC5E,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,0MAAA;AAAA,GAGhD;AACF;AAGO,SAAS,0BAAA,CAA2B,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AACxF,EAAA,OAAO,GAAA,CAAI,gCAAA,KAAqC,GAAA,IAAO,GAAA,CAAI,sCAAA,KAA2C,GAAA;AACxG;;;AC5HA,IAAM,WAAA,GAAc,WAAA;AACpB,IAAM,UAAA,GAAa,cAAA;AACnB,IAAM,cAAA,GAAiB,6BAAA;AAGvB,IAAM,IAAA,uBAAW,GAAA,CAAI;AAAA,EACnB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,OAAA;AAAA,EAAS,QAAA;AAAA,EACjE,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAC/D,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,QAAA;AAAA,EAC3D,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EACnE,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAC/D,SAAA;AAAA,EAAW,YAAA;AAAA,EAAc,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,QAAA;AAAA,EAC3D,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,UAAA;AAAA,EAC9D,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EACjE,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AACzD,CAAC,CAAA;AAmBM,SAAS,sBAAA,GAA2C;AACzD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAG;AACpC;AAEA,SAAS,OAAO,CAAA,EAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,KAAK,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAChD;AAKO,SAAS,eAAA,CACd,KAAA,EACA,SAAA,EACA,IAAA,EACiB;AACjB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,gBAAA,EAAkB,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA,EAAE;AAAA,EACnF;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,MAAM,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAK;AAAA,EACpF;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,SAAA;AAE9B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,yBAAyB,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACvB,IAAA,IAAI,KAAK,MAAA,IAAU,CAAA,IAAK,CAAC,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA,EAAG;AAC3F,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,eAAe,IAAI,CAAA,mBAAA,CAAA;AAAA,QAC3B,gBAAA,EAAkB,oBAAA,CAAqB,IAAA,EAAM,KAAA,CAAM,MAAM;AAAA,OAC3D;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,eAAe,IAAA,CAAK,SAAS,KAAK,CAAC,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM,SAAS,KAAK,CAAC,aAAA,CAAc,IAAA,EAAM,SAAS,CAAA,EAAG;AAChE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,eAAe,SAAS,CAAA,mBAAA,CAAA;AAAA,QAChC,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,gBAAA,EAAkB,YAAA,CAAa,IAAA,EAAM,IAAI;AAAA,GAC3C;AACF;AAGA,SAAS,SAAA,CAAU,OAAyB,SAAA,EAAqC;AAC/E,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA;AACjB,EAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AACnB,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,QAAA,IAAA,GAAO,UAAA;AACP,QAAA,MAAA,GAAS,EAAA;AAAA,MACX;AAAA,IACF,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAA,IAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,MAAA,GAAS,EAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAEA,SAAS,YAAA,CAAa,OAAyB,IAAA,EAAoD;AACjG,EAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,YAAY,OAAO,IAAA;AAC/C,EAAA,OAAO,oBAAA,CAAqB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAChD;AAKO,SAAS,gBAAA,CACd,KAAA,EACA,UAAA,EACA,IAAA,EACU;AACV,EAAA,OAAO,UAAA,CAAW,OAAO,CAAC,CAAA,KAAM,gBAAgB,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,CAAE,OAAO,CAAA;AACzE;AAKO,SAAS,uBAAA,CACd,OACA,IAAA,EACiB;AACjB,EAAA,OAAO,YAAA,CAAa,OAAO,IAAI,CAAA;AACjC;AAMO,SAAS,wBAAA,CACd,UAAA,EACA,IAAA,EACA,YAAA,EAC8F;AAC9F,EAAA,MAAM,QAAQ,sBAAA,EAAuB;AACrC,EAAA,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAE3D,EAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,IAAA,IAAI,SAAS,sBAAA,EAAuB;AACpC,IAAA,UAAA,CAAW,OAAA,GAAU,CAAC,SAAA,KAAsB;AAC1C,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AAC1B,MAAA,MAAA,GAAS,IAAA,CAAK,IAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,OAAO,MAAA,EAAO;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,IAAA,IAAI,SAAS,sBAAA,EAAuB;AACpC,IAAA,UAAA,CAAW,aAAA,GAAgB;AAAA,MACzB,MAAA,EAAQ,CAAC,SAAA,KAAsB;AAC7B,QAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA;AACpD,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AAC1B,QAAA,MAAA,GAAS,IAAA,CAAK,IAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,OAAO,MAAA,EAAO;AAAA,EAClE;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAClD;;;AChIA,IAAMA,eAAAA,GAAiB,6BAAA;AAMhB,SAAS,yBACd,GAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,GAAiC,EAAC,EACZ;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAU;AAAA,EACrH;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,MAAM,CAAA,GAAS,KAAA;AACf,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,cAAc,UAAA,EAAY;AAE3C,IAAA,IAAI,CAAA,IAAK,OAAO,CAAA,CAAE,gBAAA,KAAqB,UAAA,EAAY;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,YAAA;AAAA,QACR,SAAA,EAAW,IAAA;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,gBAAA,EAAkB,CAAA;AAAA,QAClB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,GAAG,SAAA,IAAa,CAAA;AAClC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAAA,EAClC,SAAS,CAAA,EAAG;AACV,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,EAAM,WAAW,CAAA;AAClD,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,CAAA,EAAG,IAAI,CAAA;AACzC,IAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,IAAI;AAEF,QAAA,IAAI,OAAO,IAAA,CAAK,GAAA,KAAQ,UAAA,EAAY;AAClC,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,UACrB,CAAA,CAAA,MAAQ;AACN,YAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,UAChC;AACA,UAAA,aAAA,EAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,eAAA,KAAoB,KAAA,IAAS,OAAO,CAAA,CAAE,qBAAqB,UAAA,IAAc,OAAO,CAAA,CAAE,UAAA,KAAe,UAAA,EAAY;AACvH,IAAA,MAAM,OAAA,GAAU,QAAQ,YAAA,IAAgB,GAAA;AACxC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,KAAA,IAAS,CAAA,CAAE,gBAAA,EAAiB,EAAG;AACxC,QAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,CAAA,CAAE,UAAA,CAAW,CAAC,KAAK,CAAC,CAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,IAAA,IAAQ,CAACA,eAAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,QAAQ,IAAA,EAAM,IAAI,KAAK,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA,EAAG;AAGtD,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AACvB,UAAA,gBAAA,EAAA;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AACrB,YAAA,gBAAA,EAAA;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GACJ,gBAAgB,CAAA,IAAK,gBAAA,GAAmB,IACpC,gBAAA,GAAmB,CAAA,GACjB,cACA,iBAAA,GACF,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,KAAW,MAAA;AAAA,IACpB,MAAA,EAAQ,MAAA,KAAW,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,IACrC,SAAA,EAAW,MAAA,KAAW,MAAA,GAAS,IAAA,GAAO,IAAA;AAAA,IACtC,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA,EAAQ,MAAA,KAAW,MAAA,GAAS,oBAAA,GAAuB;AAAA,GACrD;AACF;AAEA,SAAS,kBAAA,CAAmB,OAAY,IAAA,EAAyB;AAC/D,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACxC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,MAAA,IAAI,CAAA,IAAK,OAAO,CAAA,CAAE,MAAA,CAAO,QAAQ,MAAM,UAAA,EAAY,OAAO,CAAC,GAAG,CAAC,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,IAAI,MAAM,SAAA,IAAa,OAAO,KAAA,CAAM,SAAA,CAAU,WAAW,UAAA,EAAY;AACnE,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAMO,SAAS,gBAAA,CAAiB,MAAgB,YAAA,EAAgC;AAC/E,EAAA,OAAO,oBAAA,CAAqB,MAAM,YAAY,CAAA;AAChD;AAMO,SAAS,uBAAA,CAAwB,SAAA,EAAmB,IAAA,EAAgB,UAAA,GAAa,EAAA,EAAa;AACnG,EAAA,MAAM,SAAS,UAAA,GAAa,SAAA;AAE5B,EAAA,IAAI,OAAA,CAAQ,MAAM,MAAM,CAAA,IAAK,cAAc,IAAA,EAAM,MAAM,GAAG,OAAO,IAAA;AAEjE,EAAA,MAAM,GAAA,GAAM,mBAAmB,MAAM,CAAA;AACrC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,IAAK,aAAA,CAAc,IAAA,EAAM,EAAE,CAAC,CAAA;AACvE;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAgB,KAAA,GAAQ,GAAA,EAAa;AACnE,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA;AAC5C,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACxD;;;ACtOO,SAAS,mBAAA,CACd,UAAA,EACA,QAAA,EACA,GAAA,GAAM,CAAA,EACS;AACf,EAAA,IAAI,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,EAAC;AACjC,EAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,OAAA,EAAS,aAAY,IAAK,EAAA;AACtE,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAClB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACnE,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AACpB,QAAA,KAAA,IAAS,CAAA;AACT,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,IAAI,yEAAA,CAA0E,IAAA,CAAK,IAAI,CAAA,EAAG;AACxF,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,8DAAA,CAA+D,IAAA,CAAK,CAAC,CAAA,EAAG;AAC1E,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IAAK,OAAA,EAAS,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,sDAAA,CAAuD,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5F,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,EAAE,IAAA,EAAK,CAAE,MAAA,IAAU,CAAA,SAAU,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,MAAK,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,wBAAwB,CAAA;AAAA,IACpG;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAC/F;AAGO,SAAS,aAAA,CAAc,YAAkC,QAAA,EAA2C;AACzG,EAAA,OAAO,oBAAoB,UAAA,EAAY,QAAA,EAAU,CAAC,CAAA,CAAE,CAAC,GAAG,IAAA,IAAQ,IAAA;AAClE;;;AC8DA,IAAM,UAAA,uBAAiB,GAAA,EAAyB;AAEzC,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,OAAO,YAAY,SAAS,CAAA,CAAA;AAC9B;AAGO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,UAAA,CAAW,KAAA,EAAM;AACnB;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,UAAA,CAAW,IAAA;AACpB;AAeO,SAAS,gBAAA,GAAsC;AACpD,EAAA,OAAO,CAAC,GAAG,UAAA,CAAW,MAAA,EAAQ,CAAA,CAC3B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,QAAA,EAAU,CAAA,CAAE,EAAA,CAAG,IAAA,EAAK;AAAA,IACpB,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,eAAA,CAAgB,MAAA;AAAA,IACvC,WAAA,EAAa,CAAA,CAAE,IAAA,EAAM,OAAA,IAAW;AAAA,GAClC,CAAE,EACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAC3C;AAGO,SAAS,gBAAgB,cAAA,EAAiC;AAC/D,EAAA,MAAM,MAAM,cAAA,CAAe,UAAA,CAAW,WAAW,CAAA,GAAI,cAAA,GAAiB,WAAW,cAAc,CAAA;AAC/F,EAAA,OAAO,UAAA,CAAW,OAAO,GAAG,CAAA;AAC9B;AAKA,eAAsB,kBAAA,CAAmB,KAAc,SAAA,EAAyC;AAC9F,EAAA,MAAM,GAAA,GAAM,WAAW,SAAS,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,QAAA,GAAW,KAAK,GAAA,EAAI;AAC7B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,aAAa,UAAA,EAAY;AAC1C,IAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,CAAE,QAAA,EAAS;AAC/B,EAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,WAAW,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,aAAA,EAAc;AAC1C,EAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,EAAA,MAAM,EAAE,kBAAiB,GAAI,CAAA;AAC7B,EAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AAC1C,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACA,EAAA,MAAM,OAAO,IAAI,gBAAA,CAAiB,EAAE,eAAA,EAAiB,UAAU,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAA;AAAA,IACA,GAAA,EAAK,CAAA;AAAA,IACL,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAA,EAAI,IAAI,eAAA,EAAgB;AAAA,IACxB,MAAA,EAAQ,IAAI,mBAAA,EAAoB;AAAA,IAChC,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,IACnB,KAAA,EAAO,CAAA;AAAA,IACP,cAAA,sBAAoB,GAAA,EAAI;AAAA,IACxB,IAAA,EAAM;AAAA,GACR;AACA,EAAA,UAAA,CAAW,GAAA,CAAI,KAAK,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,iBAAA,CAAkB,cAAc,CAAA,EAAG,SAAA,GAAY,KAAK,GAAA,EAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,EAAW;AACpG,EAAA,IAAI,UAAA,CAAW,QAAQ,WAAA,EAAa;AAClC,IAAA,IAAIC,QAAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,UAAA,EAAY;AAC/B,MAAA,IAAI,GAAA,GAAM,CAAA,CAAE,QAAA,GAAW,SAAA,EAAW;AAChC,QAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AACnB,QAAAA,QAAAA,EAAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAOA,QAAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,CAAC,GAAG,WAAW,OAAA,EAAS,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,CAAC,EAAE,QAAQ,CAAA;AACtF,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,UAAA,CAAW,IAAA,GAAO,WAAA,IAAe,OAAA,CAAQ,MAAA,EAAQ;AACtD,IAAA,MAAM,CAAC,CAAC,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAM;AAC1B,IAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AACnB,IAAA,OAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,iBAAA,CACpB,OAAA,EACA,QAAA,EACA,MAAA,GAA6B,EAAC,EACD;AAC7B,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,GAAQ,CAAA,IAAK,QAAQ,QAAA,GAAW,CAAA;AAC1D,EAAA,OAAA,CAAQ,KAAA,EAAA;AACR,EAAA,OAAA,CAAQ,QAAA,GAAW,KAAK,GAAA,EAAI;AAE5B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,GAAA;AAClC,EAAA,MAAM,IAAA,GACJ,QAAQ,IAAA,IACR,wBAAA,CAAyB,QAAQ,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAA,EAAU;AAAA,IACrE,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,IAC5B;AAAA,GACD,CAAA;AACH,EAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AAEf,EAAA,MAAM,WACJ,MAAA,CAAO,cAAA,IACP,SAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IACtB,IAAA,EAAM,EAAE,IAAA,KAAS,QAAA,GAAW,WAAW,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC5E,MAAM,CAAA,CAAE;AAAA,GACV,CAAE,CAAA;AACJ,EAAA,MAAM,SAAS,OAAA,CAAQ,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,QAAQ,MAAM,CAAA;AAGvD,EAAA,MAAM,cAAc,MAAM,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAU,QAAQ,IAAI,CAAA;AAE5E,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,MAAA,CAAO,eAAA,EAAiB,UAAU,CAAC,CAAA;AACtE,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,oBAAA,GAAuB,CAAA;AAC3B,EAAA,IAAI,IAAA,GAAO,EAAA;AAEX,EAAA,MAAM,QAAA,GAAW,2BAA2B,GAAG,CAAA;AAE/C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AACzF,EAAA,oBAAA,CAAqB,OAAA,EAAS;AAAA,IAC5B,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACD,EAAA,IAAI,aAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,KAAA;AAAA,OAAA,IACpC,OAAA,CAAQ,WAAW,iBAAA,IAAqB,OAAA,CAAQ,UAAU,QAAA,IAAY,CAAC,OAAO,cAAA,CAAA,EAAiB;AACtG,IAAA,aAAA,GAAgB,OAAA,CAAQ,KAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,OAAO,gBAAA,CAAiB,OAAA,EAAS,OAAO,cAAA,EAAgB,MAAA,CAAO,0BAA0B,KAAK,CAAA;AAEpG,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,WAAA,EAAa,OAAO,WAAA,IAAe;AAAA,GACrC;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU,QAAA,CAAS,YAAY,MAAA,CAAO,SAAA;AAGtE,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,SAAA,GAAkD,MAAA;AACtD,EAAA,IAAI,MAAA,CAAO,cAAA,IAAkB,2BAAA,CAA4B,IAAI,CAAA,EAAG;AAC9D,IAAA,MAAM,GAAA,GAAM,wBAAA,CAAyB,MAAA,EAAQ,MAAA,CAAO,cAAA,EAAgB;AAAA,MAClE,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,eAAe,IAAA,CAAK;AAAA,KACrB,CAAA;AACD,IAAA,eAAA,GAAkB,GAAA,CAAI,QAAA;AACtB,IAAA,SAAA,GAAY,GAAA,CAAI,MAAA;AAAA,EAClB;AAEA,EAAA,MAAM,WAAW,wBAAA,CAAyB;AAAA,IACxC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAA,EAAS,kBAAkB,MAAA,GAAS;AAAA,GACrC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,IAAA,EAAM,eAAA,EAAiB,SAAS,CAAA;AAE3E,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,oBAAA,EAAA;AACA,MAAA,IAAI,MAAM,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,IAAA,EAAM,IAAI,CAAA,EAAG;AAC/C,QAAA,QAAA,GAAW,CAAA,CAAE,IAAA;AACb,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,kBAAA,GAAqB,QAAA,CAAS,MAAA;AAC9B,MAAA,IAAA,GAAO,QAAA;AACP,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,GAAG,QAAA;AAAA,QACH,EAAE,IAAA,EAAM,WAAA,EAAsB,OAAA,EAAS,QAAA,EAAS;AAAA,QAChD,EAAE,IAAA,EAAM,MAAA,EAAiB,OAAA,EAAS,qDAAA;AAAsD,OAC1F;AACA,MAAA,MAAM,OAAO,MAAM,aAAA,CAAc,OAAA,EAAS,YAAA,EAAc,SAAS,UAAU,CAAA;AAC3E,MAAA,IAAA,GAAO,QAAA,IAAY,KAAK,UAAA,CAAW,QAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA,CAAA;AAAA,IAC/E,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA,IACnE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA,EACnE;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,QAAQ,CAAA;AAC1B,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAElC,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,IAAI,MAAA,CAAO,+BAA+B,KAAA,EAAO;AAC/C,MAAA,MAAM,GAAA,GAAM,0BAAA,CAA2B,IAAA,EAAM,MAAA,CAAO,cAAc,CAAA;AAClE,MAAA,IAAA,GAAO,GAAA,CAAI,IAAA;AACX,MAAA,kBAAA,GAAqB,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,GAAA,CAAI,OAAA,GAAU,MAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,0BAAA,CAA2B,IAAA,EAAM,MAAA,CAAO,cAAc,CAAA;AACnE,MAAA,kBAAA,GAAqB,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,OAAA,CAAQ,SAAA;AAAA,IACf,SAAA,EAAW,UAAA;AAAA,IACX,aAAa,OAAA,CAAQ,OAAA,IAAY,CAAC,CAAC,iBAAiB,QAAA,IAAa,eAAA;AAAA,IACjE,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,EAAgB,QAAQ,OAAA,IAAY,CAAC,CAAC,aAAA,IAAiB,QAAA,IAAY,QAAQ,MAAA,KAAW,iBAAA;AAAA,IACtF,eAAe,OAAA,CAAQ,MAAA;AAAA,IACvB,WAAA,EAAa,KAAK,OAAA,IAAW,eAAA;AAAA,IAC7B,aAAA;AAAA,IACA,sBAAsB,IAAA,CAAK,aAAA;AAAA,IAC3B,yBAAyB,IAAA,CAAK,gBAAA;AAAA,IAC9B,cAAA,EAAgB,eAAA;AAAA,IAChB,sBAAsB,WAAA,CAAY,MAAA;AAAA,IAClC,eAAe,MAAA,CAAO,WAAA;AAAA,IACtB,aAAa,IAAA,CAAK,OAAA;AAAA,IAClB,kBAAkB,QAAA,CAAS,MAAA;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC1B;AACF;AAEA,SAAS,oBAAA,CACP,IAAA,EACA,eAAA,EACA,SAAA,EACmB;AACnB,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,eAAA,EAAiB,OAAO,mBAAA;AAC5C,EAAA,IAAI,eAAA,IAAmB,SAAA,KAAc,SAAA,EAAW,OAAO,iBAAA;AACvD,EAAA,IAAI,eAAA,IAAmB,SAAA,KAAc,eAAA,EAAiB,OAAO,uBAAA;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;AAEA,SAAS,gBAAA,CACP,OAAA,EACA,IAAA,EACA,eAAA,EACsB;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAE;AAAA,EAClG;AACA,EAAA,MAAM,EAAA,GAAK,GAAG,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAA,EAAQ,eAAA,GAAkB,IAAI,CAAC,CAAA,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC5C,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,QAAQ,wBAAA,CAAyB,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,IAAA,EAAM;AAAA,IACvE;AAAA,GACD,CAAA;AACD,EAAA,IAAI,QAAQ,cAAA,CAAe,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,eAAe,KAAA,EAAM;AAClE,EAAA,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,aAAA,CAAc,OAAA,EAAsB,QAAA,EAA4B,UAAA,EAAsD;AACnI,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACzE,EAAA,MAAM,OAAe,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,QAAQ,UAAU,CAAA;AACjE,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AAC5D;AAEA,eAAe,cAAA,CAAe,OAAA,EAAsB,KAAA,EAAe,IAAA,EAA6C;AAC9G,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAA,CAAQ,QAAA;AACpB,IAAA,IAAI,IAAA,CAAK,2BAA2B,IAAA,CAAK,QAAA,IAAY,OAAO,OAAO,GAAA,CAAI,uCAAuC,UAAA,EAAY;AACxH,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACjD,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AACnC,QAAA,MAAM,GAAA,CAAI,mCAAmC,MAAM,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,OAAA,CAAQ,EAAA,CAAG,MAAA,CAAO,WAAA,CAAY,KAAK,CAAC,CAAA;AAC7C;AAMA,eAAe,kBAAA,CACb,OAAA,EACA,QAAA,EACA,IAAA,EACA,IAAA,EACkG;AAClG,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,IAAI,OAAO,KAAA,KAAU,CAAA,IAAA,CAAM,IAAA,CAAK,gBAAA,IAAoB,OAAO,CAAA,EAAG;AAC5D,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,EACrC;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,uBAAA;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAA,CAAQ,QAAA;AACpB,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,IAAW,GAAA,IAAO,OAAO,GAAA,CAAI,kCAAA,KAAuC,cAAc,KAAA,IAAS,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AAEnI,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AACvD,MAAA,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,IAAK,KAAA,CAAM,YAAA,EAAc;AAC9C,QAAA,MAAMC,OAAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,YAAY,CAAA;AAChD,QAAA,MAAM,GAAA,CAAI,mCAAmCA,OAAM,CAAA;AACnD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,QAAQ,gBAAA,EAAiB;AAAA,MAC5D;AACA,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAMA,OAAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA,MAAM,GAAA,CAAI,mCAAmCA,OAAM,CAAA;AACnD,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,QAAQ,iBAAA,EAAkB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,SAAA;AACrC,EAAA,IAAI,SAAS,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,QAAQ,WAAA,EAAY;AACrD,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AACrC","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
+ {"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":";;;AAwCO,SAAS,yBACd,GAAA,EACA,KAAA,EACA,QAAA,EACA,OAAA,GAA+B,EAAC,EACX;AACrB,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,MAAM,CAAA,GAAS,KAAA;AACf,EAAA,MAAM,GAAA,GAAW,QAAA;AACjB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AAEnC,EAAA,MAAM,YAAY,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,SAAA,KAAc,UAAA,CAAA;AACjD,EAAA,MAAM,eAAe,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,YAAA,KAAiB,UAAA,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,gBAAA,KAAqB,UAAA,IAAc,OAAO,CAAA,CAAE,UAAA,KAAe,UAAA,CAAA;AACjG,EAAA,MAAM,WAAW,CAAC,EAAE,CAAA,IAAK,OAAO,EAAE,QAAA,KAAa,UAAA,CAAA;AAC/C,EAAA,MAAM,0BAA0B,CAAC,EAAE,GAAA,IAAO,OAAO,IAAI,kCAAA,KAAuC,UAAA,CAAA;AAE5F,EAAA,MAAM,UAAA,GAAa,kBAAkB,IAAA,CAAK,MAAA,CAAO,IAAI,eAAA,IAAmB,GAAA,CAAI,qBAAA,IAAyB,EAAE,CAAC,CAAA;AACxG,EAAA,MAAM,YAAY,iBAAA,CAAkB,IAAA,CAAK,OAAO,GAAA,CAAI,qBAAA,IAAyB,EAAE,CAAC,CAAA;AAChF,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAE,OAAA,CAAQ,aAAA,IAAiB,UAAA,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAE,OAAA,CAAQ,mBAAA,IAAuB,SAAA,CAAA;AAExD,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AACvC,EAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AACrC,EAAA,IAAI,uBAAA,EAAyB,OAAA,CAAQ,IAAA,CAAK,yBAAyB,CAAA;AACnE,EAAA,IAAI,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAC3C,EAAA,IAAI,aAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,uBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,4BAA4B,IAAA,EAAoC;AAC9E,EAAA,OAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,aAAA;AACtC;AAGO,SAAS,yBAAyB,IAAA,EAAoC;AAC3E,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,uBAAA;AAC/B;;;AC9DO,SAAS,yBAAyB,KAAA,EAA0D;AACjG,EAAA,MAAM,aAAsC,EAAE,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAG;AACpE,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,EAAM,UAAA,CAAW,UAAU,KAAA,CAAM,OAAA;AACtD,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,IAAA,EAAM,UAAA,CAAW,YAAY,KAAA,CAAM,SAAA;AAC1D,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,CAAA,KAAM,MAAA,EAAW,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,MAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,MAC9B,OAAA,EAAS,CAAC,EAAE,KAAA,CAAM,OAAA,IAAW,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA;AACnE,GACF;AACF;;;ACfA,eAAsB,aAAA,CACpB,GAAA,EACA,IAAA,EACA,OAAA,GAAgC,EAAC,EACH;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,EAAK,EAAG;AACjB,IAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,kBAAA,EAAmB;AAAA,EACnF;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,yBAAA,EAA0B;AAAA,EAC1F;AAGA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,EAAE,YAAA,EAAc;AAClB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,CAAA,CAAE,YAAA,KAAiB,UAAA,EAAY;AACxC,QAAA,IAAI,QAAiB,OAAA,CAAQ,KAAA;AAC7B,QAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,UAAA,IAAI;AACF,YAAA,KAAA,GAAQ,OAAO,CAAA,CAAE,QAAA,KAAa,aAAa,MAAM,CAAA,CAAE,UAAS,GAAI,KAAA,CAAA;AAAA,UAClE,CAAA,CAAA,MAAQ;AACN,YAAA,KAAA,GAAQ,KAAA,CAAA;AAAA,UACV;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAiC;AAAA,UACrC,MAAM,IAAI,CAAA,CAAE,YAAA,CAAa,OAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,UACjD,MAAM,IAAI,CAAA,CAAE,aAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,UAC1C,MAAM,IAAI,CAAA,CAAE,YAAA,CAAa,IAAI;AAAA,SAC/B;AACA,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAI;AACF,YAAA,MAAM,IAAI,OAAA,EAAQ;AAClB,YAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,cAAA,EAAgB,SAAS,IAAA,EAAK;AAAA,UAClE,SAAS,CAAA,EAAG;AACV,YAAA,UAAA,CAAW,KAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,CAAA,CAAE,YAAA,CAAa,UAAA,KAAe,UAAA,EAAY;AACnD,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,MAAM,CAAA,CAAE,YAAA,CAAa,WAAW,IAAI,CAAA;AAC9C,UAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,cAAA,EAAgB,SAAS,IAAA,EAAK;AAAA,QAClE,SAAS,CAAA,EAAG;AACV,UAAA,UAAA,CAAW,KAAK,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,wBAAwB,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,OAC5E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,CAAA,CAAE,aAAA,KAAkB,UAAA,EAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,CAAA,CAAE,aAAA,CAAc,IAAI,CAAA;AACpC,MAAA,IAAI,CAAA,SAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,eAAA,EAAiB,SAAS,IAAA,EAAK;AAAA,IACnE,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAChF;AAAA,EACF;AAKA,EAAA,MAAM,SAAS,CAAC,EAAE,GAAG,YAAA,IAAgB,OAAO,GAAG,aAAA,KAAkB,UAAA,CAAA;AACjE,EAAA,MAAM,SAAS,MAAA,GACX,CAAA,wDAAA,CAAA,IACC,UAAA,CAAW,CAAC,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,CAAC,CAAC,MAAM,EAAA,CAAA,GACxD,yGAAA;AACJ,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAS,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAKO,SAAS,oBAAA,CACd,MAAA,EACA,IAAA,GAAoE,EAAC,EAC/D;AACN,EAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,EAAA,IAAI,OAAO,OAAA,EAAS;AACpB,EAAA,IAAI,KAAK,mBAAA,IAAuB,MAAA,CAAO,MAAA,KAAW,iBAAA,IAAqB,OAAO,KAAA,EAAO;AAEnF,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,iEAAA,EAAoE,MAAA,CAAO,MAAM,CAAA,EAC5E,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,0MAAA;AAAA,GAGhD;AACF;AAGO,SAAS,0BAAA,CAA2B,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AACxF,EAAA,OAAO,GAAA,CAAI,gCAAA,KAAqC,GAAA,IAAO,GAAA,CAAI,sCAAA,KAA2C,GAAA;AACxG;;;AC5HA,IAAM,WAAA,GAAc,WAAA;AACpB,IAAM,UAAA,GAAa,cAAA;AACnB,IAAM,cAAA,GAAiB,6BAAA;AAGvB,IAAM,IAAA,uBAAW,GAAA,CAAI;AAAA,EACnB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,OAAA;AAAA,EAAS,QAAA;AAAA,EACjE,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAC/D,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,QAAA;AAAA,EAC3D,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EACnE,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAC/D,SAAA;AAAA,EAAW,YAAA;AAAA,EAAc,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,QAAA;AAAA,EAC3D,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,UAAA;AAAA,EAC9D,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EACjE,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AACzD,CAAC,CAAA;AAmBM,SAAS,sBAAA,GAA2C;AACzD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAG;AACpC;AAEA,SAAS,OAAO,CAAA,EAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,KAAK,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAChD;AAKO,SAAS,eAAA,CACd,KAAA,EACA,SAAA,EACA,IAAA,EACiB;AACjB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,gBAAA,EAAkB,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA,EAAE;AAAA,EACnF;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,MAAM,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAK;AAAA,EACpF;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,SAAA;AAE9B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,yBAAyB,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACvB,IAAA,IAAI,KAAK,MAAA,IAAU,CAAA,IAAK,CAAC,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA,EAAG;AAC3F,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,eAAe,IAAI,CAAA,mBAAA,CAAA;AAAA,QAC3B,gBAAA,EAAkB,oBAAA,CAAqB,IAAA,EAAM,KAAA,CAAM,MAAM;AAAA,OAC3D;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,eAAe,IAAA,CAAK,SAAS,KAAK,CAAC,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/D,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM,SAAS,KAAK,CAAC,aAAA,CAAc,IAAA,EAAM,SAAS,CAAA,EAAG;AAChE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,eAAe,SAAS,CAAA,mBAAA,CAAA;AAAA,QAChC,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,gBAAA,EAAkB,YAAA,CAAa,IAAA,EAAM,IAAI;AAAA,GAC3C;AACF;AAGA,SAAS,SAAA,CAAU,OAAyB,SAAA,EAAqC;AAC/E,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA;AACjB,EAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AACnB,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,QAAA,IAAA,GAAO,UAAA;AACP,QAAA,MAAA,GAAS,EAAA;AAAA,MACX;AAAA,IACF,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAA,IAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,MAAA,GAAS,EAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAEA,SAAS,YAAA,CAAa,OAAyB,IAAA,EAAoD;AACjG,EAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,YAAY,OAAO,IAAA;AAC/C,EAAA,OAAO,oBAAA,CAAqB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAChD;AAKO,SAAS,gBAAA,CACd,KAAA,EACA,UAAA,EACA,IAAA,EACU;AACV,EAAA,OAAO,UAAA,CAAW,OAAO,CAAC,CAAA,KAAM,gBAAgB,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,CAAE,OAAO,CAAA;AACzE;AAKO,SAAS,uBAAA,CACd,OACA,IAAA,EACiB;AACjB,EAAA,OAAO,YAAA,CAAa,OAAO,IAAI,CAAA;AACjC;AAMO,SAAS,wBAAA,CACd,UAAA,EACA,IAAA,EACA,YAAA,EAC8F;AAC9F,EAAA,MAAM,QAAQ,sBAAA,EAAuB;AACrC,EAAA,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAE3D,EAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,IAAA,IAAI,SAAS,sBAAA,EAAuB;AACpC,IAAA,UAAA,CAAW,OAAA,GAAU,CAAC,SAAA,KAAsB;AAC1C,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AAC1B,MAAA,MAAA,GAAS,IAAA,CAAK,IAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,OAAO,MAAA,EAAO;AAAA,EAC5D;AAEA,EAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,IAAA,IAAI,SAAS,sBAAA,EAAuB;AACpC,IAAA,UAAA,CAAW,aAAA,GAAgB;AAAA,MACzB,MAAA,EAAQ,CAAC,SAAA,KAAsB;AAC7B,QAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA;AACpD,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,KAAA;AAC1B,QAAA,MAAA,GAAS,IAAA,CAAK,IAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,OAAO,MAAA,EAAO;AAAA,EAClE;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAClD;;;AChIA,IAAMA,eAAAA,GAAiB,6BAAA;AAMhB,SAAS,yBACd,GAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,GAAiC,EAAC,EACZ;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAU;AAAA,EACrH;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,MAAM,CAAA,GAAS,KAAA;AACf,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,cAAc,UAAA,EAAY;AAE3C,IAAA,IAAI,CAAA,IAAK,OAAO,CAAA,CAAE,gBAAA,KAAqB,UAAA,EAAY;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,YAAA;AAAA,QACR,SAAA,EAAW,IAAA;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,gBAAA,EAAkB,CAAA;AAAA,QAClB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,GAAG,SAAA,IAAa,CAAA;AAClC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAAA,EAClC,SAAS,CAAA,EAAG;AACV,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB,CAAA;AAAA,MAClB,MAAA,EAAQ,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,EAAM,WAAW,CAAA;AAClD,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,CAAA,EAAG,IAAI,CAAA;AACzC,IAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,IAAI;AAEF,QAAA,IAAI,OAAO,IAAA,CAAK,GAAA,KAAQ,UAAA,EAAY;AAClC,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,UACrB,CAAA,CAAA,MAAQ;AACN,YAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,UAChC;AACA,UAAA,aAAA,EAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,eAAA,KAAoB,KAAA,IAAS,OAAO,CAAA,CAAE,qBAAqB,UAAA,IAAc,OAAO,CAAA,CAAE,UAAA,KAAe,UAAA,EAAY;AACvH,IAAA,MAAM,OAAA,GAAU,QAAQ,YAAA,IAAgB,GAAA;AACxC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,KAAA,IAAS,CAAA,CAAE,gBAAA,EAAiB,EAAG;AACxC,QAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,CAAA,CAAE,UAAA,CAAW,CAAC,KAAK,CAAC,CAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,IAAA,IAAQ,CAACA,eAAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,QAAQ,IAAA,EAAM,IAAI,KAAK,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA,EAAG;AAGtD,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AACvB,UAAA,gBAAA,EAAA;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AACrB,YAAA,gBAAA,EAAA;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GACJ,gBAAgB,CAAA,IAAK,gBAAA,GAAmB,IACpC,gBAAA,GAAmB,CAAA,GACjB,cACA,iBAAA,GACF,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,KAAW,MAAA;AAAA,IACpB,MAAA,EAAQ,MAAA,KAAW,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,IACrC,SAAA,EAAW,MAAA,KAAW,MAAA,GAAS,IAAA,GAAO,IAAA;AAAA,IACtC,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA,EAAQ,MAAA,KAAW,MAAA,GAAS,oBAAA,GAAuB;AAAA,GACrD;AACF;AAEA,SAAS,kBAAA,CAAmB,OAAY,IAAA,EAAyB;AAC/D,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACxC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,MAAA,IAAI,CAAA,IAAK,OAAO,CAAA,CAAE,MAAA,CAAO,QAAQ,MAAM,UAAA,EAAY,OAAO,CAAC,GAAG,CAAC,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,IAAI,MAAM,SAAA,IAAa,OAAO,KAAA,CAAM,SAAA,CAAU,WAAW,UAAA,EAAY;AACnE,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AACrC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAMO,SAAS,gBAAA,CAAiB,MAAgB,YAAA,EAAgC;AAC/E,EAAA,OAAO,oBAAA,CAAqB,MAAM,YAAY,CAAA;AAChD;AAMO,SAAS,uBAAA,CAAwB,SAAA,EAAmB,IAAA,EAAgB,UAAA,GAAa,EAAA,EAAa;AACnG,EAAA,MAAM,SAAS,UAAA,GAAa,SAAA;AAE5B,EAAA,IAAI,OAAA,CAAQ,MAAM,MAAM,CAAA,IAAK,cAAc,IAAA,EAAM,MAAM,GAAG,OAAO,IAAA;AAEjE,EAAA,MAAM,GAAA,GAAM,mBAAmB,MAAM,CAAA;AACrC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,IAAK,aAAA,CAAc,IAAA,EAAM,EAAE,CAAC,CAAA;AACvE;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAgB,KAAA,GAAQ,GAAA,EAAa;AACnE,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA;AAC5C,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACxD;;;ACtOO,SAAS,mBAAA,CACd,UAAA,EACA,QAAA,EACA,GAAA,GAAM,CAAA,EACS;AACf,EAAA,IAAI,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,EAAC;AACjC,EAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,OAAA,EAAS,aAAY,IAAK,EAAA;AACtE,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAClB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACnE,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AACpB,QAAA,KAAA,IAAS,CAAA;AACT,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,IAAI,yEAAA,CAA0E,IAAA,CAAK,IAAI,CAAA,EAAG;AACxF,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,8DAAA,CAA+D,IAAA,CAAK,CAAC,CAAA,EAAG;AAC1E,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IAAK,OAAA,EAAS,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,sDAAA,CAAuD,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5F,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,EAAE,IAAA,EAAK,CAAE,MAAA,IAAU,CAAA,SAAU,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,MAAK,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,wBAAwB,CAAA;AAAA,IACpG;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAC/F;AAGO,SAAS,aAAA,CAAc,YAAkC,QAAA,EAA2C;AACzG,EAAA,OAAO,oBAAoB,UAAA,EAAY,QAAA,EAAU,CAAC,CAAA,CAAE,CAAC,GAAG,IAAA,IAAQ,IAAA;AAClE;;;AC8DA,IAAM,UAAA,uBAAiB,GAAA,EAAyB;AAEzC,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,OAAO,YAAY,SAAS,CAAA,CAAA;AAC9B;AAGO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,UAAA,CAAW,KAAA,EAAM;AACnB;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,UAAA,CAAW,IAAA;AACpB;AAeO,SAAS,gBAAA,GAAsC;AACpD,EAAA,OAAO,CAAC,GAAG,UAAA,CAAW,MAAA,EAAQ,CAAA,CAC3B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,QAAA,EAAU,CAAA,CAAE,EAAA,CAAG,IAAA,EAAK;AAAA,IACpB,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,eAAA,CAAgB,MAAA;AAAA,IACvC,WAAA,EAAa,CAAA,CAAE,IAAA,EAAM,OAAA,IAAW;AAAA,GAClC,CAAE,EACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAC3C;AAGO,SAAS,gBAAgB,cAAA,EAAiC;AAC/D,EAAA,MAAM,MAAM,cAAA,CAAe,UAAA,CAAW,WAAW,CAAA,GAAI,cAAA,GAAiB,WAAW,cAAc,CAAA;AAC/F,EAAA,OAAO,UAAA,CAAW,OAAO,GAAG,CAAA;AAC9B;AAKA,eAAsB,kBAAA,CAAmB,KAAc,SAAA,EAAyC;AAC9F,EAAA,MAAM,GAAA,GAAM,WAAW,SAAS,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,QAAA,GAAW,KAAK,GAAA,EAAI;AAC7B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAS,GAAA;AACf,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,aAAa,UAAA,EAAY;AAC1C,IAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,CAAE,QAAA,EAAS;AAC/B,EAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,WAAW,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,aAAA,EAAc;AAC1C,EAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,EAAA,MAAM,EAAE,kBAAiB,GAAI,CAAA;AAC7B,EAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AAC1C,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACA,EAAA,MAAM,OAAO,IAAI,gBAAA,CAAiB,EAAE,eAAA,EAAiB,UAAU,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAA;AAAA,IACA,GAAA,EAAK,CAAA;AAAA,IACL,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAA,EAAI,IAAI,eAAA,EAAgB;AAAA,IACxB,MAAA,EAAQ,IAAI,mBAAA,EAAoB;AAAA,IAChC,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,IACnB,KAAA,EAAO,CAAA;AAAA,IACP,cAAA,sBAAoB,GAAA,EAAI;AAAA,IACxB,IAAA,EAAM;AAAA,GACR;AACA,EAAA,UAAA,CAAW,GAAA,CAAI,KAAK,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,iBAAA,CAAkB,cAAc,CAAA,EAAG,SAAA,GAAY,KAAK,GAAA,EAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,EAAW;AACpG,EAAA,IAAI,UAAA,CAAW,QAAQ,WAAA,EAAa;AAClC,IAAA,IAAIC,QAAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,UAAA,EAAY;AAC/B,MAAA,IAAI,GAAA,GAAM,CAAA,CAAE,QAAA,GAAW,SAAA,EAAW;AAChC,QAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AACnB,QAAAA,QAAAA,EAAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAOA,QAAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,CAAC,GAAG,WAAW,OAAA,EAAS,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,CAAC,EAAE,QAAQ,CAAA;AACtF,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,UAAA,CAAW,IAAA,GAAO,WAAA,IAAe,OAAA,CAAQ,MAAA,EAAQ;AACtD,IAAA,MAAM,CAAC,CAAC,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAM;AAC1B,IAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AACnB,IAAA,OAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,iBAAA,CACpB,OAAA,EACA,QAAA,EACA,MAAA,GAA6B,EAAC,EACD;AAC7B,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,GAAQ,CAAA,IAAK,QAAQ,QAAA,GAAW,CAAA;AAC1D,EAAA,OAAA,CAAQ,KAAA,EAAA;AACR,EAAA,OAAA,CAAQ,QAAA,GAAW,KAAK,GAAA,EAAI;AAE5B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,GAAA;AAClC,EAAA,MAAM,IAAA,GACJ,QAAQ,IAAA,IACR,wBAAA,CAAyB,QAAQ,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAA,EAAU;AAAA,IACrE,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,IAC5B;AAAA,GACD,CAAA;AACH,EAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AAEf,EAAA,MAAM,WACJ,MAAA,CAAO,cAAA,IACP,SAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IACtB,IAAA,EAAM,EAAE,IAAA,KAAS,QAAA,GAAW,WAAW,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC5E,MAAM,CAAA,CAAE;AAAA,GACV,CAAE,CAAA;AACJ,EAAA,MAAM,SAAS,OAAA,CAAQ,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,QAAQ,MAAM,CAAA;AAGvD,EAAA,MAAM,cAAc,MAAM,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAU,QAAQ,IAAI,CAAA;AAE5E,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,MAAA,CAAO,eAAA,EAAiB,UAAU,CAAC,CAAA;AACtE,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,oBAAA,GAAuB,CAAA;AAC3B,EAAA,IAAI,IAAA,GAAO,EAAA;AAEX,EAAA,MAAM,QAAA,GAAW,2BAA2B,GAAG,CAAA;AAE/C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AACzF,EAAA,oBAAA,CAAqB,OAAA,EAAS;AAAA,IAC5B,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACD,EAAA,IAAI,aAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,KAAA;AAAA,OAAA,IACpC,OAAA,CAAQ,WAAW,iBAAA,IAAqB,OAAA,CAAQ,UAAU,QAAA,IAAY,CAAC,OAAO,cAAA,CAAA,EAAiB;AACtG,IAAA,aAAA,GAAgB,OAAA,CAAQ,KAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,OAAO,gBAAA,CAAiB,OAAA,EAAS,OAAO,cAAA,EAAgB,MAAA,CAAO,0BAA0B,KAAK,CAAA;AAEpG,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,WAAA,EAAa,OAAO,WAAA,IAAe;AAAA,GACrC;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU,QAAA,CAAS,YAAY,MAAA,CAAO,SAAA;AAGtE,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,SAAA,GAAkD,MAAA;AACtD,EAAA,IAAI,MAAA,CAAO,cAAA,IAAkB,2BAAA,CAA4B,IAAI,CAAA,EAAG;AAC9D,IAAA,MAAM,GAAA,GAAM,wBAAA,CAAyB,MAAA,EAAQ,MAAA,CAAO,cAAA,EAAgB;AAAA,MAClE,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,eAAe,IAAA,CAAK;AAAA,KACrB,CAAA;AACD,IAAA,eAAA,GAAkB,GAAA,CAAI,QAAA;AACtB,IAAA,SAAA,GAAY,GAAA,CAAI,MAAA;AAAA,EAClB;AAEA,EAAA,MAAM,WAAW,wBAAA,CAAyB;AAAA,IACxC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAA,EAAS,kBAAkB,MAAA,GAAS;AAAA,GACrC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,IAAA,EAAM,eAAA,EAAiB,SAAS,CAAA;AAE3E,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,oBAAA,EAAA;AACA,MAAA,IAAI,MAAM,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,IAAA,EAAM,IAAI,CAAA,EAAG;AAC/C,QAAA,QAAA,GAAW,CAAA,CAAE,IAAA;AACb,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,kBAAA,GAAqB,QAAA,CAAS,MAAA;AAC9B,MAAA,IAAA,GAAO,QAAA;AACP,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,GAAG,QAAA;AAAA,QACH,EAAE,IAAA,EAAM,WAAA,EAAsB,OAAA,EAAS,QAAA,EAAS;AAAA,QAChD,EAAE,IAAA,EAAM,MAAA,EAAiB,OAAA,EAAS,qDAAA;AAAsD,OAC1F;AACA,MAAA,MAAM,OAAO,MAAM,aAAA,CAAc,OAAA,EAAS,YAAA,EAAc,SAAS,UAAU,CAAA;AAC3E,MAAA,IAAA,GAAO,QAAA,IAAY,KAAK,UAAA,CAAW,QAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA,CAAA;AAAA,IAC/E,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA,IACnE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA,EACnE;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,QAAQ,CAAA;AAC1B,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAElC,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,IAAI,MAAA,CAAO,+BAA+B,KAAA,EAAO;AAC/C,MAAA,MAAM,GAAA,GAAM,0BAAA,CAA2B,IAAA,EAAM,MAAA,CAAO,cAAc,CAAA;AAClE,MAAA,IAAA,GAAO,GAAA,CAAI,IAAA;AACX,MAAA,kBAAA,GAAqB,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,GAAA,CAAI,OAAA,GAAU,MAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,0BAAA,CAA2B,IAAA,EAAM,MAAA,CAAO,cAAc,CAAA;AACnE,MAAA,kBAAA,GAAqB,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,OAAA,CAAQ,SAAA;AAAA,IACf,SAAA,EAAW,UAAA;AAAA,IACX,aAAa,OAAA,CAAQ,OAAA,IAAY,CAAC,CAAC,iBAAiB,QAAA,IAAa,eAAA;AAAA,IACjE,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,EAAgB,QAAQ,OAAA,IAAY,CAAC,CAAC,aAAA,IAAiB,QAAA,IAAY,QAAQ,MAAA,KAAW,iBAAA;AAAA,IACtF,eAAe,OAAA,CAAQ,MAAA;AAAA,IACvB,WAAA,EAAa,KAAK,OAAA,IAAW,eAAA;AAAA,IAC7B,aAAA;AAAA,IACA,sBAAsB,IAAA,CAAK,aAAA;AAAA,IAC3B,yBAAyB,IAAA,CAAK,gBAAA;AAAA,IAC9B,cAAA,EAAgB,eAAA;AAAA,IAChB,sBAAsB,WAAA,CAAY,MAAA;AAAA,IAClC,eAAe,MAAA,CAAO,WAAA;AAAA,IACtB,aAAa,IAAA,CAAK,OAAA;AAAA,IAClB,kBAAkB,QAAA,CAAS,MAAA;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC1B;AACF;AAEA,SAAS,oBAAA,CACP,IAAA,EACA,eAAA,EACA,SAAA,EACmB;AACnB,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,eAAA,EAAiB,OAAO,mBAAA;AAC5C,EAAA,IAAI,eAAA,IAAmB,SAAA,KAAc,SAAA,EAAW,OAAO,iBAAA;AACvD,EAAA,IAAI,eAAA,IAAmB,SAAA,KAAc,eAAA,EAAiB,OAAO,uBAAA;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;AAEA,SAAS,gBAAA,CACP,OAAA,EACA,IAAA,EACA,eAAA,EACsB;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAE;AAAA,EAClG;AACA,EAAA,MAAM,EAAA,GAAK,GAAG,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAA,EAAQ,eAAA,GAAkB,IAAI,CAAC,CAAA,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC5C,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,QAAQ,wBAAA,CAAyB,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,IAAA,EAAM;AAAA,IACvE;AAAA,GACD,CAAA;AACD,EAAA,IAAI,QAAQ,cAAA,CAAe,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,eAAe,KAAA,EAAM;AAClE,EAAA,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,aAAA,CAAc,OAAA,EAAsB,QAAA,EAA4B,UAAA,EAAsD;AACnI,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACzE,EAAA,MAAM,OAAe,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,QAAQ,UAAU,CAAA;AACjE,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,MAAA,CAAO,QAAQ,EAAE,CAAA;AAC5D;AAEA,eAAe,cAAA,CAAe,OAAA,EAAsB,KAAA,EAAe,IAAA,EAA6C;AAC9G,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAA,CAAQ,QAAA;AACpB,IAAA,IAAI,IAAA,CAAK,2BAA2B,IAAA,CAAK,QAAA,IAAY,OAAO,OAAO,GAAA,CAAI,uCAAuC,UAAA,EAAY;AACxH,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AACjD,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AACnC,QAAA,MAAM,GAAA,CAAI,mCAAmC,MAAM,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,OAAA,CAAQ,EAAA,CAAG,MAAA,CAAO,WAAA,CAAY,KAAK,CAAC,CAAA;AAC7C;AAMA,eAAe,kBAAA,CACb,OAAA,EACA,QAAA,EACA,IAAA,EACA,IAAA,EACkG;AAClG,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,EAAA,EAAI,QAAQ,CAAA;AACrD,EAAA,IAAI,OAAO,KAAA,KAAU,CAAA,IAAA,CAAM,IAAA,CAAK,gBAAA,IAAoB,OAAO,CAAA,EAAG;AAC5D,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,EACrC;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,uBAAA;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAA,CAAQ,QAAA;AACpB,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,IAAW,GAAA,IAAO,OAAO,GAAA,CAAI,kCAAA,KAAuC,cAAc,KAAA,IAAS,OAAO,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AAEnI,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AACvD,MAAA,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,IAAK,KAAA,CAAM,YAAA,EAAc;AAC9C,QAAA,MAAMC,OAAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,YAAY,CAAA;AAChD,QAAA,MAAM,GAAA,CAAI,mCAAmCA,OAAM,CAAA;AACnD,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,QAAQ,gBAAA,EAAiB;AAAA,MAC5D;AACA,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAMA,OAAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA,MAAM,GAAA,CAAI,mCAAmCA,OAAM,CAAA;AACnD,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,QAAQ,iBAAA,EAAkB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,SAAA;AACrC,EAAA,IAAI,SAAS,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,QAAQ,WAAA,EAAY;AACrD,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AACrC","file":"chunk-X634FZVG.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"]}