@vibgrate/cli 2026.825.1 → 2026.825.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/{agent-IHNUBFBM.js → agent-DHQYEHVW.js} +13 -13
  2. package/dist/{agent-IHNUBFBM.js.map → agent-DHQYEHVW.js.map} +1 -1
  3. package/dist/{approvals-HRIMDIX3.js → approvals-KBM72NU2.js} +5 -5
  4. package/dist/{approvals-HRIMDIX3.js.map → approvals-KBM72NU2.js.map} +1 -1
  5. package/dist/{attach-L43JUJ7A.js → attach-O74NL4M5.js} +3 -3
  6. package/dist/{attach-L43JUJ7A.js.map → attach-O74NL4M5.js.map} +1 -1
  7. package/dist/{baseline-EZQ7SCRT.js → baseline-4X6MQBDA.js} +3 -3
  8. package/dist/{baseline-EZQ7SCRT.js.map → baseline-4X6MQBDA.js.map} +1 -1
  9. package/dist/{chunk-X34HVFZ6.js → chunk-27TS2AUJ.js} +8 -8
  10. package/dist/{chunk-X34HVFZ6.js.map → chunk-27TS2AUJ.js.map} +1 -1
  11. package/dist/{chunk-RHYRMMN3.js → chunk-2NUS5BOR.js} +3 -3
  12. package/dist/{chunk-RHYRMMN3.js.map → chunk-2NUS5BOR.js.map} +1 -1
  13. package/dist/{chunk-TLYNLQL2.js → chunk-3E7QT4NE.js} +9 -9
  14. package/dist/{chunk-TLYNLQL2.js.map → chunk-3E7QT4NE.js.map} +1 -1
  15. package/dist/{chunk-L3YEEJ6U.js → chunk-6MIJLO5B.js} +3 -3
  16. package/dist/{chunk-L3YEEJ6U.js.map → chunk-6MIJLO5B.js.map} +1 -1
  17. package/dist/{chunk-5BFA532E.js → chunk-7M4E7UGX.js} +3 -3
  18. package/dist/{chunk-5BFA532E.js.map → chunk-7M4E7UGX.js.map} +1 -1
  19. package/dist/{chunk-M7O6IVKN.js → chunk-BICZR6UJ.js} +3 -3
  20. package/dist/{chunk-M7O6IVKN.js.map → chunk-BICZR6UJ.js.map} +1 -1
  21. package/dist/{chunk-BCK2NIBM.js → chunk-DIZ5KI5Q.js} +6 -6
  22. package/dist/{chunk-BCK2NIBM.js.map → chunk-DIZ5KI5Q.js.map} +1 -1
  23. package/dist/{chunk-QTQRM7HQ.js → chunk-E3XVIFSH.js} +3 -3
  24. package/dist/{chunk-QTQRM7HQ.js.map → chunk-E3XVIFSH.js.map} +1 -1
  25. package/dist/{chunk-B5X246UH.js → chunk-FQHWPOTS.js} +3 -3
  26. package/dist/{chunk-B5X246UH.js.map → chunk-FQHWPOTS.js.map} +1 -1
  27. package/dist/chunk-G3ACLBMG.js +6 -0
  28. package/dist/{chunk-KFLNWYZG.js.map → chunk-G3ACLBMG.js.map} +1 -1
  29. package/dist/{chunk-CIC3NY2D.js → chunk-GR7SFCQJ.js} +12 -12
  30. package/dist/{chunk-CIC3NY2D.js.map → chunk-GR7SFCQJ.js.map} +1 -1
  31. package/dist/{chunk-Y3X3ORQ3.js → chunk-GWSJYDK7.js} +5 -5
  32. package/dist/{chunk-Y3X3ORQ3.js.map → chunk-GWSJYDK7.js.map} +1 -1
  33. package/dist/{chunk-ECQFRZJI.js → chunk-HFQIYM6E.js} +4 -4
  34. package/dist/{chunk-ECQFRZJI.js.map → chunk-HFQIYM6E.js.map} +1 -1
  35. package/dist/{chunk-GRMZU24V.js → chunk-IJVWKZRS.js} +3 -3
  36. package/dist/{chunk-GRMZU24V.js.map → chunk-IJVWKZRS.js.map} +1 -1
  37. package/dist/{chunk-YIRDV4YJ.js → chunk-JAEHLTVX.js} +3 -3
  38. package/dist/{chunk-YIRDV4YJ.js.map → chunk-JAEHLTVX.js.map} +1 -1
  39. package/dist/{chunk-LUJ4H4RJ.js → chunk-K3SXWOTT.js} +3 -3
  40. package/dist/{chunk-LUJ4H4RJ.js.map → chunk-K3SXWOTT.js.map} +1 -1
  41. package/dist/{chunk-JSZ46IDG.js → chunk-KYM55VZX.js} +6 -6
  42. package/dist/{chunk-JSZ46IDG.js.map → chunk-KYM55VZX.js.map} +1 -1
  43. package/dist/{chunk-YP243ZKD.js → chunk-L7GCJNDT.js} +3 -3
  44. package/dist/{chunk-YP243ZKD.js.map → chunk-L7GCJNDT.js.map} +1 -1
  45. package/dist/{chunk-UUVOA6WD.js → chunk-NS4DL3QR.js} +8 -8
  46. package/dist/{chunk-UUVOA6WD.js.map → chunk-NS4DL3QR.js.map} +1 -1
  47. package/dist/{chunk-S3HMG6BC.js → chunk-NZES47ST.js} +3 -3
  48. package/dist/{chunk-S3HMG6BC.js.map → chunk-NZES47ST.js.map} +1 -1
  49. package/dist/{chunk-FVBN4E5C.js → chunk-OIUVWCKM.js} +3 -3
  50. package/dist/{chunk-FVBN4E5C.js.map → chunk-OIUVWCKM.js.map} +1 -1
  51. package/dist/{chunk-DLNNNESQ.js → chunk-SIXWWQ6S.js} +3 -3
  52. package/dist/{chunk-DLNNNESQ.js.map → chunk-SIXWWQ6S.js.map} +1 -1
  53. package/dist/{chunk-6VLOI2ZP.js → chunk-SYMJSRYF.js} +3 -3
  54. package/dist/{chunk-6VLOI2ZP.js.map → chunk-SYMJSRYF.js.map} +1 -1
  55. package/dist/{chunk-LKJIYGO5.js → chunk-TT2J2TB6.js} +6 -6
  56. package/dist/{chunk-LKJIYGO5.js.map → chunk-TT2J2TB6.js.map} +1 -1
  57. package/dist/{chunk-4PCFSRYH.js → chunk-VMPKOMHG.js} +5 -5
  58. package/dist/{chunk-4PCFSRYH.js.map → chunk-VMPKOMHG.js.map} +1 -1
  59. package/dist/cli.js +49 -49
  60. package/dist/{daemon-WPX2SBVV.js → daemon-RZS5FPIW.js} +9 -9
  61. package/dist/{daemon-WPX2SBVV.js.map → daemon-RZS5FPIW.js.map} +1 -1
  62. package/dist/embed-worker-main.js +3 -3
  63. package/dist/{ensure-map-MLI4XCRV.js → ensure-map-DL2S774J.js} +14 -14
  64. package/dist/{ensure-map-MLI4XCRV.js.map → ensure-map-DL2S774J.js.map} +1 -1
  65. package/dist/{graph-backend-LK5EFQXN.js → graph-backend-JXARVT3R.js} +7 -7
  66. package/dist/{graph-backend-LK5EFQXN.js.map → graph-backend-JXARVT3R.js.map} +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.js +15 -15
  69. package/dist/{interactive-K446F42I.js → interactive-2XRBRFRB.js} +25 -25
  70. package/dist/{interactive-K446F42I.js.map → interactive-2XRBRFRB.js.map} +1 -1
  71. package/dist/load-7C5VETRD.js +11 -0
  72. package/dist/{load-2FRH37JY.js.map → load-7C5VETRD.js.map} +1 -1
  73. package/dist/parse-worker.js +2 -2
  74. package/dist/{run-outcome-4ETNDPX6.js → run-outcome-TMB5TJNA.js} +5 -5
  75. package/dist/{run-outcome-4ETNDPX6.js.map → run-outcome-TMB5TJNA.js.map} +1 -1
  76. package/dist/{runtime-session-RMSKXFIJ.js → runtime-session-Y23NVY7R.js} +9 -9
  77. package/dist/{runtime-session-RMSKXFIJ.js.map → runtime-session-Y23NVY7R.js.map} +1 -1
  78. package/dist/{session-22BGDYWF.js → session-KXT2ZTPE.js} +8 -8
  79. package/dist/{session-22BGDYWF.js.map → session-KXT2ZTPE.js.map} +1 -1
  80. package/dist/{stream-json-MD7MSSCH.js → stream-json-NW6AOE47.js} +13 -13
  81. package/dist/{stream-json-MD7MSSCH.js.map → stream-json-NW6AOE47.js.map} +1 -1
  82. package/dist/version-7ABYXWOZ.js +4 -0
  83. package/dist/{version-FRUT6RI2.js.map → version-7ABYXWOZ.js.map} +1 -1
  84. package/dist/{vg-mcp-bridge-H6I3ALUW.js → vg-mcp-bridge-LXBHKEFR.js} +8 -8
  85. package/dist/{vg-mcp-bridge-H6I3ALUW.js.map → vg-mcp-bridge-LXBHKEFR.js.map} +1 -1
  86. package/dist/{vgd-TW7HU2PH.js → vgd-RW7HCEIP.js} +8 -8
  87. package/dist/vgd-RW7HCEIP.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/chunk-KFLNWYZG.js +0 -6
  90. package/dist/load-2FRH37JY.js +0 -11
  91. package/dist/version-FRUT6RI2.js +0 -4
  92. package/dist/vgd-TW7HU2PH.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/lock.ts","../src/engine/embeddings.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-B5X246UH.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Cross-process single-writer lock (O_EXCL create), shared by the embedding\n * cache writer and the auto-refresh rebuild so two vg processes never write\n * the same repo-local artifact at once. A lock whose owning process is dead,\n * or that is older than `staleMs`, is presumed abandoned and reclaimed.\n */\n\n/** A lock older than this is presumed dead (crashed process). */\nexport const DEFAULT_LOCK_STALE_MS = 15 * 60 * 1000;\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException).code === 'EPERM'; // exists, just not ours to signal\n }\n}\n\nfunction lockIsStale(file: string, staleMs: number): boolean {\n try {\n const { pid, at } = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: number; at?: number };\n if (typeof at === 'number' && Date.now() - at > staleMs) return true;\n if (typeof pid === 'number' && !isProcessAlive(pid)) return true;\n return false;\n } catch {\n return true; // unreadable/corrupt → reclaim it\n }\n}\n\n/**\n * True when a live process is holding this lock right now. Read-only: it never\n * reclaims, so a caller can politely stand down (the vgd semantic warm does\n * this rather than embedding a repo a `vg embed` child is already embedding).\n */\nexport function lockHeld(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n if (!fs.existsSync(file)) return false;\n return !lockIsStale(file, staleMs);\n}\n\n/** Take the lock (O_EXCL), reclaiming a stale/dead one. Returns success. */\nexport function acquireLock(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n const write = (): boolean => {\n try {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const fd = fs.openSync(file, 'wx');\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: Date.now() }));\n fs.closeSync(fd);\n return true;\n } catch {\n return false;\n }\n };\n if (write()) return true;\n if (lockIsStale(file, staleMs)) {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* another process may have reclaimed it */\n }\n return write();\n }\n return false;\n}\n\nexport function releaseLock(file: string): void {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* best-effort */\n }\n}\n","import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { hashString } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { resolveGraphPath } from './artifacts.js';\nimport { acquireLock, lockHeld, releaseLock } from './lock.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Local-embedding semantic search for `vg ask --semantic`/`--deep` (no API key).\n *\n * The embedding backend is OPTIONAL and lazily loaded (the vendored\n * `src/vendor/fastembed` dense backend over `onnxruntime-node`, local ONNX)\n * so the core install stays lean and `ask` never breaks:\n * if the backend or model isn't available it degrades to (prefix-fuzzy) lexical\n * search with a clear note. Per-repo vectors live in a binary `*.embeddings`\n * file **alongside the code map** (global store under Application Support /\n * XDG data, or `.vibgrate/embeddings` in-repo) — never model-named, never under\n * `.vibgrate/cache/`, and NEVER inside the committed `graph.json`, so the map\n * stays byte-deterministic. The model id is recorded inside the file header so\n * a model change still invalidates the cache without putting the name in the\n * path.\n *\n * `--local` disables the model download (semantic is skipped unless already\n * cached via an injected backend), keeping the air-gapped guarantee.\n */\n\nexport interface Embedder {\n /** Stable model id (recorded with cached vectors so a model change invalidates them). */\n id: string;\n /** Embed documents → unit-or-raw vectors (cosine handles normalization). */\n embed(texts: string[]): Promise<number[][]>;\n /** Embed a single query string. */\n embedQuery(text: string): Promise<number[]>;\n}\n\n/** Why semantic fell back to lexical — for calm, specific messaging. */\nexport type EmbedUnavailable = 'not-installed' | 'no-permission' | 'download-failed' | 'init-failed';\n\nexport interface LoadEmbedderOptions {\n local?: boolean; // --local: do not download a model\n model?: string; // override the embedding model id\n noDownload?: boolean; // only load if the model is already cached (never fetch)\n showDownloadProgress?: boolean; // let fastembed print its one-time download progress\n /**\n * Called (not thrown) when the backend can't load. `detail` carries the\n * underlying loader error when there is one, so a host can log something\n * actionable instead of a bare category.\n */\n onUnavailable?: (reason: EmbedUnavailable, detail?: string) => void;\n}\n\n/** The embedding model id in effect (explicit override → default). */\nexport function resolveEmbedModel(model?: string): string {\n return model ?? 'bge-small-en-v1.5';\n}\n\n/**\n * The **central, per-user** model cache — downloaded once per machine and shared\n * across every repo/folder (devs have many repos; the ~tens-of-MB model should\n * not re-download per project). Uses the XDG standard:\n * `$XDG_CACHE_HOME/vibgrate/models` (or `~/.cache/vibgrate/models`); relocate via\n * the standard `XDG_CACHE_HOME`. NB: fastembed's own default is the relative\n * `./local_cache`, i.e. per-CWD — which we override.\n */\nexport function modelCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'models');\n}\n\n/** A machine-global marker written once the model has loaded successfully. */\nfunction modelReadyMarker(modelId: string): string {\n return path.join(modelCacheDir(), `.ready-${safe(modelId)}`);\n}\n\n/**\n * Whether the embedding model is already present on this machine (loaded at least\n * once), so it can be used with **no network**. Lets the background warm-up\n * trigger only when it won't surprise-download.\n */\nexport function isModelReady(modelId = resolveEmbedModel()): boolean {\n return fs.existsSync(modelReadyMarker(modelId));\n}\n\n/**\n * A calm, specific, actionable one-liner for why semantic isn't available right\n * now — built to reassure (lexical still works) and inform, never to alarm. No\n * stack traces, no scary words; always names the off switch and the fix.\n */\nexport function unavailableMessage(reason: EmbedUnavailable): string {\n switch (reason) {\n case 'no-permission':\n return `semantic search couldn't write its model cache at ${modelCacheDir()} — using fast lexical search instead. Relocate it with the standard XDG_CACHE_HOME, or run with --local to stay lexical quietly. (No admin/sudo is ever needed — the cache lives in your home folder.)`;\n case 'download-failed':\n return `the semantic model isn't downloaded yet and couldn't be fetched (offline?) — using fast lexical search. It'll try again next time; run with --local to keep lexical without retrying.`;\n case 'not-installed':\n return `the optional semantic backend isn't available here — using fast lexical search.`;\n case 'init-failed':\n default:\n return `the semantic model couldn't load — using fast lexical search.`;\n }\n}\n\nexport interface ModelCacheInfo {\n dir: string;\n present: boolean;\n bytes: number;\n}\n\n/** Where the shared model lives, whether it's present, and how big it is. */\nexport function modelCacheInfo(modelId = resolveEmbedModel()): ModelCacheInfo {\n const dir = modelCacheDir();\n return { dir, present: isModelReady(modelId) || fs.existsSync(dir), bytes: dirSize(dir) };\n}\n\n/** Remove the shared, re-downloadable model from the central cache. Returns bytes freed. */\nexport function clearModelCache(): number {\n const dir = modelCacheDir();\n const bytes = dirSize(dir);\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n return bytes;\n}\n\nfunction dirSize(dir: string): number {\n let total = 0;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) total += dirSize(p);\n else {\n try {\n total += fs.statSync(p).size;\n } catch {\n /* skip unreadable */\n }\n }\n }\n return total;\n}\n\nfunction isPermissionError(e: unknown): boolean {\n const code = (e as NodeJS.ErrnoException | undefined)?.code;\n return code === 'EACCES' || code === 'EPERM' || code === 'EROFS';\n}\n\n/**\n * Whether this repo already has a cached vector set for `modelId` — i.e. semantic\n * search has run here before, so the next run is fast (no first-use download/embed).\n * Lets `ask` show the one-time setup note only when it's actually warranted.\n * Checks the binary sidecar next to the map (and the legacy JSON path once).\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n const file = vectorCachePath(root);\n if (fs.existsSync(file) && readCacheHeader(file)?.model === modelId) return true;\n // One-shot legacy: pre-binary caches lived under `.vibgrate/cache/embeddings-<model>.json`.\n return fs.existsSync(legacyVectorCachePath(root, modelId));\n}\n\n/**\n * Path of the binary embeddings file for this repo's current map — always named\n * `embeddings` (or `<snapshot>.embeddings` next to a branch-keyed graph), never\n * after the model. Exported for `vg embed --where` and tests.\n */\nexport function embeddingsPath(root: string): string {\n return vectorCachePath(root);\n}\n\n/** Sidecar path next to a map file: `…/branch-main.graph.json` → `…/branch-main.embeddings`. */\nexport function embeddingsPathFor(graphPath: string): string {\n // Branch-keyed global maps: `…/graphs/branch-main.graph.json` → `…/graphs/branch-main.embeddings`.\n if (graphPath.endsWith('.graph.json')) return `${graphPath.slice(0, -'.graph.json'.length)}.embeddings`;\n if (graphPath.endsWith('.graph.snap')) return `${graphPath.slice(0, -'.graph.snap'.length)}.embeddings`;\n // In-repo map is exactly `…/graph.json` (or `graph.snap`) → plain `…/embeddings`.\n const base = path.basename(graphPath);\n if (base === 'graph.json' || base === 'graph.snap') {\n return path.join(path.dirname(graphPath), 'embeddings');\n }\n if (graphPath.endsWith('.json')) return `${graphPath.slice(0, -5)}.embeddings`;\n if (graphPath.endsWith('.snap')) return `${graphPath.slice(0, -5)}.embeddings`;\n return `${graphPath}.embeddings`;\n}\n\n/**\n * Try to load the optional local embedding backend. Returns null (→ caller falls\n * back to lexical) when running `--local`, when the dependency isn't installed,\n * or when the model can't initialize.\n */\nexport async function loadEmbedder(options: LoadEmbedderOptions = {}): Promise<Embedder | null> {\n // `--local` forces the deterministic lexical floor with no model load/download\n // (air-gapped guarantee; also how tests stay offline).\n if (options.local) return null;\n const modelId = resolveEmbedModel(options.model);\n // noDownload (used by the background warm-up): never fetch — bail if not cached.\n if (options.noDownload && !isModelReady(modelId)) return null;\n const fail = (reason: EmbedUnavailable, detail?: string): null => {\n options.onUnavailable?.(reason, detail);\n return null;\n };\n\n // Lazy, optional dependency (native ONNX): loaded only for `vg ask`/`embed`,\n // never by build/verify, so the graph artifact stays deterministic.\n const backend = await importEmbedBackend();\n const mod: any = backend.mod;\n if (!mod?.FlagEmbedding) return fail('not-installed', backend.error);\n\n const cache = modelCacheDir(); // central, shared across all repos\n try {\n fs.mkdirSync(cache, { recursive: true });\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'init-failed');\n }\n\n try {\n // First use fetches the model. A refused connection fails fast, but a\n // black-holing proxy (common on corporate networks) would hang the first\n // `vg ask` / MCP query_graph forever — bound the wait and fall back to\n // lexical instead. Cached loads are local disk and get the same generous\n // ceiling without ever hitting it.\n const model: any = await withTimeout(\n mod.FlagEmbedding.init({\n model: mapModel(mod, modelId),\n cacheDir: cache,\n showDownloadProgress: options.showDownloadProgress ?? false,\n }) as Promise<unknown>,\n embedInitTimeoutMs(),\n 'embedding model init timed out',\n );\n // Record machine-global readiness so future builds can warm up offline.\n try {\n fs.writeFileSync(modelReadyMarker(modelId), new Date(0).toISOString());\n } catch {\n /* marker is best-effort */\n }\n return {\n id: modelId,\n async embed(texts) {\n const out: number[][] = [];\n for await (const batch of model.embed(texts, 64)) {\n for (const v of batch) out.push(Array.from(v as ArrayLike<number>));\n }\n return out;\n },\n async embedQuery(text) {\n const v = await model.queryEmbed(text);\n return Array.from(v as ArrayLike<number>);\n },\n };\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'download-failed', errText(e));\n }\n}\n\n/**\n * Import the optional embedding backend — the VENDORED dense backend\n * (src/vendor/fastembed). It still needs the optional native deps\n * (`onnxruntime-node`, `@anush008/tokenizers`, `tar`), which a host can supply\n * out-of-tree via `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules`\n * contains them. Editor integrations use this when their bundled engine ships\n * without the native optional dependencies (the VS Code extension installs\n * them into its own storage on consent); the host dir wins over this package's\n * own dependency tree so the copies the user consented to are the ones that\n * load (see `ensureNativeDeps` in the vendored module).\n *\n * Legacy host contract: a host dir holding a whole upstream `fastembed`\n * install (what older extension versions set up) is still honored, and wins,\n * so an engine upgrade never breaks a backend the user already consented to.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<{ mod: any | null; error?: string }> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n let error: string | undefined;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n let entry: string | null = null;\n try {\n entry = req.resolve('fastembed');\n } catch {\n // No upstream fastembed in the host dir — the normal state under the\n // current contract (the host supplies only the native deps, resolved\n // by the vendored backend below). Not an error worth reporting.\n }\n if (entry) {\n const mod: any = await import(pathToFileURL(entry).href);\n const resolved = unwrapBackend(mod);\n if (resolved) return { mod: resolved };\n error = `${hostDir}: fastembed loaded but exported no FlagEmbedding`;\n }\n } catch (e) {\n // Keep the reason. A host-supplied backend that resolves but won't load\n // (native binary built for another ABI, a half-extracted tree, a missing\n // transitive dep) is indistinguishable from \"never installed\" once the\n // error is dropped — and that is the one failure a user cannot act on.\n error = `${hostDir}: ${errText(e)}`;\n }\n }\n try {\n const mod: any = await import('../vendor/fastembed/index.js');\n const resolved = unwrapBackend(mod);\n if (!resolved) return { mod: null, error: error ?? 'embed backend exported no FlagEmbedding' };\n // Load the native deps now (host dir first — see the vendored module), so\n // a missing or broken install surfaces here as \"not-installed\" with the\n // real reason instead of failing later mid-init.\n if (typeof resolved.ensureNativeDeps === 'function') await resolved.ensureNativeDeps();\n return { mod: resolved };\n } catch (e) {\n return { mod: null, error: error ?? errText(e) };\n }\n}\n\n/** A CJS entry imported over ESM may nest its exports one or two `default`s deep. */\nfunction unwrapBackend(mod: any): any | null {\n for (const candidate of [mod, mod?.default, mod?.default?.default]) {\n if (candidate?.FlagEmbedding) return candidate;\n }\n return null;\n}\n\nfunction errText(e: unknown): string {\n const msg = e instanceof Error ? e.message : String(e);\n return msg.replace(/\\s+/g, ' ').trim().slice(0, 300);\n}\n\n/** Ceiling for the one-time model fetch/init; override via VG_EMBED_TIMEOUT_MS. */\nfunction embedInitTimeoutMs(): number {\n const n = Number(process.env.VG_EMBED_TIMEOUT_MS);\n return Number.isFinite(n) && n > 0 ? n : 60_000;\n}\n\n/** Reject `promise` if it hasn't settled within `ms` (the work itself is not cancelled). */\nexport async function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), ms);\n timer.unref?.();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction mapModel(mod: any, id: string): unknown {\n const m = mod.EmbeddingModel ?? {};\n if (/bge-small/i.test(id)) return m.BGESmallENV15 ?? m.BGESmallEN ?? id;\n if (/bge-base/i.test(id)) return m.BGEBaseENV15 ?? id;\n if (/all-minilm/i.test(id)) return m.AllMiniLML6V2 ?? id;\n return id;\n}\n\n/** Path segments that carry no semantic signal — dropped from embed context. */\nconst PATH_NOISE = new Set([\n 'src', 'app', 'apps', 'lib', 'libs', 'dist', 'build', 'out', 'index', 'main',\n 'packages', 'pkg', 'test', 'tests', '__tests__', 'spec', 'node_modules', 'internal',\n 'com', 'example', 'demo', 'java', 'net', 'org', 'www',\n]);\n\n/** Meaningful path context for a node: a couple of parent dirs + the filename stem. */\nfunction pathContext(file: string): string {\n const parts = file.split('/');\n const stem = (parts.pop() ?? '').replace(/\\.[^.]+$/, '');\n const dirs = parts.filter((p) => p && !PATH_NOISE.has(p.toLowerCase()));\n return [...dirs.slice(-2), stem].filter(Boolean).join(' ');\n}\n\n/**\n * The text we embed for a node. Alongside identity + signature we add the\n * strongest available signal — the node's **doc-comment / docstring** summary —\n * plus lightweight context already on the graph (file-path words, area label), so\n * a tersely-named symbol (`Table`, `NotificationJob`) a concept query can reach.\n *\n * `document` nodes (markdown, manifests, Docker, CI, OpenAPI, …) put the\n * scrubbed body in `doc` — that body is the primary embed signal so `vg ask`\n * can answer project-context questions, not only code symbols.\n */\nexport function nodeEmbedText(node: GraphNode, areaLabel?: string): string {\n if (node.kind === 'document') {\n const category = (node.signature ?? 'document').replace(/^document:/, '');\n // Category keywords help ops/config queries land on the right file type.\n const categoryHints: Record<string, string> = {\n manifest: 'package dependencies scripts install dependencies versions',\n docker: 'dockerfile container image build runtime',\n compose: 'docker-compose services containers networking volumes',\n ci: 'continuous integration github actions workflow pipeline test build deploy',\n 'build-config': 'typescript tsconfig bundler vite webpack eslint prettier test',\n 'api-contract': 'openapi swagger graphql protobuf api schema endpoints',\n 'task-runner': 'makefile justfile tasks build test run commands',\n workspace: 'monorepo workspace packages pnpm turbo nx',\n infra: 'deploy infrastructure kubernetes kubernetes terraform helm kubernetes',\n 'env-example': 'environment variables configuration secrets template',\n markdown: 'documentation readme guide',\n };\n const hint = categoryHints[category] ?? category;\n return [\n node.qualifiedName,\n 'document',\n category,\n hint,\n pathContext(node.file),\n (node.doc ?? '').slice(0, 5000),\n ]\n .filter(Boolean)\n .join('\\n');\n }\n return [node.qualifiedName, node.kind, node.signature ?? '', node.doc ?? '', pathContext(node.file), areaLabel ?? '']\n .filter(Boolean)\n .join(' ');\n}\n\nexport function cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\ninterface EmbedCache {\n model: string;\n entries: Record<string, { hash: string; vec: number[] }>;\n}\n\n/** Reports embedding progress: how many of `total` nodes are done so far. */\nexport type EmbedProgress = (done: number, total: number) => void;\n\n/** Nodes embedded per chunk — bounds memory and gives progress granularity. */\nconst EMBED_CHUNK = 256;\n/** Min gap between incremental cache writes (ms) — caps IO on big repos. */\nconst CACHE_WRITE_INTERVAL_MS = 1500;\n\n/**\n * Binary embeddings format (local cache next to the map, never committed):\n *\n * MAGIC \"VGEMB1\\0\" · u16 version · u16 modelLen · model utf8 ·\n * u32 dims · u32 count ·\n * for each entry: u16 idLen · id · u16 hashLen · hash ·\n * then contiguous Float32LE vectors [count × dims]\n *\n * Why binary: a medium map (~4k nodes × 384 dims) is ~6 MB of floats but was\n * ~30 MB of JSON with full decimal text — slow to parse and noisy in source\n * control if it ever landed under the repo. The filename is always\n * `embeddings` / `<snapshot>.embeddings`; the model id lives only in the header.\n */\n/** 8-byte little-endian-friendly magic (same width as graph `VGSNAP1\\0`). */\nconst EMB_MAGIC = Buffer.from('VGEMB01\\0', 'latin1');\nconst EMB_VERSION = 1;\n\nfunction vectorCachePath(root: string): string {\n return embeddingsPathFor(resolveGraphPath(root));\n}\n\n/** Pre-binary path: `.vibgrate/cache/embeddings-<model>.json` (read once to migrate). */\nfunction legacyVectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/** One node's contribution to the semantic index: what is embedded, and its hash. */\nexport interface EmbedTarget {\n id: string;\n text: string;\n hash: string;\n}\n\n/**\n * The nodes the semantic index covers, and the exact text embedded for each.\n *\n * This is the single definition of \"what is in the index\", shared by the\n * on-disk cache (`vg embed`, `vg ask`) and vgd's in-memory slot index. They\n * used to compute it separately — vgd embedded *every* node with a shorter\n * text — so the two indexes described different things and vgd re-embedded\n * work the disk cache had already done. Keep them on this one function.\n */\nexport function embedTargets(graph: VgGraph): EmbedTarget[] {\n // Tolerant of a partial graph: vgd indexes whatever a client publishes, and\n // an `areas`-less map is a valid (if unlabelled) one.\n const areaLabel = new Map((graph.areas ?? []).map((a) => [a.id, a.label] as const));\n const targets: EmbedTarget[] = [];\n for (const n of graph.nodes ?? []) {\n // file/external stay out of the index; document (docs/env examples) are in.\n if (n.kind === 'file' || n.kind === 'external') continue;\n const text = nodeEmbedText(n, areaLabel.get(n.area));\n targets.push({ id: n.id, text, hash: hashString(text) });\n }\n return targets;\n}\n\n/**\n * How many searchable nodes still need embedding for `modelId` — cheap (hashes\n * the embed-text, reads only the cache; never loads the model). Lets the embed\n * command / background warm-up exit instantly when nothing changed.\n */\nexport function countPending(graph: VgGraph, root: string, modelId: string): number {\n const entries = loadCache(root, modelId).entries;\n let pending = 0;\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (!cached || cached.hash !== t.hash) pending++;\n }\n return pending;\n}\n\n/** What a reader (vgd) finds in this repo's on-disk vector cache. */\nexport interface CachedVectorRead {\n model: string;\n /** nodeId → vector, for every node whose cached hash still matches. */\n vectors: Map<string, number[]>;\n /** Targets the cache does not cover yet. */\n pending: EmbedTarget[];\n /** True while another process holds the cache's single-writer lock. */\n writerBusy: boolean;\n}\n\n/**\n * Read this repo's vector cache without loading the embedding backend.\n *\n * vgd warms its slot index from here first: on a repo `vg embed` has already\n * warmed, a slot goes `ready` in milliseconds with no worker and no duplicated\n * embedding. `writerBusy` reports the single-writer lock so vgd can stand down\n * while the `vg build` warm-up child is mid-run instead of racing it.\n */\nexport function readCachedVectors(\n graph: VgGraph,\n root: string,\n modelId = resolveEmbedModel(),\n): CachedVectorRead {\n const entries = loadCache(root, modelId).entries;\n const vectors = new Map<string, number[]>();\n const pending: EmbedTarget[] = [];\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (cached && cached.hash === t.hash && cached.vec.length > 0) vectors.set(t.id, cached.vec);\n else pending.push(t);\n }\n return { model: modelId, vectors, pending, writerBusy: lockHeld(`${vectorCachePath(root)}.lock`) };\n}\n\nfunction loadCache(root: string, modelId: string): EmbedCache {\n const file = vectorCachePath(root);\n const binary = readBinaryCache(file, modelId);\n if (binary) return binary;\n\n // Migrate legacy JSON if present (once) — keep working after upgrade without\n // re-embedding the whole repo.\n const legacy = legacyVectorCachePath(root, modelId);\n if (fs.existsSync(legacy)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(legacy, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) {\n return { model: modelId, entries: loaded.entries };\n }\n } catch {\n /* treat as empty */\n }\n }\n return { model: modelId, entries: {} };\n}\n\ninterface EmbedHeader {\n model: string;\n dims: number;\n count: number;\n}\n\n/** Cheap header-only peek (no vectors) for `embeddingsCached` / diagnostics. */\nfunction readCacheHeader(file: string): EmbedHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(8 + 2 + 2 + 512); // magic + ver + modelLen + model (capped)\n const n = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (n < EMB_MAGIC.length + 4 || !prefix.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n const version = prefix.readUInt16LE(o);\n o += 2;\n if (version !== EMB_VERSION) return null;\n const modelLen = prefix.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > n) {\n // model spills past our prefix — re-read exactly\n const full = Buffer.alloc(EMB_MAGIC.length + 2 + 2 + modelLen + 8);\n fs.readSync(fd, full, 0, full.length, 0);\n return parseHeaderPrefix(full);\n }\n return parseHeaderPrefix(prefix);\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\nfunction parseHeaderPrefix(buf: Buffer): EmbedHeader | null {\n try {\n if (!buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > buf.length) return null;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n return { model, dims, count };\n } catch {\n return null;\n }\n}\n\nfunction readBinaryCache(file: string, modelId: string): EmbedCache | null {\n if (!fs.existsSync(file)) return null;\n try {\n const buf = fs.readFileSync(file);\n if (buf.length < EMB_MAGIC.length + 4 || !buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n if (model !== modelId) return null;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n o += 4;\n if (dims === 0 || count === 0) return { model, entries: {} };\n\n const ids: string[] = [];\n const hashes: string[] = [];\n for (let i = 0; i < count; i++) {\n const idLen = buf.readUInt16LE(o);\n o += 2;\n ids.push(buf.subarray(o, o + idLen).toString('utf8'));\n o += idLen;\n const hashLen = buf.readUInt16LE(o);\n o += 2;\n hashes.push(buf.subarray(o, o + hashLen).toString('utf8'));\n o += hashLen;\n }\n const floatsNeeded = count * dims;\n const bytesNeeded = floatsNeeded * 4;\n if (o + bytesNeeded > buf.length) return null;\n // Copy into a standalone ArrayBuffer so Float32Array views are safe after buf is GC'd.\n const floatBuf = Buffer.from(buf.subarray(o, o + bytesNeeded));\n const floats = new Float32Array(floatBuf.buffer, floatBuf.byteOffset, floatsNeeded);\n\n const entries: EmbedCache['entries'] = {};\n for (let i = 0; i < count; i++) {\n const start = i * dims;\n const vec = Array.from(floats.subarray(start, start + dims));\n entries[ids[i]!] = { hash: hashes[i]!, vec };\n }\n return { model, entries };\n } catch {\n return null;\n }\n}\n\nfunction writeBinaryCache(file: string, cache: EmbedCache): void {\n const ids = Object.keys(cache.entries);\n const count = ids.length;\n let dims = 0;\n for (const id of ids) {\n const d = cache.entries[id]!.vec.length;\n if (d > 0) {\n dims = d;\n break;\n }\n }\n // Empty or all-zero-dim cache: still write a valid header so \"cached\" is true.\n const modelBuf = Buffer.from(cache.model, 'utf8');\n if (modelBuf.length > 0xffff) throw new Error('embed model id too long');\n\n // Index size (ids + hashes)\n let indexBytes = 0;\n const idBufs: Buffer[] = [];\n const hashBufs: Buffer[] = [];\n for (const id of ids) {\n const ib = Buffer.from(id, 'utf8');\n const hb = Buffer.from(cache.entries[id]!.hash, 'utf8');\n if (ib.length > 0xffff || hb.length > 0xffff) throw new Error('embed entry key too long');\n idBufs.push(ib);\n hashBufs.push(hb);\n indexBytes += 2 + ib.length + 2 + hb.length;\n }\n\n const headerBytes = EMB_MAGIC.length + 2 + 2 + modelBuf.length + 4 + 4;\n const vecBytes = count * dims * 4;\n const out = Buffer.allocUnsafe(headerBytes + indexBytes + vecBytes);\n let o = 0;\n EMB_MAGIC.copy(out, o);\n o += EMB_MAGIC.length;\n out.writeUInt16LE(EMB_VERSION, o);\n o += 2;\n out.writeUInt16LE(modelBuf.length, o);\n o += 2;\n modelBuf.copy(out, o);\n o += modelBuf.length;\n out.writeUInt32LE(dims, o);\n o += 4;\n out.writeUInt32LE(count, o);\n o += 4;\n\n for (let i = 0; i < count; i++) {\n const ib = idBufs[i]!;\n const hb = hashBufs[i]!;\n out.writeUInt16LE(ib.length, o);\n o += 2;\n ib.copy(out, o);\n o += ib.length;\n out.writeUInt16LE(hb.length, o);\n o += 2;\n hb.copy(out, o);\n o += hb.length;\n }\n\n if (dims > 0 && count > 0) {\n const floats = new Float32Array(count * dims);\n for (let i = 0; i < count; i++) {\n const vec = cache.entries[ids[i]!]!.vec;\n const base = i * dims;\n for (let d = 0; d < dims; d++) floats[base + d] = vec[d] ?? 0;\n }\n Buffer.from(floats.buffer, floats.byteOffset, floats.byteLength).copy(out, o);\n }\n\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, out);\n fs.renameSync(tmp, file);\n}\n\n/** Best-effort drop of the old model-named JSON caches under `.vibgrate/cache/`. */\nfunction purgeLegacyJsonCaches(root: string): void {\n const dir = cacheDir(root);\n let names: string[];\n try {\n names = fs.readdirSync(dir);\n } catch {\n return;\n }\n for (const name of names) {\n if (/^embeddings-.+\\.json$/.test(name) || /^embeddings-.+\\.json\\.lock$/.test(name)) {\n try {\n fs.rmSync(path.join(dir, name), { force: true });\n } catch {\n /* best-effort */\n }\n }\n }\n}\n\n// Single-writer lock (shared helper — see ./lock.ts) so a foreground `ask`\n// and a background `embed` never both embed the same repo at once (which\n// would race on the cache file).\n\n/**\n * Node embeddings for the searchable (non-file/external) nodes, cache-backed:\n * only nodes whose embed-text changed are re-embedded. The first run embeds in\n * chunks, **persists the cache incrementally** (so an interrupted/timed-out run\n * resumes instead of wasting the work), and reports progress via `onProgress`.\n */\nexport async function getNodeEmbeddings(\n graph: VgGraph,\n embedder: Embedder,\n root: string,\n onProgress?: EmbedProgress,\n): Promise<Map<string, number[]>> {\n const file = vectorCachePath(root);\n const cache = loadCache(root, embedder.id);\n\n // Includes document nodes (markdown/txt/env examples) so ask can retrieve docs.\n const targets = embedTargets(graph);\n const toEmbed: EmbedTarget[] = [];\n const vectors = new Map<string, number[]>();\n for (const t of targets) {\n const cached = cache.entries[t.id];\n if (cached && cached.hash === t.hash) vectors.set(t.id, cached.vec);\n else toEmbed.push(t);\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n writeBinaryCache(file, cache);\n purgeLegacyJsonCaches(root);\n } catch {\n /* cache write best-effort */\n }\n };\n\n if (toEmbed.length) {\n // Single-writer: if another process (e.g. a background warm-up) is already\n // embedding this repo, don't double-work or race the cache — return what's\n // cached so far (lexical floor still applies). It will be complete next run.\n const lock = `${file}.lock`;\n if (!acquireLock(lock)) return vectors;\n try {\n onProgress?.(0, toEmbed.length);\n let lastWrite = Date.now();\n for (let i = 0; i < toEmbed.length; i += EMBED_CHUNK) {\n const slice = toEmbed.slice(i, i + EMBED_CHUNK);\n const vecs = await embedder.embed(slice.map((t) => t.text));\n slice.forEach((t, j) => {\n const vec = vecs[j] ?? [];\n vectors.set(t.id, vec);\n cache.entries[t.id] = { hash: t.hash, vec };\n });\n onProgress?.(Math.min(i + EMBED_CHUNK, toEmbed.length), toEmbed.length);\n // Persist periodically so a crash/timeout resumes from here next run.\n if (Date.now() - lastWrite >= CACHE_WRITE_INTERVAL_MS) {\n persist();\n lastWrite = Date.now();\n }\n }\n // prune entries for nodes no longer present, then a final authoritative write\n const live = new Set(targets.map((t) => t.id));\n for (const id of Object.keys(cache.entries)) if (!live.has(id)) delete cache.entries[id];\n persist();\n } finally {\n releaseLock(lock);\n }\n } else if (!fs.existsSync(file) && Object.keys(cache.entries).length > 0) {\n // Migrating from legacy JSON with a full hit set — rewrite as binary once\n // so the next run never reads the old path again.\n persist();\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n"]}
