@vibgrate/cli 2026.803.4 → 2026.804.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 (97) hide show
  1. package/dist/agent-YDRDDKPE.js +24 -0
  2. package/dist/{agent-WYBWUBCC.js.map → agent-YDRDDKPE.js.map} +1 -1
  3. package/dist/{baseline-3HECX4Q6.js → baseline-IALIGR4A.js} +3 -3
  4. package/dist/{baseline-3HECX4Q6.js.map → baseline-IALIGR4A.js.map} +1 -1
  5. package/dist/{chunk-QUI3E3TQ.js → chunk-2U4SXS5U.js} +26 -3
  6. package/dist/chunk-2U4SXS5U.js.map +1 -0
  7. package/dist/{chunk-5TS7N7J2.js → chunk-4TPTVRVI.js} +5 -5
  8. package/dist/{chunk-5TS7N7J2.js.map → chunk-4TPTVRVI.js.map} +1 -1
  9. package/dist/{chunk-HBQC4XQJ.js → chunk-A4CGGQJ7.js} +5 -6
  10. package/dist/chunk-A4CGGQJ7.js.map +1 -0
  11. package/dist/chunk-B2Y45PCA.js +6 -0
  12. package/dist/{chunk-FZ5Y4KEI.js.map → chunk-B2Y45PCA.js.map} +1 -1
  13. package/dist/{chunk-2A7XCANX.js → chunk-B6IBSQHG.js} +218 -24
  14. package/dist/chunk-B6IBSQHG.js.map +1 -0
  15. package/dist/{chunk-JZGVUH57.js → chunk-CM6OYYBW.js} +4 -4
  16. package/dist/{chunk-JZGVUH57.js.map → chunk-CM6OYYBW.js.map} +1 -1
  17. package/dist/{chunk-23UPIFRU.js → chunk-D56WBMAM.js} +7 -8
  18. package/dist/chunk-D56WBMAM.js.map +1 -0
  19. package/dist/{chunk-66B4ZQA3.js → chunk-FJ2ARY3S.js} +6 -7
  20. package/dist/chunk-FJ2ARY3S.js.map +1 -0
  21. package/dist/{chunk-7TOIESUT.js → chunk-K5GPEWPI.js} +458 -6
  22. package/dist/chunk-K5GPEWPI.js.map +1 -0
  23. package/dist/{chunk-5WMFX7TY.js → chunk-KSFYHT5G.js} +4 -4
  24. package/dist/{chunk-5WMFX7TY.js.map → chunk-KSFYHT5G.js.map} +1 -1
  25. package/dist/{chunk-4ZMJKR74.js → chunk-L4CYXVW2.js} +4 -4
  26. package/dist/{chunk-4ZMJKR74.js.map → chunk-L4CYXVW2.js.map} +1 -1
  27. package/dist/{chunk-BRUMBQV7.js → chunk-L7GGEXZG.js} +4 -4
  28. package/dist/{chunk-BRUMBQV7.js.map → chunk-L7GGEXZG.js.map} +1 -1
  29. package/dist/{chunk-KFK7KCAH.js → chunk-NAZLPO63.js} +3 -3
  30. package/dist/{chunk-KFK7KCAH.js.map → chunk-NAZLPO63.js.map} +1 -1
  31. package/dist/{chunk-TVRM57CE.js → chunk-NGMVIAKI.js} +4 -4
  32. package/dist/{chunk-TVRM57CE.js.map → chunk-NGMVIAKI.js.map} +1 -1
  33. package/dist/{chunk-HVHCXM2E.js → chunk-P63H3DXY.js} +7 -8
  34. package/dist/chunk-P63H3DXY.js.map +1 -0
  35. package/dist/{chunk-7BU7CWXC.js → chunk-TASMCKLD.js} +8 -8
  36. package/dist/{chunk-7BU7CWXC.js.map → chunk-TASMCKLD.js.map} +1 -1
  37. package/dist/{chunk-UWVFLVZX.js → chunk-UHLFD7EO.js} +4 -4
  38. package/dist/{chunk-UWVFLVZX.js.map → chunk-UHLFD7EO.js.map} +1 -1
  39. package/dist/{chunk-OVDL76LB.js → chunk-UZO2T3J2.js} +3 -3
  40. package/dist/{chunk-OVDL76LB.js.map → chunk-UZO2T3J2.js.map} +1 -1
  41. package/dist/{chunk-FAA7RBIG.js → chunk-WGIX4S5A.js} +8 -9
  42. package/dist/chunk-WGIX4S5A.js.map +1 -0
  43. package/dist/{chunk-BUCNKYTW.js → chunk-XVZMDDU4.js} +5 -5
  44. package/dist/{chunk-BUCNKYTW.js.map → chunk-XVZMDDU4.js.map} +1 -1
  45. package/dist/{chunk-537JBQVB.js → chunk-ZZNNXZYB.js} +3 -4
  46. package/dist/chunk-ZZNNXZYB.js.map +1 -0
  47. package/dist/cli.js +101 -49
  48. package/dist/cli.js.map +1 -1
  49. package/dist/embed-worker-main.js +5 -2
  50. package/dist/embed-worker-main.js.map +1 -1
  51. package/dist/{ensure-map-DZ53QXRT.js → ensure-map-DNLGAQRQ.js} +12 -14
  52. package/dist/{ensure-map-DZ53QXRT.js.map → ensure-map-DNLGAQRQ.js.map} +1 -1
  53. package/dist/graph-backend-L7PIG7CS.js +13 -0
  54. package/dist/{graph-backend-3A2M22QN.js.map → graph-backend-L7PIG7CS.js.map} +1 -1
  55. package/dist/index.d.ts +25 -6
  56. package/dist/index.js +11 -13
  57. package/dist/index.js.map +1 -1
  58. package/dist/{interactive-DB7IC3BL.js → interactive-GQ3O7FKE.js} +22 -24
  59. package/dist/interactive-GQ3O7FKE.js.map +1 -0
  60. package/dist/load-VOSNNCOZ.js +9 -0
  61. package/dist/{load-6KVGUQMU.js.map → load-VOSNNCOZ.js.map} +1 -1
  62. package/dist/{run-outcome-YOYRC32U.js → run-outcome-I4T5GDQZ.js} +5 -7
  63. package/dist/run-outcome-I4T5GDQZ.js.map +1 -0
  64. package/dist/runtime-session-45HT7NZA.js +20 -0
  65. package/dist/{runtime-session-XEP7IPGP.js.map → runtime-session-45HT7NZA.js.map} +1 -1
  66. package/dist/session-QUONHFJN.js +15 -0
  67. package/dist/{session-5WKEACIF.js.map → session-QUONHFJN.js.map} +1 -1
  68. package/dist/{stream-json-3OJCPBWY.js → stream-json-WEWVI3DW.js} +11 -13
  69. package/dist/stream-json-WEWVI3DW.js.map +1 -0
  70. package/dist/{vg-mcp-bridge-PM3C4FQL.js → vg-mcp-bridge-NOG3D6TL.js} +8 -10
  71. package/dist/vg-mcp-bridge-NOG3D6TL.js.map +1 -0
  72. package/dist/{vgd-UTLMMPIZ.js → vgd-URRPZ7OD.js} +8 -10
  73. package/dist/{vgd-UTLMMPIZ.js.map → vgd-URRPZ7OD.js.map} +1 -1
  74. package/package.json +1 -1
  75. package/dist/agent-WYBWUBCC.js +0 -26
  76. package/dist/chunk-23UPIFRU.js.map +0 -1
  77. package/dist/chunk-2A7XCANX.js.map +0 -1
  78. package/dist/chunk-4LGDQBYK.js +0 -358
  79. package/dist/chunk-4LGDQBYK.js.map +0 -1
  80. package/dist/chunk-537JBQVB.js.map +0 -1
  81. package/dist/chunk-66B4ZQA3.js.map +0 -1
  82. package/dist/chunk-7TOIESUT.js.map +0 -1
  83. package/dist/chunk-FAA7RBIG.js.map +0 -1
  84. package/dist/chunk-FZ5Y4KEI.js +0 -6
  85. package/dist/chunk-HBQC4XQJ.js.map +0 -1
  86. package/dist/chunk-HVHCXM2E.js.map +0 -1
  87. package/dist/chunk-QUI3E3TQ.js.map +0 -1
  88. package/dist/chunk-RBMKBYGV.js +0 -102
  89. package/dist/chunk-RBMKBYGV.js.map +0 -1
  90. package/dist/graph-backend-3A2M22QN.js +0 -13
  91. package/dist/interactive-DB7IC3BL.js.map +0 -1
  92. package/dist/load-6KVGUQMU.js +0 -11
  93. package/dist/run-outcome-YOYRC32U.js.map +0 -1
  94. package/dist/runtime-session-XEP7IPGP.js +0 -22
  95. package/dist/session-5WKEACIF.js +0 -17
  96. package/dist/stream-json-3OJCPBWY.js.map +0 -1
  97. package/dist/vg-mcp-bridge-PM3C4FQL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/code/prompt.ts","../src/code/apply.ts","../src/code/diff.ts","../src/code/providers.ts"],"names":["i","j"],"mappings":"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","file":"chunk-QUI3E3TQ.js","sourcesContent":["/**\n * Prompt assembly with cache-stable ordering (VG-CLI-CODE §5.1).\n *\n * The fast coding tools lean hard on prompt caching — cached tokens are roughly\n * an order of magnitude cheaper and skip re-encoding, so hit-rate is a\n * first-class speed lever. A cache only helps if the *prefix* is byte-stable\n * across turns, which makes prompt ordering a scheduling constraint, not a\n * cosmetic choice: put the invariant material (the instruction contract + the\n * repo-derived context) first and the volatile turn-specific ask last. This\n * module is the single place that ordering is enforced, so every provider\n * inherits it.\n */\n\nimport type { ChatMessage, CodeContext } from './types.js';\n\n/**\n * The system contract for the planner. Intentionally fixed (no interpolation)\n * so it is a perfectly stable cache prefix. It pins the edit *format* the\n * deterministic applier expects — the model's only job is to emit these blocks.\n */\nexport const CODE_SYSTEM_PROMPT = [\n 'You are a precise code-editing assistant operating inside the Vibgrate CLI.',\n 'You are given repository context derived from a deterministic code graph, then a task.',\n 'Propose the smallest correct change. Do not restate unchanged code.',\n '',\n 'Reply ONLY with edit blocks in this exact format, one per change:',\n '',\n '<path/to/file>',\n '<<<<<<< SEARCH',\n '<exact current lines to find>',\n '=======',\n '<replacement lines>',\n '>>>>>>> REPLACE',\n '',\n 'The SEARCH text must match the current file (whitespace differences are tolerated).',\n 'To add a new file use:',\n 'CREATE <path/to/file>',\n '<full file body>',\n 'END CREATE',\n 'To remove a file use: DELETE <path/to/file>',\n '',\n 'Respect every hard constraint in the context. Keep edits minimal and self-consistent.',\n].join('\\n');\n\n/**\n * Build the chat messages for a planning turn, in cache-stable order:\n * 1. system contract (fixed)\n * 2. repository context (stable for the repo/turn — the big, reusable prefix)\n * 3. the task instruction (volatile — always last)\n *\n * Keeping the volatile instruction in its own trailing user turn maximizes the\n * reusable prefix when the same repo is edited across multiple asks.\n */\nexport function buildMessages(context: CodeContext): ChatMessage[] {\n return [\n { role: 'system', content: CODE_SYSTEM_PROMPT },\n { role: 'user', content: context.rendered },\n { role: 'user', content: `Now produce the edit blocks for: ${context.instruction}` },\n ];\n}\n\n/**\n * The system contract for the agentic loop (tool-calling). Fixed text → stable\n * cache prefix. Full coding agent (Claude Code / Codex / Cline / OpenHands class):\n * free tool use, Markdown answers, edits only via tools — never a forced edit IR.\n */\nexport const AGENT_SYSTEM_PROMPT = [\n 'You are VG Code — a full coding agent in a real repository (parity with Claude Code / Codex / Cline / OpenHands).',\n 'You handle every intent: questions, locate/search, design discussion, and multi-file edits. The host never forces an edit format on your turn — you choose tools.',\n 'Most requests change application source. Prefer editing code under packages/src, not package manifests,',\n 'unless the user asks for dependency or packaging work.',\n '',\n 'You receive a Task Capsule (ranked symbols + source slices) as first-turn evidence. Use it;',\n 'it does not replace tools when you need more context.',\n '',\n 'Tools: search_code (graph + literal string/URL sweep — like workspace Find), read_file, list_files, graph_impact,',\n 'library_docs, edit_file, create_file, delete_file, apply_patch, run_command, inspect_task,',\n 'inspect_change, verify_change, ask_user, finish, abort.',\n '',\n 'You also always have the local Vibgrate AI Context MCP tools (namespaced',\n 'mcp__vibgrate__*): search_symbols, query_graph, orient, get_node, impact_of,',\n 'library_docs, check_drift, and the rest of `vg serve`. Prefer them for deep',\n 'graph navigation, docs, and drift. Project MCP servers may add more mcp__* tools.',\n '',\n '## How to work',\n '- Search or read before you edit. Never invent file contents.',\n '- Smallest correct change; check graph_impact / mcp__vibgrate__impact_of before touching shared hubs.',\n '- edit_file SEARCH must match current file (whitespace-flexible). Prefer apply_patch for multi-file edits.',\n '- Run tests or build when useful; use verify_change after multi-file work.',\n '- Mutating tools and shell need user approval — adapt if declined.',\n '',\n '## Answers and task space',\n '- Call finish with a Markdown summary: what you did or found, key `file:line` refs, next steps.',\n '- Q&A / locate / explain: use search_code (pass the exact needle, e.g. stripe or \"stripe\"), then finish with Markdown.',\n '- Do not invent PatchIR, dummy edits, or raw JSON as the user-facing answer. Edits only via edit_file / apply_patch tools.',\n '',\n '## When stuck',\n '- If intent, scope, or trade-off is ambiguous, call ask_user with one clear question (optional options).',\n '- Prefer ask_user over abort when the user can unblock you. Do not guess product requirements.',\n '- abort only when the request is impossible after clarification or lookup.',\n '',\n 'Never dump raw JSON schemas, PatchIR templates, or tool wire formats as the user-facing answer.',\n].join('\\n');\n\n/** Build the opening messages for an agent run: system contract + graph-grounded context + task. */\nexport function buildAgentMessages(context: CodeContext): ChatMessage[] {\n return [\n { role: 'system', content: AGENT_SYSTEM_PROMPT },\n { role: 'user', content: context.rendered },\n { role: 'user', content: `Task: ${context.instruction}` },\n ];\n}\n","/**\n * The deterministic fast-apply merge engine (VG-CLI-CODE §4).\n *\n * Speed in the fast coding tools comes from letting the planner emit a *terse*\n * edit instead of rewriting a whole file; correctness comes from applying that\n * edit **deterministically and scoped**, never by letting the model free-hand\n * the merge. This module is that deterministic floor: it parses the\n * search/replace edit form and applies it with three escalating match\n * strategies — exact, whitespace-flexible, then graph-span-scoped — so an\n * ambiguous SEARCH is resolved to the symbol the planner actually named rather\n * than the first textual hit. No model is required to apply an edit; a hosted\n * fast-apply model is only ever an *acceleration* over this same contract.\n *\n * Everything here is pure and deterministic: identical (content, edit) always\n * yields the identical outcome, which is what makes it unit- and\n * benchmark-testable offline.\n */\n\nimport type { CodeEdit, EditOutcome } from './types.js';\n\n/** A symbol span the graph knows about, used to disambiguate a SEARCH match. */\nexport interface SymbolSpan {\n /** Qualified name, matched against `anchorSymbol`. */\n qualifiedName: string;\n file: string;\n /** 1-based inclusive line range. */\n start: number;\n end: number;\n}\n\n/**\n * Parse a model's reply into structured edits. The accepted form is the\n * widely-supported search/replace block (robust to surrounding prose and code\n * fences), plus explicit whole-file create/delete markers:\n *\n * ```\n * path/to/file.ts\n * <<<<<<< SEARCH\n * old code\n * =======\n * new code\n * >>>>>>> REPLACE\n * ```\n *\n * `CREATE path/to/new.ts` … `END CREATE` wraps a new file's whole body;\n * `DELETE path/to/gone.ts` removes a file. Parsing is forgiving of blank lines\n * and fences but strict about the block markers, so a malformed block surfaces\n * as an `invalid` outcome at apply time rather than silently corrupting a file.\n */\nexport function parseEdits(text: string): CodeEdit[] {\n const edits: CodeEdit[] = [];\n const lines = text.split('\\n');\n let i = 0;\n let pendingFile = '';\n\n const isFence = (s: string): boolean => /^\\s*```/.test(s);\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Whole-file create: `CREATE <path>` … `END CREATE`.\n const create = /^\\s*CREATE\\s+(\\S.*?)\\s*$/.exec(line);\n if (create) {\n const file = create[1];\n const body: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*END CREATE\\s*$/.test(lines[i])) {\n if (!isFence(lines[i])) body.push(lines[i]);\n i++;\n }\n i++; // consume END CREATE\n edits.push({ op: 'create', file, content: body.join('\\n') });\n pendingFile = '';\n continue;\n }\n\n // Whole-file delete: `DELETE <path>`.\n const del = /^\\s*DELETE\\s+(\\S.*?)\\s*$/.exec(line);\n if (del) {\n edits.push({ op: 'delete', file: del[1] });\n i++;\n pendingFile = '';\n continue;\n }\n\n // Search/replace block. The file path is the most recent non-fence,\n // non-blank line before the SEARCH marker (or an inline `path` on it).\n if (/^\\s*<{5,}\\s*SEARCH/.test(line)) {\n const file = pendingFile;\n const search: string[] = [];\n const replace: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*={5,}\\s*$/.test(lines[i])) {\n search.push(lines[i]);\n i++;\n }\n i++; // consume =======\n while (i < lines.length && !/^\\s*>{5,}\\s*REPLACE/.test(lines[i])) {\n replace.push(lines[i]);\n i++;\n }\n i++; // consume >>>>>>> REPLACE\n edits.push({\n op: 'replace',\n file,\n search: search.join('\\n'),\n replace: replace.join('\\n'),\n anchorSymbol: undefined,\n });\n continue;\n }\n\n // Track the most recent file-path candidate: a lone token that looks like a\n // path (has a slash or a file extension) and isn't a fence/marker.\n const trimmed = line.trim();\n if (trimmed && !isFence(line) && looksLikePath(trimmed)) pendingFile = trimmed.replace(/[:`]+$/, '');\n i++;\n }\n\n return edits;\n}\n\nfunction looksLikePath(s: string): boolean {\n if (/\\s/.test(s.replace(/:$/, ''))) return false; // paths don't contain spaces\n return /\\//.test(s) || /\\.[A-Za-z0-9]{1,8}:?$/.test(s);\n}\n\n/**\n * Apply a single edit to a file's current content (or `null` when the file does\n * not exist). Pure: returns the new content and an outcome; never touches disk.\n * The `spans` are the graph's symbol spans for this file — when a SEARCH is\n * textually ambiguous, a match inside the `anchorSymbol` span wins, which is how\n * the graph makes a terse edit land where the planner meant it to.\n */\nexport function applyEdit(\n content: string | null,\n edit: CodeEdit,\n spans: SymbolSpan[] = [],\n): { content: string | null; outcome: EditOutcome } {\n if (edit.op === 'create') {\n if (content !== null && content !== edit.content) {\n return { content, outcome: { edit, status: 'conflict', reason: `${edit.file} already exists — refusing to overwrite it with a create; use a replace edit instead` } };\n }\n return { content: edit.content, outcome: { edit, status: content === edit.content ? 'no-op' : 'applied', matchedBy: 'exact' } };\n }\n\n if (edit.op === 'delete') {\n if (content === null) return { content: null, outcome: { edit, status: 'no-op', reason: `${edit.file} does not exist — nothing to delete` } };\n return { content: null, outcome: { edit, status: 'applied', matchedBy: 'exact' } };\n }\n\n // op === 'replace'\n if (content === null) {\n return { content: null, outcome: { edit, status: 'not-found', reason: `${edit.file} does not exist — a replace needs an existing file (did you mean CREATE ${edit.file}?)` } };\n }\n if (edit.search === '') {\n // Empty SEARCH means \"prepend\" only when the file is empty; otherwise it is\n // ambiguous and we refuse rather than guess a location.\n if (content === '') return { content: edit.replace, outcome: { edit, status: 'applied', matchedBy: 'exact' } };\n return { content, outcome: { edit, status: 'invalid', reason: 'empty SEARCH on a non-empty file is ambiguous — quote the exact lines to replace' } };\n }\n if (edit.search === edit.replace) {\n return { content, outcome: { edit, status: 'no-op', reason: 'SEARCH and REPLACE are identical — no change' } };\n }\n\n const located = locate(content, edit.search, edit.anchorSymbol, spans, edit.file);\n if (located.kind === 'none') {\n return { content, outcome: { edit, status: 'not-found', reason: `the SEARCH text was not found in ${edit.file} — it must match the current file exactly (whitespace-flexible)` } };\n }\n if (located.kind === 'ambiguous') {\n return {\n content,\n outcome: {\n edit,\n status: 'ambiguous',\n reason: `the SEARCH text matches ${located.count} places in ${edit.file} — add more surrounding lines, or name the symbol so the graph can disambiguate`,\n },\n };\n }\n const next = content.slice(0, located.from) + edit.replace + content.slice(located.to);\n return { content: next, outcome: { edit, status: 'applied', matchedBy: located.matchedBy } };\n}\n\n/**\n * Apply a set of edits across a set of files. `read(file)` returns current\n * content or `null`. Edits are applied in the order given, threading each\n * file's evolving content so two edits to the same file compose. Returns, per\n * file, its before/after content and the per-edit outcomes — the dry-run\n * product the session turns into diffs. Deterministic given a deterministic\n * `read`.\n */\nexport function applyEdits(\n edits: CodeEdit[],\n read: (file: string) => string | null,\n spansByFile: (file: string) => SymbolSpan[] = () => [],\n): Map<string, { before: string | null; after: string | null; outcomes: EditOutcome[] }> {\n const state = new Map<string, { before: string | null; after: string | null; outcomes: EditOutcome[] }>();\n for (const edit of edits) {\n let entry = state.get(edit.file);\n if (!entry) {\n const before = read(edit.file);\n entry = { before, after: before, outcomes: [] };\n state.set(edit.file, entry);\n }\n const { content, outcome } = applyEdit(entry.after, edit, spansByFile(edit.file));\n entry.after = content;\n entry.outcomes.push(outcome);\n }\n return state;\n}\n\ntype Located =\n | { kind: 'unique'; from: number; to: number; matchedBy: 'exact' | 'whitespace' | 'graph-span' }\n | { kind: 'ambiguous'; count: number }\n | { kind: 'none' };\n\n/**\n * Find the SEARCH text in the content. Escalates: (1) exact substring; (2)\n * whitespace-flexible (indentation/trailing-space differences tolerated); and\n * when either is ambiguous, (3) narrow to the `anchorSymbol`'s graph span so the\n * intended occurrence wins. Line-oriented so offsets map back to real edits.\n */\nfunction locate(content: string, search: string, anchor: string | undefined, spans: SymbolSpan[], file: string): Located {\n const exact = allIndexes(content, search);\n if (exact.length === 1) return { kind: 'unique', from: exact[0], to: exact[0] + search.length, matchedBy: 'exact' };\n if (exact.length > 1) {\n const scoped = scopeToAnchor(content, exact.map((from) => ({ from, to: from + search.length })), anchor, spans, file);\n if (scoped) return { ...scoped, matchedBy: 'graph-span' };\n return { kind: 'ambiguous', count: exact.length };\n }\n\n // Whitespace-flexible: compare with runs of whitespace collapsed and each\n // line trimmed, then map the match back to real character offsets.\n const flex = flexIndexes(content, search);\n if (flex.length === 1) return { kind: 'unique', from: flex[0].from, to: flex[0].to, matchedBy: 'whitespace' };\n if (flex.length > 1) {\n const scoped = scopeToAnchor(content, flex, anchor, spans, file);\n if (scoped) return { ...scoped, matchedBy: 'graph-span' };\n return { kind: 'ambiguous', count: flex.length };\n }\n return { kind: 'none' };\n}\n\n/** Every start index of `needle` in `hay` (non-overlapping left-to-right). */\nfunction allIndexes(hay: string, needle: string): number[] {\n const out: number[] = [];\n if (needle === '') return out;\n let from = 0;\n for (;;) {\n const idx = hay.indexOf(needle, from);\n if (idx === -1) break;\n out.push(idx);\n from = idx + needle.length;\n }\n return out;\n}\n\n/**\n * Whitespace-flexible match: align the search's trimmed non-empty lines against\n * the content's lines, tolerating indentation and trailing-whitespace drift\n * (the single most common reason an otherwise-correct terse edit fails to\n * apply). Returns real character offset ranges for each full-block match.\n */\nfunction flexIndexes(content: string, search: string): { from: number; to: number }[] {\n const cLines = content.split('\\n');\n const sLines = search.split('\\n');\n // Trim a possible leading/trailing blank line from the search block.\n while (sLines.length && sLines[0].trim() === '') sLines.shift();\n while (sLines.length && sLines[sLines.length - 1].trim() === '') sLines.pop();\n if (sLines.length === 0) return [];\n const sNorm = sLines.map((l) => l.trim());\n\n // Precompute char offset of the start of each content line.\n const lineStart: number[] = [];\n let acc = 0;\n for (const l of cLines) {\n lineStart.push(acc);\n acc += l.length + 1; // +1 for the '\\n'\n }\n\n const out: { from: number; to: number }[] = [];\n for (let i = 0; i + sNorm.length <= cLines.length; i++) {\n let ok = true;\n for (let j = 0; j < sNorm.length; j++) {\n if (cLines[i + j].trim() !== sNorm[j]) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n const from = lineStart[i];\n const lastLine = i + sNorm.length - 1;\n const to = lineStart[lastLine] + cLines[lastLine].length; // end of the last matched line (exclusive of '\\n')\n out.push({ from, to });\n }\n return out;\n}\n\n/** If exactly one candidate falls inside the anchor symbol's span, pick it. */\nfunction scopeToAnchor(\n content: string,\n candidates: { from: number; to: number }[],\n anchor: string | undefined,\n spans: SymbolSpan[],\n file: string,\n): { kind: 'unique'; from: number; to: number } | null {\n if (!anchor) return null;\n const span = spans.find((s) => s.file === file && s.qualifiedName === anchor);\n if (!span) return null;\n const lineOf = lineIndexer(content);\n const inside = candidates.filter((c) => {\n const line = lineOf(c.from); // 1-based\n return line >= span.start && line <= span.end;\n });\n if (inside.length === 1) return { kind: 'unique', from: inside[0].from, to: inside[0].to };\n return null;\n}\n\n/** Returns a function mapping a char offset → 1-based line number. */\nfunction lineIndexer(content: string): (offset: number) => number {\n const starts: number[] = [0];\n for (let i = 0; i < content.length; i++) if (content[i] === '\\n') starts.push(i + 1);\n return (offset: number) => {\n // binary search for the greatest line start <= offset\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n };\n}\n","/**\n * Deterministic unified diff (VG-CLI-CODE §4.3).\n *\n * A `vg code` dry-run shows the human/agent exactly what would change *before*\n * anything is written — the \"inspect the proposal\" half of the governance\n * lifecycle. This is a small, dependency-free Myers-style line diff producing\n * standard unified-diff hunks. Identical (before, after) always renders the\n * identical text, so the dry-run output is stable and diff-able in tests and\n * benchmarks.\n */\n\n/** Render a unified diff for one file. Returns '' when there is no change. */\nexport function unifiedDiff(before: string | null, after: string | null, file: string, context = 3): string {\n if (before === after) return '';\n if (before === null) return newFileDiff(after ?? '', file);\n if (after === null) return deletedFileDiff(before, file);\n\n const a = splitLines(before);\n const b = splitLines(after);\n const ops = diffLines(a, b);\n const hunks = groupHunks(ops, context);\n if (hunks.length === 0) return '';\n\n const out: string[] = [`--- a/${file}`, `+++ b/${file}`];\n for (const h of hunks) {\n out.push(`@@ -${h.aStart},${h.aLen} +${h.bStart},${h.bLen} @@`);\n for (const line of h.lines) out.push(line);\n }\n return out.join('\\n');\n}\n\nfunction newFileDiff(after: string, file: string): string {\n const lines = splitLines(after);\n const out = [`--- /dev/null`, `+++ b/${file}`, `@@ -0,0 +1,${lines.length} @@`];\n for (const l of lines) out.push(`+${l}`);\n return out.join('\\n');\n}\n\nfunction deletedFileDiff(before: string, file: string): string {\n const lines = splitLines(before);\n const out = [`--- a/${file}`, `+++ /dev/null`, `@@ -1,${lines.length} +0,0 @@`];\n for (const l of lines) out.push(`-${l}`);\n return out.join('\\n');\n}\n\nfunction splitLines(s: string): string[] {\n if (s === '') return [];\n const lines = s.split('\\n');\n // A trailing newline yields a final '' element — drop it so line counts match.\n if (lines.length && lines[lines.length - 1] === '') lines.pop();\n return lines;\n}\n\ntype Op = { tag: 'eq' | 'del' | 'add'; line: string };\n\n/**\n * Line diff via LCS (dynamic programming). O(n·m) space is fine for source\n * files; the deterministic backtrace (favouring deletions before additions on\n * ties) keeps output stable.\n */\nfunction diffLines(a: string[], b: string[]): Op[] {\n const n = a.length;\n const m = b.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i][j] = a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n ops.push({ tag: 'eq', line: a[i] });\n i++;\n j++;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n ops.push({ tag: 'del', line: a[i] });\n i++;\n } else {\n ops.push({ tag: 'add', line: b[j] });\n j++;\n }\n }\n while (i < n) ops.push({ tag: 'del', line: a[i++] });\n while (j < m) ops.push({ tag: 'add', line: b[j++] });\n return ops;\n}\n\ninterface Hunk {\n aStart: number;\n aLen: number;\n bStart: number;\n bLen: number;\n lines: string[];\n}\n\n/** Group the op stream into unified-diff hunks with `context` equal lines around changes. */\nfunction groupHunks(ops: Op[], context: number): Hunk[] {\n // Index of each op that is a change (del/add).\n const changeIdx = ops.map((o, i) => (o.tag === 'eq' ? -1 : i)).filter((i) => i >= 0);\n if (changeIdx.length === 0) return [];\n\n // Merge change indices into windows that share context.\n const windows: [number, number][] = [];\n let start = Math.max(0, changeIdx[0] - context);\n let end = Math.min(ops.length - 1, changeIdx[0] + context);\n for (let k = 1; k < changeIdx.length; k++) {\n const cs = Math.max(0, changeIdx[k] - context);\n const ce = Math.min(ops.length - 1, changeIdx[k] + context);\n if (cs <= end + 1) {\n end = ce;\n } else {\n windows.push([start, end]);\n start = cs;\n end = ce;\n }\n }\n windows.push([start, end]);\n\n const hunks: Hunk[] = [];\n // Running 1-based line numbers into a and b.\n let aLine = 1;\n let bLine = 1;\n let idx = 0;\n for (const [ws, we] of windows) {\n // advance line counters up to window start\n while (idx < ws) {\n const o = ops[idx];\n if (o.tag !== 'add') aLine++;\n if (o.tag !== 'del') bLine++;\n idx++;\n }\n const hunk: Hunk = { aStart: aLine, aLen: 0, bStart: bLine, bLen: 0, lines: [] };\n for (let k = ws; k <= we; k++) {\n const o = ops[k];\n if (o.tag === 'eq') {\n hunk.lines.push(` ${o.line}`);\n hunk.aLen++;\n hunk.bLen++;\n aLine++;\n bLine++;\n } else if (o.tag === 'del') {\n hunk.lines.push(`-${o.line}`);\n hunk.aLen++;\n aLine++;\n } else {\n hunk.lines.push(`+${o.line}`);\n hunk.bLen++;\n bLine++;\n }\n idx = k + 1;\n }\n // A hunk that starts at line 1 with zero length should report start 0.\n if (hunk.aLen === 0) hunk.aStart = Math.max(0, hunk.aStart - 1);\n if (hunk.bLen === 0) hunk.bStart = Math.max(0, hunk.bStart - 1);\n hunks.push(hunk);\n }\n return hunks;\n}\n\n/** A compact one-line changeset summary: `+adds -dels across N file(s)`. */\nexport function summarizeDiffs(diffs: { file: string; diff: string }[]): string {\n let adds = 0;\n let dels = 0;\n let touched = 0;\n for (const { diff } of diffs) {\n if (!diff) continue;\n touched++;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+') && !line.startsWith('+++')) adds++;\n else if (line.startsWith('-') && !line.startsWith('---')) dels++;\n }\n }\n return `+${adds} -${dels} across ${touched} file(s)`;\n}\n","/**\n * Model backends for `vg code` (VG-CLI-CODE §5).\n *\n * Every backend implements the same {@link Provider} contract, so the router and\n * session are provider-agnostic. Three families:\n * - **local HTTP** — Ollama and LM Studio, reached over `fetch` on localhost;\n * no package, no key, no egress. Selected under `--local`.\n * - **hosted HTTP** — any OpenAI-compatible endpoint (OpenRouter, LiteLLM,\n * Together, a self-hosted gateway, …). One shape covers the \"best in breed\n * router\" story: an ordered model list with automatic fallback lives in the\n * router, not here. Keys come from the environment only and are never logged.\n * - **local inference** — a llama.cpp binding loaded on demand via\n * {@link ensurePackage}; this is the one path that may install a package on\n * first use, and only with consent. Model weights are never auto-downloaded.\n *\n * A deterministic {@link MockProvider} backs the tests, the offline benchmark,\n * and the `--mock` flag, so the whole loop runs end-to-end with no network.\n */\n\nimport { ensurePackage, ensureUnavailableMessage } from './ensure.js';\nimport type { ChatMessage, ChatOptions, Provider, ProviderResult, ToolCall, ToolSpec } from './types.js';\n\n/* ------------------------------------------------------------------ *\\\n * Tool-calling wire helpers (shared by the HTTP providers)\n\\* ------------------------------------------------------------------ */\n\n/** Map our ChatMessage union to OpenAI-compatible wire messages (tool calls included). */\nfunction openAiMessages(messages: ChatMessage[]): unknown[] {\n return messages.map((m) => {\n if (m.role === 'tool') return { role: 'tool', tool_call_id: m.toolCallId, name: m.name, content: m.content };\n if (m.role === 'assistant' && m.toolCalls?.length) {\n return {\n role: 'assistant',\n content: m.content || null,\n tool_calls: m.toolCalls.map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: JSON.stringify(t.arguments) } })),\n };\n }\n // Multimodal user turn → OpenAI content-part array (text + data-URI images).\n if (m.role === 'user' && m.images?.length) {\n return {\n role: 'user',\n content: [\n { type: 'text', text: m.content },\n ...m.images.map((img) => ({\n type: 'image_url',\n image_url: { url: `data:${img.mediaType};base64,${img.dataBase64}` },\n })),\n ],\n };\n }\n return { role: m.role, content: m.content };\n });\n}\n\n/** Ollama's chat shape: images ride as a base64 array on the message itself. */\nfunction ollamaMessages(messages: ChatMessage[]): unknown[] {\n return openAiMessages(messages).map((wire, i) => {\n const m = messages[i];\n if (m.role === 'user' && m.images?.length) {\n return { role: 'user', content: m.content, images: m.images.map((img) => img.dataBase64) };\n }\n return wire;\n });\n}\n\n/** OpenAI-compatible `tools` array from our specs. */\nfunction openAiTools(tools: ToolSpec[] | undefined): unknown[] | undefined {\n if (!tools?.length) return undefined;\n return tools.map((t) => ({ type: 'function', function: { name: t.name, description: t.description, parameters: t.parameters } }));\n}\n\n/** Parse OpenAI-shaped tool_calls, tolerating a malformed arguments string. */\nfunction parseToolCalls(raw: unknown, synthesizePrefix = 'call'): ToolCall[] {\n const calls = raw as { id?: string; function?: { name?: string; arguments?: unknown } }[] | undefined;\n if (!Array.isArray(calls)) return [];\n return calls.map((c, i) => ({\n id: typeof c.id === 'string' && c.id ? c.id : `${synthesizePrefix}_${i}`,\n name: c.function?.name ?? 'unknown',\n arguments: coerceArgs(c.function?.arguments),\n }));\n}\n\nfunction coerceArgs(raw: unknown): Record<string, unknown> {\n if (raw && typeof raw === 'object') return raw as Record<string, unknown>;\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n }\n return {};\n}\n\n/** Redact anything that looks like a credential before it can reach a log/error. */\nexport function redactSecrets(s: string): string {\n return s\n .replace(/\\b(sk|xoxb|ghp|gho|glpat|AKIA)[-_][A-Za-z0-9-_]{6,}/g, '$1-***redacted***')\n .replace(/Bearer\\s+[A-Za-z0-9._-]{8,}/gi, 'Bearer ***redacted***');\n}\n\n/** Common HTTP-completion error shaping: actionable, internals-free (GUARDRAILS §1.3). */\nfunction httpError(label: string, status: number, hint: string): Error {\n return new Error(`${label} returned HTTP ${status} — ${hint}`);\n}\n\n/**\n * The server's own account of what went wrong, when it gave one. An\n * OpenAI-compatible error body is `{ error: { message } }` or `{ error: '…' }`;\n * the Vibgrate Relay adds `detail` (the upstream's verbatim reason) and\n * `correlation_id`. Guessing a hint from the status code alone turns an\n * actionable \"insufficient credits\" or \"no endpoints match your data policy\"\n * into \"check the model id\" — so prefer the body whenever it carries text.\n * Total and defensive: any parse failure just yields null and the caller\n * falls back to its hint.\n */\nexport function relayErrorDetail(body: string): string | null {\n if (!body) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return nonJsonErrorDetail(body);\n }\n const obj = parsed as { error?: unknown; detail?: unknown; message?: unknown; correlation_id?: unknown };\n const err = obj?.error;\n const errObj = (typeof err === 'object' && err ? err : {}) as { message?: unknown; detail?: unknown; correlation_id?: unknown };\n const message =\n typeof err === 'string'\n ? err\n : typeof errObj.message === 'string'\n ? errObj.message\n : typeof obj?.message === 'string'\n ? obj.message\n : null;\n const detailValue = typeof obj?.detail === 'string' ? obj.detail : typeof errObj.detail === 'string' ? errObj.detail : null;\n const detail = detailValue && detailValue.trim() ? detailValue.trim() : null;\n const parts = [message, detail].filter((p): p is string => !!p && p.trim().length > 0);\n if (!parts.length) return null;\n const correlationId = typeof obj?.correlation_id === 'string' && obj.correlation_id\n ? obj.correlation_id\n : typeof errObj.correlation_id === 'string' && errObj.correlation_id\n ? errObj.correlation_id\n : null;\n const id = correlationId ? ` (correlation id ${correlationId})` : '';\n return `${[...new Set(parts)].join(' — ').slice(0, 400)}${id}`;\n}\n\n/**\n * A non-JSON body — an HTML error page from a CDN or proxy sitting in front of\n * the endpoint, a plain-text proxy notice. A short one is still more\n * informative than nothing; a long one is noise EXCEPT for its `<title>`\n * (\"502 Bad Gateway\", \"Worker threw exception\"), which is the whole story.\n * Without that salvage the caller falls back to a status-code guess and blames\n * the model id for what is really an infrastructure failure.\n */\nfunction nonJsonErrorDetail(body: string): string | null {\n const text = body.trim();\n if (!text) return null;\n if (text.length <= 200) return text;\n const title = /<title[^>]*>([\\s\\S]*?)<\\/title>/i.exec(text)?.[1]?.replace(/\\s+/g, ' ').trim();\n if (title) return title.slice(0, 200);\n // Cloudflare renders its worker/gateway failures as \"Error 1101\"-style codes.\n const code = /\\bError\\s+\\d{3,4}\\b/.exec(text)?.[0];\n return code ?? null;\n}\n\n/**\n * What to suggest for a failing status when the server said nothing useful.\n * A gateway status (502/503/504) means the request never reached the model, or\n * never came back from it — the model id is not the suspect there, and saying\n * it is sends people editing a `--model` flag that was correct all along.\n */\nexport function statusHint(status: number, model: string, apiKeyEnv: string | undefined): string {\n if (status === 401 || status === 403) return `the key in ${apiKeyEnv ?? '(none)'} was rejected — check it has access to \"${model}\"`;\n if (status === 402) return 'the account behind this endpoint is out of credit — top it up, or switch backend with --provider / --local';\n if (status === 404) return `this endpoint has no model \"${model}\" — check the id (\\`vg models catalog\\`) and the base URL`;\n if (status === 408 || status === 504) return 'the request timed out before the model replied — retry, shorten the task, or use --local';\n if (status === 429) return 'rate limited — wait and retry, or switch backend with --provider / --local';\n if (status >= 500) return `the endpoint failed to serve the request — this is an upstream/gateway failure, not the model id \"${model}\"; retry, or use --provider / --local if it persists`;\n return `check the model id \"${model}\" and the endpoint`;\n}\n\n/** Yield newline-delimited lines from a streamed response body. */\nasync function* streamLines(res: Response): AsyncGenerator<string> {\n const reader = res.body?.getReader();\n if (!reader) return;\n const decoder = new TextDecoder();\n let buf = '';\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (line) yield line;\n }\n }\n if (buf.trim()) yield buf.trim();\n}\n\n/** Accumulate an OpenAI-compatible SSE stream into text + tool calls + usage. */\nexport function accumulateOpenAiDelta(\n acc: {\n text: string;\n tools: Map<number, { id?: string; name?: string; args: string }>;\n usage: { promptTokens?: number; completionTokens?: number };\n /** Last non-null `finish_reason` seen — 'length' means the cap cut the reply. */\n finishReason?: string;\n },\n chunk: unknown,\n onToken?: (t: string) => void,\n): void {\n const c = chunk as { choices?: { delta?: { content?: string; tool_calls?: { index?: number; id?: string; function?: { name?: string; arguments?: string } }[] }; finish_reason?: string | null }[]; usage?: { prompt_tokens?: number; completion_tokens?: number } };\n const reason = c.choices?.[0]?.finish_reason;\n if (typeof reason === 'string' && reason) acc.finishReason = reason;\n const delta = c.choices?.[0]?.delta;\n if (delta?.content) {\n acc.text += delta.content;\n onToken?.(delta.content);\n }\n for (const tc of delta?.tool_calls ?? []) {\n const idx = tc.index ?? 0;\n const e = acc.tools.get(idx) ?? { args: '' };\n if (tc.id) e.id = tc.id;\n if (tc.function?.name) e.name = tc.function.name;\n if (tc.function?.arguments) e.args += tc.function.arguments;\n acc.tools.set(idx, e);\n }\n if (c.usage) {\n acc.usage.promptTokens = c.usage.prompt_tokens;\n acc.usage.completionTokens = c.usage.completion_tokens;\n }\n}\n\n/** Turn accumulated OpenAI tool-call fragments into ToolCalls. */\nfunction finalizeTools(tools: Map<number, { id?: string; name?: string; args: string }>): ToolCall[] {\n return [...tools.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([i, e]) => ({ id: e.id ?? `call_${i}`, name: e.name ?? 'unknown', arguments: coerceArgs(e.args) }));\n}\n\nasync function postJson(url: string, body: unknown, headers: Record<string, string>, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', headers: { 'content-type': 'application/json', ...headers }, body: JSON.stringify(body), signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Deterministic mock (tests / offline / --mock)\n\\* ------------------------------------------------------------------ */\n\n/**\n * A provider that returns a fixed, scripted reply — the deterministic floor that\n * lets the entire `vg code` loop run offline. Used by tests, the benchmark, and\n * the `--mock` flag (which reads the scripted edit blocks from a file).\n */\nexport class MockProvider implements Provider {\n readonly id = 'mock';\n readonly label = 'Mock (deterministic)';\n readonly local = true;\n constructor(\n readonly model: string,\n private readonly reply: string,\n ) {}\n async chat(_messages?: ChatMessage[], _opts?: ChatOptions): Promise<ProviderResult> {\n return { text: this.reply, model: this.model, provider: this.id };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Ollama (local, no key)\n\\* ------------------------------------------------------------------ */\n\nexport class OllamaProvider implements Provider {\n readonly id = 'ollama';\n readonly label = 'Ollama (local)';\n readonly local = true;\n constructor(\n readonly model: string,\n private readonly host = process.env.OLLAMA_HOST || 'http://127.0.0.1:11434',\n ) {}\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const streaming = !!(opts.stream && opts.onToken);\n let res: Response;\n try {\n res = await postJson(\n `${this.host.replace(/\\/$/, '')}/api/chat`,\n { model: this.model, messages: ollamaMessages(messages), stream: streaming, tools: openAiTools(opts.tools), options: { temperature: opts.temperature ?? 0 } },\n {},\n opts.timeoutMs ?? 120_000,\n );\n } catch {\n throw new Error(`couldn't reach Ollama at ${this.host} — is \\`ollama serve\\` running? (start it, or pass --provider to use a different backend)`);\n }\n if (!res.ok) throw httpError('Ollama', res.status, res.status === 404 ? `model \"${this.model}\" isn't pulled — run \\`ollama pull ${this.model}\\` or pick another with --model` : 'check `ollama serve` and the model name');\n\n if (streaming) {\n let text = '';\n let toolCallsRaw: unknown;\n let truncated = false;\n const usage: { promptTokens?: number; completionTokens?: number } = {};\n for await (const line of streamLines(res)) {\n try {\n const obj = JSON.parse(line) as { message?: { content?: string; tool_calls?: unknown }; prompt_eval_count?: number; eval_count?: number; done_reason?: string };\n const delta = obj.message?.content;\n if (delta) {\n text += delta;\n opts.onToken?.(delta);\n }\n if (obj.message?.tool_calls) toolCallsRaw = obj.message.tool_calls;\n if (typeof obj.prompt_eval_count === 'number') usage.promptTokens = obj.prompt_eval_count;\n if (typeof obj.eval_count === 'number') usage.completionTokens = obj.eval_count;\n // Ollama's spelling of finish_reason: 'length' means num_predict cut it.\n if (obj.done_reason === 'length') truncated = true;\n } catch {\n /* skip a malformed line */\n }\n }\n return { text, model: this.model, provider: this.id, toolCalls: parseToolCalls(toolCallsRaw), usage, truncated };\n }\n\n const data = (await res.json()) as { message?: { content?: string; tool_calls?: unknown }; prompt_eval_count?: number; eval_count?: number; done_reason?: string };\n return {\n text: data.message?.content ?? '',\n model: this.model,\n provider: this.id,\n toolCalls: parseToolCalls(data.message?.tool_calls),\n usage: { promptTokens: data.prompt_eval_count, completionTokens: data.eval_count },\n truncated: data.done_reason === 'length',\n };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * OpenAI-compatible (LM Studio, OpenRouter, LiteLLM, …)\n\\* ------------------------------------------------------------------ */\n\nexport interface OpenAiCompatibleConfig {\n /** Base URL, e.g. `https://openrouter.ai/api/v1` or `http://127.0.0.1:1234/v1`. */\n baseUrl: string;\n /** Env var name holding the API key (never the key itself). Absent for local. */\n apiKeyEnv?: string;\n /** Whether this endpoint is on-device (LM Studio) vs hosted. */\n local: boolean;\n /** Display label. */\n label: string;\n id: string;\n}\n\nexport class OpenAiCompatibleProvider implements Provider {\n readonly id: string;\n readonly label: string;\n readonly local: boolean;\n constructor(\n readonly model: string,\n private readonly config: OpenAiCompatibleConfig,\n ) {\n this.id = config.id;\n this.label = config.label;\n this.local = config.local;\n }\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const headers: Record<string, string> = {};\n if (this.config.apiKeyEnv) {\n const key = process.env[this.config.apiKeyEnv];\n if (!key) {\n throw new Error(`${this.label} needs an API key in ${this.config.apiKeyEnv} — set it in your environment (never pass keys as flags), or use --local for an on-device backend.`);\n }\n headers.authorization = `Bearer ${key}`;\n }\n const streaming = !!(opts.stream && opts.onToken);\n const url = `${this.config.baseUrl.replace(/\\/$/, '')}/chat/completions`;\n const body = {\n model: this.model,\n messages: openAiMessages(messages),\n tools: openAiTools(opts.tools),\n temperature: opts.temperature ?? 0,\n max_tokens: opts.maxTokens,\n stream: streaming,\n ...(streaming ? { stream_options: { include_usage: true } } : {}),\n };\n let res: Response;\n try {\n res = await postJson(url, body, headers, opts.timeoutMs ?? 120_000);\n } catch {\n throw new Error(`couldn't reach ${this.label} at ${this.config.baseUrl} — check the endpoint is up (or use --local).`);\n }\n if (!res.ok) {\n const detail = relayErrorDetail(await res.text().catch(() => ''));\n const hint = detail ?? statusHint(res.status, this.model, this.config.apiKeyEnv);\n throw httpError(this.label, res.status, hint);\n }\n\n if (streaming) {\n const acc = { text: '', tools: new Map<number, { id?: string; name?: string; args: string }>(), usage: {} as { promptTokens?: number; completionTokens?: number }, finishReason: undefined as string | undefined };\n for await (const line of streamLines(res)) {\n if (!line.startsWith('data:')) continue;\n const payload = line.slice(5).trim();\n if (payload === '[DONE]') break;\n try {\n accumulateOpenAiDelta(acc, JSON.parse(payload), opts.onToken);\n } catch {\n /* skip a malformed chunk */\n }\n }\n const tools = finalizeTools(acc.tools);\n return { text: acc.text, model: this.model, provider: this.id, toolCalls: tools.length ? tools : undefined, usage: acc.usage, truncated: acc.finishReason === 'length' };\n }\n const data = (await res.json()) as { choices?: { message?: { content?: string; tool_calls?: unknown }; finish_reason?: string | null }[]; usage?: { prompt_tokens?: number; completion_tokens?: number } };\n const message = data.choices?.[0]?.message;\n return {\n text: message?.content ?? '',\n model: this.model,\n provider: this.id,\n toolCalls: parseToolCalls(message?.tool_calls),\n usage: { promptTokens: data.usage?.prompt_tokens, completionTokens: data.usage?.completion_tokens },\n truncated: data.choices?.[0]?.finish_reason === 'length',\n };\n }\n}\n\n/* ------------------------------------------------------------------ *\\\n * Scripted provider (agent-loop tests / offline demos)\n\\* ------------------------------------------------------------------ */\n\n/**\n * Returns a queued sequence of {@link ProviderResult}s — one per turn — so the\n * agentic loop can be driven deterministically offline: script the tool calls\n * the \"model\" makes (read → search → edit → run → finish) and assert what the\n * agent did. Ignores the incoming messages by design.\n */\nexport class ScriptedProvider implements Provider {\n readonly id = 'scripted';\n readonly label = 'Scripted (deterministic)';\n readonly local = true;\n private turn = 0;\n constructor(\n readonly model: string,\n private readonly steps: Array<{ text?: string; toolCalls?: ToolCall[]; truncated?: boolean }>,\n ) {}\n // Match Provider.chat so tests can wrap/spy with the full signature.\n async chat(_messages?: ChatMessage[], _opts?: ChatOptions): Promise<ProviderResult> {\n const step = this.steps[Math.min(this.turn, this.steps.length - 1)];\n this.turn++;\n return { text: step.text ?? '', model: this.model, provider: this.id, toolCalls: step.toolCalls, truncated: step.truncated };\n }\n}\n\n/** The catalogue of known OpenAI-compatible endpoints, keyed by short id. */\nexport const OPENAI_COMPATIBLE: Record<string, Omit<OpenAiCompatibleConfig, 'label' | 'id'> & { label: string }> = {\n /**\n * Vibgrate Relay — the first-party hosted router. OpenAI-compatible, so it\n * needs no bespoke client. Reached with a Vibgrate token rather than a\n * provider key; the base URL is overridable for staging and self-hosting.\n */\n 'vibgrate-relay': {\n baseUrl: process.env.VIBGRATE_RELAY_URL || 'https://api.vibgrate.com/relay/v1',\n apiKeyEnv: 'VIBGRATE_RELAY_TOKEN',\n local: false,\n label: 'Vibgrate Relay',\n },\n openrouter: { baseUrl: 'https://openrouter.ai/api/v1', apiKeyEnv: 'OPENROUTER_API_KEY', local: false, label: 'OpenRouter' },\n litellm: { baseUrl: process.env.LITELLM_BASE_URL || 'http://127.0.0.1:4000', apiKeyEnv: 'LITELLM_API_KEY', local: false, label: 'LiteLLM' },\n openai: { baseUrl: 'https://api.openai.com/v1', apiKeyEnv: 'OPENAI_API_KEY', local: false, label: 'OpenAI' },\n together: { baseUrl: 'https://api.together.xyz/v1', apiKeyEnv: 'TOGETHER_API_KEY', local: false, label: 'Together' },\n lmstudio: { baseUrl: process.env.LMSTUDIO_BASE_URL || 'http://127.0.0.1:1234/v1', local: true, label: 'LM Studio (local)' },\n /**\n * Microsoft Foundry Local — OpenAI-compatible local endpoint (Windows NPU/GPU).\n * Default port matches current Foundry Local docs; override with FOUNDRY_LOCAL_BASE_URL.\n */\n 'foundry-local': {\n baseUrl: process.env.FOUNDRY_LOCAL_BASE_URL || 'http://127.0.0.1:5272/v1',\n local: true,\n label: 'Foundry Local',\n },\n};\n\n/* ------------------------------------------------------------------ *\\\n * Local llama.cpp (installs a package on first use, with consent)\n\\* ------------------------------------------------------------------ */\n\n/**\n * A fully-local inference backend backed by the dual-mode llm-host (ADR-005)\n * and `node-llama-cpp`. Install runtime deps via `vg models install` (or pass\n * consent so ensurePackage can run once). Model *weights* are never fetched\n * automatically: `modelPath` must point at a gguf the user already has.\n */\nexport class LocalLlamaProvider implements Provider {\n readonly id = 'llama-cpp';\n /** Surfaced as the Vibgrate model manager (embedded llama.cpp). */\n readonly label = 'Vibgrate (local)';\n readonly local = true;\n /**\n * The embedded host has no native function-calling API — the router wraps\n * this provider in the text tool protocol (text-tool-protocol.ts) so the\n * agent loop still gets structured tool calls.\n */\n readonly supportsTools = false;\n /** Process-wide warm binding + path (best-in-breed: no reload per turn). */\n private static warmBinding: unknown | null = null;\n private static warmHost: import('../runtime/llm-host/embedded.js').EmbeddedLlmHost | null = null;\n private static warmPath: string | null = null;\n\n constructor(\n readonly model: string,\n private readonly modelPath: string,\n private readonly ensure: typeof ensurePackage = ensurePackage,\n private readonly consent = false,\n /** Override isolation (default: env / embedded). */\n private readonly isolation: 'embedded' | 'process' = 'embedded',\n private readonly processEndpoint?: string,\n ) {}\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const {\n createLlmHost,\n EmbeddedLlmHost,\n resolveInferenceIsolation,\n acquireHostSession,\n generateOnSession,\n evictIdleSessions,\n } = await import('../runtime/llm-host/index.js');\n const isolation = resolveInferenceIsolation(this.isolation);\n try {\n const chatMessages = messages.map((m) => ({\n role: (m.role === 'tool' ? 'user' : m.role) as 'system' | 'user' | 'assistant',\n content: m.content,\n }));\n const genOpts = {\n temperature: opts.temperature ?? 0,\n maxTokens: opts.maxTokens,\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: !!opts.identifierTrie,\n draftCandidates: opts.draftCandidates,\n promptSegments: opts.promptSegments,\n };\n\n if (isolation === 'process') {\n const host = createLlmHost({ isolation: 'process', endpoint: this.processEndpoint });\n await host.load(this.modelPath);\n const out = await host.generate(chatMessages, genOpts);\n return { text: out.text, model: this.model, provider: this.id };\n }\n\n // Warm path: reuse binding + session across turns.\n if (!LocalLlamaProvider.warmBinding) {\n const res = await this.ensure('node-llama-cpp@^3', { consent: this.consent, onUnavailable: () => {} });\n if (!res.module) {\n throw new Error(ensureUnavailableMessage(res.reason ?? 'no-consent', 'node-llama-cpp', res.detail));\n }\n LocalLlamaProvider.warmBinding = res.module;\n }\n evictIdleSessions(2);\n\n // Prefer direct session API for metrics-rich generate.\n const session = await acquireHostSession(LocalLlamaProvider.warmBinding, this.modelPath);\n const report = await generateOnSession(session, chatMessages, genOpts);\n // Real-ish usage for the panel meter. Never report draftAcceptedChars as\n // tokens — that is a char count of a speculative draft, not model usage\n // (it produced footers like \"56 tokens\" for multi-paragraph answers).\n const promptTokens = report.kvPlan?.totalTokens;\n const completionTokens = report.text ? Math.max(1, Math.ceil(report.text.length / 4)) : undefined;\n return {\n text: report.text,\n model: this.model,\n provider: this.id,\n usage: {\n ...(typeof promptTokens === 'number' && promptTokens > 0 ? { promptTokens } : {}),\n ...(completionTokens != null ? { completionTokens } : {}),\n },\n };\n } catch (e) {\n // Fall back to EmbeddedLlmHost once if session path fails.\n try {\n if (LocalLlamaProvider.warmBinding) {\n if (\n !LocalLlamaProvider.warmHost ||\n LocalLlamaProvider.warmPath !== this.modelPath\n ) {\n const host = createLlmHost({\n isolation: 'embedded',\n binding: LocalLlamaProvider.warmBinding,\n preferGrammar: !!opts.grammar,\n });\n if (host instanceof EmbeddedLlmHost) {\n LocalLlamaProvider.warmHost = host;\n LocalLlamaProvider.warmPath = this.modelPath;\n await host.load(this.modelPath);\n }\n }\n if (LocalLlamaProvider.warmHost) {\n const out = await LocalLlamaProvider.warmHost.generate(\n messages.map((m) => ({\n role: (m.role === 'tool' ? 'user' : m.role) as 'system' | 'user' | 'assistant',\n content: m.content,\n })),\n {\n temperature: opts.temperature ?? 0,\n maxTokens: opts.maxTokens,\n grammar: opts.grammar,\n requireGrammar: opts.requireGrammar,\n identifierTrie: opts.identifierTrie,\n annotateUnknownIdentifiers: !!opts.identifierTrie,\n draftCandidates: opts.draftCandidates,\n promptSegments: opts.promptSegments,\n },\n );\n return { text: out.text, model: this.model, provider: this.id };\n }\n }\n } catch {\n /* rethrow outer */\n }\n throw new Error(`local llama.cpp inference failed for ${this.modelPath} — ${redactSecrets((e as Error).message)}`);\n }\n }\n}\n"]}
@@ -1,102 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
-
4
- // src/engine/serialize.ts
5
- function serializeGraph(graph, opts) {
6
- const indent = opts?.compact ? 0 : 2;
7
- return `${stableStringify(graph, indent)}
8
- `;
9
- }
10
- function slimGraphForExport(graph) {
11
- return {
12
- ...graph,
13
- areas: graph.areas.map((a) => ({
14
- ...a,
15
- members: []
16
- // member id lists dominate XL exports; area id still on nodes
17
- })),
18
- grounding: void 0,
19
- facts: graph.facts
20
- // Keep summaries/unknowns — small and useful to agents.
21
- };
22
- }
23
- function stableStringify(value, indent = 2) {
24
- return JSON.stringify(sortKeys(value), null, indent);
25
- }
26
- function sortKeys(value) {
27
- if (Array.isArray(value)) return value.map(sortKeys);
28
- if (value && typeof value === "object") {
29
- const input = value;
30
- const out = {};
31
- for (const key of Object.keys(input).sort()) {
32
- const v = input[key];
33
- if (v === void 0) continue;
34
- out[key] = sortKeys(v);
35
- }
36
- return out;
37
- }
38
- return value;
39
- }
40
- function parseGraph(json) {
41
- return JSON.parse(json);
42
- }
43
- var CACHE_VERSION = "vg-parse-cache/4";
44
- function cacheDir(root) {
45
- return path.join(root, ".vibgrate", "cache");
46
- }
47
- function cachePath(root) {
48
- return path.join(cacheDir(root), "parse-cache.json");
49
- }
50
- function loadCache(root, opts) {
51
- const file = cachePath(root);
52
- let data = {
53
- version: CACHE_VERSION,
54
- toolVersion: opts.toolVersion,
55
- grammars: opts.grammars,
56
- entries: {}
57
- };
58
- if (!opts.disabled && fs.existsSync(file)) {
59
- try {
60
- const loaded = JSON.parse(fs.readFileSync(file, "utf8"));
61
- if ((loaded.version === CACHE_VERSION || loaded.version === "vg-parse-cache/3") && loaded.toolVersion === opts.toolVersion && loaded.grammars === opts.grammars && loaded.entries) {
62
- data = { ...loaded, version: CACHE_VERSION };
63
- }
64
- } catch {
65
- }
66
- }
67
- return {
68
- get(rel, hash) {
69
- const entry = data.entries[rel];
70
- return entry && entry.hash === hash ? entry.parse : void 0;
71
- },
72
- getByStat(rel, mtimeMs, size) {
73
- const entry = data.entries[rel];
74
- if (!entry) return void 0;
75
- if (entry.mtimeMs === mtimeMs && entry.size === size && entry.parse) {
76
- return { parse: entry.parse, hash: entry.hash };
77
- }
78
- return void 0;
79
- },
80
- set(rel, parse, stat) {
81
- data.entries[rel] = {
82
- hash: parse.hash,
83
- parse,
84
- mtimeMs: stat?.mtimeMs,
85
- size: stat?.size
86
- };
87
- },
88
- prune(currentRels) {
89
- for (const rel of Object.keys(data.entries)) {
90
- if (!currentRels.has(rel)) delete data.entries[rel];
91
- }
92
- },
93
- save() {
94
- fs.mkdirSync(cacheDir(root), { recursive: true });
95
- fs.writeFileSync(file, stableStringify(data, 0));
96
- }
97
- };
98
- }
99
-
100
- export { cacheDir, loadCache, parseGraph, serializeGraph, slimGraphForExport, stableStringify };
101
- //# sourceMappingURL=chunk-RBMKBYGV.js.map
102
- //# sourceMappingURL=chunk-RBMKBYGV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/serialize.ts","../src/engine/cache.ts"],"names":[],"mappings":"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","file":"chunk-RBMKBYGV.js","sourcesContent":["import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic serialization of `graph.json`.\n *\n * Object keys are sorted recursively and arrays are emitted in the (already\n * stable) order the engine produced them, so two runs over identical content\n * yield byte-identical output — the determinism contract (VG-CLI-SPEC §1.3).\n * Pretty-printed (2-space) and newline-terminated so the committed artifact is\n * human-diffable and plays well with the union merge driver.\n */\nexport function serializeGraph(graph: VgGraph, opts?: { compact?: boolean }): string {\n // Compact (no pretty-print) for large maps / CI artifacts — still deterministic.\n const indent = opts?.compact ? 0 : 2;\n return `${stableStringify(graph, indent)}\\n`;\n}\n\n/**\n * Drop heavy optional fields for export/sharing when size matters.\n * Does not mutate the input graph.\n */\nexport function slimGraphForExport(graph: VgGraph): VgGraph {\n return {\n ...graph,\n areas: graph.areas.map((a) => ({\n ...a,\n members: [], // member id lists dominate XL exports; area id still on nodes\n })),\n grounding: undefined,\n facts: graph.facts,\n // Keep summaries/unknowns — small and useful to agents.\n };\n}\n\nexport function stableStringify(value: unknown, indent = 2): string {\n return JSON.stringify(sortKeys(value), null, indent);\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(input).sort()) {\n const v = input[key];\n if (v === undefined) continue; // omit undefined for stable output\n out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\nexport function parseGraph(json: string): VgGraph {\n return JSON.parse(json) as VgGraph;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { stableStringify } from './serialize.js';\nimport type { FileParse } from './types.js';\n\n/**\n * Incremental parse cache. Maps a file's content hash to its parsed\n * symbol/edge tables, so a rebuild re-parses only files whose content actually\n * changed (VG-DEVELOPMENT-PLAN Phase 0.4). Lives under `.vibgrate/cache/` and is\n * gitignored — never part of the committed artifact.\n *\n * The cache is a pure performance optimisation: a reused FileParse is identical\n * to a freshly-parsed one (parsing is pure over content), so the graph is\n * byte-identical whether or not the cache was warm. CI-enforced by the\n * mutation-corpus identity gate (incremental-identity.test.ts): warm\n * incremental rebuild ≡ cold full rebuild, byte for byte, across\n * edit/add/delete/rename/touch mutations and the production refresh path.\n */\n\n// Bumped to /4: optional mtime+size fingerprint for stat-skip fast path.\nconst CACHE_VERSION = 'vg-parse-cache/4';\n\ninterface CacheEntry {\n hash: string;\n mtimeMs?: number;\n size?: number;\n parse: FileParse;\n}\n\ninterface CacheFile {\n version: string;\n toolVersion: string;\n grammars: string;\n entries: Record<string, CacheEntry>;\n}\n\nexport interface ParseCache {\n get(rel: string, hash: string): FileParse | undefined;\n /** Fast path: mtime+size match → reuse parse without re-reading bytes. */\n getByStat(rel: string, mtimeMs: number, size: number): { parse: FileParse; hash: string } | undefined;\n set(rel: string, parse: FileParse, stat?: { mtimeMs: number; size: number }): void;\n /** Drop entries for files no longer present. */\n prune(currentRels: Set<string>): void;\n save(): void;\n}\n\nexport function cacheDir(root: string): string {\n return path.join(root, '.vibgrate', 'cache');\n}\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'parse-cache.json');\n}\n\nexport function loadCache(\n root: string,\n opts: { toolVersion: string; grammars: string; disabled?: boolean },\n): ParseCache {\n const file = cachePath(root);\n let data: CacheFile = {\n version: CACHE_VERSION,\n toolVersion: opts.toolVersion,\n grammars: opts.grammars,\n entries: {},\n };\n\n if (!opts.disabled && fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as CacheFile;\n // Accept v3 → v4 (stat fields optional).\n if (\n (loaded.version === CACHE_VERSION || loaded.version === 'vg-parse-cache/3') &&\n loaded.toolVersion === opts.toolVersion &&\n loaded.grammars === opts.grammars &&\n loaded.entries\n ) {\n data = { ...loaded, version: CACHE_VERSION };\n }\n } catch {\n /* corrupt cache — start fresh */\n }\n }\n\n return {\n get(rel, hash) {\n const entry = data.entries[rel];\n return entry && entry.hash === hash ? entry.parse : undefined;\n },\n getByStat(rel, mtimeMs, size) {\n const entry = data.entries[rel];\n if (!entry) return undefined;\n if (entry.mtimeMs === mtimeMs && entry.size === size && entry.parse) {\n return { parse: entry.parse, hash: entry.hash };\n }\n return undefined;\n },\n set(rel, parse, stat) {\n data.entries[rel] = {\n hash: parse.hash,\n parse,\n mtimeMs: stat?.mtimeMs,\n size: stat?.size,\n };\n },\n prune(currentRels) {\n for (const rel of Object.keys(data.entries)) {\n if (!currentRels.has(rel)) delete data.entries[rel];\n }\n },\n save() {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(file, stableStringify(data, 0));\n },\n };\n}\n"]}
@@ -1,13 +0,0 @@
1
- export { localGraphBackend, resolveGraphBackend, vgdGraphBackend } from './chunk-KFK7KCAH.js';
2
- import './chunk-RBIRXQR6.js';
3
- import './chunk-J7LKEB2R.js';
4
- import './chunk-TVRM57CE.js';
5
- import './chunk-2A7XCANX.js';
6
- import './chunk-4LGDQBYK.js';
7
- import './chunk-RBMKBYGV.js';
8
- import './chunk-BWPBB45M.js';
9
- import './chunk-JFGYT6BI.js';
10
- import './chunk-BPF3YX2U.js';
11
- import './chunk-Z6ZWNWWR.js';
12
- //# sourceMappingURL=graph-backend-3A2M22QN.js.map
13
- //# sourceMappingURL=graph-backend-3A2M22QN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/code/wizard.ts","../src/code/cost.ts","../src/runtime/bridge-facts.ts","../src/code/interactive.ts"],"names":["group","model","sp"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,IAAM,UAAA,GAAa,gBAAA;AACnB,IAAM,KAAA,GAAQ,WAAA;AACd,IAAM,MAAA,GAAS,YAAA;AASf,eAAsB,iBAAA,CAAkB,UAAoB,IAAA,EAAyC;AACnG,EAAA,MAAM,YAAY,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAC,CAAA;AAG3D,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAe,6BAAA,EAA+B;AAAA,IAC1E,EAAE,KAAA,EAAO,+BAAA,EAAiC,KAAA,EAAO,OAAO,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,MAAM,WAAW,uBAAA,EAAwB;AAAA,IACrJ,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,kBAAiB,CAAE,CAAA;AAAA,IACjF,EAAE,KAAA,EAAO,uCAAA,EAAyC,KAAA,EAAO,UAAA;AAAW,GACrE,CAAA;AAED,EAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,SAAA,CAAU,UAAU,IAAI,CAAA;AACrD,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,0EAA0E,GAAG,IAAA,EAAK;AAErH,IAAA,IAAI,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,EAAE,MAAM,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,MAAM,YAAA,EAAc,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACvH,IAAA,MAAMA,MAAAA,GAAQ,KAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAI,CAAA;AAC9D,IAAA,IAAIA,MAAAA,IAASA,MAAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,OAAO,gBAAgB,QAAA,EAAUA,MAAAA,CAAM,EAAA,EAAIA,MAAAA,CAAM,MAAM,CAAA;AAEzF,IAAA,MAAM,KAAA,GAAA,CAAS,MAAM,QAAA,CAAS,KAAA,CAAM,iBAAiB,IAAI,CAAA,CAAA,CAAG,GAAG,IAAA,EAAK;AACpE,IAAA,OAAO,EAAE,MAAM,QAAA,EAAU,QAAA,EAAU,cAAc,KAAA,EAAO,KAAA,IAAS,IAAA,EAAM,YAAA,EAAc,IAAA,EAAK;AAAA,EAC5F;AAGA,EAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AACnD,EAAA,OAAO,eAAA,CAAgB,QAAA,EAAU,KAAA,CAAM,EAAA,EAAI,MAAM,MAAM,CAAA;AACzD;AAEA,eAAe,eAAA,CAAgB,QAAA,EAAoB,YAAA,EAAsB,MAAA,EAAgD;AACvH,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAMC,MAAAA,GAAAA,CAAS,MAAM,QAAA,CAAS,KAAA,CAAM,WAAW,YAAY,CAAA,SAAA,CAAW,GAAG,IAAA,EAAK;AAC9E,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAmB,UAAU,YAAA,EAAuB,KAAA,EAAAA,QAAO,YAAA,EAAa;AAAA,EACzF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,MAAA,CAAe,gBAAA,EAAkB;AAAA,IAC5D,GAAG,OAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,SAAA,CAAU,EAAE,aAAA,EAAe,CAAA,CAAE,eAAe,CAAA,EAAE,CAAE,CAAA;AAAA,IACvH,EAAE,KAAA,EAAO,2BAAA,EAA6B,KAAA,EAAO,UAAA;AAAW,GACzD,CAAA;AACD,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,KAAA,GAAA,CAAS,MAAM,QAAA,CAAS,KAAA,CAAM,WAAW,YAAY,CAAA,SAAA,CAAW,GAAG,IAAA,EAAK;AAC9E,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAmB,UAAU,YAAA,EAAuB,KAAA,EAAO,OAAO,YAAA,EAAa;AAAA,EAChG;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAmB,QAAA,EAAU,YAAA,EAAuB,OAAO,YAAA,EAAa;AACzF;AAEA,eAAe,SAAA,CAAU,UAAoB,IAAA,EAAyC;AACpF,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,QAAQ,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,aAAY,CAAE,CAAA;AAAA,IAC7E,EAAE,KAAA,EAAO,uCAAA,EAAyC,KAAA,EAAO,MAAA,EAAO;AAAA,IAChE,EAAE,KAAA,EAAO,4BAAA,EAA8B,KAAA,EAAO,UAAA;AAAW,GAC3D;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAe,eAAe,OAAO,CAAA;AAEnE,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,8CAA8C,GAAG,IAAA,EAAK;AACzF,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK;AAAA,EACnG;AACA,EAAA,IAAI,WAAW,MAAA,EAAQ;AAErB,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,SAAA,CACzB,QAAQ,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA,CACvB,OAAO,CAAC,CAAA,KAAM,iBAAiB,IAAA,CAAK,CAAA,CAAE,EAAE,CAAC,CAAA,CACzC,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACd,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,8CAA8C,GAAG,IAAA,EAAK;AACzF,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK;AAAA,IACnG;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,MAAA,CAAe,sBAAA,EAAwB;AAAA,MACjE,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,YAAY,CAAA,CAAE,EAAE,GAAG,IAAA,EAAM,CAAA,CAAE,IAAG,CAAE,CAAA;AAAA,MAC9E,EAAE,KAAA,EAAO,2BAAA,EAA6B,KAAA,EAAO,UAAA;AAAW,KACzD,CAAA;AACD,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,8CAA8C,GAAG,IAAA,EAAK;AACzF,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK;AAAA,IACnG;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK;AAAA,EACnG;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAO,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM;AACtG;AAGO,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,IAAA;AACtC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAA,CACV,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAC1B,OAAA,CAAQ,qBAAA,EAAuB,EAAE,CAAA,CACjC,QAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACtB,EAAA,OAAO,OAAO,CAAA,EAAG,IAAI,IAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AACxC;AAEA,SAAS,SAAA,CAAU,eAAwB,SAAA,EAA4B;AACrE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,aAAA,QAAqB,IAAA,CAAK,CAAA,EAAG,KAAK,KAAA,CAAM,aAAA,GAAgB,GAAI,CAAC,CAAA,KAAA,CAAO,CAAA;AACxE,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,GAAI,MAAA,GAAS,CAAA,CAAA,EAAI,SAAS,CAAA,KAAA,CAAO,CAAA;AAC7F,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;;;ACnHO,SAAS,MAAA,CAAO,OAAmB,OAAA,EAA+B;AACvE,EAAA,MAAM,UAAW,KAAA,CAAM,YAAA,IAAgB,CAAA,IAAK,GAAA,IAAQ,QAAQ,UAAA,IAAc,CAAA,CAAA;AAC1E,EAAA,MAAM,WAAY,KAAA,CAAM,gBAAA,IAAoB,CAAA,IAAK,GAAA,IAAQ,QAAQ,cAAA,IAAkB,CAAA,CAAA;AACnF,EAAA,OAAO,MAAA,CAAO,SAAS,OAAO,CAAA;AAChC;AAGO,IAAM,eAAN,MAAmB;AAAA,EAMxB,WAAA,CAAoB,OAAA,GAAwB,EAAC,EAAG;AAA5B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA6B;AAAA,EAA7B,OAAA;AAAA,EALZ,MAAA,GAAS,CAAA;AAAA,EACT,UAAA,GAAa,CAAA;AAAA,EACb,IAAA,GAAO,CAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA;AAAA,EAKhB,WAAW,OAAA,EAA6B;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,KAAA,EAA2B;AAC7B,IAAA,IAAA,CAAK,MAAA,IAAU,MAAM,YAAA,IAAgB,CAAA;AACrC,IAAA,IAAA,CAAK,UAAA,IAAc,MAAM,gBAAA,IAAoB,CAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,IAAS,CAAA;AACd,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,GAAO,KAAK,CAAA;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,GAA+G;AACjH,IAAA,OAAO,EAAE,YAAA,EAAc,IAAA,CAAK,MAAA,EAAQ,gBAAA,EAAkB,KAAK,UAAA,EAAY,WAAA,EAAa,IAAA,CAAK,MAAA,GAAS,KAAK,UAAA,EAAY,IAAA,EAAM,KAAK,IAAA,EAAM,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,EACxJ;AAAA;AAAA,EAGA,OAAA,GAAkB;AAChB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAA,CAAU,CAAA,CAAE,WAAW,CAAC,CAAA,IAAA,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,KAAK,OAAA,CAAQ,cAAA;AACvD,IAAA,OAAO,MAAA,GAAS,GAAG,GAAG,CAAA,QAAA,EAAQ,EAAE,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,GAAA;AAAA,EACtD;AACF,CAAA;AAEO,SAAS,UAAU,CAAA,EAAmB;AAC3C,EAAA,IAAI,CAAA,IAAK,KAAK,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC5C,EAAA,IAAI,CAAA,IAAK,KAAK,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC5C,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;;;AC1DO,SAAS,iBAAA,CACd,OAAA,EACA,OAAA,GAAyD,EAAC,EAChD;AACV,EAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAC;AAC9B,EAAA,MAAM,GAAA,GAAM,QAAQ,aAAA,IAAiB,GAAA;AACrC,EAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,IAAY,EAAA;AAChC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,GAAG,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAC9B,IAAA,MAAM,MAAM,CAAA,CAAE,WAAA,GAAc,CAAA,SAAA,EAAY,CAAA,CAAE,WAAW,CAAA,CAAA,GAAK,EAAA;AAC1D,IAAA,OAAO,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,QAAA,EAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5E,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACjC,KAAA,CAAM,GAAG,GAAG,CAAA;AACjB;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AACpC;;;ACyDA,eAAsB,eAAe,IAAA,EAAc,MAAA,EAAoB,MAA0B,QAAA,GAAqB,IAAI,aAAY,EAAkB;AACtJ,EAAA,aAAA,CAAc,IAAI,CAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACtC,IAAA,MAAM,YAAY,MAAM,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAChE,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,WAAW,QAAQ,CAAA;AAAA,EAC1D,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,2CAAsC,CAAC,CAAA;AAClD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA;AAAA,EACR;AACF;AAGA,eAAe,SAAA,CAAU,IAAA,EAAc,MAAA,EAAoB,QAAA,EAAmC;AAC5F,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAC7C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAMC,GAAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,6BAAwB,CAAA;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,CAAc,MAAM,MAAM,CAAA;AAChC,MAAAA,GAAAA,CAAG,KAAK,gBAAgB,CAAA;AAAA,IAC1B,SAAS,CAAA,EAAG;AACV,MAAAA,GAAAA,CAAG,IAAA,CAAK,CAAA,6BAAA,EAAiC,CAAA,CAAY,OAAO,CAAA,CAAE,CAAA;AAC9D,MAAA,MAAM,CAAA;AAAA,IACR;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,2CAAsC,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,iBAAiB,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,IAAA,EAAM,EAAE,WAAW,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5E,EAAA,IAAI,SAAA,EAAW,MAAA,KAAW,WAAA,EAAa,EAAA,CAAG,KAAK,oBAAoB,CAAA;AAAA,OAC9D,EAAA,CAAG,KAAK,gBAAgB,CAAA;AAC/B;AAGA,eAAe,WAAA,CAAY,IAAA,EAAc,MAAA,EAAoB,IAAA,EAA0B,QAAA,EAAkD;AAEvI,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,KAAA,IAAS,KAAK,SAAA,CAAA,EAAY;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,UAAA,IAAc,IAAA,CAAK,QAAA,KAAa,WAAA,IAAe,CAAC,CAAC,MAAA,CAAO,KAAA;AACtH,IAAA,OAAO,EAAE,MAAM,KAAA,GAAQ,OAAA,GAAU,UAAU,QAAA,EAAU,IAAA,CAAK,aAAa,QAAA,GAAW,QAAA,GAAW,cAAc,KAAA,EAAO,IAAA,CAAK,SAAS,IAAA,CAAK,SAAA,IAAa,IAAI,YAAA,EAAc,IAAA,CAAK,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM;AAAA,EACtM;AAEA,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,iCAA4B,CAAA;AACxD,EAAA,MAAM,UAAU,MAAM,YAAA,CAAa,EAAE,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAC5D,EAAA,EAAA,CAAG,IAAA,CAAK,QAAQ,MAAA,KAAW,SAAA,GAAY,yBAAyB,OAAA,CAAQ,MAAA,KAAW,OAAA,GAAU,wBAAA,GAA2B,8BAA8B,CAAA;AACtJ,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,YAAY,MAAM,iBAAA,CAAkB,UAAU,EAAE,OAAA,EAAS,aAAa,CAAA;AAE5E,EAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,SAAA,EAAW;AACrD,IAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAA;AACrD,IAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAAA,EAClB;AACA,EAAA,IAAI,UAAU,IAAA,KAAS,QAAA,IAAY,CAAC,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClE,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,uGAAuG,CAAC,CAAA;AAAA,EACjI;AACA,EAAA,OAAO,SAAA;AACT;AAGA,eAAe,gBAAA,CAAiB,WAAyB,QAAA,EAAsC;AAC7F,EAAA,IAAI,CAAC,WAAU,EAAG;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,uHAA6G,CAAC,CAAA;AACrI,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,SAAA,CAAU,KAAK,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,QAAA,EAAU,kBAAA,EAAoB,CAAA;AAE9D,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,kBAAA,EAAgB,GAAA,CAAI,QAAA,CAAS,KAAK,CAAC,GAAG,QAAA,CAAS,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,iBAAiB,CAAA,GAAI,EAAE,CAAA,GAAA,EAAM,GAAA,CAAI,MAAA,CAAO,cAAc,CAAC,CAAA,SAAA,CAAW,CAAA;AACzK,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,KAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAEjE,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,2HAAiH,CAAC,CAAA;AACtI,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA;AACtE,IAAA,IAAI,OAAA,IAAY,MAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,CAAA,EAAK,IAAI,CAAA,EAAI;AACvG,MAAA,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,IAAI,CAAE,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,SAAA,CAAU,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,SAAS,KAAK,CAAC,CAAA,EAAA,CAAA,EAAM,IAAI,GAAI,OAAO,KAAA;AAElG,EAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,CAAA,QAAA,EAAW,SAAA,CAAU,KAAK,CAAA,MAAA,CAAG,CAAA;AACzD,EAAA,MAAM,EAAA,GAAK,MAAM,cAAA,CAAe,SAAA,CAAU,OAAO,EAAE,CAAA;AACnD,EAAA,IAAI,IAAI,EAAA,CAAG,IAAA,CAAK,CAAA,OAAA,EAAU,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AAAA,OACtC,EAAA,CAAG,IAAA,CAAK,CAAA,mBAAA,EAAiB,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AAC/C,EAAA,OAAO,EAAA;AACT;AAGA,eAAe,UAAA,CAAW,IAAA,EAAc,MAAA,EAAoB,IAAA,EAA0B,WAAyB,QAAA,EAAmC;AAChJ,EAAA,IAAI,GAAA,GAAM,SAAA;AACV,EAAA,IAAI,QAAQ,gBAAA,CAAiB;AAAA,IAC3B,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,KAAA,EAAO,GAAA,CAAI,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,KAAA;AAAA,IACtC,OAAA,EAAS;AAAA;AAAA,GACV,CAAA;AACD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,6BAA6B,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB;AAAA,MACxC,YAAY,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,GAAA,CAAI,QAAA;AAAA,MAC1C,OAAO,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA;AAAA,MACxC,OAAA,EAAS,CAAC,CAAC,MAAA,CAAO,KAAA;AAAA,MAClB,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,yBAAyB,CAAC,CAAA;AAAA,SAAA,IACxE,MAAA,CAAO,SAAA,CAAU,MAAA,IAAU,MAAA,CAAO,OAAO,MAAA,EAAQ;AACxD,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,UAAA,EAAa,CAAC,CAAA,CAAE,CAAC,CAAA;AACvE,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,QAAA,CAAS,KAAK,CAAA,CAAE,GAAA,CAAI,WAAW,KAAA,CAAM,WAAW,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,EAAA,IAAI,cAA4B,EAAC;AAGjC,EAAA,IAAI,KAAA,GAAuB,UAAA,CAAW,SAAA,EAAU,EAAG,GAAA,CAAI,cAAc,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAC1F,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,WAAA,GAAc,IAAA,CAAK,eAAe,EAAC;AACnC,MAAA,YAAA,GAAe,iBAAiB,IAAI,CAAA;AACpC,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,uBAAA,EAAqB,KAAK,KAAA,CAAM,MAAM,kDAAkD,CAAC,CAAA;AAAA,IAC/G,OAAO,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,iCAAiC,CAAC,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,WAAA,GAAkE,EAAE,OAAA,EAAS,IAAA,EAAK;AAGxF,EAAA,MAAM,EAAE,uBAAA,EAAyB,qBAAA,EAAsB,GAAI,MAAM,OAAO,6BAAoB,CAAA;AAC5F,EAAA,MAAM,YAAY,uBAAA,CAAwB;AAAA,IACxC,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,EAAS,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAChE,MAAA,OAAO,WAAA,CAAY,OAAA;AAAA,IACrB,CAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,OAAO,KAAA,KAAU;AAAA,GACzB,CAAA;AACD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,KAAK,UAAA,IAAc,MAAA,CAAO,KAAK,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ;AAC1D,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,4BAAuB,CAAA;AACnD,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,iBAAiB,CAAA;AAC5G,IAAA,GAAA,GAAM,OAAA;AACN,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,EAAY,MAAA,GAAS,CAAA,OAAA,EAAU,KAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACjF,IAAA,EAAA,CAAG,IAAA;AAAA,MACD,cAAc,OAAA,CAAQ,KAAA,EAAM,CAAE,MAAM,cAAc,SAAA,CAAU,KAAA,CAAM,MAAM,CAAA,WAAA,EACjE,OAAO,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,CAAE,MAAM,aAAa,IAAI,CAAA,CAAA;AAAA,KAC7D;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,UAAU,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,CAAO,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EAC5D,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,SAAA,EAAS,UAAU,KAAA,CAAM,MAAM,qDAAqD,CAAC,CAAA;AAAA,EAC3G;AACA,EAAA,MAAM,mBAAA,GAAsB,qBAAA;AAAA,IAC1B,SAAA;AAAA,IACA,MAAM,gBAAA,CAAiB,GAAA,EAAK,aAAa,IAAA,EAAM,QAAQ,CAAC,CAAA,GAAI;AAAA,GAC9D;AAIA,EAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB,EAAE,MAAM,CAAA;AAGtD,EAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,EAAE,MAAM,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAG7E,EAAA,MAAM,UAAA,GAAa,yBAAyB,IAAI,CAAA;AAChD,EAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,UAAA,CAAW,OAAO,CAAA;AAC7D,EAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAM,MAAM,YAAA,CAAa,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,CAAA,EAAI;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,UAAA;AAAA,QACJ;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,SAAS,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE;AAAA,SACzF;AAAA,QACA,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA;AAAW,OACnC;AACA,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,EAAS,MAAA,IAAU,CAAA;AAC9C,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,CAAE,GAAA;AAAA,UACA,CAAA,gBAAA,EAAgB,WAAW,OAAA,CAAQ,MAAM,uCACtC,OAAA,GAAU,CAAA,MAAA,EAAM,OAAO,CAAA,eAAA,CAAA,GAAoB,EAAA;AAAA;AAChD,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,MAAA,IAAA,CAAY,UAAA,CAAW,OAAA,EAAS,MAAA,IAAU,KAAK,CAAA,EAAG;AAChD,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,CAAE,GAAA;AAAA,QACA,mBAAgB,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAgB,UAAA,CAAW,QAAS,MAAM,CAAA,2BAAA;AAAA;AACrF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,0BAAA;AAAA,IACjB,4BAAA,CAA6B;AAAA,MAC3B,YAAY,GAAA,CAAI,YAAA;AAAA,MAChB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AAAA,MAC5C,eAAA,EAAiB,KAAK,MAAA,EAAQ,SAAA;AAAA,MAC9B,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,GACP;AAKA,EAAA,MAAM,eACJ,IAAA,CAAK,YAAA,IAAgB,aAAa,YAAA,KAAiB,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA,CAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,IAAK,CAAC,IAAI,CAAA;AACrE,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,YAAA,EAAc,EAAE,eAAe,CAAA;AAExE,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,KAAK,QAAQ,OAAA,EAAQ;AACrB,IAAA,KAAK,KAAK,OAAA,EAAQ;AAAA,EACpB,CAAA;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,OAAO,CAAA;AAE9B,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,uBAAoB,CAAA,GAAI,EAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,IAAI,CAAA,MAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AAC7E,EAAA,MAAM,YAAA,GAAe,EAAE,GAAA,CAAI,CAAA,MAAA,EAAM,aAAa,IAAI,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA;AAC1E,EAAA,MAAM,UAAU,CAAA,CAAE,GAAA,CAAI,CAAA,UAAA,EAAU,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AACnD,EAAA,QAAA,CAAS,KAAA,CAAM,CAAA,aAAA,EAAW,GAAA,CAAI,YAAY,IAAI,GAAA,CAAI,KAAK,CAAA,EAAG,WAAW,GAAG,YAAY,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,gDAAA,CAAkD,CAAA;AAE3J,EAAA,IAAI;AACF,IAAA,WAAS;AACP,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,aAAQ,GAAG,IAAA,EAAK;AACnD,MAAA,IAAI,CAAC,QAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,OAAA,EAAS;AAElF,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,CAAC,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,MAAM,KAAK,CAAA;AACvC,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,QAAA,CAAS,KAAK,0DAA0D,CAAA;AAAA,QAC1E,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,CAAE,GAAA,CAAI,iBAAiB,CAAC,CAAA;AAAA,eAC/D;AACH,YAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,MAAM,CAAA;AAChD,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAA,gBAAA,EAAc,QAAA,CAAS,MAAM,CAAA,UAAA,EAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AACtF,YAAA,WAAA,GAAc,EAAC;AACf,YAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,WAAA,EAAa,EAAC,EAAE;AACpC,YAAA,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,UACzB;AAAA,QACF,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,CAAE,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAAA,eAChE,KAAA,MAAW,MAAM,WAAA,EAAa,IAAI,GAAG,IAAA,EAAM,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,QAC7D,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAC1D,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,GAAA,GAAM,OAAA;AACN,YAAA,KAAA,GAAQ,gBAAA,CAAiB;AAAA,cACvB,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,KAAA,EAAO,GAAA,CAAI,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,KAAA;AAAA,cACtC,OAAA,EAAS;AAAA,aACV,CAAA;AACD,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,CAAA,UAAA,EAAa,GAAA,CAAI,YAAY,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,UACrE;AAAA,QACF,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAQ;AACzB,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,CAAA;AAChD,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAChB,CAAA,MAAA,IAAW,QAAQ,SAAA,EAAW;AAC5B,UAAA,IAAI,KAAA,CAAM,MAAM,MAAA,IAAU,CAAA,WAAY,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,wBAAwB,CAAC,CAAA;AAAA,eACrE;AACH,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA;AAC3B,YAAA,KAAA,GAAQ,eAAA,CAAgB,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AACzC,YAAA,WAAA,CAAY,MAAM,KAAK,CAAA;AACvB,YAAA,YAAA,GAAe,gBAAA,CAAiB,KAAK,CAAA,IAAK,KAAA,CAAA;AAC1C,YAAA,QAAA,CAAS,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,UAAA,EAAa,MAAM,wEAAmE,CAAC,CAAA;AAAA,UAC/G;AAAA,QACF,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,wDAAmD,CAAC,CAAA;AAAA,QAC1E,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,iBAAA,EAAoB,GAAG,mBAAc,CAAC,CAAA;AAAA,QAC/D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,aAAa,aAAA,EAAc;AAC9C,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,qDAAgD,CAAC,CAAA;AACrE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,CAAA,CAAE,GAAA;AAAA,YACA,eAAY,UAAA,CAAW,MAAM,GAAG,UAAA,CAAW,SAAA,GAAY,kBAAkB,eAAe,CAAA;AAAA;AAC1F,SACF;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,UAAA,IAAc,KAAA,IAAS,WAAW,MAAA,IAAU,UAAA,CAAW,WAAW,SAAA,EAAW;AACvF,QAAA,KAAK,UAAA;AAAA,UACH;AAAA,YACE,EAAA,EAAI,WAAA;AAAA,YACJ,cAAc,UAAA,CAAW,YAAA;AAAA,YACzB,QAAQ,UAAA,CAAW,MAAA;AAAA,YACnB;AAAA,WACF;AAAA,UACA,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA;AAAW,SACnC,CAAE,MAAM,MAAM;AAAA,QAEd,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,eAAe,mBAAA,CAAoB;AAAA,QACvC,KAAA;AAAA,QACA,cAAc,UAAA,CAAW,YAAA;AAAA,QACzB,MAAA,EAAQ,UAAA,CAAW,MAAA,KAAW,SAAA,GAAY,WAAW,MAAA,GAAS,IAAA;AAAA,QAC9D,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAED,MAAA,YAAA,GAAe,0BAAA;AAAA,QACb,4BAAA,CAA6B;AAAA,UAC3B,YAAY,GAAA,CAAI,YAAA;AAAA,UAChB,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA,CAAA;AAAA,UAC5C,eAAA,EAAiB,KAAK,MAAA,EAAQ,SAAA;AAAA,UAC9B;AAAA,SACD,CAAA;AAAA,QACD,IAAA,CAAK;AAAA,OACP;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU;AAAA,QAC7B,IAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,MAAA;AAAA,QACA,WAAA,EAAa,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAU,GAAA,CAAI,YAAA,EAAc,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AAAA,QAC/E,IAAA,EAAM,CAAC,CAAC,IAAA,CAAK,IAAA;AAAA,QACb,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,YAAA,CAAa,mBAAA;AAAA,QACrB,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAA,EAAQ,IAAA,CAAK,MAAA,GACT,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,YAAA,CAAa,iBAAgB,GACnF,KAAA,CAAA;AAAA,QACJ,YAAA;AAAA;AAAA;AAAA,QAGA,gBAAA,EAAkB,KAAA,CAAM,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,WAAA;AAAA,QACtC,aAAA,EAAe,mBAAA;AAAA,QACf,KAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,YAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,YAAA,GAAe,KAAA,CAAA;AACf,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,WAAA,GAAc,MAAA,CAAO,OAAA;AACrB,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,wCAAqC,CAAC,CAAA;AAAA,MAC5D;AAEA,MAAA,KAAA,GAAQ,WAAW,KAAA,EAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAS,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,SAAS,OAAA,EAAS,MAAA,CAAO,SAAQ,EAAG,IAAA,CAAK,KAAK,CAAA;AACxI,MAAA,WAAA,CAAY,MAAM,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,EAAQ;AACR,IAAA,OAAA,CAAQ,cAAA,CAAe,UAAU,OAAO,CAAA;AAAA,EAC1C;AACA,EAAA,QAAA,CAAS,MAAM,OAAO,CAAA;AACxB;AAGA,SAAS,YAAA,CAAa,MAA0B,QAAA,EAA6D;AAC3G,EAAA,OAAO,OAAO,MAAA,KAAW;AACvB,IAAA,IAAI,IAAA,CAAK,MAAM,OAAO,IAAA;AACtB,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ,OAAO,QAAA,CAAS,QAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACjF,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,CAAA,GAAI,OAAO,KAAA,CAAM,MAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAClB,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,IAAI,CAAA;AACZ,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,MAAA,CAAA,GAAW,EAAA;AAC3C,MAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,eAAA,EAAkB,CAAC,aAAa,KAAK,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAGA,SAAS,gBAAA,CAAiB,KAAiB,OAAA,EAAiF;AAC1H,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,OAAM,EAAG,IAAA,EAAM,CAAC,IAAA,KAAS,GAAA,CAAI,KAAK,IAAI,CAAA,EAAG,SAAS,CAAC,IAAA,KAAS,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,EAAE;AAC7G;AAGA,SAAS,SAAA,GAAoB;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA;AACR,EAAA,MAAM,QAAA,GAAW,sCAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AACtF,EAAA,OAAO,CAAA;AACT;AAGA,eAAe,aAAA,CAAc,IAAA,EAAc,MAAA,EAAoB,QAAA,EAAkD;AAC/G,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,iCAA4B,CAAA;AACxD,IAAA,MAAM,UAAU,MAAM,YAAA,CAAa,EAAE,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAC5D,IAAA,EAAA,CAAG,KAAK,sBAAsB,CAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,MAAM,iBAAA,CAAkB,QAAA,EAAU,EAAE,OAAA,EAAS,WAAA,EAAa,cAAA,EAAe,EAAG,CAAA;AAC9F,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,SAAA,EAAW;AACrD,MAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAA;AACrD,MAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,SAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,CAAA,YAAa,iBAAiB,OAAO,IAAA;AACzC,IAAA,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA,CAAO,0BAA2B,CAAA,CAAY,OAAO,EAAE,CAAC,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,SAAS,UAAU,IAAA,EAAoB;AACrC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,sCAAsC,CAAC,CAAA;AAClD,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,0CAA0C,CAAC,CAAA;AACvD,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,CAAE,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,eAAA,EAAe,CAAA,CAAE,QAAQ,CAAA,2BAAA,EAAsB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC3H;AAQA,eAAsB,UAAU,MAAA,EAgCP;AACvB,EAAA,MAAM,EAAE,UAAS,GAAI,MAAA;AACrB,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAA6C;AAClE,IAAA,IAAI,MAAA,CAAO,MAAM,OAAO,IAAA;AACxB,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,MAAA;AACH,QAAA,GAAA,CAAI,OAAO,IAAI,CAAA;AACf,QAAA,OAAO,SAAS,OAAA,CAAQ,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAI,KAAK,IAAI,CAAA;AAAA,MAC/D,KAAK,QAAA;AACH,QAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,QAAA,CAAA,EAAY,IAAI,CAAA;AAAA,MAChF,KAAK,QAAA;AACH,QAAA,OAAO,SAAS,OAAA,CAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,KAAK,KAAK,CAAA;AAAA,MACzD,KAAK,KAAA;AACH,QAAA,OAAO,SAAS,OAAA,CAAQ,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,OAAO,KAAK,CAAA;AAAA,MAC7D,KAAK,MAAA;AACH,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MAClF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,CAAA,GAAI,OAAO,KAAA,CAAM,MAAA;AACvB,QAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,UAAA,IAAI,CAAA,CAAE,IAAA,EAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAAA,mBACb,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,QAC9B;AACA,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAClB,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,IAAI,CAAA;AACZ,QAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAA,EAAM,CAAA,GAAI,CAAC,CAAA,MAAA,CAAA,GAAW,EAAA;AAC3C,QAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,eAAA,EAAkB,CAAC,aAAa,KAAK,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAChF;AAAA;AACF,EACF,CAAA;AAIA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,IAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AAC3B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,MAAA,IAAI,CAAA,CAAE,KAAK,IAAA,EAAK,OAAQ,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,CAAA,SAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe;AACnC,MAAA,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,CAAM,SAAI,CAAA,GAAI,EAAE,CAAA,EAAG,EAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,0BAAA,EAA0B,CAAA,CAAE,aAAa,+BAA+B,CAAC,CAAA;AAAA,IACtF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,YAAO,CAAA,CAAE,OAAO,CAAA,OAAA,CAAS,CAAA,GAAI,EAAE,MAAA,CAAO,CAAA,SAAA,EAAO,CAAA,CAAE,OAAO,2CAAsC,CAAC,CAAA;AAAA,IACvH,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,KAAA,CAAM,qCAAgC,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,uEAA6D,CAAC,CAAA;AAC/H,MAAA,IAAI,CAAC,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,OAAA,CAAQ,MAAK,EAAG;AAC7B,QAAA,KAAA,MAAW,QAAQ,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,OAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,EAAO,IAAI,EAAE,CAAC,CAAA;AAAA,MACjF;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,OAAA,EAAO,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,eAAA,EAAiB;AACrC,MAAA,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,8BAAA,EAA8B,CAAA,CAAE,QAAQ,CAAA,WAAA,EAAc,CAAA,CAAE,KAAK,CAAA,OAAA,CAAS,CAAC,CAAA;AAAA,IACpF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,EAAE,GAAA,CAAI,CAAA,yBAAA,EAAsB,CAAA,CAAE,OAAA,CAAQ,QAAQ,MAAM,CAAA,cAAA,EAAc,CAAA,CAAE,OAAA,CAAQ,gBAAgB,CAAA,uBAAA,EAAuB,CAAA,CAAE,OAAA,CAAQ,cAAc,SAAS,CAAC,CAAA;AAAA,IAC5J,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,iBAAA,EAAmB;AACvC,MAAA,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA,4BAAA,EAAyB,CAAA,CAAE,QAAQ,UAAA,CAAW,IAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,WAAW,OAAA,GAAU,CAAA,MAAA,EAAM,EAAE,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,CAAA,GAAK,EAAE,EAAE,CAAC,CAAA;AAAA,IAChJ,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW;AAC/B,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,CAAA,8BAAA,EAA2B,CAAA,CAAE,kBAAkB,CAAA,gBAAA,EAAgB,CAAA,CAAE,iBAAiB,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,aAAA,GAAa,EAAE,EAAE,CAAC,CAAA;AAAA,IAC/H;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS;AAAA,IAC5B,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,GAAA,EAAK,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,IAC5B,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,cAAc,MAAA,CAAO,YAAA;AAAA;AAAA,IAErB,eAAA,EAAiB,OAAO,eAAA,IAAmB,IAAA;AAAA,IAC3C,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA;AAAI,GACrB,CAAA;AACD,EAAA,WAAA,EAAY;AAEZ,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,EAAA,MAAQ,EAAE,IAAA,EAAM,GAAG,IAAA,EAAM,IAAA,EAAM,EAAA,CAAG,IAAA,GAAO,CAAC,CAAA;AAC7F,EAAA,IAAA,CAAK,EAAE,CAAA;AACP,EAAA,IAAA;AAAA,IACE,MAAA,CAAO,OAAA,KAAY,UAAA,GACf,CAAA,CAAE,KAAA,CAAM,UAAK,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA,GAC/B,MAAA,CAAO,OAAA,KAAY,cACjB,CAAA,CAAE,MAAA,CAAO,CAAA,iCAAA,EAA+B,MAAA,CAAO,OAAA,CAAQ,MAAM,mBAAmB,CAAA,GAChF,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,SAAS;AAAA,GAC9B;AACA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAA,GAAY,CAAA,MAAA,EAAM,OAAO,KAAA,CAAO,OAAA,EAAS,CAAA,CAAA,GAAK,EAAA;AAC5E,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,IAAU,OAAA,EAAS,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,CAAA,EAAA,EAAK,OAAO,CAAA,UAAA,EAAU,MAAA,CAAO,QAAA,CAAS,EAAE,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,QAAA,GAAW,cAAA,GAAiB,EAAE,CAAA,EAAG,SAAS,CAAA,CAAE,CAAC,CAAA;AAClL,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAuC;AACxD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,IAAA,CAAK,UAAU,CAAC,CAAA;AACtD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,EAAE,MAAA,GAAS,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GAAM,CAAC,CAAA,CAAE,CAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AAAA,EACzB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGA,SAAS,YAAY,IAAA,EAAgD;AACnE,EAAA,OAAO,CAAC,OAAA,KAAoB;AAC1B,IAAA,MAAM,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,GAAA,EAAK,MAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,IAAA,EAAS,SAAA,EAAW,EAAA,GAAK,IAAA,GAAO,MAAM,CAAA;AAC1H,IAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,MAAA,IAAU,EAAA,KAAO,IAAI,MAAA,GAAS;AAAA,EAAK,GAAA,CAAI,MAAM,CAAA,CAAA,GAAK,EAAA,CAAA;AACtE,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA,EAAE;AAAA,EAC7C,CAAA;AACF","file":"interactive-DB7IC3BL.js","sourcesContent":["/**\n * The `vg code` guided provider/model wizard (VG-CLI-CODE §8).\n *\n * Walks the developer from \"I want to code\" to a concrete (provider, model)\n * choice: run locally, or pick one of the current top hosted providers\n * (Claude / GPT / Grok / Gemini / …) surfaced live from the model catalog — with\n * an \"enter a slug myself\" escape hatch at every step. Pure over an injected\n * {@link Prompter} + catalog + local fleet, so the whole decision tree is\n * unit-tested with a scripted prompter and no network or TTY.\n */\n\nimport type { Prompter } from './ui.js';\nimport type { Catalog } from './catalog.js';\nimport { topProviders } from './catalog.js';\nimport type { LocalModel } from '../engine/models.js';\n\nexport interface WizardResult {\n kind: 'hosted' | 'local';\n /** The router `--provider` value: `openrouter` for hosted picks, `ollama` for local. */\n provider: 'openrouter' | 'ollama';\n /** The concrete model slug/tag to run. */\n model: string;\n /** The display provider for per-model savings attribution (e.g. `anthropic`, `ollama`). */\n providerSlug: string;\n /** For a local model not yet present on the machine → pull it first. */\n needsPull?: boolean;\n}\n\nconst ENTER_SLUG = '__enter_slug__';\nconst LOCAL = '__local__';\nconst BROWSE = '__browse__';\n\nexport interface WizardDeps {\n catalog: Catalog;\n localModels: LocalModel[];\n topN?: number;\n}\n\n/** Run the guided selection and return the resolved provider + model. */\nexport async function runProviderWizard(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const providers = topProviders(deps.catalog, deps.topN ?? 6);\n\n // Screen 1 — where should the model run?\n const choice = await prompter.select<string>('Where should the model run?', [\n { label: 'Local model (on your machine)', value: LOCAL, hint: deps.localModels.length ? `${deps.localModels.length} found` : 'nothing installed yet' },\n ...providers.map((p) => ({ label: p.label, value: p.id, hint: 'via OpenRouter' })),\n { label: 'Enter a provider or model slug myself', value: ENTER_SLUG },\n ]);\n\n if (choice === LOCAL) return pickLocal(prompter, deps);\n if (choice === ENTER_SLUG) {\n const slug = (await prompter.input('Model slug (e.g. anthropic/claude-3.5-sonnet, or a provider like openai)')).trim();\n // A full `provider/model` slug is a hosted pick; a bare provider name → show its models.\n if (slug.includes('/')) return { kind: 'hosted', provider: 'openrouter', model: slug, providerSlug: slug.split('/')[0] };\n const group = deps.catalog.providers.find((p) => p.id === slug);\n if (group && group.models.length) return pickHostedModel(prompter, group.id, group.models);\n // Unknown provider → let them type the full model slug.\n const model = (await prompter.input(`Model id for \"${slug}\"`)).trim();\n return { kind: 'hosted', provider: 'openrouter', model: model || slug, providerSlug: slug };\n }\n\n // A hosted provider was chosen → pick one of its models.\n const group = providers.find((p) => p.id === choice)!;\n return pickHostedModel(prompter, group.id, group.models);\n}\n\nasync function pickHostedModel(prompter: Prompter, providerSlug: string, models: Catalog['providers'][number]['models']) {\n if (models.length === 0) {\n const model = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n }\n const model = await prompter.select<string>('Choose a model', [\n ...models.slice(0, 12).map((m) => ({ label: m.name, value: m.id, hint: modelHint(m.contextLength, m.promptPricePerM) })),\n { label: 'Enter a model slug myself', value: ENTER_SLUG },\n ]);\n if (model === ENTER_SLUG) {\n const typed = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model: typed, providerSlug };\n }\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n}\n\nasync function pickLocal(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const installed = deps.localModels.filter((m) => m.runtime === 'ollama');\n const choices = [\n ...installed.map((m) => ({ label: m.name, value: m.name, hint: 'installed' })),\n { label: 'Browse coding models to pull (Ollama)', value: BROWSE },\n { label: 'Enter a model name to pull', value: ENTER_SLUG },\n ];\n const picked = await prompter.select<string>('Local model', choices);\n\n if (picked === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n if (picked === BROWSE) {\n // Suggest coding models from the catalog, mapped to a likely Ollama tag.\n const coding = deps.catalog.providers\n .flatMap((p) => p.models)\n .filter((m) => /cod(e|er|ing)/i.test(m.id))\n .slice(0, 10);\n if (coding.length === 0) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n const slug = await prompter.select<string>('Coding model to pull', [\n ...coding.map((m) => ({ label: m.name, value: toOllamaTag(m.id), hint: m.id })),\n { label: 'Enter a model name myself', value: ENTER_SLUG },\n ]);\n if (slug === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n return { kind: 'local', provider: 'ollama', model: slug, providerSlug: 'ollama', needsPull: true };\n }\n // An already-installed model — no pull needed.\n return { kind: 'local', provider: 'ollama', model: picked, providerSlug: 'ollama', needsPull: false };\n}\n\n/** Best-effort map an OpenRouter slug to a likely Ollama tag (`qwen/qwen-2.5-coder-7b` → `qwen2.5-coder:7b`). */\nexport function toOllamaTag(slug: string): string {\n const tail = slug.split('/').pop() ?? slug;\n const size = tail.match(/(\\d+(?:\\.\\d+)?)b\\b/i);\n const base = tail\n .replace(/-instruct\\b/i, '')\n .replace(/(\\d+(?:\\.\\d+)?)b\\b/i, '')\n .replace(/[-.]+$/g, '')\n .replace(/\\s+/g, '-');\n return size ? `${base}:${size[1]}b` : base;\n}\n\nfunction modelHint(contextLength?: number, pricePerM?: number): string {\n const parts: string[] = [];\n if (contextLength) parts.push(`${Math.round(contextLength / 1000)}k ctx`);\n if (typeof pricePerM === 'number') parts.push(pricePerM === 0 ? 'free' : `$${pricePerM}/M in`);\n return parts.join(' · ');\n}\n","/**\n * Live cost / token metering for VG Code (VG-CLI-CODE §15).\n *\n * A session meter accumulates the prompt/completion tokens providers report and\n * turns them into a running dollar estimate from the model's published price\n * (per-million, from the catalog). Local models are free, so cost is 0 and only\n * tokens are shown. Pure and unit-tested; the estimate is labelled as such.\n */\n\nexport interface TokenUsage {\n promptTokens?: number;\n completionTokens?: number;\n}\n\n/** USD per 1M tokens for the active model (from the catalog); absent for local/free. */\nexport interface ModelPricing {\n promptPerM?: number;\n completionPerM?: number;\n}\n\n/** Dollar cost of one usage sample under a pricing table (0 when unpriced/free). */\nexport function costOf(usage: TokenUsage, pricing: ModelPricing): number {\n const inCost = ((usage.promptTokens ?? 0) / 1e6) * (pricing.promptPerM ?? 0);\n const outCost = ((usage.completionTokens ?? 0) / 1e6) * (pricing.completionPerM ?? 0);\n return round4(inCost + outCost);\n}\n\n/** Accumulates usage + cost across a coding session. */\nexport class SessionMeter {\n private prompt = 0;\n private completion = 0;\n private cost = 0;\n private turns = 0;\n\n constructor(private pricing: ModelPricing = {}) {}\n\n /** Update the pricing (e.g. after `/model` switches model mid-session). */\n setPricing(pricing: ModelPricing): void {\n this.pricing = pricing;\n }\n\n /** Record one model turn; returns the incremental cost of just this turn. */\n add(usage: TokenUsage): number {\n this.prompt += usage.promptTokens ?? 0;\n this.completion += usage.completionTokens ?? 0;\n this.turns += 1;\n const delta = costOf(usage, this.pricing);\n this.cost = round4(this.cost + delta);\n return delta;\n }\n\n get totals(): { promptTokens: number; completionTokens: number; totalTokens: number; cost: number; turns: number } {\n return { promptTokens: this.prompt, completionTokens: this.completion, totalTokens: this.prompt + this.completion, cost: this.cost, turns: this.turns };\n }\n\n /** A compact one-line summary, e.g. `3.1k tok · ~$0.0042` (cost only when priced). */\n summary(): string {\n const t = this.totals;\n const tok = `${fmtTokens(t.totalTokens)} tok`;\n const priced = this.pricing.promptPerM || this.pricing.completionPerM;\n return priced ? `${tok} · ~$${t.cost.toFixed(4)}` : tok;\n }\n}\n\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction round4(x: number): number {\n return Math.round(x * 1e4) / 1e4;\n}\n","/**\n * Project federation bridge edges into capsule pinned facts (Fusion Phase 6).\n *\n * High-confidence bridges become short, secret-free facts the model can see\n * without opening every workspace root. Pure over {@link BridgeEdge}.\n */\n\nimport type { BridgeEdge } from './bridge-edges.js';\n\n/**\n * Turn bridge edges into pinned-fact lines for Task Capsules.\n * Default minConfidence 0.8 keeps only workspace/package-strong links\n * (interface bridges sit ~0.68–0.75 and stay out unless lowered).\n */\nexport function bridgePinnedFacts(\n bridges: BridgeEdge[] | undefined | null,\n options: { minConfidence?: number; maxFacts?: number } = {},\n): string[] {\n if (!bridges?.length) return [];\n const min = options.minConfidence ?? 0.8;\n const max = options.maxFacts ?? 12;\n return bridges\n .filter((b) => b.confidence >= min)\n .map((b) => {\n const from = shortLabel(b.fromRoot);\n const to = shortLabel(b.toRoot);\n const via = b.packageName ? ` package ${b.packageName}` : '';\n return `bridge ${b.kind}: ${from} → ${to}${via} (${b.confidence.toFixed(2)})`;\n })\n .sort((a, b) => a.localeCompare(b))\n .slice(0, max);\n}\n\nfunction shortLabel(root: string): string {\n const parts = root.replace(/\\\\/g, '/').split('/').filter(Boolean);\n return parts[parts.length - 1] || root;\n}\n","/**\n * The `vg code` guided, interactive mode (VG-CLI-CODE §8–§11).\n *\n * Running bare `vg code` at a terminal enters this flow: show the VG Code\n * banner, make sure the code map is built (behind a spinner, no map banner),\n * walk the developer through choosing a provider + model (local or a top hosted\n * provider), run a memory pre-flight before pulling any local model, then drop\n * into a coding REPL that proposes a diff per instruction and writes only what\n * the developer approves.\n *\n * The decision logic (catalog grouping, wizard tree, capability assessment) is\n * pure and unit-tested elsewhere; this module is the I/O shell that wires those\n * pieces to the terminal, the graph build, and the model runtime.\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { resolveGraphPath } from '../engine/artifacts.js';\nimport { BranchGraphSession } from '../runtime/branch-graph-session.js';\nimport { discoverModels } from '../engine/models.js';\nimport { ensureCodeMap } from './ensure-map.js';\nimport { printCodeLogo } from '../util/logo.js';\nimport { c, info, out } from '../util/output.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport { fetchCatalog } from './catalog.js';\nimport { runProviderWizard, type WizardResult } from './wizard.js';\nimport { TtyPrompter, PromptCancelled, type Prompter } from './ui.js';\nimport { estimateModelBytes, assessCapability, fmt } from './capability.js';\nimport { gatherSystemMemory, hasOllama, stopModel, pullModelClean } from './local-runtime.js';\nimport { spawnSync } from 'node:child_process';\nimport { resolveProviders } from './router.js';\nimport { nodeCodeFs, undoChanges } from './session.js';\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport { readModelSavings } from '../engine/savings.js';\nimport { SessionMeter } from './cost.js';\nimport { McpToolset, defaultMcpConnect, type McpConnect } from './mcp-tools.js';\nimport { condenseSession, loadLatestSession, saveSession, summarizeSession, newSession, recordTask, type StoredSession } from './session-store.js';\nimport type { McpServerConfig } from './config.js';\nimport type { MutatingAction, ShellResult } from './tools.js';\nimport type { FileChange, Provider } from './types.js';\nimport { startCodeRuntimeSession } from './runtime-session.js';\nimport { loadOrDiscoverFederation } from '../runtime/federation.js';\nimport { bridgePinnedFacts } from '../runtime/bridge-facts.js';\nimport { resolveExecutionEnv, type SecurityTier } from '../runtime/execution-env.js';\nimport {\n mergeModelExecutionProfile,\n resolveModelExecutionProfile,\n type ModelExecutionProfile,\n} from '../runtime/model-execution-profile.js';\nimport { vgdIsRunning, vgdRequest } from '../runtime/vgd/index.js';\nimport { resolveGraphBackend } from './graph-backend.js';\nimport { summarizeDiffs } from './diff.js';\n\nexport interface InteractiveOptions {\n provider?: string;\n model?: string;\n modelPath?: string;\n budget?: string;\n file?: string[];\n /** Auto-approve edits and commands (autonomous). */\n auto?: boolean;\n /** Cap on agent steps per instruction. */\n maxSteps?: number;\n /** Extra command-denylist rules for autonomous mode (from config). */\n denyCommands?: string[];\n /** Project test/verify command surfaced to the agent (from config). */\n testCommand?: string;\n /** Transcript compaction budget in tokens (from config / model window). */\n contextBudget?: number;\n /** Stream assistant tokens live. */\n stream?: boolean;\n /** Auto-verify: run the test command after the agent finishes and fix failures. */\n verify?: { command: string; maxRounds?: number };\n /** External MCP servers whose tools the agent may call. */\n mcpServers?: Record<string, McpServerConfig>;\n /** Which config files the MCP servers came from (for a transparent note). */\n mcpSources?: string[];\n /** Resume the most recent session (inject a recap, restore /undo). */\n continueSession?: boolean;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n /**\n * Security ladder tier for shell (ADR-002). When omitted: L1 under `--auto`,\n * otherwise L0. Explicit value always wins.\n */\n securityTier?: SecurityTier;\n /** Optional Model Execution Profile overrides from code.json. */\n modelProfile?: Partial<ModelExecutionProfile>;\n /** Injectable MCP connect (tests). */\n mcpConnect?: McpConnect;\n}\n\n/** Entry point for guided `vg code` (no instruction, at a TTY). */\nexport async function runInteractive(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter = new TtyPrompter()): Promise<void> {\n printCodeLogo(root);\n try {\n await ensureMap(root, global, prompter);\n const selection = await chooseModel(root, global, opts, prompter);\n if (!selection) return; // aborted (e.g. can't run a local model)\n await codingRepl(root, global, opts, selection, prompter);\n } catch (e) {\n if (e instanceof PromptCancelled) {\n info(c.dim('\\n cancelled — no changes were made'));\n return;\n }\n throw e;\n }\n}\n\n/** Build the code map if missing, or refresh it if the tree drifted — behind a spinner, no map banner. */\nasync function ensureMap(root: string, global: GlobalOpts, prompter: Prompter): Promise<void> {\n const existing = loadGraph(root, global.graph);\n if (!existing) {\n const sp = prompter.spinner('Building the code map…');\n try {\n await ensureCodeMap(root, global);\n sp.stop('Code map built');\n } catch (e) {\n sp.fail(`couldn't build the code map: ${(e as Error).message}`);\n throw e;\n }\n return;\n }\n const sp = prompter.spinner('Checking the code map is up to date…');\n const graphPath = resolveGraphPath(root);\n const refreshed = await refreshIfStale(root, { graphPath }).catch(() => null);\n if (refreshed?.status === 'refreshed') sp.stop('Code map refreshed');\n else sp.stop('Code map ready');\n}\n\n/** Resolve the provider/model — from flags if given, else via the guided wizard. */\nasync function chooseModel(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter): Promise<WizardResult | null> {\n // Explicit flags skip the wizard entirely.\n if (opts.provider && (opts.model || opts.modelPath)) {\n const local = opts.provider === 'ollama' || opts.provider === 'lmstudio' || opts.provider === 'llama-cpp' || !!global.local;\n return { kind: local ? 'local' : 'hosted', provider: opts.provider === 'ollama' ? 'ollama' : 'openrouter', model: opts.model ?? opts.modelPath ?? '', providerSlug: opts.provider, needsPull: false };\n }\n\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop(catalog.source === 'network' ? 'Model catalog loaded' : catalog.source === 'cache' ? 'Model catalog (cached)' : 'Model catalog (offline list)');\n const localModels = discoverModels();\n\n const selection = await runProviderWizard(prompter, { catalog, localModels });\n\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n if (selection.kind === 'hosted' && !process.env.OPENROUTER_API_KEY) {\n prompter.note(c.yellow('Set OPENROUTER_API_KEY in your environment to use this hosted model (keys are never passed as flags).'));\n }\n return selection;\n}\n\n/** Memory pre-flight, then a clean, wrapped `ollama pull`. Returns false if we shouldn't proceed. */\nasync function preflightAndPull(selection: WizardResult, prompter: Prompter): Promise<boolean> {\n if (!hasOllama()) {\n prompter.note(c.yellow('Ollama isn’t installed — get it from https://ollama.com, then re-run. (We never install a runtime for you.)'));\n return false;\n }\n const estimate = estimateModelBytes(selection.model);\n const report = assessCapability(estimate, gatherSystemMemory());\n\n prompter.note(`${c.bold(selection.model)} — estimated ${fmt(estimate.bytes)}${estimate.guessed ? c.dim(' (size guessed)') : ''}; ~${fmt(report.availableBytes)} free now`);\n for (const s of report.suggestions) prompter.note(c.dim(`· ${s}`));\n\n if (!report.canRun) {\n prompter.note(c.red('This machine doesn’t have enough memory for that model — not pulling it. Pick a smaller model or a lower quant.'));\n return false;\n }\n if (report.needsUnload) {\n const biggest = [...report.loaded].sort((a, b) => b.bytes - a.bytes)[0];\n if (biggest && (await prompter.confirm(`Unload ${biggest.name} to free ~${fmt(biggest.bytes)}?`, true))) {\n stopModel(biggest.name);\n }\n }\n if (!(await prompter.confirm(`Pull ${selection.model} (~${fmt(estimate.bytes)})?`, true))) return false;\n\n const sp = prompter.spinner(`Pulling ${selection.model}…`);\n const ok = await pullModelClean(selection.model, sp);\n if (ok) sp.stop(`Pulled ${selection.model}`);\n else sp.fail(`couldn’t pull ${selection.model}`);\n return ok;\n}\n\n/** The coding REPL: a graph-grounded agent per task, plus slash-commands (/help, /undo, …). */\nasync function codingRepl(root: string, global: GlobalOpts, opts: InteractiveOptions, selection: WizardResult, prompter: Prompter): Promise<void> {\n let sel = selection;\n let route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true, // interactive selection is consent for manager runtime deps\n });\n try {\n const { ensureManagerRuntime } = await import('../runtime/model-manager.js');\n const ensure = await ensureManagerRuntime({\n providerId: route.providers[0]?.id ?? sel.provider,\n model: route.providers[0]?.model ?? sel.model,\n offline: !!global.local,\n consent: true,\n });\n if (!ensure.ok) prompter.note(c.yellow(ensure.error ?? 'model manager not ready'));\n else if (ensure.installed.length || ensure.pulled.length) {\n for (const s of ensure.installed) prompter.note(c.dim(`installed ${s}`));\n for (const s of ensure.pulled) prompter.note(c.dim(`pulled ${s}`));\n }\n prompter.note(c.dim(`manager ${route.managerLine}`));\n } catch {\n /* non-fatal — route still usable */\n }\n const fsImpl = nodeCodeFs(root);\n const meter = new SessionMeter();\n let lastChanges: FileChange[] = [];\n\n // Resume the most recent session (recap for the model + restore /undo).\n let store: StoredSession = newSession(sessionId(), sel.providerSlug, sel.model, Date.now());\n let priorSummary: string | undefined;\n if (opts.continueSession) {\n const prev = loadLatestSession(root);\n if (prev) {\n store = prev;\n lastChanges = prev.lastChanges ?? [];\n priorSummary = summarizeSession(prev);\n prompter.note(c.dim(`resumed session — ${prev.tasks.length} earlier task(s); /undo restores the last change`));\n } else prompter.note(c.dim('no previous session to continue'));\n }\n\n // Live graph holder: filled each turn; MCP builtins always read the current map.\n const graphHolder: { current: import('../schema.js').VgGraph | null } = { current: null };\n\n // Always expose local `vg serve` MCP tools; merge any project-configured servers.\n const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge.js');\n const vgBuiltin = createVgBuiltinMcpTools({\n getGraph: () => {\n if (!graphHolder.current) throw new Error('graph not loaded yet');\n return graphHolder.current;\n },\n root,\n local: global.local === true,\n });\n let mcp: McpToolset | undefined;\n if (opts.mcpServers && Object.keys(opts.mcpServers).length) {\n const sp = prompter.spinner('Connecting MCP tools…');\n const { toolset, warnings } = await McpToolset.connect(opts.mcpServers, opts.mcpConnect ?? defaultMcpConnect);\n mcp = toolset;\n const from = opts.mcpSources?.length ? ` (from ${opts.mcpSources.join(', ')})` : '';\n sp.stop(\n `MCP tools: ${toolset.specs().length} project + ${vgBuiltin.specs.length} local vg` +\n ` (${Object.keys(opts.mcpServers).length} server(s)${from})`,\n );\n for (const w of warnings) prompter.note(c.yellow(` ${w}`));\n } else {\n prompter.note(c.dim(`MCP · ${vgBuiltin.specs.length} local vg tools (mcp__vibgrate__*) always available`));\n }\n const externalToolsMerged = mergeExternalToolsets(\n vgBuiltin,\n mcp ? mcpExternalTools(mcp, agentApprove(opts, prompter)) : undefined,\n );\n\n // Fusion Runtime: attach to (or own) a local vgd session instead of spawning\n // `vg serve` as GraphProcess. Failure degrades to in-process graph only.\n const runtime = await startCodeRuntimeSession({ root });\n // Multi-branch ActiveGraph: warm maps per gitRef; ensureCurrent on each turn\n // so `git checkout` mid-session switches the tool-visible graph (plan §4.1.1).\n const branchGraphs = new BranchGraphSession({ root, graphPath: global.graph });\n // Federated workspaces: if `.vibgrate/federation.json` exists and a daemon is\n // reachable, register every member so multi-repo graphs share one vgd session.\n const federation = loadOrDiscoverFederation(root);\n const extraPinnedFacts = bridgePinnedFacts(federation.bridges);\n if (federation.members.length > 1 && (await vgdIsRunning({ socketPath: runtime.socketPath }))) {\n try {\n await vgdRequest(\n {\n op: 'register-federation',\n primaryRoot: federation.primaryRoot,\n members: federation.members.map((m) => ({ root: m.root, label: m.label, role: m.role })),\n },\n { socketPath: runtime.socketPath },\n );\n const bridgeN = federation.bridges?.length ?? 0;\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} workspace(s) registered with vgd` +\n (bridgeN ? ` · ${bridgeN} bridge edge(s)` : ''),\n ),\n );\n } catch {\n /* federation registration is best-effort */\n }\n } else if ((federation.bridges?.length ?? 0) > 0) {\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} member(s) · ${federation.bridges!.length} bridge edge(s) (discovery)`,\n ),\n );\n }\n\n // Model Execution Profile: provider/model heuristics + code.json overrides.\n let modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier: opts.securityTier,\n }),\n opts.modelProfile,\n );\n\n // Security ladder (ADR-002): explicit flag > MEP > --auto → L1 > L0.\n // Writable roots include every federation member so multi-root sessions can\n // write into sibling workspace folders under L1/L2 isolation.\n const securityTier: SecurityTier =\n opts.securityTier ?? modelProfile.securityTier ?? (opts.auto ? 'L1' : 'L0');\n const writableRoots = federation?.members.map((m) => m.root) ?? [root];\n const executionEnv = resolveExecutionEnv(securityTier, { writableRoots });\n\n const cleanup = (): void => {\n void runtime.dispose();\n void mcp?.dispose();\n };\n process.once('SIGINT', cleanup);\n\n const autoNote = opts.auto ? c.yellow(' · auto-approve ON') : '';\n const runtimeNote = runtime.kind !== 'none' ? c.dim(` · ${runtime.label}`) : '';\n const securityNote = c.dim(` · ${executionEnv.tier}/${executionEnv.label}`);\n const mepNote = c.dim(` · mep ${modelProfile.mode}`);\n prompter.intro(`Ready — ${sel.providerSlug}/${sel.model}${runtimeNote}${securityNote}${mepNote}${autoNote}. Describe a task, or /help. Empty line to exit.`);\n\n try {\n for (;;) {\n const line = (await prompter.input('code ›')).trim();\n if (!line || /^(exit|quit)$/i.test(line) || line === '/exit' || line === '/quit') break;\n\n if (line.startsWith('/')) {\n const [cmd] = line.slice(1).split(/\\s+/);\n if (cmd === 'help') {\n prompter.note('commands: /undo /diff /model /cost /compact /clear /exit');\n } else if (cmd === 'undo') {\n if (lastChanges.length === 0) prompter.note(c.dim('nothing to undo'));\n else {\n const restored = undoChanges(lastChanges, fsImpl);\n prompter.note(c.green(`↩ reverted ${restored.length} file(s): ${restored.join(', ')}`));\n lastChanges = [];\n store = { ...store, lastChanges: [] };\n saveSession(root, store);\n }\n } else if (cmd === 'diff') {\n if (lastChanges.length === 0) prompter.note(c.dim('no recent change'));\n else for (const ch of lastChanges) if (ch.diff) out(ch.diff);\n } else if (cmd === 'model') {\n const swapped = await reselectModel(root, global, prompter);\n if (swapped) {\n sel = swapped;\n route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true,\n });\n prompter.note(c.green(`now using ${sel.providerSlug}/${sel.model}`));\n }\n } else if (cmd === 'cost') {\n prompter.note(`this session: ${meter.summary()}`);\n printCost(root);\n } else if (cmd === 'compact') {\n if (store.tasks.length <= 1) prompter.note(c.dim('nothing to compact yet'));\n else {\n const before = store.tasks.length;\n store = condenseSession(store, Date.now());\n saveSession(root, store);\n priorSummary = summarizeSession(store) || undefined;\n prompter.note(c.green(`compacted ${before} task(s) into one checkpoint — future turns carry the short recap`));\n }\n } else if (cmd === 'clear') {\n prompter.note(c.dim('each task already starts fresh — nothing to clear'));\n } else {\n prompter.note(c.yellow(`unknown command /${cmd} — try /help`));\n }\n continue;\n }\n\n const branchLoad = branchGraphs.ensureCurrent();\n const graph = branchLoad.graph;\n graphHolder.current = graph;\n if (!graph) {\n prompter.note(c.red('the code map disappeared — run `vg` to rebuild'));\n break;\n }\n if (branchLoad.switched) {\n prompter.note(\n c.dim(\n `branch · ${branchLoad.gitRef}${branchLoad.fromCache ? ' (warm cache)' : ' (loaded map)'}`,\n ),\n );\n }\n // Share warm slot with a running vgd (local process or long-lived daemon).\n if (runtime.socketPath && graph && branchLoad.gitRef && branchLoad.gitRef !== 'unknown') {\n void vgdRequest(\n {\n op: 'put-graph',\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef,\n graph,\n },\n { socketPath: runtime.socketPath },\n ).catch(() => {\n /* best-effort IPC */\n });\n }\n // Prefer vgd ActiveGraph for search/impact when the daemon holds this slot.\n const graphBackend = resolveGraphBackend({\n graph,\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef !== 'unknown' ? branchLoad.gitRef : null,\n socketPath: runtime.socketPath,\n });\n // Refresh MEP if the user swapped models mid-session.\n modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier,\n }),\n opts.modelProfile,\n );\n const result = await agentTask({\n root,\n graph,\n instruction: line,\n providers: route.providers,\n fsImpl,\n attribution: { client: 'vg-code', provider: sel.providerSlug, model: sel.model },\n auto: !!opts.auto,\n maxSteps: opts.maxSteps,\n budget: modelProfile.capsuleBudgetTokens,\n denyCommands: opts.denyCommands,\n testCommand: opts.testCommand,\n contextBudget: opts.contextBudget,\n stream: opts.stream,\n verify: opts.verify\n ? { ...opts.verify, maxRounds: opts.verify.maxRounds ?? modelProfile.maxRepairRounds }\n : undefined,\n priorSummary,\n // Conversation carry-over for capsule seed ranking: the previous\n // task's instruction keeps follow-up asks anchored to the topic.\n priorInstruction: store.tasks.at(-1)?.instruction,\n externalTools: externalToolsMerged,\n meter,\n prompter,\n capsule: opts.capsule,\n executionEnv,\n graphBackend,\n modelProfile,\n extraPinnedFacts,\n llmCompaction: true,\n });\n priorSummary = undefined; // recap only seeds the first task after --continue\n if (result.changes.length) {\n lastChanges = result.changes;\n prompter.note(c.dim(' /undo to revert · /diff to review'));\n }\n // Persist the session after each task so --continue and /undo survive a restart.\n store = recordTask(store, { instruction: line, summary: result.finalText, changes: result.changes, stopped: result.stopped }, Date.now());\n saveSession(root, store);\n }\n } finally {\n cleanup();\n process.removeListener('SIGINT', cleanup);\n }\n prompter.outro('Done.');\n}\n\n/** Approval gate closure for MCP tools (mirrors agentTask's gate). */\nfunction agentApprove(opts: InteractiveOptions, prompter: Prompter): (a: MutatingAction) => Promise<boolean> {\n return async (action) => {\n if (opts.auto) return true;\n if (action.kind === 'tool') return prompter.confirm(`Call ${action.name}?`, false);\n if (action.kind === 'patch') {\n const n = action.files.length;\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n return true;\n };\n}\n\n/** Bind an McpToolset to the agent's externalTools shape. */\nfunction mcpExternalTools(mcp: McpToolset, approve: (a: MutatingAction) => Promise<boolean>): AgentOptions['externalTools'] {\n return { specs: mcp.specs(), owns: (name) => mcp.owns(name), execute: (call) => mcp.execute(call, approve) };\n}\n\n/** A time-free-ish session id (runtime randomness is fine — not a graph artifact). */\nfunction sessionId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 10; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n\n/** Re-run the provider/model wizard mid-session (the `/model` command). */\nasync function reselectModel(root: string, global: GlobalOpts, prompter: Prompter): Promise<WizardResult | null> {\n try {\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop('Model catalog loaded');\n const selection = await runProviderWizard(prompter, { catalog, localModels: discoverModels() });\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n return selection;\n } catch (e) {\n if (e instanceof PromptCancelled) return null;\n prompter.note(c.yellow(`couldn't switch model: ${(e as Error).message}`));\n return null;\n }\n}\n\n/** Print the local per-model savings for `/cost`. */\nfunction printCost(root: string): void {\n const now = Date.now();\n const models = readModelSavings(root, 30, now);\n if (models.length === 0) {\n info(c.dim(' no usage recorded yet this session'));\n return;\n }\n info(c.bold(' savings by model (last 30 days, local)'));\n for (const m of models) info(` ${m.key.padEnd(32)} ${m.queries} call(s) · ~${m.vgTokens} tokens · saved ≈ $${m.saved}`);\n}\n\n/**\n * Run one agentic task and render it to the terminal. Shared by the guided REPL\n * and the one-shot command. Read-only tools stream as dim status lines; each\n * mutating tool (edit / create / delete / run) is gated — auto-approved under\n * `--auto`, otherwise confirmed by the developer (with the diff or command shown).\n */\nexport async function agentTask(params: {\n root: string;\n graph: import('../schema.js').VgGraph;\n instruction: string;\n providers: Provider[];\n fsImpl: ReturnType<typeof nodeCodeFs>;\n attribution: { client: string; provider?: string; model?: string };\n auto: boolean;\n maxSteps?: number;\n budget?: number;\n contextBudget?: number;\n denyCommands?: string[];\n testCommand?: string;\n stream?: boolean;\n verify?: { command: string; maxRounds?: number };\n priorSummary?: string;\n priorInstruction?: string;\n externalTools?: AgentOptions['externalTools'];\n meter?: SessionMeter;\n prompter?: Prompter;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n files?: string[];\n /** Security ladder substrate (ADR-002). */\n executionEnv?: AgentOptions['executionEnv'];\n graphBackend?: AgentOptions['graphBackend'];\n modelProfile?: AgentOptions['modelProfile'];\n advancedMode?: boolean;\n worktreeOverlay?: boolean;\n extraPinnedFacts?: string[];\n /** Model-written checkpoint summaries on compaction (real-model hosts). */\n llmCompaction?: boolean;\n}): Promise<AgentResult> {\n const { prompter } = params;\n const approve = async (action: MutatingAction): Promise<boolean> => {\n if (params.auto) return true;\n if (!prompter) return false; // non-interactive without --auto: refuse mutations\n switch (action.kind) {\n case 'edit':\n out(action.diff);\n return prompter.confirm(`Apply edit to ${action.file}?`, true);\n case 'create':\n return prompter.confirm(`Create ${action.file} (${action.bytes} bytes)?`, true);\n case 'delete':\n return prompter.confirm(`Delete ${action.file}?`, false);\n case 'run':\n return prompter.confirm(`Run \\`${action.command}\\`?`, false);\n case 'tool':\n return prompter.confirm(`Call ${action.name}(${briefArgs(action.args)})?`, false);\n case 'patch': {\n const n = action.files.length;\n for (const f of action.files) {\n if (f.diff) out(f.diff);\n else out(`${f.op} ${f.file}`);\n }\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n }\n };\n\n // Event rendering, with live token streaming: raw tokens print inline; any\n // other event first closes the streamed line so the layout stays clean.\n let streaming = false;\n const closeStream = (): void => {\n if (streaming) {\n process.stderr.write('\\n');\n streaming = false;\n }\n };\n const onEvent = (e: AgentEvent): void => {\n if (e.type === 'token') {\n process.stderr.write(e.text);\n streaming = true;\n return;\n }\n closeStream();\n if (e.type === 'assistant') {\n if (e.text.trim()) info(e.text.trim());\n } else if (e.type === 'tool-call') {\n info(c.dim(` → ${e.name}(${briefArgs(e.args)})`));\n } else if (e.type === 'tool-result') {\n info(c.dim(` ${e.mutated ? c.green('✔ ') : ''}${e.content.split('\\n')[0].slice(0, 100)}`));\n } else if (e.type === 'compact') {\n info(c.dim(` · compacted context (${e.droppedRounds} earlier round(s) summarized)`));\n } else if (e.type === 'verify') {\n info(e.passed ? c.green(` ✔ ${e.command} passed`) : c.yellow(` ✗ ${e.command} failed — asking the model to fix it`));\n } else if (e.type === 'ladder') {\n info(e.ok ? c.green(' ✔ verification ladder passed') : c.yellow(' ✗ verification ladder failed — asking the model to fix it'));\n if (!e.ok && e.summary.trim()) {\n for (const line of e.summary.split('\\n').slice(0, 6)) info(c.dim(` ${line}`));\n }\n } else if (e.type === 'notice') {\n info(c.dim(` · ${e.text}`));\n } else if (e.type === 'session-graph') {\n info(c.dim(` · session graph updated (${e.reparsed} reparsed, ${e.dirty} dirty)`));\n } else if (e.type === 'capsule') {\n info(c.dim(` · Task Capsule · ${e.summary.primary.length} primary · ${e.summary.sourceSliceCount} source slice(s) · ~${e.summary.tokensEstimate} tokens`));\n } else if (e.type === 'failure-capsule') {\n info(c.yellow(` · Failure Capsule · ${e.capsule.failedStep.type}${e.capsule.failedStep.command ? ` · ${e.capsule.failedStep.command}` : ''}`));\n } else if (e.type === 'metrics') {\n const m = e.metrics;\n info(c.dim(` · metrics · discovery ${m.discoveryToolCalls} · mutations ${m.mutationToolCalls}${m.znsAt1 ? ' · ZNS@1' : ''}`));\n }\n };\n\n const result = await runAgent({\n graph: params.graph,\n root: params.root,\n instruction: params.instruction,\n providers: params.providers,\n fsImpl: params.fsImpl,\n run: shellRunner(params.root),\n executionEnv: params.executionEnv,\n graphBackend: params.graphBackend,\n modelProfile: params.modelProfile,\n advancedMode: params.advancedMode,\n // Interactive sessions always prefer a worktree-correct map unless disabled.\n worktreeOverlay: params.worktreeOverlay ?? true,\n extraPinnedFacts: params.extraPinnedFacts,\n approve,\n onEvent,\n attribution: params.attribution,\n maxSteps: params.maxSteps,\n budget: params.budget,\n contextBudget: params.contextBudget,\n auto: params.auto,\n denyCommands: params.denyCommands,\n testCommand: params.testCommand,\n stream: params.stream,\n verify: params.verify,\n priorSummary: params.priorSummary,\n priorInstruction: params.priorInstruction,\n externalTools: params.externalTools,\n capsule: params.capsule,\n files: params.files,\n llmCompaction: params.llmCompaction,\n now: () => Date.now(),\n });\n closeStream();\n\n const perTask = params.meter?.add(result.usage);\n const summary = summarizeDiffs(result.changes.map((ch) => ({ file: ch.file, diff: ch.diff })));\n info('');\n info(\n result.stopped === 'finished'\n ? c.green(`✔ ${result.finalText}`)\n : result.stopped === 'max-steps'\n ? c.yellow(`stopped at the step limit — ${result.changes.length} change(s) so far`)\n : c.dim(result.finalText),\n );\n const meterNote = perTask !== undefined ? ` · ${params.meter!.summary()}` : '';\n if (result.changes.length || perTask) info(c.dim(` ${summary} · via ${result.provider.id}/${result.provider.model}${result.provider.fellBack ? ' (fell back)' : ''}${meterNote}`));\n return result;\n}\n\nfunction briefArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = typeof v === 'string' ? v : JSON.stringify(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + '…' : s}`);\n if (parts.length >= 2) break;\n }\n return parts.join(', ');\n}\n\n/** A shell runner for the agent's run_command tool, scoped to the repo root. */\nfunction shellRunner(root: string): (command: string) => ShellResult {\n return (command: string) => {\n const res = spawnSync(command, { cwd: root, shell: true, encoding: 'utf8', timeout: 120_000, maxBuffer: 10 * 1024 * 1024 });\n const stdout = (res.stdout ?? '') + (res.stderr ? `\\n${res.stderr}` : '');\n return { stdout, exitCode: res.status ?? 1 };\n };\n}\n"]}
@@ -1,11 +0,0 @@
1
- export { loadGraph } from './chunk-537JBQVB.js';
2
- import './chunk-7TOIESUT.js';
3
- import './chunk-FZ5Y4KEI.js';
4
- import './chunk-4LGDQBYK.js';
5
- import './chunk-RBMKBYGV.js';
6
- import './chunk-BWPBB45M.js';
7
- import './chunk-JFGYT6BI.js';
8
- import './chunk-BPF3YX2U.js';
9
- import './chunk-Z6ZWNWWR.js';
10
- //# sourceMappingURL=load-6KVGUQMU.js.map
11
- //# sourceMappingURL=load-6KVGUQMU.js.map