1
+ {"version":3,"sources":["../src/engine/lock.ts","../src/engine/embeddings.ts"],"names":["fs","path"],"mappings":";;;;;;;;;AAWO,IAAM,qBAAA,GAAwB,KAAK,EAAA,GAAK,GAAA;AAE/C,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,OAAQ,EAA4B,IAAA,KAAS,OAAA;AAAA,EAC/C;AACF;AAEA,SAAS,WAAA,CAAY,MAAc,OAAA,EAA0B;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,KAAK,EAAA,EAAG,GAAI,KAAK,KAAA,CAASA,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAO,OAAO,QAAA,IAAY,IAAA,CAAK,KAAI,GAAI,EAAA,GAAK,SAAS,OAAO,IAAA;AAChE,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,cAAA,CAAe,GAAG,GAAG,OAAO,IAAA;AAC5D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,QAAA,CAAS,IAAA,EAAc,OAAA,GAAU,qBAAA,EAAgC;AAC/E,EAAA,IAAI,CAAIA,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,OAAO,CAAC,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AACnC;AAGO,SAAS,WAAA,CAAY,IAAA,EAAc,OAAA,GAAU,qBAAA,EAAgC;AAClF,EAAA,MAAM,QAAQ,MAAe;AAC3B,IAAA,IAAI;AACF,MAAGA,cAAeC,KAAA,CAAA,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAM,EAAA,GAAQD,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACjC,MAAGA,GAAA,CAAA,aAAA,CAAc,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,CAAA;AACzE,MAAGA,cAAU,EAAE,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,IAAA;AACpB,EAAA,IAAI,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAGA,GAAA,CAAA,MAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,KAAA,EAAM;AAAA,EACf;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,IAAA,EAAoB;AAC9C,EAAA,IAAI;AACF,IAAGA,GAAA,CAAA,MAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AClBO,SAAS,kBAAkB,KAAA,EAAwB;AACxD,EAAA,OAAO,KAAA,IAAS,mBAAA;AAClB;AAUO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,kBAAuB,KAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,IAAW,QAAQ,CAAA;AAC3E,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,QAAQ,CAAA;AAC7C;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAY,WAAK,aAAA,EAAc,EAAG,UAAU,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC7D;AAOO,SAAS,YAAA,CAAa,OAAA,GAAU,iBAAA,EAAkB,EAAY;AACnE,EAAA,OAAU,GAAA,CAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAChD;AAOO,SAAS,mBAAmB,MAAA,EAAkC;AACnE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,kDAAA,EAAqD,eAAe,CAAA,gNAAA,CAAA;AAAA,IAC7E,KAAK,iBAAA;AACH,MAAA,OAAO,CAAA,0LAAA,CAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,oFAAA,CAAA;AAAA,IACT,KAAK,aAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAA,kEAAA,CAAA;AAAA;AAEb;AASO,SAAS,cAAA,CAAe,OAAA,GAAU,iBAAA,EAAkB,EAAmB;AAC5E,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA,IAAQ,GAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,EAAE;AAC1F;AAGO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,EAAA,IAAI;AACF,IAAG,WAAO,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAa,GAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,CAAA,GAAS,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,WAAA,EAAY,EAAG,KAAA,IAAS,QAAQ,CAAC,CAAA;AAAA,SAClC;AACH,MAAA,IAAI;AACF,QAAA,KAAA,IAAY,GAAA,CAAA,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAkB,CAAA,EAAqB;AAC9C,EAAA,MAAM,OAAQ,CAAA,EAAyC,IAAA;AACvD,EAAA,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,OAAA;AAC3D;AAQO,SAAS,gBAAA,CAAiB,MAAc,OAAA,EAA0B;AACvE,EAAA,MAAM,IAAA,GAAO,gBAAgB,IAAI,CAAA;AACjC,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,IAAK,eAAA,CAAgB,IAAI,CAAA,EAAG,KAAA,KAAU,SAAS,OAAO,IAAA;AAE5E,EAAA,OAAU,GAAA,CAAA,UAAA,CAAW,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAC,CAAA;AAC3D;AAOO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,gBAAgB,IAAI,CAAA;AAC7B;AAGO,SAAS,kBAAkB,SAAA,EAA2B;AAE3D,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,aAAA,CAAc,MAAM,CAAC,CAAA,WAAA,CAAA;AAC1F,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,aAAA,CAAc,MAAM,CAAC,CAAA,WAAA,CAAA;AAE1F,EAAA,MAAM,IAAA,GAAY,eAAS,SAAS,CAAA;AACpC,EAAA,IAAI,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,YAAA,EAAc;AAClD,IAAA,OAAY,KAAA,CAAA,IAAA,CAAU,KAAA,CAAA,OAAA,CAAQ,SAAS,CAAA,EAAG,YAAY,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,WAAA,CAAA;AACjE,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,WAAA,CAAA;AACjE,EAAA,OAAO,GAAG,SAAS,CAAA,WAAA,CAAA;AACrB;AAOA,eAAsB,YAAA,CAAa,OAAA,GAA+B,EAAC,EAA6B;AAG9F,EAAA,IAAI,OAAA,CAAQ,OAAO,OAAO,IAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,CAAQ,KAAK,CAAA;AAE/C,EAAA,IAAI,QAAQ,UAAA,IAAc,CAAC,YAAA,CAAa,OAAO,GAAG,OAAO,IAAA;AACzD,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAA0B,MAAA,KAA0B;AAChE,IAAA,OAAA,CAAQ,aAAA,GAAgB,QAAQ,MAAM,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,EAAmB;AACzC,EAAA,MAAM,MAAW,OAAA,CAAQ,GAAA;AACzB,EAAA,IAAI,CAAC,GAAA,EAAK,aAAA,SAAsB,IAAA,CAAK,eAAA,EAAiB,QAAQ,KAAK,CAAA;AAEnE,EAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,EAAA,IAAI;AACF,IAAG,GAAA,CAAA,SAAA,CAAU,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACzC,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA,GAAI,kBAAkB,aAAa,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI;AAMF,IAAA,MAAM,QAAa,MAAM,WAAA;AAAA,MACvB,GAAA,CAAI,cAAc,IAAA,CAAK;AAAA,QACrB,KAAA,EAAO,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AAAA,QAC5B,QAAA,EAAU,KAAA;AAAA,QACV,oBAAA,EAAsB,QAAQ,oBAAA,IAAwB;AAAA,OACvD,CAAA;AAAA,MACD,kBAAA,EAAmB;AAAA,MACnB;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,iBAAiB,OAAO,CAAA,EAAA,qBAAO,IAAA,CAAK,CAAC,CAAA,EAAE,WAAA,EAAa,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAA;AAAA,MACJ,MAAM,MAAM,KAAA,EAAO;AACjB,QAAA,MAAM,MAAkB,EAAC;AACzB,QAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA,EAAG;AAChD,UAAA,KAAA,MAAW,KAAK,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,CAAsB,CAAC,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,MACA,MAAM,WAAW,IAAA,EAAM;AACrB,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA;AACrC,QAAA,OAAO,KAAA,CAAM,KAAK,CAAsB,CAAA;AAAA,MAC1C;AAAA,KACF;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA,CAAK,kBAAkB,CAAC,CAAA,GAAI,kBAAkB,iBAAA,EAAmB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACpF;AACF;AAkBA,eAAe,kBAAA,GAAmE;AAChF,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,sBAAA;AAC5B,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,aAAA,CAAmB,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAC,CAAA;AAC5D,MAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,GAAA,CAAI,QAAQ,WAAW,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAIR;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,GAAA,GAAW,MAAM,OAAO,aAAA,CAAc,KAAK,CAAA,CAAE,IAAA,CAAA;AACnD,QAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,QAAA,IAAI,QAAA,EAAU,OAAO,EAAE,GAAA,EAAK,QAAA,EAAS;AACrC,QAAA,KAAA,GAAQ,GAAG,OAAO,CAAA,gDAAA,CAAA;AAAA,MACpB;AAAA,IACF,SAAS,CAAA,EAAG;AAKV,MAAA,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAW,MAAM,OAAO,yBAA8B,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,cAAc,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,UAAU,OAAO,EAAE,KAAK,IAAA,EAAM,KAAA,EAAO,SAAS,yCAAA,EAA0C;AAI7F,IAAA,IAAI,OAAO,QAAA,CAAS,gBAAA,KAAqB,UAAA,EAAY,MAAM,SAAS,gBAAA,EAAiB;AACrF,IAAA,OAAO,EAAE,KAAK,QAAA,EAAS;AAAA,EACzB,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,OAAO,KAAA,IAAS,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,EACjD;AACF;AAGA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,KAAA,MAAW,SAAA,IAAa,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA,EAAG;AAClE,IAAA,IAAI,SAAA,EAAW,eAAe,OAAO,SAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAQ,CAAA,EAAoB;AACnC,EAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,EAAA,OAAO,GAAA,CAAI,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACrD;AAGA,SAAS,kBAAA,GAA6B;AACpC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAChD,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AAC3C;AAGA,eAAsB,WAAA,CAAe,OAAA,EAAqB,EAAA,EAAY,OAAA,EAA6B;AACjG,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAQ,IAAA,CAAK;AAAA,MACxB,OAAA;AAAA,MACA,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,QAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,CAAA;AACvD,QAAA,KAAA,CAAM,KAAA,IAAQ;AAAA,MAChB,CAAC;AAAA,KACF,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;AAEA,SAAS,QAAA,CAAS,KAAU,EAAA,EAAqB;AAC/C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,cAAA,IAAkB,EAAC;AACjC,EAAA,IAAI,YAAA,CAAa,KAAK,EAAE,CAAA,SAAU,CAAA,CAAE,aAAA,IAAiB,EAAE,UAAA,IAAc,EAAA;AACrE,EAAA,IAAI,YAAY,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,EAAE,YAAA,IAAgB,EAAA;AACnD,EAAA,IAAI,cAAc,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,EAAE,aAAA,IAAiB,EAAA;AACtD,EAAA,OAAO,EAAA;AACT;AAGA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EACtE,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,cAAA;AAAA,EAAgB,UAAA;AAAA,EACzE,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AAClD,CAAC,CAAA;AAGD,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,MAAS,EAAA,EAAI,OAAA,CAAQ,YAAY,EAAE,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACtE,EAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC3D;AAYO,SAAS,aAAA,CAAc,MAAiB,SAAA,EAA4B;AACzE,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,IAAa,UAAA,EAAY,OAAA,CAAQ,cAAc,EAAE,CAAA;AAExE,IAAA,MAAM,aAAA,GAAwC;AAAA,MAC5C,QAAA,EAAU,4DAAA;AAAA,MACV,MAAA,EAAQ,0CAAA;AAAA,MACR,OAAA,EAAS,uDAAA;AAAA,MACT,EAAA,EAAI,2EAAA;AAAA,MACJ,cAAA,EAAgB,+DAAA;AAAA,MAChB,cAAA,EAAgB,uDAAA;AAAA,MAChB,aAAA,EAAe,iDAAA;AAAA,MACf,SAAA,EAAW,2CAAA;AAAA,MACX,KAAA,EAAO,uEAAA;AAAA,MACP,aAAA,EAAe,sDAAA;AAAA,MACf,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,QAAQ,CAAA,IAAK,QAAA;AACxC,IAAA,OAAO;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MAAA,CACpB,IAAA,CAAK,GAAA,IAAO,EAAA,EAAI,KAAA,CAAM,GAAG,GAAI;AAAA,KAChC,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAAA,EACd;AACA,EAAA,OAAO,CAAC,KAAK,aAAA,EAAe,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,IAAa,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,EAAA,EAAI,YAAY,IAAA,CAAK,IAAI,GAAG,SAAA,IAAa,EAAE,EACjH,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AACb;AAEO,SAAS,MAAA,CAAO,GAAa,CAAA,EAAqB;AACvD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,EAAA,IAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAChB,IAAA,EAAA,IAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,CAAA;AACjC,EAAA,OAAO,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA,CAAA;AAC5C;AAWA,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,uBAAA,GAA0B,IAAA;AAgBhC,IAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AACnD,IAAM,WAAA,GAAc,CAAA;AAEpB,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,OAAO,iBAAA,CAAkB,gBAAA,CAAiB,IAAI,CAAC,CAAA;AACjD;AAGA,SAAS,qBAAA,CAAsB,MAAc,OAAA,EAAyB;AACpE,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA,EAAG,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,KAAA,CAAO,CAAA;AACrE;AAkBO,SAAS,aAAa,KAAA,EAA+B;AAG1D,EAAA,MAAM,YAAY,IAAI,GAAA,CAAA,CAAK,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAU,CAAC,CAAA;AAClF,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG;AAEjC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,UAAA,EAAY;AAChD,IAAA,MAAM,OAAO,aAAA,CAAc,CAAA,EAAG,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACnD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,IAAA,EAAM,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,YAAA,CAAa,KAAA,EAAgB,IAAA,EAAc,OAAA,EAAyB;AAClF,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA;AACzC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AACnC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,EAAE,IAAA,EAAM,OAAA,EAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA;AACT;AAqBO,SAAS,iBAAA,CACd,KAAA,EACA,IAAA,EACA,OAAA,GAAU,mBAAkB,EACV;AAClB,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA;AACzC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AACnC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,CAAA,CAAE,QAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,OAAO,GAAG,CAAA;AAAA,SACtF,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,QAAA,CAAS,CAAA,EAAG,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAA,CAAO,CAAA,EAAE;AACnG;AAEA,SAAS,SAAA,CAAU,MAAc,OAAA,EAA6B;AAC5D,EAAA,MAAM,IAAA,GAAO,gBAAgB,IAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAInB,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAA;AAClD,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAC,CAAA;AACzD,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,OAAA,IAAW,MAAA,CAAO,OAAA,EAAS;AAC9C,QAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,MACnD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,EAAC,EAAE;AACvC;AASA,SAAS,gBAAgB,IAAA,EAAkC;AACzD,EAAA,IAAI,EAAA,GAAoB,IAAA;AACxB,EAAA,IAAI;AACF,IAAA,EAAA,GAAQ,GAAA,CAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAC1B,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAI,GAAG,CAAA;AAC3C,IAAA,MAAM,IAAO,GAAA,CAAA,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAC,CAAA;AACrD,IAAA,IAAI,CAAA,GAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,GAAG,OAAO,IAAA;AAChG,IAAA,IAAI,IAAI,SAAA,CAAU,MAAA;AAClB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,YAAA,CAAa,CAAC,CAAA;AACrC,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,IAAI,OAAA,KAAY,aAAa,OAAO,IAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,CAAC,CAAA;AACtC,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,IAAI,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,CAAA,EAAG;AAExB,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,GAAI,CAAA,GAAI,WAAW,CAAC,CAAA;AACjE,MAAG,aAAS,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvC,MAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,IAAI,EAAA,KAAO,IAAA,EAAS,GAAA,CAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EAClC;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAiC;AAC1D,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG,OAAO,IAAA;AACjE,IAAA,IAAI,IAAI,SAAA,CAAU,MAAA;AAClB,IAAA,IAAI,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA,KAAM,aAAa,OAAO,IAAA;AAChD,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AACnC,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,IAAI,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,GAAA,CAAI,QAAQ,OAAO,IAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,CAAA,EAAG,IAAI,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AAC3D,IAAA,CAAA,IAAK,QAAA;AACL,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAC/B,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAChC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAA,CAAgB,MAAc,OAAA,EAAoC;AACzE,EAAA,IAAI,CAAI,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAS,iBAAa,IAAI,CAAA;AAChC,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,SAAA,CAAU,MAAA,GAAS,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,UAAU,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,GAAG,OAAO,IAAA;AACtG,IAAA,IAAI,IAAI,SAAA,CAAU,MAAA;AAClB,IAAA,IAAI,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA,KAAM,aAAa,OAAO,IAAA;AAChD,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AACnC,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,CAAA,EAAG,IAAI,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AAC3D,IAAA,CAAA,IAAK,QAAA;AACL,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,IAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAC/B,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAChC,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,IAAI,IAAA,KAAS,KAAK,KAAA,KAAU,CAAA,SAAU,EAAE,KAAA,EAAO,OAAA,EAAS,EAAC,EAAE;AAE3D,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAChC,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,GAAA,CAAI,IAAA,CAAK,IAAI,QAAA,CAAS,CAAA,EAAG,IAAI,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACpD,MAAA,CAAA,IAAK,KAAA;AACL,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,YAAA,CAAa,CAAC,CAAA;AAClC,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,QAAA,CAAS,CAAA,EAAG,IAAI,OAAO,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACzD,MAAA,CAAA,IAAK,OAAA;AAAA,IACP;AACA,IAAA,MAAM,eAAe,KAAA,GAAQ,IAAA;AAC7B,IAAA,MAAM,cAAc,YAAA,GAAe,CAAA;AACnC,IAAA,IAAI,CAAA,GAAI,WAAA,GAAc,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AAEzC,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,GAAI,WAAW,CAAC,CAAA;AAC7D,IAAA,MAAM,SAAS,IAAI,YAAA,CAAa,SAAS,MAAA,EAAQ,QAAA,CAAS,YAAY,YAAY,CAAA;AAElF,IAAA,MAAM,UAAiC,EAAC;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,QAAQ,CAAA,GAAI,IAAA;AAClB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,KAAA,EAAO,KAAA,GAAQ,IAAI,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA,GAAI,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAI,GAAA,EAAI;AAAA,IAC7C;AACA,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAyB;AAC/D,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACrC,EAAA,MAAM,QAAQ,GAAA,CAAI,MAAA;AAClB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,EAAE,EAAG,GAAA,CAAI,MAAA;AACjC,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,IAAA,GAAO,CAAA;AACP,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AAChD,EAAA,IAAI,SAAS,MAAA,GAAS,KAAA,EAAQ,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAGvE,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,CAAA,CAAG,MAAM,MAAM,CAAA;AACtD,IAAA,IAAI,EAAA,CAAG,SAAS,KAAA,IAAU,EAAA,CAAG,SAAS,KAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,0BAA0B,CAAA;AACxF,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,IAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,IAAA,UAAA,IAAc,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,CAAA,GAAI,EAAA,CAAG,MAAA;AAAA,EACvC;AAEA,EAAA,MAAM,cAAc,SAAA,CAAU,MAAA,GAAS,IAAI,CAAA,GAAI,QAAA,CAAS,SAAS,CAAA,GAAI,CAAA;AACrE,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,GAAO,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,WAAA,CAAY,WAAA,GAAc,aAAa,QAAQ,CAAA;AAClE,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AACrB,EAAA,CAAA,IAAK,SAAA,CAAU,MAAA;AACf,EAAA,GAAA,CAAI,aAAA,CAAc,aAAa,CAAC,CAAA;AAChC,EAAA,CAAA,IAAK,CAAA;AACL,EAAA,GAAA,CAAI,aAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,CAAC,CAAA;AACpC,EAAA,CAAA,IAAK,CAAA;AACL,EAAA,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AACpB,EAAA,CAAA,IAAK,QAAA,CAAS,MAAA;AACd,EAAA,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AACzB,EAAA,CAAA,IAAK,CAAA;AACL,EAAA,GAAA,CAAI,aAAA,CAAc,OAAO,CAAC,CAAA;AAC1B,EAAA,CAAA,IAAK,CAAA;AAEL,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,IAAA,GAAA,CAAI,aAAA,CAAc,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA;AAC9B,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACd,IAAA,CAAA,IAAK,EAAA,CAAG,MAAA;AACR,IAAA,GAAA,CAAI,aAAA,CAAc,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA;AAC9B,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACd,IAAA,CAAA,IAAK,EAAA,CAAG,MAAA;AAAA,EACV;AAEA,EAAA,IAAI,IAAA,GAAO,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,KAAA,GAAQ,IAAI,CAAA;AAC5C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA,CAAG,GAAA;AACpC,MAAA,MAAM,OAAO,CAAA,GAAI,IAAA;AACjB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAAA,IAC9D;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,UAAU,CAAA,CAAE,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAG,cAAe,KAAA,CAAA,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACtC,EAAG,GAAA,CAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACzB,EAAG,GAAA,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACzB;AAGA,SAAS,sBAAsB,IAAA,EAAoB;AACjD,EAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAW,gBAAY,GAAG,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,wBAAwB,IAAA,CAAK,IAAI,KAAK,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA,EAAG;AAClF,MAAA,IAAI;AACF,QAAG,GAAA,CAAA,MAAA,CAAY,WAAK,GAAA,EAAK,IAAI,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAYA,eAAsB,iBAAA,CACpB,KAAA,EACA,QAAA,EACA,IAAA,EACA,UAAA,EACgC;AAChC,EAAA,MAAM,IAAA,GAAO,gBAAgB,IAAI,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AAGzC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AACjC,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,CAAA,CAAE,IAAA,UAAc,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,MAAA,CAAO,GAAG,CAAA;AAAA,SAC7D,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACrB;AAGA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI;AACF,MAAA,gBAAA,CAAiB,MAAM,KAAK,CAAA;AAC5B,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAIlB,IAAA,MAAM,IAAA,GAAO,GAAG,IAAI,CAAA,KAAA,CAAA;AACpB,IAAA,IAAI,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG,OAAO,OAAA;AAC/B,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,CAAA,EAAG,QAAQ,MAAM,CAAA;AAC9B,MAAA,IAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,KAAK,WAAA,EAAa;AACpD,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1D,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AACxB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AACrB,UAAA,KAAA,CAAM,OAAA,CAAQ,EAAE,EAAE,CAAA,GAAI,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAI;AAAA,QAC5C,CAAC,CAAA;AACD,QAAA,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,GAAI,WAAA,EAAa,QAAQ,MAAM,CAAA,EAAG,QAAQ,MAAM,CAAA;AAEtE,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,uBAAA,EAAyB;AACrD,UAAA,OAAA,EAAQ;AACR,UAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7C,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,IAAI,CAAC,IAAA,CAAK,IAAI,EAAE,CAAA,EAAG,OAAO,KAAA,CAAM,QAAQ,EAAE,CAAA;AACvF,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,MAAA,IAAW,CAAI,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AAGxE,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,KAAK,EAAA,EAAoB;AAChC,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACzC","file":"chunk-FQHWPOTS.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Cross-process single-writer lock (O_EXCL create), shared by the embedding\n * cache writer and the auto-refresh rebuild so two vg processes never write\n * the same repo-local artifact at once. A lock whose owning process is dead,\n * or that is older than `staleMs`, is presumed abandoned and reclaimed.\n */\n\n/** A lock older than this is presumed dead (crashed process). */\nexport const DEFAULT_LOCK_STALE_MS = 15 * 60 * 1000;\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException).code === 'EPERM'; // exists, just not ours to signal\n }\n}\n\nfunction lockIsStale(file: string, staleMs: number): boolean {\n try {\n const { pid, at } = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: number; at?: number };\n if (typeof at === 'number' && Date.now() - at > staleMs) return true;\n if (typeof pid === 'number' && !isProcessAlive(pid)) return true;\n return false;\n } catch {\n return true; // unreadable/corrupt → reclaim it\n }\n}\n\n/**\n * True when a live process is holding this lock right now. Read-only: it never\n * reclaims, so a caller can politely stand down (the vgd semantic warm does\n * this rather than embedding a repo a `vg embed` child is already embedding).\n */\nexport function lockHeld(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n if (!fs.existsSync(file)) return false;\n return !lockIsStale(file, staleMs);\n}\n\n/** Take the lock (O_EXCL), reclaiming a stale/dead one. Returns success. */\nexport function acquireLock(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n const write = (): boolean => {\n try {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const fd = fs.openSync(file, 'wx');\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: Date.now() }));\n fs.closeSync(fd);\n return true;\n } catch {\n return false;\n }\n };\n if (write()) return true;\n if (lockIsStale(file, staleMs)) {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* another process may have reclaimed it */\n }\n return write();\n }\n return false;\n}\n\nexport function releaseLock(file: string): void {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* best-effort */\n }\n}\n","import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { hashString } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { resolveGraphPath } from './artifacts.js';\nimport { acquireLock, lockHeld, releaseLock } from './lock.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Local-embedding semantic search for `vg ask --semantic`/`--deep` (no API key).\n *\n * The embedding backend is OPTIONAL and lazily loaded (the vendored\n * `src/vendor/fastembed` dense backend over `onnxruntime-node`, local ONNX)\n * so the core install stays lean and `ask` never breaks:\n * if the backend or model isn't available it degrades to (prefix-fuzzy) lexical\n * search with a clear note. Per-repo vectors live in a binary `*.embeddings`\n * file **alongside the code map** (global store under Application Support /\n * XDG data, or `.vibgrate/embeddings` in-repo) — never model-named, never under\n * `.vibgrate/cache/`, and NEVER inside the committed `graph.json`, so the map\n * stays byte-deterministic. The model id is recorded inside the file header so\n * a model change still invalidates the cache without putting the name in the\n * path.\n *\n * `--local` disables the model download (semantic is skipped unless already\n * cached via an injected backend), keeping the air-gapped guarantee.\n */\n\nexport interface Embedder {\n /** Stable model id (recorded with cached vectors so a model change invalidates them). */\n id: string;\n /** Embed documents → unit-or-raw vectors (cosine handles normalization). */\n embed(texts: string[]): Promise<number[][]>;\n /** Embed a single query string. */\n embedQuery(text: string): Promise<number[]>;\n}\n\n/** Why semantic fell back to lexical — for calm, specific messaging. */\nexport type EmbedUnavailable = 'not-installed' | 'no-permission' | 'download-failed' | 'init-failed';\n\nexport interface LoadEmbedderOptions {\n local?: boolean; // --local: do not download a model\n model?: string; // override the embedding model id\n noDownload?: boolean; // only load if the model is already cached (never fetch)\n showDownloadProgress?: boolean; // let fastembed print its one-time download progress\n /**\n * Called (not thrown) when the backend can't load. `detail` carries the\n * underlying loader error when there is one, so a host can log something\n * actionable instead of a bare category.\n */\n onUnavailable?: (reason: EmbedUnavailable, detail?: string) => void;\n}\n\n/** The embedding model id in effect (explicit override → default). */\nexport function resolveEmbedModel(model?: string): string {\n return model ?? 'bge-small-en-v1.5';\n}\n\n/**\n * The **central, per-user** model cache — downloaded once per machine and shared\n * across every repo/folder (devs have many repos; the ~tens-of-MB model should\n * not re-download per project). Uses the XDG standard:\n * `$XDG_CACHE_HOME/vibgrate/models` (or `~/.cache/vibgrate/models`); relocate via\n * the standard `XDG_CACHE_HOME`. NB: fastembed's own default is the relative\n * `./local_cache`, i.e. per-CWD — which we override.\n */\nexport function modelCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'models');\n}\n\n/** A machine-global marker written once the model has loaded successfully. */\nfunction modelReadyMarker(modelId: string): string {\n return path.join(modelCacheDir(), `.ready-${safe(modelId)}`);\n}\n\n/**\n * Whether the embedding model is already present on this machine (loaded at least\n * once), so it can be used with **no network**. Lets the background warm-up\n * trigger only when it won't surprise-download.\n */\nexport function isModelReady(modelId = resolveEmbedModel()): boolean {\n return fs.existsSync(modelReadyMarker(modelId));\n}\n\n/**\n * A calm, specific, actionable one-liner for why semantic isn't available right\n * now — built to reassure (lexical still works) and inform, never to alarm. No\n * stack traces, no scary words; always names the off switch and the fix.\n */\nexport function unavailableMessage(reason: EmbedUnavailable): string {\n switch (reason) {\n case 'no-permission':\n return `semantic search couldn't write its model cache at ${modelCacheDir()} — using fast lexical search instead. Relocate it with the standard XDG_CACHE_HOME, or run with --local to stay lexical quietly. (No admin/sudo is ever needed — the cache lives in your home folder.)`;\n case 'download-failed':\n return `the semantic model isn't downloaded yet and couldn't be fetched (offline?) — using fast lexical search. It'll try again next time; run with --local to keep lexical without retrying.`;\n case 'not-installed':\n return `the optional semantic backend isn't available here — using fast lexical search.`;\n case 'init-failed':\n default:\n return `the semantic model couldn't load — using fast lexical search.`;\n }\n}\n\nexport interface ModelCacheInfo {\n dir: string;\n present: boolean;\n bytes: number;\n}\n\n/** Where the shared model lives, whether it's present, and how big it is. */\nexport function modelCacheInfo(modelId = resolveEmbedModel()): ModelCacheInfo {\n const dir = modelCacheDir();\n return { dir, present: isModelReady(modelId) || fs.existsSync(dir), bytes: dirSize(dir) };\n}\n\n/** Remove the shared, re-downloadable model from the central cache. Returns bytes freed. */\nexport function clearModelCache(): number {\n const dir = modelCacheDir();\n const bytes = dirSize(dir);\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n return bytes;\n}\n\nfunction dirSize(dir: string): number {\n let total = 0;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) total += dirSize(p);\n else {\n try {\n total += fs.statSync(p).size;\n } catch {\n /* skip unreadable */\n }\n }\n }\n return total;\n}\n\nfunction isPermissionError(e: unknown): boolean {\n const code = (e as NodeJS.ErrnoException | undefined)?.code;\n return code === 'EACCES' || code === 'EPERM' || code === 'EROFS';\n}\n\n/**\n * Whether this repo already has a cached vector set for `modelId` — i.e. semantic\n * search has run here before, so the next run is fast (no first-use download/embed).\n * Lets `ask` show the one-time setup note only when it's actually warranted.\n * Checks the binary sidecar next to the map (and the legacy JSON path once).\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n const file = vectorCachePath(root);\n if (fs.existsSync(file) && readCacheHeader(file)?.model === modelId) return true;\n // One-shot legacy: pre-binary caches lived under `.vibgrate/cache/embeddings-<model>.json`.\n return fs.existsSync(legacyVectorCachePath(root, modelId));\n}\n\n/**\n * Path of the binary embeddings file for this repo's current map — always named\n * `embeddings` (or `<snapshot>.embeddings` next to a branch-keyed graph), never\n * after the model. Exported for `vg embed --where` and tests.\n */\nexport function embeddingsPath(root: string): string {\n return vectorCachePath(root);\n}\n\n/** Sidecar path next to a map file: `…/branch-main.graph.json` → `…/branch-main.embeddings`. */\nexport function embeddingsPathFor(graphPath: string): string {\n // Branch-keyed global maps: `…/graphs/branch-main.graph.json` → `…/graphs/branch-main.embeddings`.\n if (graphPath.endsWith('.graph.json')) return `${graphPath.slice(0, -'.graph.json'.length)}.embeddings`;\n if (graphPath.endsWith('.graph.snap')) return `${graphPath.slice(0, -'.graph.snap'.length)}.embeddings`;\n // In-repo map is exactly `…/graph.json` (or `graph.snap`) → plain `…/embeddings`.\n const base = path.basename(graphPath);\n if (base === 'graph.json' || base === 'graph.snap') {\n return path.join(path.dirname(graphPath), 'embeddings');\n }\n if (graphPath.endsWith('.json')) return `${graphPath.slice(0, -5)}.embeddings`;\n if (graphPath.endsWith('.snap')) return `${graphPath.slice(0, -5)}.embeddings`;\n return `${graphPath}.embeddings`;\n}\n\n/**\n * Try to load the optional local embedding backend. Returns null (→ caller falls\n * back to lexical) when running `--local`, when the dependency isn't installed,\n * or when the model can't initialize.\n */\nexport async function loadEmbedder(options: LoadEmbedderOptions = {}): Promise<Embedder | null> {\n // `--local` forces the deterministic lexical floor with no model load/download\n // (air-gapped guarantee; also how tests stay offline).\n if (options.local) return null;\n const modelId = resolveEmbedModel(options.model);\n // noDownload (used by the background warm-up): never fetch — bail if not cached.\n if (options.noDownload && !isModelReady(modelId)) return null;\n const fail = (reason: EmbedUnavailable, detail?: string): null => {\n options.onUnavailable?.(reason, detail);\n return null;\n };\n\n // Lazy, optional dependency (native ONNX): loaded only for `vg ask`/`embed`,\n // never by build/verify, so the graph artifact stays deterministic.\n const backend = await importEmbedBackend();\n const mod: any = backend.mod;\n if (!mod?.FlagEmbedding) return fail('not-installed', backend.error);\n\n const cache = modelCacheDir(); // central, shared across all repos\n try {\n fs.mkdirSync(cache, { recursive: true });\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'init-failed');\n }\n\n try {\n // First use fetches the model. A refused connection fails fast, but a\n // black-holing proxy (common on corporate networks) would hang the first\n // `vg ask` / MCP query_graph forever — bound the wait and fall back to\n // lexical instead. Cached loads are local disk and get the same generous\n // ceiling without ever hitting it.\n const model: any = await withTimeout(\n mod.FlagEmbedding.init({\n model: mapModel(mod, modelId),\n cacheDir: cache,\n showDownloadProgress: options.showDownloadProgress ?? false,\n }) as Promise<unknown>,\n embedInitTimeoutMs(),\n 'embedding model init timed out',\n );\n // Record machine-global readiness so future builds can warm up offline.\n try {\n fs.writeFileSync(modelReadyMarker(modelId), new Date(0).toISOString());\n } catch {\n /* marker is best-effort */\n }\n return {\n id: modelId,\n async embed(texts) {\n const out: number[][] = [];\n for await (const batch of model.embed(texts, 64)) {\n for (const v of batch) out.push(Array.from(v as ArrayLike<number>));\n }\n return out;\n },\n async embedQuery(text) {\n const v = await model.queryEmbed(text);\n return Array.from(v as ArrayLike<number>);\n },\n };\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'download-failed', errText(e));\n }\n}\n\n/**\n * Import the optional embedding backend — the VENDORED dense backend\n * (src/vendor/fastembed). It still needs the optional native deps\n * (`onnxruntime-node`, `@anush008/tokenizers`, `tar`), which a host can supply\n * out-of-tree via `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules`\n * contains them. Editor integrations use this when their bundled engine ships\n * without the native optional dependencies (the VS Code extension installs\n * them into its own storage on consent); the host dir wins over this package's\n * own dependency tree so the copies the user consented to are the ones that\n * load (see `ensureNativeDeps` in the vendored module).\n *\n * Legacy host contract: a host dir holding a whole upstream `fastembed`\n * install (what older extension versions set up) is still honored, and wins,\n * so an engine upgrade never breaks a backend the user already consented to.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<{ mod: any | null; error?: string }> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n let error: string | undefined;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n let entry: string | null = null;\n try {\n entry = req.resolve('fastembed');\n } catch {\n // No upstream fastembed in the host dir — the normal state under the\n // current contract (the host supplies only the native deps, resolved\n // by the vendored backend below). Not an error worth reporting.\n }\n if (entry) {\n const mod: any = await import(pathToFileURL(entry).href);\n const resolved = unwrapBackend(mod);\n if (resolved) return { mod: resolved };\n error = `${hostDir}: fastembed loaded but exported no FlagEmbedding`;\n }\n } catch (e) {\n // Keep the reason. A host-supplied backend that resolves but won't load\n // (native binary built for another ABI, a half-extracted tree, a missing\n // transitive dep) is indistinguishable from \"never installed\" once the\n // error is dropped — and that is the one failure a user cannot act on.\n error = `${hostDir}: ${errText(e)}`;\n }\n }\n try {\n const mod: any = await import('../vendor/fastembed/index.js');\n const resolved = unwrapBackend(mod);\n if (!resolved) return { mod: null, error: error ?? 'embed backend exported no FlagEmbedding' };\n // Load the native deps now (host dir first — see the vendored module), so\n // a missing or broken install surfaces here as \"not-installed\" with the\n // real reason instead of failing later mid-init.\n if (typeof resolved.ensureNativeDeps === 'function') await resolved.ensureNativeDeps();\n return { mod: resolved };\n } catch (e) {\n return { mod: null, error: error ?? errText(e) };\n }\n}\n\n/** A CJS entry imported over ESM may nest its exports one or two `default`s deep. */\nfunction unwrapBackend(mod: any): any | null {\n for (const candidate of [mod, mod?.default, mod?.default?.default]) {\n if (candidate?.FlagEmbedding) return candidate;\n }\n return null;\n}\n\nfunction errText(e: unknown): string {\n const msg = e instanceof Error ? e.message : String(e);\n return msg.replace(/\\s+/g, ' ').trim().slice(0, 300);\n}\n\n/** Ceiling for the one-time model fetch/init; override via VG_EMBED_TIMEOUT_MS. */\nfunction embedInitTimeoutMs(): number {\n const n = Number(process.env.VG_EMBED_TIMEOUT_MS);\n return Number.isFinite(n) && n > 0 ? n : 60_000;\n}\n\n/** Reject `promise` if it hasn't settled within `ms` (the work itself is not cancelled). */\nexport async function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), ms);\n timer.unref?.();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction mapModel(mod: any, id: string): unknown {\n const m = mod.EmbeddingModel ?? {};\n if (/bge-small/i.test(id)) return m.BGESmallENV15 ?? m.BGESmallEN ?? id;\n if (/bge-base/i.test(id)) return m.BGEBaseENV15 ?? id;\n if (/all-minilm/i.test(id)) return m.AllMiniLML6V2 ?? id;\n return id;\n}\n\n/** Path segments that carry no semantic signal — dropped from embed context. */\nconst PATH_NOISE = new Set([\n 'src', 'app', 'apps', 'lib', 'libs', 'dist', 'build', 'out', 'index', 'main',\n 'packages', 'pkg', 'test', 'tests', '__tests__', 'spec', 'node_modules', 'internal',\n 'com', 'example', 'demo', 'java', 'net', 'org', 'www',\n]);\n\n/** Meaningful path context for a node: a couple of parent dirs + the filename stem. */\nfunction pathContext(file: string): string {\n const parts = file.split('/');\n const stem = (parts.pop() ?? '').replace(/\\.[^.]+$/, '');\n const dirs = parts.filter((p) => p && !PATH_NOISE.has(p.toLowerCase()));\n return [...dirs.slice(-2), stem].filter(Boolean).join(' ');\n}\n\n/**\n * The text we embed for a node. Alongside identity + signature we add the\n * strongest available signal — the node's **doc-comment / docstring** summary —\n * plus lightweight context already on the graph (file-path words, area label), so\n * a tersely-named symbol (`Table`, `NotificationJob`) a concept query can reach.\n *\n * `document` nodes (markdown, manifests, Docker, CI, OpenAPI, …) put the\n * scrubbed body in `doc` — that body is the primary embed signal so `vg ask`\n * can answer project-context questions, not only code symbols.\n */\nexport function nodeEmbedText(node: GraphNode, areaLabel?: string): string {\n if (node.kind === 'document') {\n const category = (node.signature ?? 'document').replace(/^document:/, '');\n // Category keywords help ops/config queries land on the right file type.\n const categoryHints: Record<string, string> = {\n manifest: 'package dependencies scripts install dependencies versions',\n docker: 'dockerfile container image build runtime',\n compose: 'docker-compose services containers networking volumes',\n ci: 'continuous integration github actions workflow pipeline test build deploy',\n 'build-config': 'typescript tsconfig bundler vite webpack eslint prettier test',\n 'api-contract': 'openapi swagger graphql protobuf api schema endpoints',\n 'task-runner': 'makefile justfile tasks build test run commands',\n workspace: 'monorepo workspace packages pnpm turbo nx',\n infra: 'deploy infrastructure kubernetes kubernetes terraform helm kubernetes',\n 'env-example': 'environment variables configuration secrets template',\n markdown: 'documentation readme guide',\n };\n const hint = categoryHints[category] ?? category;\n return [\n node.qualifiedName,\n 'document',\n category,\n hint,\n pathContext(node.file),\n (node.doc ?? '').slice(0, 5000),\n ]\n .filter(Boolean)\n .join('\\n');\n }\n return [node.qualifiedName, node.kind, node.signature ?? '', node.doc ?? '', pathContext(node.file), areaLabel ?? '']\n .filter(Boolean)\n .join(' ');\n}\n\nexport function cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\ninterface EmbedCache {\n model: string;\n entries: Record<string, { hash: string; vec: number[] }>;\n}\n\n/** Reports embedding progress: how many of `total` nodes are done so far. */\nexport type EmbedProgress = (done: number, total: number) => void;\n\n/** Nodes embedded per chunk — bounds memory and gives progress granularity. */\nconst EMBED_CHUNK = 256;\n/** Min gap between incremental cache writes (ms) — caps IO on big repos. */\nconst CACHE_WRITE_INTERVAL_MS = 1500;\n\n/**\n * Binary embeddings format (local cache next to the map, never committed):\n *\n * MAGIC \"VGEMB1\\0\" · u16 version · u16 modelLen · model utf8 ·\n * u32 dims · u32 count ·\n * for each entry: u16 idLen · id · u16 hashLen · hash ·\n * then contiguous Float32LE vectors [count × dims]\n *\n * Why binary: a medium map (~4k nodes × 384 dims) is ~6 MB of floats but was\n * ~30 MB of JSON with full decimal text — slow to parse and noisy in source\n * control if it ever landed under the repo. The filename is always\n * `embeddings` / `<snapshot>.embeddings`; the model id lives only in the header.\n */\n/** 8-byte little-endian-friendly magic (same width as graph `VGSNAP1\\0`). */\nconst EMB_MAGIC = Buffer.from('VGEMB01\\0', 'latin1');\nconst EMB_VERSION = 1;\n\nfunction vectorCachePath(root: string): string {\n return embeddingsPathFor(resolveGraphPath(root));\n}\n\n/** Pre-binary path: `.vibgrate/cache/embeddings-<model>.json` (read once to migrate). */\nfunction legacyVectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/** One node's contribution to the semantic index: what is embedded, and its hash. */\nexport interface EmbedTarget {\n id: string;\n text: string;\n hash: string;\n}\n\n/**\n * The nodes the semantic index covers, and the exact text embedded for each.\n *\n * This is the single definition of \"what is in the index\", shared by the\n * on-disk cache (`vg embed`, `vg ask`) and vgd's in-memory slot index. They\n * used to compute it separately — vgd embedded *every* node with a shorter\n * text — so the two indexes described different things and vgd re-embedded\n * work the disk cache had already done. Keep them on this one function.\n */\nexport function embedTargets(graph: VgGraph): EmbedTarget[] {\n // Tolerant of a partial graph: vgd indexes whatever a client publishes, and\n // an `areas`-less map is a valid (if unlabelled) one.\n const areaLabel = new Map((graph.areas ?? []).map((a) => [a.id, a.label] as const));\n const targets: EmbedTarget[] = [];\n for (const n of graph.nodes ?? []) {\n // file/external stay out of the index; document (docs/env examples) are in.\n if (n.kind === 'file' || n.kind === 'external') continue;\n const text = nodeEmbedText(n, areaLabel.get(n.area));\n targets.push({ id: n.id, text, hash: hashString(text) });\n }\n return targets;\n}\n\n/**\n * How many searchable nodes still need embedding for `modelId` — cheap (hashes\n * the embed-text, reads only the cache; never loads the model). Lets the embed\n * command / background warm-up exit instantly when nothing changed.\n */\nexport function countPending(graph: VgGraph, root: string, modelId: string): number {\n const entries = loadCache(root, modelId).entries;\n let pending = 0;\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (!cached || cached.hash !== t.hash) pending++;\n }\n return pending;\n}\n\n/** What a reader (vgd) finds in this repo's on-disk vector cache. */\nexport interface CachedVectorRead {\n model: string;\n /** nodeId → vector, for every node whose cached hash still matches. */\n vectors: Map<string, number[]>;\n /** Targets the cache does not cover yet. */\n pending: EmbedTarget[];\n /** True while another process holds the cache's single-writer lock. */\n writerBusy: boolean;\n}\n\n/**\n * Read this repo's vector cache without loading the embedding backend.\n *\n * vgd warms its slot index from here first: on a repo `vg embed` has already\n * warmed, a slot goes `ready` in milliseconds with no worker and no duplicated\n * embedding. `writerBusy` reports the single-writer lock so vgd can stand down\n * while the `vg build` warm-up child is mid-run instead of racing it.\n */\nexport function readCachedVectors(\n graph: VgGraph,\n root: string,\n modelId = resolveEmbedModel(),\n): CachedVectorRead {\n const entries = loadCache(root, modelId).entries;\n const vectors = new Map<string, number[]>();\n const pending: EmbedTarget[] = [];\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (cached && cached.hash === t.hash && cached.vec.length > 0) vectors.set(t.id, cached.vec);\n else pending.push(t);\n }\n return { model: modelId, vectors, pending, writerBusy: lockHeld(`${vectorCachePath(root)}.lock`) };\n}\n\nfunction loadCache(root: string, modelId: string): EmbedCache {\n const file = vectorCachePath(root);\n const binary = readBinaryCache(file, modelId);\n if (binary) return binary;\n\n // Migrate legacy JSON if present (once) — keep working after upgrade without\n // re-embedding the whole repo.\n const legacy = legacyVectorCachePath(root, modelId);\n if (fs.existsSync(legacy)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(legacy, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) {\n return { model: modelId, entries: loaded.entries };\n }\n } catch {\n /* treat as empty */\n }\n }\n return { model: modelId, entries: {} };\n}\n\ninterface EmbedHeader {\n model: string;\n dims: number;\n count: number;\n}\n\n/** Cheap header-only peek (no vectors) for `embeddingsCached` / diagnostics. */\nfunction readCacheHeader(file: string): EmbedHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(8 + 2 + 2 + 512); // magic + ver + modelLen + model (capped)\n const n = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (n < EMB_MAGIC.length + 4 || !prefix.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n const version = prefix.readUInt16LE(o);\n o += 2;\n if (version !== EMB_VERSION) return null;\n const modelLen = prefix.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > n) {\n // model spills past our prefix — re-read exactly\n const full = Buffer.alloc(EMB_MAGIC.length + 2 + 2 + modelLen + 8);\n fs.readSync(fd, full, 0, full.length, 0);\n return parseHeaderPrefix(full);\n }\n return parseHeaderPrefix(prefix);\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\nfunction parseHeaderPrefix(buf: Buffer): EmbedHeader | null {\n try {\n if (!buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > buf.length) return null;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n return { model, dims, count };\n } catch {\n return null;\n }\n}\n\nfunction readBinaryCache(file: string, modelId: string): EmbedCache | null {\n if (!fs.existsSync(file)) return null;\n try {\n const buf = fs.readFileSync(file);\n if (buf.length < EMB_MAGIC.length + 4 || !buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n if (model !== modelId) return null;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n o += 4;\n if (dims === 0 || count === 0) return { model, entries: {} };\n\n const ids: string[] = [];\n const hashes: string[] = [];\n for (let i = 0; i < count; i++) {\n const idLen = buf.readUInt16LE(o);\n o += 2;\n ids.push(buf.subarray(o, o + idLen).toString('utf8'));\n o += idLen;\n const hashLen = buf.readUInt16LE(o);\n o += 2;\n hashes.push(buf.subarray(o, o + hashLen).toString('utf8'));\n o += hashLen;\n }\n const floatsNeeded = count * dims;\n const bytesNeeded = floatsNeeded * 4;\n if (o + bytesNeeded > buf.length) return null;\n // Copy into a standalone ArrayBuffer so Float32Array views are safe after buf is GC'd.\n const floatBuf = Buffer.from(buf.subarray(o, o + bytesNeeded));\n const floats = new Float32Array(floatBuf.buffer, floatBuf.byteOffset, floatsNeeded);\n\n const entries: EmbedCache['entries'] = {};\n for (let i = 0; i < count; i++) {\n const start = i * dims;\n const vec = Array.from(floats.subarray(start, start + dims));\n entries[ids[i]!] = { hash: hashes[i]!, vec };\n }\n return { model, entries };\n } catch {\n return null;\n }\n}\n\nfunction writeBinaryCache(file: string, cache: EmbedCache): void {\n const ids = Object.keys(cache.entries);\n const count = ids.length;\n let dims = 0;\n for (const id of ids) {\n const d = cache.entries[id]!.vec.length;\n if (d > 0) {\n dims = d;\n break;\n }\n }\n // Empty or all-zero-dim cache: still write a valid header so \"cached\" is true.\n const modelBuf = Buffer.from(cache.model, 'utf8');\n if (modelBuf.length > 0xffff) throw new Error('embed model id too long');\n\n // Index size (ids + hashes)\n let indexBytes = 0;\n const idBufs: Buffer[] = [];\n const hashBufs: Buffer[] = [];\n for (const id of ids) {\n const ib = Buffer.from(id, 'utf8');\n const hb = Buffer.from(cache.entries[id]!.hash, 'utf8');\n if (ib.length > 0xffff || hb.length > 0xffff) throw new Error('embed entry key too long');\n idBufs.push(ib);\n hashBufs.push(hb);\n indexBytes += 2 + ib.length + 2 + hb.length;\n }\n\n const headerBytes = EMB_MAGIC.length + 2 + 2 + modelBuf.length + 4 + 4;\n const vecBytes = count * dims * 4;\n const out = Buffer.allocUnsafe(headerBytes + indexBytes + vecBytes);\n let o = 0;\n EMB_MAGIC.copy(out, o);\n o += EMB_MAGIC.length;\n out.writeUInt16LE(EMB_VERSION, o);\n o += 2;\n out.writeUInt16LE(modelBuf.length, o);\n o += 2;\n modelBuf.copy(out, o);\n o += modelBuf.length;\n out.writeUInt32LE(dims, o);\n o += 4;\n out.writeUInt32LE(count, o);\n o += 4;\n\n for (let i = 0; i < count; i++) {\n const ib = idBufs[i]!;\n const hb = hashBufs[i]!;\n out.writeUInt16LE(ib.length, o);\n o += 2;\n ib.copy(out, o);\n o += ib.length;\n out.writeUInt16LE(hb.length, o);\n o += 2;\n hb.copy(out, o);\n o += hb.length;\n }\n\n if (dims > 0 && count > 0) {\n const floats = new Float32Array(count * dims);\n for (let i = 0; i < count; i++) {\n const vec = cache.entries[ids[i]!]!.vec;\n const base = i * dims;\n for (let d = 0; d < dims; d++) floats[base + d] = vec[d] ?? 0;\n }\n Buffer.from(floats.buffer, floats.byteOffset, floats.byteLength).copy(out, o);\n }\n\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, out);\n fs.renameSync(tmp, file);\n}\n\n/** Best-effort drop of the old model-named JSON caches under `.vibgrate/cache/`. */\nfunction purgeLegacyJsonCaches(root: string): void {\n const dir = cacheDir(root);\n let names: string[];\n try {\n names = fs.readdirSync(dir);\n } catch {\n return;\n }\n for (const name of names) {\n if (/^embeddings-.+\\.json$/.test(name) || /^embeddings-.+\\.json\\.lock$/.test(name)) {\n try {\n fs.rmSync(path.join(dir, name), { force: true });\n } catch {\n /* best-effort */\n }\n }\n }\n}\n\n// Single-writer lock (shared helper — see ./lock.ts) so a foreground `ask`\n// and a background `embed` never both embed the same repo at once (which\n// would race on the cache file).\n\n/**\n * Node embeddings for the searchable (non-file/external) nodes, cache-backed:\n * only nodes whose embed-text changed are re-embedded. The first run embeds in\n * chunks, **persists the cache incrementally** (so an interrupted/timed-out run\n * resumes instead of wasting the work), and reports progress via `onProgress`.\n */\nexport async function getNodeEmbeddings(\n graph: VgGraph,\n embedder: Embedder,\n root: string,\n onProgress?: EmbedProgress,\n): Promise<Map<string, number[]>> {\n const file = vectorCachePath(root);\n const cache = loadCache(root, embedder.id);\n\n // Includes document nodes (markdown/txt/env examples) so ask can retrieve docs.\n const targets = embedTargets(graph);\n const toEmbed: EmbedTarget[] = [];\n const vectors = new Map<string, number[]>();\n for (const t of targets) {\n const cached = cache.entries[t.id];\n if (cached && cached.hash === t.hash) vectors.set(t.id, cached.vec);\n else toEmbed.push(t);\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n writeBinaryCache(file, cache);\n purgeLegacyJsonCaches(root);\n } catch {\n /* cache write best-effort */\n }\n };\n\n if (toEmbed.length) {\n // Single-writer: if another process (e.g. a background warm-up) is already\n // embedding this repo, don't double-work or race the cache — return what's\n // cached so far (lexical floor still applies). It will be complete next run.\n const lock = `${file}.lock`;\n if (!acquireLock(lock)) return vectors;\n try {\n onProgress?.(0, toEmbed.length);\n let lastWrite = Date.now();\n for (let i = 0; i < toEmbed.length; i += EMBED_CHUNK) {\n const slice = toEmbed.slice(i, i + EMBED_CHUNK);\n const vecs = await embedder.embed(slice.map((t) => t.text));\n slice.forEach((t, j) => {\n const vec = vecs[j] ?? [];\n vectors.set(t.id, vec);\n cache.entries[t.id] = { hash: t.hash, vec };\n });\n onProgress?.(Math.min(i + EMBED_CHUNK, toEmbed.length), toEmbed.length);\n // Persist periodically so a crash/timeout resumes from here next run.\n if (Date.now() - lastWrite >= CACHE_WRITE_INTERVAL_MS) {\n persist();\n lastWrite = Date.now();\n }\n }\n // prune entries for nodes no longer present, then a final authoritative write\n const live = new Set(targets.map((t) => t.id));\n for (const id of Object.keys(cache.entries)) if (!live.has(id)) delete cache.entries[id];\n persist();\n } finally {\n releaseLock(lock);\n }\n } else if (!fs.existsSync(file) && Object.keys(cache.entries).length > 0) {\n // Migrating from legacy JSON with a full hit set — rewrite as binary once\n // so the next run never reads the old path again.\n persist();\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n"]}
@@ -0,0 +1,6 @@
1
+ // src/version.ts
2
+ var VERSION = "2026.825.2";
3
+
4
+ export { VERSION };
5
+ //# sourceMappingURL=chunk-G3ACLBMG.js.map
6
+ //# sourceMappingURL=chunk-G3ACLBMG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-KFLNWYZG.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.825.1';\n"]}
1
+ {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-G3ACLBMG.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.825.2';\n"]}
@@ -1,17 +1,17 @@
1
1
  import { isSecretPath, secretRefusal, secretEgressRefusal, redactText } from './chunk-543E6WDJ.js';
2
- import { findMatchingRule, ruleLabel } from './chunk-QTQRM7HQ.js';
3
- import { localGraphBackend } from './chunk-YIRDV4YJ.js';
2
+ import { findMatchingRule, ruleLabel } from './chunk-E3XVIFSH.js';
3
+ import { localGraphBackend } from './chunk-JAEHLTVX.js';
4
4
  import { buildAgentMessages, redactSecrets, unifiedDiff, applyEdit } from './chunk-SHD5TCZ5.js';
5
5
  import { buildIdentifierTrieFromGraph, KvBlockRegistry, graphDraftCandidates, extractIdentifiers, scanIdentifiersAgainstTrie } from './chunk-5HYCB55P.js';
6
- import { mappedFilePaths, capsuleMode, askNamesSymbol, sourceTokenMass, buildWholeRepoPacket } from './chunk-YP243ZKD.js';
6
+ import { mappedFilePaths, capsuleMode, askNamesSymbol, sourceTokenMass, buildWholeRepoPacket } from './chunk-L7GCJNDT.js';
7
7
  import { resolve } from './chunk-VIWZ4QT7.js';
8
- import { searchSymbols, resolveLib, loadCatalog, readDoc, localPackageDocs, resolveVersion } from './chunk-S3HMG6BC.js';
9
- import { summarizeCapsule, CAPSULE_RANKING_VERSION, buildCodeContext, buildTaskCapsule, capsuleToCodeContext, recordCliCall, CLI_TOOL_ALIASES } from './chunk-6VLOI2ZP.js';
8
+ import { searchSymbols, resolveLib, loadCatalog, readDoc, localPackageDocs, resolveVersion } from './chunk-NZES47ST.js';
9
+ import { summarizeCapsule, CAPSULE_RANKING_VERSION, buildCodeContext, buildTaskCapsule, capsuleToCodeContext, recordCliCall, CLI_TOOL_ALIASES } from './chunk-SYMJSRYF.js';
10
10
  import { resolveOne } from './chunk-J7LKEB2R.js';
11
- import { userAskFromInstruction, isLocateOnlyInstruction, extractLiteralNeedles, impactOf } from './chunk-LUJ4H4RJ.js';
12
- import { parseSource } from './chunk-L3YEEJ6U.js';
11
+ import { userAskFromInstruction, isLocateOnlyInstruction, extractLiteralNeedles, impactOf } from './chunk-K3SXWOTT.js';
12
+ import { parseSource } from './chunk-6MIJLO5B.js';
13
13
  import { langForExtension } from './chunk-6WRG7VDO.js';
14
- import { loadTopicTags, rankQuestion } from './chunk-FVBN4E5C.js';
14
+ import { loadTopicTags, rankQuestion } from './chunk-OIUVWCKM.js';
15
15
  import { repositoryIdFromRoot } from './chunk-XP6UUCZZ.js';
16
16
  import { hashString, canonicalize } from './chunk-JFGYT6BI.js';
17
17
  import { spawnSync, spawn } from 'child_process';
@@ -1940,8 +1940,8 @@ async function runSubagent(host, req) {
1940
1940
  text: `Subagent starting${worktreePath ? ` in worktree ${worktreePath}` : " in-place"}\u2026`
1941
1941
  });
1942
1942
  try {
1943
- const { runAgent: runAgent2 } = await import('./agent-IHNUBFBM.js');
1944
- const { nodeCodeFs } = await import('./session-22BGDYWF.js');
1943
+ const { runAgent: runAgent2 } = await import('./agent-DHQYEHVW.js');
1944
+ const { nodeCodeFs } = await import('./session-KXT2ZTPE.js');
1945
1945
  const childFs = childRoot === host.root ? host.fsImpl : nodeCodeFs(childRoot);
1946
1946
  const childApprove = async (action) => {
1947
1947
  host.onEvent?.({
@@ -4314,5 +4314,5 @@ function buildSpanIndex(graph) {
4314
4314
  }
4315
4315
 
4316
4316
  export { CONTEXT_POLICY_VERSION, DISCOVERY_TOOLS, MUTATION_TOOLS, compact, compactWithModel, computeFcsReport, createTrajectoryCollector, lookupModelCapabilities, renderFcsReportMarkdown, runAgent };
4317
- //# sourceMappingURL=chunk-CIC3NY2D.js.map
4318
- //# sourceMappingURL=chunk-CIC3NY2D.js.map
4317
+ //# sourceMappingURL=chunk-GR7SFCQJ.js.map
4318
+ //# sourceMappingURL=chunk-GR7SFCQJ.js.map