@vibgrate/cli 2026.727.4 → 2026.728.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/DOCS.md +3 -3
  2. package/dist/baseline-PPZJBYAJ.js +8 -0
  3. package/dist/{baseline-ENCOSJYQ.js.map → baseline-PPZJBYAJ.js.map} +1 -1
  4. package/dist/{chunk-T3AYRS7J.js → chunk-3BIRGSRS.js} +3 -3
  5. package/dist/{chunk-T3AYRS7J.js.map → chunk-3BIRGSRS.js.map} +1 -1
  6. package/dist/{chunk-YKVH2PGF.js → chunk-57QU36P6.js} +94 -142
  7. package/dist/chunk-57QU36P6.js.map +1 -0
  8. package/dist/{chunk-FPEOIS7K.js → chunk-6GRLZ4Z2.js} +12 -9
  9. package/dist/chunk-6GRLZ4Z2.js.map +1 -0
  10. package/dist/{chunk-K7REHDQS.js → chunk-6HX47EBL.js} +25 -19
  11. package/dist/chunk-6HX47EBL.js.map +1 -0
  12. package/dist/{chunk-KKRSQQ3A.js → chunk-7AVYKZEM.js} +4 -4
  13. package/dist/{chunk-KKRSQQ3A.js.map → chunk-7AVYKZEM.js.map} +1 -1
  14. package/dist/{chunk-MAUJTPQW.js → chunk-A2IYFNCQ.js} +24 -62
  15. package/dist/chunk-A2IYFNCQ.js.map +1 -0
  16. package/dist/{chunk-3SDV6ADQ.js → chunk-CQDUBAQY.js} +3 -3
  17. package/dist/{chunk-3SDV6ADQ.js.map → chunk-CQDUBAQY.js.map} +1 -1
  18. package/dist/{chunk-77LYGXBI.js → chunk-JRAGO6OB.js} +3 -3
  19. package/dist/{chunk-77LYGXBI.js.map → chunk-JRAGO6OB.js.map} +1 -1
  20. package/dist/{chunk-PVZBYZZR.js → chunk-NZELMYT4.js} +27 -6
  21. package/dist/chunk-NZELMYT4.js.map +1 -0
  22. package/dist/chunk-OSD546W7.js +167 -0
  23. package/dist/chunk-OSD546W7.js.map +1 -0
  24. package/dist/{chunk-GYSOQH5C.js → chunk-OV4KGXPD.js} +30 -4
  25. package/dist/chunk-OV4KGXPD.js.map +1 -0
  26. package/dist/{chunk-XPJZTSY7.js → chunk-R2QNFXE5.js} +3 -3
  27. package/dist/{chunk-XPJZTSY7.js.map → chunk-R2QNFXE5.js.map} +1 -1
  28. package/dist/{chunk-PXHNTC6D.js → chunk-SIPGDJT4.js} +3 -3
  29. package/dist/{chunk-PXHNTC6D.js.map → chunk-SIPGDJT4.js.map} +1 -1
  30. package/dist/{chunk-YCJIIGLP.js → chunk-SZSNPXSW.js} +4 -4
  31. package/dist/{chunk-YCJIIGLP.js.map → chunk-SZSNPXSW.js.map} +1 -1
  32. package/dist/chunk-UZJS7GMK.js +57 -0
  33. package/dist/chunk-UZJS7GMK.js.map +1 -0
  34. package/dist/{chunk-LJP2EPKM.js → chunk-VI4ITXHQ.js} +4 -4
  35. package/dist/{chunk-LJP2EPKM.js.map → chunk-VI4ITXHQ.js.map} +1 -1
  36. package/dist/{chunk-HYRAILGM.js → chunk-VYGEOOLY.js} +3 -3
  37. package/dist/{chunk-HYRAILGM.js.map → chunk-VYGEOOLY.js.map} +1 -1
  38. package/dist/{chunk-R6ZRVVZT.js → chunk-WH2N22S3.js} +3 -3
  39. package/dist/{chunk-R6ZRVVZT.js.map → chunk-WH2N22S3.js.map} +1 -1
  40. package/dist/{chunk-KXSKFQMI.js → chunk-YF43FOPP.js} +5 -5
  41. package/dist/chunk-YF43FOPP.js.map +1 -0
  42. package/dist/cli.js +531 -142
  43. package/dist/cli.js.map +1 -1
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.js +6 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/{interactive-SMHVURYK.js → interactive-OCWQ326U.js} +18 -17
  48. package/dist/interactive-OCWQ326U.js.map +1 -0
  49. package/dist/{llm-host-7GWDO6IX.js → llm-host-XYBT4267.js} +4 -4
  50. package/dist/{llm-host-7GWDO6IX.js.map → llm-host-XYBT4267.js.map} +1 -1
  51. package/dist/model-manager-LB54VSV7.js +10 -0
  52. package/dist/{model-manager-PN7HEDXD.js.map → model-manager-LB54VSV7.js.map} +1 -1
  53. package/dist/{model-orchestrator-4VSYP4J4.js → model-orchestrator-4M5FG6MN.js} +3 -3
  54. package/dist/{model-orchestrator-4VSYP4J4.js.map → model-orchestrator-4M5FG6MN.js.map} +1 -1
  55. package/dist/resolve-gguf-4AFRN4CP.js +9 -0
  56. package/dist/{resolve-gguf-Y6FH3CNB.js.map → resolve-gguf-4AFRN4CP.js.map} +1 -1
  57. package/dist/{runtime-session-4AMZIAAG.js → runtime-session-EJQZXANB.js} +5 -5
  58. package/dist/{runtime-session-4AMZIAAG.js.map → runtime-session-EJQZXANB.js.map} +1 -1
  59. package/dist/{session-W3646AOV.js → session-ZJGENHKX.js} +6 -5
  60. package/dist/{session-W3646AOV.js.map → session-ZJGENHKX.js.map} +1 -1
  61. package/dist/{stream-json-X7UQFB4T.js → stream-json-Z5KC2DM3.js} +6 -5
  62. package/dist/stream-json-Z5KC2DM3.js.map +1 -0
  63. package/dist/{vgd-CVLKBS7K.js → vgd-3MHSB4KA.js} +4 -4
  64. package/dist/vgd-3MHSB4KA.js.map +1 -0
  65. package/package.json +1 -1
  66. package/dist/baseline-ENCOSJYQ.js +0 -8
  67. package/dist/chunk-FPEOIS7K.js.map +0 -1
  68. package/dist/chunk-GYSOQH5C.js.map +0 -1
  69. package/dist/chunk-K7REHDQS.js.map +0 -1
  70. package/dist/chunk-KUIBP3LU.js +0 -101
  71. package/dist/chunk-KUIBP3LU.js.map +0 -1
  72. package/dist/chunk-KXSKFQMI.js.map +0 -1
  73. package/dist/chunk-MAUJTPQW.js.map +0 -1
  74. package/dist/chunk-PVZBYZZR.js.map +0 -1
  75. package/dist/chunk-YKVH2PGF.js.map +0 -1
  76. package/dist/interactive-SMHVURYK.js.map +0 -1
  77. package/dist/model-manager-PN7HEDXD.js +0 -9
  78. package/dist/resolve-gguf-Y6FH3CNB.js +0 -9
  79. package/dist/stream-json-X7UQFB4T.js.map +0 -1
  80. package/dist/vgd-CVLKBS7K.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/model-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-NZELMYT4.js","sourcesContent":["/**\n * Vibgrate Model Orchestrator — Code Modes (Spark / Flow / Forge).\n *\n * Product stance (PRD): users and agents select outcome-oriented **Code Modes**,\n * never GGUF names by default. This module:\n * 1. Declares versioned **qualified packs** (contract + primary/fallback weights)\n * 2. Runs a **fit** algorithm (available memory now × reserves × repo signals)\n * 3. Resolves mode → pack → concrete model / backend\n * 4. Supports pin/unpin for reproducibility\n *\n * Pure resolve + fit helpers have no I/O. Registry pin state uses the global\n * Vibgrate data dir (never in-repo). Pull/ensure is a separate CLI concern that\n * calls into `vg models pull` after resolve.\n *\n * schemaVersion: model-orchestrator/0\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { estimateModelBytes, type SystemMemory } from '../code/capability.js';\nimport {\n MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n type ModelExecutionProfile,\n type ModelMode,\n type ToolCallingMode,\n type EditFormatPreference,\n} from './model-execution-profile.js';\nimport { vibgrateDataDir } from './paths.js';\n\nexport const MODEL_ORCHESTRATOR_SCHEMA_VERSION = 'model-orchestrator/0' as const;\n\n/** UX fit vocabulary (stricter than “weights fit”). */\nexport type FitLabel = 'flies' | 'comfortable' | 'tight' | 'will_not_fit';\n\nexport type TaskClass = 'spark_task' | 'flow_task' | 'forge_task' | 'explicit_mode';\n\nexport interface PackWeightsRef {\n /** Backend that can load these weights. */\n backend: 'ollama' | 'llama.cpp' | 'lm-studio' | 'foundry-local' | 'other';\n /** Concrete model id / slug (e.g. qwen2.5-coder:3b). */\n weightsRef: string;\n quant?: string;\n /** SPDX / short license note for first-download surface. */\n license?: string;\n /** Approx weights size in bytes (for fit when not discoverable). */\n weightsBytes?: number;\n /**\n * Optional HTTPS GGUF URL for the first-party weight store (must pass host\n * allowlist). When set, `vg models install` can download without Ollama.\n */\n downloadUrl?: string;\n /** Optional content hash for downloaded GGUF. */\n sha256?: string;\n}\n\nexport interface PackContract {\n toolCalling: ToolCallingMode;\n editFormat: EditFormatPreference;\n capsuleBudgetTokens: number;\n maxRepairRounds: number;\n maxParallelEdits: number;\n /** Minimum qualification score (0–1) this pack was gated on. */\n minEffectiveScore?: number;\n constrainedDecoding?: boolean;\n kvCacheStrategy?: ModelExecutionProfile['kvCacheStrategy'];\n securityTier?: ModelExecutionProfile['securityTier'];\n /**\n * Preferred inference path when available (ADR-005). Weights may still be\n * pulled via Ollama; embedded llama.cpp is preferred for sampler/grammar.\n */\n preferredInference?: 'ollama' | 'llama.cpp';\n /** Process isolation for preferredInference llama.cpp (default embedded). */\n inferenceIsolation?: ModelExecutionProfile['inferenceIsolation'];\n}\n\nexport interface QualifiedPack {\n /** e.g. flow@2026.07.1 */\n packId: string;\n mode: ModelMode;\n displayName: string;\n /** User-facing promise (one line). */\n promise: string;\n primary: PackWeightsRef;\n fallback?: PackWeightsRef[];\n contract: PackContract;\n resources: {\n minRamGb: number;\n minVramGb?: number;\n /** Estimated KV cache bytes per 1k context tokens. */\n estimatedKvPer1kContext?: number;\n };\n provenance?: {\n evalRunIds?: string[];\n notes?: string;\n };\n}\n\nexport interface RepoSignals {\n /** Approximate source file count (0 = unknown). */\n fileCount?: number;\n /** Graph node count when a map is warm (0 = unknown). */\n graphNodeCount?: number;\n /** Dominant languages (optional). */\n languages?: string[];\n}\n\nexport interface FitInput {\n system: SystemMemory;\n pack: QualifiedPack;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /**\n * Free space on the volume that holds model weights (weight store / Ollama).\n * When set, insufficient disk for the GGUF forces {@link FitLabel will_not_fit}.\n */\n freeDiskBytes?: number;\n /**\n * Static reserves (bytes) for IDE / OS / graph / tests.\n * Defaults applied when omitted.\n */\n reserves?: {\n ideBytes?: number;\n osBytes?: number;\n graphBytes?: number;\n testsBytes?: number;\n safetyMarginBytes?: number;\n };\n /** Context budget used to estimate KV (tokens). Defaults from pack contract. */\n contextBudgetTokens?: number;\n}\n\nexport interface FitResult {\n label: FitLabel;\n /** 0–100; higher is more headroom. */\n score: number;\n needBytes: number;\n availableBytes: number;\n /** Disk needed to store weights safely (weights + 15% + ≥1 GiB floor). */\n diskNeedBytes?: number;\n /** Free disk observed when fit was computed (if provided). */\n freeDiskBytes?: number;\n /** Breakdown for “memory pie” UX. */\n breakdown: {\n modelBytes: number;\n kvBytes: number;\n ideBytes: number;\n osBytes: number;\n graphBytes: number;\n testsBytes: number;\n freeAfterReservesBytes: number;\n };\n /** When tight: suggested reduced capsule budget. */\n reducedCapsuleBudgetTokens?: number;\n reasons: string[];\n}\n\nexport interface ResolvedMode {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n mode: ModelMode;\n pack: QualifiedPack;\n /** Concrete weights chosen (primary or fallback after fit). */\n underlying: PackWeightsRef;\n fit: FitResult;\n profile: ModelExecutionProfile;\n /** True when pack id was pinned by the user. */\n pinned: boolean;\n /** How the mode was chosen. */\n selection: 'explicit' | 'default' | 'auto_fit' | 'pinned';\n}\n\nexport interface OrchestratorStatus {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n defaultMode: ModelMode;\n pin?: { mode: ModelMode; packId: string } | null;\n modes: Array<{\n mode: ModelMode;\n packId: string;\n displayName: string;\n promise: string;\n underlyingModelId: string;\n backend: string;\n fit: FitLabel;\n fitScore: number;\n needBytes: number;\n availableBytes: number;\n /** Disk budget for storing this pack’s weights (when free disk was known). */\n diskNeedBytes?: number;\n installed: boolean;\n pinned: boolean;\n }>;\n recommended: ModelMode;\n system: {\n totalRamBytes: number;\n freeRamBytes: number;\n vramTotalBytes?: number;\n vramFreeBytes?: number;\n loaded: Array<{ name: string; bytes: number }>;\n /** Free bytes on the model-cache volume (when probed). */\n freeDiskBytes?: number;\n };\n memoryBreakdown?: FitResult['breakdown'];\n}\n\n// ── Curated packs (versioned; weights may change under the same mode contract) ─\n\n/** Pack channel — bump when contracts or weight refs change under stable mode names. */\nconst PACK_CHANNEL = '2026.07.4';\n\n/**\n * Current qualified packs — one primary per mode.\n *\n * Approach B default: Spark/Flow **primary** is first-party GGUF (llama.cpp)\n * for install + inference when fit allows. Ollama remains an explicit fallback\n * adapter, not the default path.\n */\nexport const QUALIFIED_PACKS: QualifiedPack[] = [\n {\n packId: `spark@${PACK_CHANNEL}`,\n mode: 'spark',\n displayName: 'Spark',\n promise: 'Fastest capable local coding — simple edits, minimal memory.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-3b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:1.5b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:1.5b').bytes,\n },\n ],\n contract: {\n toolCalling: 'grammar',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 2000,\n maxRepairRounds: 2,\n maxParallelEdits: 2,\n minEffectiveScore: 0.55,\n constrainedDecoding: true,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 4, estimatedKvPer1kContext: 2 * 1024 * 1024 },\n provenance: {\n notes: 'Spark@2026.07.4 — Approach B: first-party GGUF + embedded vibgrate manager; Ollama pack fallback only',\n },\n },\n {\n packId: `flow@${PACK_CHANNEL}`,\n mode: 'flow',\n displayName: 'Flow',\n promise: 'Best everyday graph-guided coding for this machine.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-7b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'auto',\n capsuleBudgetTokens: 3500,\n maxRepairRounds: 2,\n maxParallelEdits: 4,\n minEffectiveScore: 0.65,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 8, minVramGb: 6, estimatedKvPer1kContext: 4 * 1024 * 1024 },\n provenance: {\n notes: 'Flow@2026.07.4 — first-party GGUF primary; Ollama pack fallback only',\n },\n },\n {\n packId: `forge@${PACK_CHANNEL}`,\n mode: 'forge',\n displayName: 'Forge',\n promise: 'Strongest deep work that safely fits (migrations, multi-file).',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-14b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:14b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 6000,\n maxRepairRounds: 3,\n maxParallelEdits: 6,\n minEffectiveScore: 0.7,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 16, minVramGb: 12, estimatedKvPer1kContext: 8 * 1024 * 1024 },\n provenance: {\n notes:\n 'Forge@2026.07.4 — first-party 14B GGUF + embedded vibgrate manager (same path as Spark/Flow); Ollama pack fallback only',\n },\n },\n];\n\nconst GiB = 1024 ** 3;\n\n/**\n * Static reserves applied on top of *available* RAM.\n *\n * Important: `freeRamBytes` is already residual after currently-running\n * processes (IDE, OS, browsers, …). Subtracting a full IDE/OS footprint again\n * double-counts and falsely zeros fit on healthy machines. Keep growth\n * headroom for graph/tests (often not yet resident) + safety, and a modest\n * fraction of IDE/OS for workspace growth under load.\n */\nconst DEFAULT_RESERVES = {\n ideBytes: 1.5 * GiB,\n osBytes: 2 * GiB,\n graphBytes: 0.5 * GiB,\n testsBytes: 0.25 * GiB,\n safetyMarginBytes: 1 * GiB,\n};\n\n/** Fraction of IDE+OS reserves kept as growth headroom on the free-RAM path. */\nconst IDE_OS_GROWTH_FRACTION = 0.25;\n\n// ── Pack lookup ───────────────────────────────────────────────────────────────\n\nexport function packForMode(mode: ModelMode, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.mode === mode) ?? null;\n}\n\nexport function packById(packId: string, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.packId === packId) ?? null;\n}\n\nexport function listModes(): ModelMode[] {\n return ['spark', 'flow', 'forge'];\n}\n\n// ── Fit algorithm ─────────────────────────────────────────────────────────────\n\n/**\n * Fit decision: available memory *now* after IDE/OS/graph/tests reserves and\n * safety margin — not only “weights fit in total RAM”.\n *\n * Target: < 100 ms once system snapshot is warm (pure arithmetic).\n */\nexport function fitPack(input: FitInput): FitResult {\n const r = { ...DEFAULT_RESERVES, ...input.reserves };\n const pack = input.pack;\n const weightsBytes =\n pack.primary.weightsBytes ??\n estimateModelBytes(pack.primary.weightsRef).bytes;\n const ctxTokens = input.contextBudgetTokens ?? pack.contract.capsuleBudgetTokens * 2;\n const kvPer1k = pack.resources.estimatedKvPer1kContext ?? 2 * 1024 * 1024;\n const kvBytes = Math.round((ctxTokens / 1000) * kvPer1k);\n const modelBytes = weightsBytes;\n const needBytes = modelBytes + kvBytes;\n\n const useVram =\n typeof input.system.vramTotalBytes === 'number' && input.system.vramTotalBytes > 0;\n const freeNow = useVram\n ? (input.system.vramFreeBytes ?? 0)\n : input.system.freeRamBytes;\n const loadedBytes = input.system.loaded.reduce((n, m) => n + m.bytes, 0);\n // Prefer free-after-unload for fit of *next* load when something is resident.\n const freePool = freeNow + loadedBytes;\n\n const graphBump =\n (input.repo?.graphNodeCount ?? 0) > 50_000\n ? 0.5 * GiB\n : (input.repo?.fileCount ?? 0) > 5_000\n ? 0.25 * GiB\n : 0;\n const graphBytes = r.graphBytes + graphBump;\n\n // On discrete VRAM, only model+KV compete for VRAM — host reserves stay on RAM.\n // On unified / CPU path: free/available RAM already excludes current IDE/OS\n // usage, so only charge growth (graph/tests/safety + modest IDE/OS headroom).\n const reserved = useVram\n ? r.safetyMarginBytes\n : graphBytes +\n r.testsBytes +\n r.safetyMarginBytes +\n IDE_OS_GROWTH_FRACTION * (r.ideBytes + r.osBytes);\n const freeAfterReserves = Math.max(0, freePool - reserved);\n\n const availableBytes = freeAfterReserves;\n const reasons: string[] = [];\n const headroom = availableBytes - needBytes;\n const ratio = needBytes > 0 ? availableBytes / needBytes : 0;\n\n let label: FitLabel;\n let reducedCapsuleBudgetTokens: number | undefined;\n\n if (availableBytes < needBytes * 0.85) {\n label = 'will_not_fit';\n reasons.push(\n `needs ~${fmtGb(needBytes)} but only ~${fmtGb(availableBytes)} is free after reserves`,\n );\n } else if (ratio < 1.1 || headroom < 0.5 * GiB) {\n label = 'tight';\n reducedCapsuleBudgetTokens = Math.max(\n 1200,\n Math.floor(pack.contract.capsuleBudgetTokens * 0.65),\n );\n reasons.push('tight fit — capsule budget will be reduced automatically');\n } else if (ratio >= 1.6 && headroom >= 2 * GiB) {\n label = 'flies';\n reasons.push('comfortable headroom for this mode');\n } else {\n label = 'comfortable';\n reasons.push('within policy for this machine');\n }\n\n // Large monorepo + forge → soft-downgrade score (does not force will_not_fit).\n if (\n pack.mode === 'forge' &&\n ((input.repo?.fileCount ?? 0) > 10_000 || (input.repo?.graphNodeCount ?? 0) > 100_000) &&\n label === 'comfortable'\n ) {\n reasons.push('large repository — prefer moderated capsule + graph paging');\n }\n\n // Disk: downloads need the full GGUF + headroom on the cache volume (not RAM).\n const diskNeedBytes = Math.round(modelBytes + Math.max(GiB, modelBytes * 0.15));\n if (typeof input.freeDiskBytes === 'number' && Number.isFinite(input.freeDiskBytes)) {\n if (input.freeDiskBytes < diskNeedBytes) {\n if (label !== 'will_not_fit') {\n label = 'will_not_fit';\n }\n reasons.push(\n `needs ~${fmtGb(diskNeedBytes)} free disk for weights, only ~${fmtGb(input.freeDiskBytes)} free`,\n );\n }\n }\n\n // Score: map ratio into 0–100 with floors for labels.\n let score = Math.max(0, Math.min(100, Math.round(ratio * 50)));\n if (label === 'will_not_fit') score = Math.min(score, 20);\n if (label === 'tight') score = Math.min(Math.max(score, 25), 45);\n if (label === 'comfortable') score = Math.min(Math.max(score, 50), 75);\n if (label === 'flies') score = Math.max(score, 80);\n\n return {\n label,\n score,\n needBytes,\n availableBytes,\n diskNeedBytes,\n freeDiskBytes: typeof input.freeDiskBytes === 'number' ? input.freeDiskBytes : undefined,\n breakdown: {\n modelBytes,\n kvBytes,\n // Report the charged growth headroom (not the full static IDE/OS footprint).\n ideBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.ideBytes,\n osBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.osBytes,\n graphBytes: useVram ? 0 : graphBytes,\n testsBytes: useVram ? 0 : r.testsBytes,\n freeAfterReservesBytes: freeAfterReserves,\n },\n reducedCapsuleBudgetTokens,\n reasons,\n };\n}\n\nfunction fmtGb(bytes: number): string {\n return `${(bytes / GiB).toFixed(1)} GiB`;\n}\n\n// ── Resolve mode → pack → underlying ──────────────────────────────────────────\n\nexport interface ResolveModeOptions {\n mode?: ModelMode;\n /** Prefer auto-fit when no mode set (default true for first-run wizard). */\n autoFit?: boolean;\n system: SystemMemory;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /** Free disk on the weight-store volume (bytes). */\n freeDiskBytes?: number;\n /** Installed model names (ollama/lmstudio) for installed: true. */\n installedNames?: string[];\n /** Pin map mode → packId. */\n pin?: { mode: ModelMode; packId: string } | null;\n packs?: QualifiedPack[];\n defaultMode?: ModelMode;\n}\n\nfunction packToProfile(pack: QualifiedPack, underlying: PackWeightsRef, fit: FitResult): ModelExecutionProfile {\n const budget =\n fit.label === 'tight' && fit.reducedCapsuleBudgetTokens\n ? fit.reducedCapsuleBudgetTokens\n : pack.contract.capsuleBudgetTokens;\n return {\n schemaVersion: MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n id: underlying.weightsRef,\n displayName: `${pack.displayName} · ${underlying.weightsRef}`,\n mode: pack.mode,\n backend:\n underlying.backend === 'ollama'\n ? 'ollama'\n : underlying.backend === 'llama.cpp'\n ? 'llama.cpp'\n : underlying.backend === 'lm-studio'\n ? 'openai-compatible'\n : 'other',\n toolCalling: pack.contract.toolCalling,\n editFormat: pack.contract.editFormat,\n capsuleBudgetTokens: budget,\n maxParallelEdits: pack.contract.maxParallelEdits,\n maxRepairRounds: pack.contract.maxRepairRounds,\n temperature: 0,\n constrainedDecoding: pack.contract.constrainedDecoding ?? false,\n kvCacheStrategy: pack.contract.kvCacheStrategy,\n resources: {\n minRamGb: pack.resources.minRamGb,\n minVramGb: pack.resources.minVramGb,\n quant: underlying.quant,\n },\n securityTier: pack.contract.securityTier,\n inferenceIsolation: pack.contract.inferenceIsolation ?? 'embedded',\n };\n}\n\nfunction tryWeights(\n pack: QualifiedPack,\n weights: PackWeightsRef,\n system: SystemMemory,\n repo?: RepoSignals,\n taskClass?: TaskClass,\n freeDiskBytes?: number,\n): { fit: FitResult; underlying: PackWeightsRef } {\n const trial: QualifiedPack = { ...pack, primary: weights };\n return {\n fit: fitPack({ system, pack: trial, repo, taskClass, freeDiskBytes }),\n underlying: weights,\n };\n}\n\n/**\n * Resolve a Code Mode to a pack, concrete weights, fit label, and MEP.\n * Refuses primary load when fit is will_not_fit and tries fallbacks; if all\n * fail, returns the best effort with label will_not_fit (caller must not load).\n */\nexport function resolveMode(opts: ResolveModeOptions): ResolvedMode {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const defaultMode = opts.defaultMode ?? 'flow';\n let mode: ModelMode = opts.mode ?? defaultMode;\n let selection: ResolvedMode['selection'] = opts.mode ? 'explicit' : 'default';\n\n if (!opts.mode && opts.autoFit !== false) {\n mode = recommendMode(opts.system, opts.repo, packs);\n selection = 'auto_fit';\n }\n\n let pack = packForMode(mode, packs);\n if (!pack) {\n pack = packForMode('flow', packs)!;\n mode = 'flow';\n selection = 'default';\n }\n\n if (opts.pin && opts.pin.mode === mode) {\n const pinned = packById(opts.pin.packId, packs);\n if (pinned && pinned.mode === mode) {\n pack = pinned;\n selection = 'pinned';\n }\n }\n\n const candidates = [pack.primary, ...(pack.fallback ?? [])];\n let best: { fit: FitResult; underlying: PackWeightsRef } | null = null;\n\n for (const w of candidates) {\n const trial = tryWeights(pack, w, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n if (!best || fitRank(trial.fit) > fitRank(best.fit)) best = trial;\n if (trial.fit.label === 'flies' || trial.fit.label === 'comfortable') {\n best = trial;\n break;\n }\n }\n\n const chosen =\n best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n const profile = packToProfile(pack, chosen.underlying, chosen.fit);\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n mode,\n pack,\n underlying: chosen.underlying,\n fit: chosen.fit,\n profile,\n pinned: selection === 'pinned',\n selection,\n };\n}\n\nfunction fitRank(f: FitResult): number {\n const order: Record<FitLabel, number> = {\n flies: 4,\n comfortable: 3,\n tight: 2,\n will_not_fit: 1,\n };\n return order[f.label] * 1000 + f.score;\n}\n\n/**\n * Pick the strongest mode that still fits at least “comfortable” (or tight\n * for spark). Prefer Flow when both Flow and Forge are comfortable.\n */\nexport function recommendMode(\n system: SystemMemory,\n repo?: RepoSignals,\n packs: QualifiedPack[] = QUALIFIED_PACKS,\n): ModelMode {\n const order: ModelMode[] = ['forge', 'flow', 'spark'];\n let bestTight: ModelMode | null = null;\n for (const mode of order) {\n const pack = packForMode(mode, packs);\n if (!pack) continue;\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system,\n repo,\n packs,\n });\n if (resolved.fit.label === 'flies' || resolved.fit.label === 'comfortable') {\n // Prefer Flow as daily default when Forge also fits, unless repo is tiny.\n if (mode === 'forge') {\n const flow = resolveMode({ mode: 'flow', autoFit: false, system, repo, packs });\n if (flow.fit.label === 'flies' || flow.fit.label === 'comfortable') {\n const files = repo?.fileCount ?? 0;\n if (files < 2000) return 'flow';\n }\n return 'forge';\n }\n return mode;\n }\n if (resolved.fit.label === 'tight' && !bestTight) bestTight = mode;\n }\n return bestTight ?? 'spark';\n}\n\n/** Build orchestrator status for `vg models status` / host UIs. */\nexport function buildOrchestratorStatus(opts: {\n system: SystemMemory;\n repo?: RepoSignals;\n installedNames?: string[];\n /** Free bytes on the weight-store volume (factored into fit). */\n freeDiskBytes?: number;\n /** Single pin (legacy) or full pin map. */\n pin?: { mode: ModelMode; packId: string } | null;\n pins?: Partial<Record<ModelMode, string>>;\n defaultMode?: ModelMode;\n packs?: QualifiedPack[];\n}): OrchestratorStatus {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const installed = new Set((opts.installedNames ?? []).map((n) => n.toLowerCase()));\n const freeDiskBytes = opts.freeDiskBytes;\n const recommended = recommendMode(opts.system, opts.repo, packs);\n const pinFor = (mode: ModelMode): { mode: ModelMode; packId: string } | null => {\n const fromMap = opts.pins?.[mode];\n if (fromMap) return { mode, packId: fromMap };\n if (opts.pin?.mode === mode) return opts.pin;\n return null;\n };\n const modes = listModes().map((mode) => {\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system: opts.system,\n repo: opts.repo,\n freeDiskBytes,\n pin: pinFor(mode),\n packs,\n });\n const id = resolved.underlying.weightsRef.toLowerCase();\n const installedHit =\n installed.has(id) ||\n [...installed].some((n) => n.includes(id) || id.includes(n));\n return {\n mode,\n packId: resolved.pack.packId,\n displayName: resolved.pack.displayName,\n promise: resolved.pack.promise,\n underlyingModelId: resolved.underlying.weightsRef,\n backend: resolved.underlying.backend,\n fit: resolved.fit.label,\n fitScore: resolved.fit.score,\n needBytes: resolved.fit.needBytes,\n availableBytes: resolved.fit.availableBytes,\n diskNeedBytes: resolved.fit.diskNeedBytes,\n installed: installedHit,\n pinned: resolved.pinned,\n };\n });\n\n const recResolved = resolveMode({\n mode: recommended,\n autoFit: false,\n system: opts.system,\n freeDiskBytes,\n repo: opts.repo,\n pin: pinFor(recommended),\n packs,\n });\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n defaultMode: opts.defaultMode ?? 'flow',\n pin: pinFor(recommended),\n modes,\n recommended,\n system: {\n totalRamBytes: opts.system.totalRamBytes,\n freeRamBytes: opts.system.freeRamBytes,\n ...(typeof opts.system.vramTotalBytes === 'number'\n ? { vramTotalBytes: opts.system.vramTotalBytes }\n : {}),\n ...(typeof opts.system.vramFreeBytes === 'number'\n ? { vramFreeBytes: opts.system.vramFreeBytes }\n : {}),\n ...(typeof freeDiskBytes === 'number' ? { freeDiskBytes } : {}),\n loaded: opts.system.loaded.map((l) => ({ name: l.name, bytes: l.bytes })),\n },\n memoryBreakdown: recResolved.fit.breakdown,\n };\n}\n\n// ── Pin registry (global storage, not in-repo) ────────────────────────────────\n\nexport interface OrchestratorPinState {\n schemaVersion: 'model-orchestrator-pin/0';\n /** mode → packId */\n pins: Partial<Record<ModelMode, string>>;\n /** Workspace / global default mode preference. */\n defaultMode?: ModelMode;\n updatedAt: string;\n}\n\nexport function orchestratorStatePath(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n return path.join(vibgrateDataDir(env, platform, home), 'model-orchestrator', 'state.json');\n}\n\nexport function readOrchestratorState(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): OrchestratorPinState {\n const p = orchestratorStatePath(env, platform, home);\n try {\n const raw = JSON.parse(fs.readFileSync(p, 'utf8')) as Partial<OrchestratorPinState>;\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: raw.pins && typeof raw.pins === 'object' ? raw.pins : {},\n defaultMode:\n raw.defaultMode === 'spark' || raw.defaultMode === 'flow' || raw.defaultMode === 'forge'\n ? raw.defaultMode\n : undefined,\n updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : new Date(0).toISOString(),\n };\n } catch {\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: {},\n updatedAt: new Date(0).toISOString(),\n };\n }\n}\n\nexport function writeOrchestratorState(\n state: OrchestratorPinState,\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n const p = orchestratorStatePath(env, platform, home);\n fs.mkdirSync(path.dirname(p), { recursive: true });\n const next: OrchestratorPinState = {\n ...state,\n schemaVersion: 'model-orchestrator-pin/0',\n updatedAt: new Date().toISOString(),\n };\n fs.writeFileSync(p, JSON.stringify(next, null, 2) + '\\n', 'utf8');\n return p;\n}\n\nexport function pinPack(\n mode: ModelMode,\n packId: string,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n if (!packById(packId)) {\n throw new Error(`unknown pack id: ${packId}`);\n }\n state.pins[mode] = packId;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function unpinPack(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n delete state.pins[mode];\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function setDefaultMode(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n state.defaultMode = mode;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\n/** Active pin for a mode, if any. */\nexport function activePin(\n mode: ModelMode,\n state: OrchestratorPinState = readOrchestratorState(),\n): { mode: ModelMode; packId: string } | null {\n const packId = state.pins[mode];\n return packId ? { mode, packId } : null;\n}\n\n/** Map backend hint to vg code --provider id. */\nexport function providerForBackend(backend: PackWeightsRef['backend']): string {\n switch (backend) {\n case 'ollama':\n return 'ollama';\n case 'llama.cpp':\n return 'llama-cpp';\n case 'lm-studio':\n return 'lmstudio';\n default:\n return 'ollama';\n }\n}\n\n/** Parse mode from user string; null if invalid. */\nexport function parseMode(raw: string | undefined | null): ModelMode | null {\n if (!raw) return null;\n const m = raw.trim().toLowerCase();\n if (m === 'spark' || m === 'flow' || m === 'forge') return m;\n return null;\n}\n"]}
@@ -0,0 +1,167 @@
1
+ import { whichOnPath } from './chunk-UZJS7GMK.js';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import { spawnSync } from 'child_process';
6
+ import { createRequire } from 'module';
7
+ import { pathToFileURL } from 'url';
8
+
9
+ function runtimeCacheDir() {
10
+ const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), ".cache");
11
+ return path.join(base, "vibgrate", "runtime");
12
+ }
13
+ function isPackageInstalled(spec) {
14
+ const name = packageName(spec);
15
+ try {
16
+ const req = createRequire(path.join(runtimeCacheDir(), "package.json"));
17
+ req.resolve(name);
18
+ return true;
19
+ } catch {
20
+ return false;
21
+ }
22
+ }
23
+ function ensureUnavailableMessage(reason, spec, detail) {
24
+ const name = packageName(spec);
25
+ switch (reason) {
26
+ case "offline":
27
+ return `${name} is needed for this backend but --local/offline is set \u2014 using a backend that needs no install, or drop --local to allow a one-time install.`;
28
+ case "no-consent":
29
+ return `${name} is needed for this backend and isn't installed yet. Run \`vg models install\` (or \`vg models pull\`) to install runtime deps for the provider into ${runtimeCacheDir()} (nothing is written into the CLI itself), or pick a backend that needs no install (e.g. --provider ollama).`;
30
+ case "install-failed":
31
+ if (detail?.trim()) {
32
+ return `couldn't install ${name}: ${detail.trim()}`;
33
+ }
34
+ return `couldn't install ${name} (offline, or npm unavailable) \u2014 using a backend that needs no install. It will try again next time.`;
35
+ case "load-failed":
36
+ default:
37
+ return `${name} installed but couldn't be loaded here \u2014 using a backend that needs no install.`;
38
+ }
39
+ }
40
+ async function ensurePackage(spec, options = {}) {
41
+ const dir = runtimeCacheDir();
42
+ const fail = (reason, detail) => {
43
+ options.onUnavailable?.(reason, spec);
44
+ return { module: null, dir, reason, detail };
45
+ };
46
+ if (isPackageInstalled(spec)) {
47
+ const mod2 = await load(spec, dir);
48
+ return mod2 ? { module: mod2, dir } : fail("load-failed");
49
+ }
50
+ if (options.local) return fail("offline");
51
+ const interactive = options.interactive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);
52
+ if (!options.consent && !interactive) return fail("no-consent");
53
+ if (!options.consent && interactive) return fail("no-consent");
54
+ try {
55
+ fs.mkdirSync(dir, { recursive: true });
56
+ ensureRuntimeManifest(dir);
57
+ } catch (err) {
58
+ return fail("install-failed", cacheWriteFailureDetail(dir, err));
59
+ }
60
+ if (options.install) {
61
+ const ok = options.install(spec, dir);
62
+ if (!ok || !isPackageInstalled(spec)) {
63
+ return fail("install-failed", !ok ? "installer returned failure" : `${packageName(spec)} not resolvable after install`);
64
+ }
65
+ } else {
66
+ const inst = runDefaultInstaller(spec, dir);
67
+ if (!inst.ok || !isPackageInstalled(spec)) {
68
+ return fail(
69
+ "install-failed",
70
+ inst.detail ?? (!inst.ok ? "npm install failed" : `${packageName(spec)} not resolvable after install`)
71
+ );
72
+ }
73
+ }
74
+ const mod = await load(spec, dir);
75
+ return mod ? { module: mod, dir } : fail("load-failed");
76
+ }
77
+ function ensureRuntimeManifest(dir) {
78
+ const manifest = path.join(dir, "package.json");
79
+ if (!fs.existsSync(manifest)) {
80
+ fs.writeFileSync(
81
+ manifest,
82
+ JSON.stringify({ name: "vibgrate-runtime-deps", private: true, description: "On-demand vg runtime packages" }, null, 2)
83
+ );
84
+ }
85
+ }
86
+ async function load(spec, dir) {
87
+ const name = packageName(spec);
88
+ try {
89
+ const req = createRequire(path.join(dir, "package.json"));
90
+ const resolved = req.resolve(name);
91
+ const mod = await import(pathToFileURL(resolved).href);
92
+ return mod?.default ?? mod;
93
+ } catch {
94
+ return null;
95
+ }
96
+ }
97
+ function cacheWriteFailureDetail(dir, err) {
98
+ const code = err && typeof err === "object" && "code" in err ? String(err.code) : "";
99
+ if (code === "EACCES" || code === "EPERM") {
100
+ const parent = path.dirname(dir);
101
+ return `cannot write runtime cache at ${dir} (permission denied). If ${parent} is root-owned (often from a past sudo run), fix with: sudo chown -R "$(whoami)" ${parent} \u2014 then re-run \`vg models install\``;
102
+ }
103
+ const msg = err instanceof Error ? err.message : String(err);
104
+ return `cannot prepare runtime cache at ${dir}: ${msg}`;
105
+ }
106
+ function resolveNpmBinary() {
107
+ const names = process.platform === "win32" ? ["npm.cmd", "npm"] : ["npm"];
108
+ for (const name of names) {
109
+ const hit = whichOnPath(name);
110
+ if (hit) return hit;
111
+ }
112
+ const candidates = process.platform === "win32" ? [] : [
113
+ "/opt/homebrew/bin/npm",
114
+ "/usr/local/bin/npm",
115
+ path.join(os.homedir(), ".npm-global", "bin", "npm"),
116
+ path.join(os.homedir(), ".local", "bin", "npm")
117
+ ];
118
+ for (const c of candidates) {
119
+ try {
120
+ if (fs.existsSync(c)) return c;
121
+ } catch {
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ function runDefaultInstaller(spec, dir) {
127
+ const npm = resolveNpmBinary();
128
+ if (!npm) {
129
+ return {
130
+ ok: false,
131
+ detail: "npm not found on PATH (common when VS Code is launched from the Dock). Install Node.js, or run `vg models install` from a terminal where `npm` works"
132
+ };
133
+ }
134
+ const res = spawnSync(npm, ["install", "--prefix", dir, "--no-audit", "--no-fund", "--ignore-scripts", spec], {
135
+ encoding: "utf8",
136
+ stdio: ["ignore", "pipe", "pipe"],
137
+ timeout: 18e4
138
+ });
139
+ if (res.error) {
140
+ const code = "code" in res.error ? String(res.error.code ?? "") : "";
141
+ if (code === "ENOENT") {
142
+ return {
143
+ ok: false,
144
+ detail: `npm binary not executable at ${npm} \u2014 install Node.js or fix PATH, then re-run \`vg models install\``
145
+ };
146
+ }
147
+ return { ok: false, detail: res.error.message };
148
+ }
149
+ if (res.status === 0) return { ok: true };
150
+ const tail = [res.stderr, res.stdout].filter(Boolean).join("\n").split(/\r?\n/).map((l) => l.trim()).filter(Boolean).slice(-4).join(" \xB7 ");
151
+ return {
152
+ ok: false,
153
+ detail: tail || `npm install exited ${res.status ?? "null"} (offline network, or registry error)`
154
+ };
155
+ }
156
+ function packageName(spec) {
157
+ if (spec.startsWith("@")) {
158
+ const at2 = spec.indexOf("@", 1);
159
+ return at2 === -1 ? spec : spec.slice(0, at2);
160
+ }
161
+ const at = spec.indexOf("@");
162
+ return at === -1 ? spec : spec.slice(0, at);
163
+ }
164
+
165
+ export { ensurePackage, ensureUnavailableMessage, isPackageInstalled };
166
+ //# sourceMappingURL=chunk-OSD546W7.js.map
167
+ //# sourceMappingURL=chunk-OSD546W7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code/ensure.ts"],"names":["mod","at"],"mappings":"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","file":"chunk-OSD546W7.js","sourcesContent":["/**\n * Lazy, consent-gated runtime dependency install (VG-CLI-CODE §6).\n *\n * The code capability must stay lean by default: we ship **no** model weights\n * and **no** heavyweight inference runtime in the published package, and we do\n * not pull anything until the `code`/`models` commands are actually used for the\n * first time — and even then only with explicit consent. This mirrors the\n * existing optional-embedder pattern (a host-side install into its own storage\n * on consent), generalized so any provider backend that needs an out-of-tree\n * package can request it.\n *\n * Guarantees:\n * - `--local`/offline never installs (air-gapped stays air-gapped).\n * - Non-interactive runs never install silently — they require `--yes`.\n * - Nothing is written into the published package tree; installs live under a\n * per-user runtime cache and load via `createRequire` from there.\n * - The installer is injectable, so tests exercise every branch without ever\n * shelling out to npm.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { whichOnPath } from '../util/cli-invocation.js';\n\n/** Why a package could not be made available — for calm, actionable messaging. */\nexport type EnsureFailure = 'offline' | 'no-consent' | 'install-failed' | 'load-failed';\n\nexport interface EnsureOptions {\n /** `--local`: never touch the network, never install. */\n local?: boolean;\n /** `--yes`/`--install`: consent to install without an interactive prompt. */\n consent?: boolean;\n /** Whether the caller is attached to an interactive TTY (defaults to a real check). */\n interactive?: boolean;\n /** Injectable installer — defaults to `npm install --prefix <dir> <spec>`. Returns true on success. */\n install?: (spec: string, dir: string) => boolean;\n /** Called (not thrown) with the reason when the package can't be provided. */\n onUnavailable?: (reason: EnsureFailure, spec: string) => void;\n}\n\nexport interface EnsureResult {\n /** The loaded module, or null when unavailable. */\n module: unknown | null;\n /** The runtime dir the package was resolved from (for diagnostics). */\n dir: string;\n reason?: EnsureFailure;\n /**\n * Optional one-line cause when `reason` is install-failed (EACCES, npm\n * missing, npm stderr tail). Prefer {@link ensureUnavailableMessage} so\n * callers always get the full actionable line.\n */\n detail?: string;\n}\n\n/**\n * The per-user runtime cache for on-demand packages. XDG-standard, shared across\n * repos (like the model cache), never inside the published package.\n * `$XDG_CACHE_HOME/vibgrate/runtime` (or `~/.cache/vibgrate/runtime`).\n */\nexport function runtimeCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'runtime');\n}\n\n/** Whether `spec`'s package is already resolvable from the runtime cache. */\nexport function isPackageInstalled(spec: string): boolean {\n const name = packageName(spec);\n try {\n const req = createRequire(path.join(runtimeCacheDir(), 'package.json'));\n req.resolve(name);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * A one-line, actionable explanation of why a runtime dependency isn't available\n * — always names the off switch and the fix, never alarms (GUARDRAILS §1.3).\n */\nexport function ensureUnavailableMessage(reason: EnsureFailure, spec: string, detail?: string): string {\n const name = packageName(spec);\n switch (reason) {\n case 'offline':\n return `${name} is needed for this backend but --local/offline is set — using a backend that needs no install, or drop --local to allow a one-time install.`;\n case 'no-consent':\n return `${name} is needed for this backend and isn't installed yet. Run \\`vg models install\\` (or \\`vg models pull\\`) to install runtime deps for the provider into ${runtimeCacheDir()} (nothing is written into the CLI itself), or pick a backend that needs no install (e.g. --provider ollama).`;\n case 'install-failed':\n if (detail?.trim()) {\n return `couldn't install ${name}: ${detail.trim()}`;\n }\n return `couldn't install ${name} (offline, or npm unavailable) — using a backend that needs no install. It will try again next time.`;\n case 'load-failed':\n default:\n return `${name} installed but couldn't be loaded here — using a backend that needs no install.`;\n }\n}\n\n/**\n * Ensure `spec` (e.g. `node-llama-cpp@^3`) is available, installing it once into\n * the runtime cache with consent if needed, then load and return it. Returns\n * `{ module: null, reason }` on any refusal/failure — the caller degrades to a\n * backend that needs no install; it never throws for an unavailable optional\n * package.\n */\nexport async function ensurePackage(spec: string, options: EnsureOptions = {}): Promise<EnsureResult> {\n const dir = runtimeCacheDir();\n const fail = (reason: EnsureFailure, detail?: string): EnsureResult => {\n options.onUnavailable?.(reason, spec);\n return { module: null, dir, reason, detail };\n };\n\n // Already present → just load it (no network, no consent needed).\n if (isPackageInstalled(spec)) {\n const mod = await load(spec, dir);\n return mod ? { module: mod, dir } : fail('load-failed');\n }\n\n // Not present. `--local`/offline forbids install outright.\n if (options.local) return fail('offline');\n\n // Non-interactive without consent must not install silently.\n const interactive = options.interactive ?? Boolean(process.stdout.isTTY && process.stdin.isTTY);\n if (!options.consent && !interactive) return fail('no-consent');\n if (!options.consent && interactive) return fail('no-consent'); // caller prompts, then re-invokes with consent\n\n // Install into the runtime cache.\n try {\n fs.mkdirSync(dir, { recursive: true });\n ensureRuntimeManifest(dir);\n } catch (err) {\n return fail('install-failed', cacheWriteFailureDetail(dir, err));\n }\n\n if (options.install) {\n const ok = options.install(spec, dir);\n if (!ok || !isPackageInstalled(spec)) {\n return fail('install-failed', !ok ? 'installer returned failure' : `${packageName(spec)} not resolvable after install`);\n }\n } else {\n const inst = runDefaultInstaller(spec, dir);\n if (!inst.ok || !isPackageInstalled(spec)) {\n return fail(\n 'install-failed',\n inst.detail ?? (!inst.ok ? 'npm install failed' : `${packageName(spec)} not resolvable after install`),\n );\n }\n }\n\n const mod = await load(spec, dir);\n return mod ? { module: mod, dir } : fail('load-failed');\n}\n\n/** A minimal manifest so npm has a project to install into. */\nfunction ensureRuntimeManifest(dir: string): void {\n const manifest = path.join(dir, 'package.json');\n if (!fs.existsSync(manifest)) {\n fs.writeFileSync(\n manifest,\n JSON.stringify({ name: 'vibgrate-runtime-deps', private: true, description: 'On-demand vg runtime packages' }, null, 2),\n );\n }\n}\n\nasync function load(spec: string, dir: string): Promise<unknown | null> {\n const name = packageName(spec);\n try {\n const req = createRequire(path.join(dir, 'package.json'));\n const resolved = req.resolve(name);\n const mod: any = await import(pathToFileURL(resolved).href);\n return mod?.default ?? mod;\n } catch {\n return null;\n }\n}\n\n/** Human detail when the runtime cache cannot be created or written. */\nexport function cacheWriteFailureDetail(dir: string, err: unknown): string {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as { code?: unknown }).code) : '';\n if (code === 'EACCES' || code === 'EPERM') {\n const parent = path.dirname(dir);\n return (\n `cannot write runtime cache at ${dir} (permission denied). ` +\n `If ${parent} is root-owned (often from a past sudo run), fix with: ` +\n `sudo chown -R \"$(whoami)\" ${parent} — then re-run \\`vg models install\\``\n );\n }\n const msg = err instanceof Error ? err.message : String(err);\n return `cannot prepare runtime cache at ${dir}: ${msg}`;\n}\n\n/**\n * Resolve `npm` for install. GUI apps (Dock-launched VS Code) often have a\n * stripped PATH without Homebrew; fall back to common install locations.\n */\nexport function resolveNpmBinary(): string | null {\n const names = process.platform === 'win32' ? ['npm.cmd', 'npm'] : ['npm'];\n for (const name of names) {\n const hit = whichOnPath(name);\n if (hit) return hit;\n }\n const candidates =\n process.platform === 'win32'\n ? []\n : [\n '/opt/homebrew/bin/npm',\n '/usr/local/bin/npm',\n path.join(os.homedir(), '.npm-global', 'bin', 'npm'),\n path.join(os.homedir(), '.local', 'bin', 'npm'),\n ];\n for (const c of candidates) {\n try {\n if (fs.existsSync(c)) return c;\n } catch {\n /* ignore */\n }\n }\n return null;\n}\n\n/** `npm install --prefix <dir> <spec>` with no scripts; capture failure detail. */\nfunction runDefaultInstaller(spec: string, dir: string): { ok: boolean; detail?: string } {\n const npm = resolveNpmBinary();\n if (!npm) {\n return {\n ok: false,\n detail:\n 'npm not found on PATH (common when VS Code is launched from the Dock). ' +\n 'Install Node.js, or run `vg models install` from a terminal where `npm` works',\n };\n }\n const res = spawnSync(npm, ['install', '--prefix', dir, '--no-audit', '--no-fund', '--ignore-scripts', spec], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: 180_000,\n });\n if (res.error) {\n const code = 'code' in res.error ? String((res.error as NodeJS.ErrnoException).code ?? '') : '';\n if (code === 'ENOENT') {\n return {\n ok: false,\n detail: `npm binary not executable at ${npm} — install Node.js or fix PATH, then re-run \\`vg models install\\``,\n };\n }\n return { ok: false, detail: res.error.message };\n }\n if (res.status === 0) return { ok: true };\n const tail = [res.stderr, res.stdout]\n .filter(Boolean)\n .join('\\n')\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .slice(-4)\n .join(' · ');\n return {\n ok: false,\n detail: tail || `npm install exited ${res.status ?? 'null'} (offline network, or registry error)`,\n };\n}\n\n/** Strip a version range from a spec → the bare package name (scoped-safe). */\nexport function packageName(spec: string): string {\n if (spec.startsWith('@')) {\n const at = spec.indexOf('@', 1);\n return at === -1 ? spec : spec.slice(0, at);\n }\n const at = spec.indexOf('@');\n return at === -1 ? spec : spec.slice(0, at);\n}\n"]}
@@ -148,7 +148,16 @@ async function ensureWeightCached(ref, options = {}) {
148
148
  }
149
149
  function sha256File(file) {
150
150
  const h = createHash("sha256");
151
- h.update(fs.readFileSync(file));
151
+ const fd = fs.openSync(file, "r");
152
+ try {
153
+ const buf = Buffer.alloc(8 * 1024 * 1024);
154
+ let n;
155
+ while ((n = fs.readSync(fd, buf, 0, buf.length, null)) > 0) {
156
+ h.update(n === buf.length ? buf : buf.subarray(0, n));
157
+ }
158
+ } finally {
159
+ fs.closeSync(fd);
160
+ }
152
161
  return h.digest("hex");
153
162
  }
154
163
  function defaultFetchToFile(url, dest, onProgress) {
@@ -201,6 +210,23 @@ function defaultFetchToFile(url, dest, onProgress) {
201
210
  get(url, 0);
202
211
  });
203
212
  }
213
+ function freeBytesOnVolume(targetPath) {
214
+ let dir = targetPath;
215
+ for (let i = 0; i < 10; i++) {
216
+ try {
217
+ const st = fs.statfsSync?.(dir);
218
+ if (st) {
219
+ const free = Number(st.bavail) * Number(st.bsize);
220
+ if (Number.isFinite(free) && free >= 0) return free;
221
+ }
222
+ } catch {
223
+ }
224
+ const parent = path.dirname(dir);
225
+ if (parent === dir) break;
226
+ dir = parent;
227
+ }
228
+ return void 0;
229
+ }
204
230
  function listCachedWeights(env = process.env) {
205
231
  const dir = weightStoreDir(env);
206
232
  try {
@@ -210,6 +236,6 @@ function listCachedWeights(env = process.env) {
210
236
  }
211
237
  }
212
238
 
213
- export { catalogIntegrityReport, ensureWeightCached, isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef, weightStoreDir };
214
- //# sourceMappingURL=chunk-GYSOQH5C.js.map
215
- //# sourceMappingURL=chunk-GYSOQH5C.js.map
239
+ export { catalogIntegrityReport, ensureWeightCached, freeBytesOnVolume, isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef, weightStoreDir };
240
+ //# sourceMappingURL=chunk-OV4KGXPD.js.map
241
+ //# sourceMappingURL=chunk-OV4KGXPD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/weight-store.ts"],"names":[],"mappings":"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","file":"chunk-OV4KGXPD.js","sourcesContent":["/**\n * First-party weight store — content-addressed GGUF cache under the Vibgrate\n * cache root (never in-repo). Complements Ollama as a download channel so\n * embedded llama.cpp packs need not depend on a third-party app for weights.\n *\n * Only HTTPS URLs from an allowlist (or pack-declared URLs that pass the same\n * host allowlist) are fetched. No auto-download except via explicit\n * `vg models install` / executor consent.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport { createHash } from 'node:crypto';\nimport { vibgrateCacheDir } from './paths.js';\n\nexport const WEIGHT_STORE_SCHEMA = 'weight-store/0' as const;\n\n/** Hosts we will download weights from (no arbitrary open proxy). */\nexport const WEIGHT_DOWNLOAD_HOST_ALLOWLIST = new Set([\n 'huggingface.co',\n 'hf.co',\n 'cdn-lfs.huggingface.co',\n 'cdn-lfs-us-1.huggingface.co',\n 'us.aws.cdn.hf.co',\n 'cas-server.xethub.hf.co',\n 'objects.githubusercontent.com',\n 'github.com',\n]);\n\n/** Host suffixes allowed for HF LFS / Xet CDN redirects. */\nexport function isAllowedWeightHost(hostname: string): boolean {\n const h = hostname.toLowerCase();\n if (WEIGHT_DOWNLOAD_HOST_ALLOWLIST.has(h)) return true;\n if (h.endsWith('.huggingface.co')) return true;\n if (h.endsWith('.hf.co')) return true;\n if (h.endsWith('.cdn.hf.co')) return true;\n return false;\n}\n\nexport interface WeightCatalogEntry {\n /** Stable ref (matches pack weightsRef or basename). */\n ref: string;\n /** HTTPS URL to the GGUF (or redirected LFS object). */\n url: string;\n /** Optional expected size for progress UX. */\n bytes?: number;\n license?: string;\n /**\n * When set, download **must** match this sha256 or install fails (B6).\n * Leave unset only while pinning is pending — status reports unpinned.\n */\n sha256?: string;\n /** Pack channel this entry was verified against. */\n packChannel?: string;\n}\n\n/**\n * Curated first-party catalog — small, versioned with packs. Not a general hub.\n * URLs point at public Hugging Face GGUF artifacts for Qwen2.5-Coder.\n *\n * Integrity: sha256 pins are required for production installs once verified.\n * Entries without sha256 are marked unpinned in {@link catalogIntegrityReport}\n * and still download, but CI should fail if any pack primary lacks a pin.\n */\nexport const FIRST_PARTY_WEIGHT_CATALOG: WeightCatalogEntry[] = [\n {\n ref: 'qwen2.5-coder-3b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-3B-Instruct-GGUF/resolve/main/qwen2.5-coder-3b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.3',\n // Git LFS oid = content sha256 (from HF API tree, 2026-07-27).\n sha256: '724fb256bec1ff062b2f65e4569e871ad2e95ab2a3989723d1769c54294730b7',\n bytes: 2_104_932_800,\n },\n {\n ref: 'qwen2.5-coder-7b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/main/qwen2.5-coder-7b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.3',\n sha256: '509287f78cb4d4cf6b3843734733b914b2c158e43e22a7f4bf5e963800894d3c',\n bytes: 4_683_073_536,\n },\n {\n ref: 'qwen2.5-coder-14b-q4_k_m.gguf',\n url: 'https://huggingface.co/Qwen/Qwen2.5-Coder-14B-Instruct-GGUF/resolve/main/qwen2.5-coder-14b-instruct-q4_k_m.gguf',\n license: 'Apache-2.0',\n packChannel: '2026.07.4',\n // Git LFS oid = content sha256 (from HF API tree, 2026-07-27).\n sha256: 'c1e659736d89ac1065fb495330fb824d94001974a4bfa78e7270e43476a8d940',\n bytes: 8_988_110_272,\n },\n];\n\nexport interface CatalogIntegrityReport {\n total: number;\n pinned: number;\n unpinned: string[];\n /** True when every entry has sha256. */\n complete: boolean;\n}\n\nexport function catalogIntegrityReport(\n catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG,\n): CatalogIntegrityReport {\n const unpinned = catalog.filter((e) => !e.sha256?.trim()).map((e) => e.ref);\n return {\n total: catalog.length,\n pinned: catalog.length - unpinned.length,\n unpinned,\n complete: unpinned.length === 0,\n };\n}\n\n/** Require sha256 on every catalog entry (CI gate for pack releases). */\nexport function assertCatalogPinned(catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG): void {\n const report = catalogIntegrityReport(catalog);\n if (!report.complete) {\n throw new Error(\n `weight catalog incomplete: ${report.unpinned.length}/${report.total} entries missing sha256: ${report.unpinned.join(', ')}`,\n );\n }\n}\n\nexport function weightStoreDir(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(vibgrateCacheDir(env), 'weights');\n}\n\nexport function weightPathForRef(ref: string, env: NodeJS.ProcessEnv = process.env): string {\n const base = path.basename(ref).replace(/[^a-zA-Z0-9._+-]/g, '_');\n return path.join(weightStoreDir(env), base);\n}\n\nexport function isWeightCached(ref: string, env: NodeJS.ProcessEnv = process.env): boolean {\n try {\n const p = weightPathForRef(ref, env);\n return fs.existsSync(p) && fs.statSync(p).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function lookupCatalog(ref: string, catalog: WeightCatalogEntry[] = FIRST_PARTY_WEIGHT_CATALOG): WeightCatalogEntry | null {\n const want = ref.toLowerCase();\n return (\n catalog.find((e) => e.ref.toLowerCase() === want) ??\n catalog.find((e) => want.includes(e.ref.toLowerCase()) || e.ref.toLowerCase().includes(want)) ??\n null\n );\n}\n\nexport function isAllowedWeightUrl(url: string): boolean {\n try {\n const u = new URL(url);\n if (u.protocol !== 'https:') return false;\n return isAllowedWeightHost(u.hostname);\n } catch {\n return false;\n }\n}\n\nexport interface DownloadWeightOptions {\n env?: NodeJS.ProcessEnv;\n /** Override catalog URL. */\n url?: string;\n expectedSha256?: string;\n onProgress?: (line: string) => void;\n /** Injectable fetch for tests. */\n fetchToFile?: (url: string, dest: string, onProgress?: (line: string) => void) => Promise<void>;\n}\n\nexport interface DownloadWeightResult {\n ok: boolean;\n path?: string;\n error?: string;\n fromCache?: boolean;\n}\n\n/** In-flight downloads: one network fetch per dest path (concurrent install-safe). */\nconst inflight = new Map<string, Promise<DownloadWeightResult>>();\n\n/**\n * Ensure weights for `ref` exist in the first-party store. Downloads when missing.\n * Concurrent callers for the same ref share a single download promise.\n */\nexport async function ensureWeightCached(ref: string, options: DownloadWeightOptions = {}): Promise<DownloadWeightResult> {\n const env = options.env ?? process.env;\n const dest = weightPathForRef(ref, env);\n if (isWeightCached(ref, env)) {\n return { ok: true, path: dest, fromCache: true };\n }\n\n const existing = inflight.get(dest);\n if (existing) return existing;\n\n const work = (async (): Promise<DownloadWeightResult> => {\n // Re-check after joining the queue.\n if (isWeightCached(ref, env)) {\n return { ok: true, path: dest, fromCache: true };\n }\n\n const entry = lookupCatalog(ref);\n const url = options.url ?? entry?.url;\n if (!url) {\n return { ok: false, error: `no first-party download URL for weights ref \"${ref}\" — set a pack downloadUrl or place a gguf at ${dest}` };\n }\n if (!isAllowedWeightUrl(url)) {\n return { ok: false, error: `weight URL host not allowlisted: ${url}` };\n }\n\n try {\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n const tmp = `${dest}.partial.${process.pid}.${Date.now()}`;\n const fetchFn = options.fetchToFile ?? defaultFetchToFile;\n options.onProgress?.(`downloading ${ref}`);\n await fetchFn(url, tmp, options.onProgress);\n const sha = (options.expectedSha256 ?? entry?.sha256)?.trim();\n if (sha) {\n const actual = sha256File(tmp);\n if (actual !== sha.toLowerCase()) {\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return { ok: false, error: `sha256 mismatch for ${ref} (expected ${sha}, got ${actual})` };\n }\n } else if (entry && !entry.sha256) {\n options.onProgress?.(`warning: ${ref} has no sha256 pin in catalog — integrity not verified`);\n }\n // Atomic publish: if another worker won the race, drop our partial.\n if (isWeightCached(ref, env)) {\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return { ok: true, path: dest, fromCache: true };\n }\n fs.renameSync(tmp, dest);\n return { ok: true, path: dest, fromCache: false };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n } finally {\n inflight.delete(dest);\n }\n })();\n\n inflight.set(dest, work);\n return work;\n}\n\n/**\n * Stream a file through sha256. Never `readFileSync` whole weights — Node rejects\n * buffers larger than ~2 GiB (`File size (…) is greater than 2 GiB`), which broke\n * Flow/Forge installs even when the download completed.\n */\nfunction sha256File(file: string): string {\n const h = createHash('sha256');\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(8 * 1024 * 1024);\n let n: number;\n while ((n = fs.readSync(fd, buf, 0, buf.length, null)) > 0) {\n h.update(n === buf.length ? buf : buf.subarray(0, n));\n }\n } finally {\n fs.closeSync(fd);\n }\n return h.digest('hex');\n}\n\n/** Minimal HTTPS GET with redirect follow (tests inject fetchToFile). */\nexport function defaultFetchToFile(url: string, dest: string, onProgress?: (line: string) => void): Promise<void> {\n return new Promise((resolve, reject) => {\n const get = (u: string, redirects: number): void => {\n if (redirects > 8) {\n reject(new Error('too many redirects'));\n return;\n }\n const lib = u.startsWith('https:') ? https : http;\n const req = lib.get(u, (res) => {\n const code = res.statusCode ?? 0;\n if (code >= 300 && code < 400 && res.headers.location) {\n const next = new URL(res.headers.location, u).href;\n // Redirects must stay on HTTPS + allowlisted hosts (incl. HF LFS/Xet CDNs).\n try {\n const nextUrl = new URL(next);\n if (nextUrl.protocol !== 'https:' || !isAllowedWeightHost(nextUrl.hostname)) {\n reject(new Error(`redirect host not allowlisted: ${nextUrl.hostname || next}`));\n return;\n }\n } catch {\n reject(new Error('invalid redirect URL'));\n return;\n }\n res.resume();\n get(next, redirects + 1);\n return;\n }\n if (code !== 200) {\n reject(new Error(`HTTP ${code} fetching weights`));\n res.resume();\n return;\n }\n const total = Number(res.headers['content-length'] || 0);\n let got = 0;\n const out = fs.createWriteStream(dest);\n res.on('data', (chunk: Buffer) => {\n got += chunk.length;\n if (total > 0 && got % (8 * 1024 * 1024) < chunk.length) {\n onProgress?.(`${Math.floor((100 * got) / total)}%`);\n }\n });\n res.pipe(out);\n out.on('finish', () => resolve());\n out.on('error', reject);\n res.on('error', reject);\n });\n req.on('error', reject);\n };\n get(url, 0);\n });\n}\n\n/**\n * Free bytes on the volume that holds `targetPath` (weight store / cache).\n * Best-effort via `statfsSync` (Node 18.15+); walks parents if path is missing.\n */\nexport function freeBytesOnVolume(targetPath: string): number | undefined {\n let dir = targetPath;\n for (let i = 0; i < 10; i++) {\n try {\n const st = (\n fs as typeof fs & {\n statfsSync?: (p: string) => { bavail: number | bigint; bsize: number | bigint };\n }\n ).statfsSync?.(dir);\n if (st) {\n const free = Number(st.bavail) * Number(st.bsize);\n if (Number.isFinite(free) && free >= 0) return free;\n }\n } catch {\n /* try parent */\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return undefined;\n}\n\n/** List GGUF files already in the first-party store (for discovery). */\nexport function listCachedWeights(env: NodeJS.ProcessEnv = process.env): Array<{ name: string; path: string }> {\n const dir = weightStoreDir(env);\n try {\n return fs\n .readdirSync(dir)\n .filter((n) => n.endsWith('.gguf'))\n .sort()\n .map((n) => ({ name: n, path: path.join(dir, n) }));\n } catch {\n return [];\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { startVgdServer } from './chunk-77LYGXBI.js';
1
+ import { startVgdServer } from './chunk-JRAGO6OB.js';
2
2
  import { vgdIsRunning, vgdRequest } from './chunk-PMYWZRRS.js';
3
3
 
4
4
  // src/code/runtime-session.ts
@@ -78,5 +78,5 @@ function noneSession() {
78
78
  }
79
79
 
80
80
  export { startCodeRuntimeSession };
81
- //# sourceMappingURL=chunk-XPJZTSY7.js.map
82
- //# sourceMappingURL=chunk-XPJZTSY7.js.map
81
+ //# sourceMappingURL=chunk-R2QNFXE5.js.map
82
+ //# sourceMappingURL=chunk-R2QNFXE5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":";;;;AA4CA,eAAsB,wBAAwB,OAAA,EAA6D;AACzG,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,KAAc,CAAC,OAAgB,YAAA,CAAa,EAAE,UAAA,EAAY,EAAA,EAAI,CAAA,CAAA;AACxF,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,UAAA;AACnC,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA,KAAgB,CAAC,IAAA,KAAkC,eAAe,IAAI,CAAA,CAAA;AAElG,EAAA,IAAI;AACF,IAAA,IAAI,MAAM,SAAA,CAAU,UAAU,CAAA,EAAG;AAC/B,MAAA,OAAO,MAAM,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,YAAY,OAAO,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,MAAM,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,UAAA,EAAY,aAAa,OAAO,CAAA;AAAA,EACxE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,eAAe,cAAA,CACb,IAAA,EACA,UAAA,EACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,UAAA,GAAa,EAAE,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,EAAE,IAAI,UAAA,EAAY,IAAA,IAAQ,UAAU,CAAA;AAC9D,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,EAAE,WAAA,IAAe,GAAA,CAAA,SAAa,WAAA,EAAY;AACzD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,UAAU,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC3E,EAAA,MAAM,MAAM,MAAA,IAAU,MAAA,CAAO,MAAM,KAAA,IAAS,MAAA,GAAS,OAAO,GAAA,GAAM,MAAA;AAClE,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,GAAA;AAAA,IACA,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,YAAY,MAAA,IAAU,MAAA,CAAO,MAAM,YAAA,IAAgB,MAAA,GAAS,OAAO,UAAA,GAAa,UAAA;AAAA,IAChF,KAAA,EAAO,GAAA,IAAO,IAAA,GAAO,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,KAAA;AAAA,IACpC,MAAM,OAAA,GAAU;AACd,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,IAAQ,UAAU,CAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,GACF;AACF;AAEA,eAAe,UAAA,CACb,IAAA,EACA,UAAA,EACA,WAAA,EACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,EAAE,YAAY,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAW;AACnD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,EAAE,IAAI,UAAA,EAAY,IAAA,IAAQ,UAAU,CAAA;AAC9D,IAAA,IAAI,GAAA,CAAI,EAAA,IAAM,WAAA,IAAe,GAAA,cAAiB,GAAA,CAAI,SAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,SAAA;AAAA,IACA,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,KAAA,EAAO,CAAA,aAAA,CAAA;AAAA,IACP,MAAM,OAAA,GAAU;AACd,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,KAAA,EAAM;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,WAAA,GAAkC;AACzC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,SAAA,EAAW,MAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,EAAA;AAAA,IACP,MAAM,OAAA,GAAU;AAAA,IAEhB;AAAA,GACF;AACF","file":"chunk-XPJZTSY7.js","sourcesContent":["/**\n * Session boundary between VG Code and the Fusion Runtime daemon (`vgd`).\n *\n * Replaces the old {@link GraphProcess} (`vg serve` child) for the interactive\n * coding REPL. Behaviour:\n *\n * 1. If a local vgd is already running — register this workspace and leave the\n * daemon running when the session ends (unregister only).\n * 2. Otherwise — start an **in-process** vgd for the life of the session and\n * tear it down on dispose. No second OS process, no `vg serve` spawn.\n *\n * Never throws: a failure to attach degrades to “no runtime session” and the\n * agent continues with the in-process graph only (same safety as GraphProcess).\n */\n\nimport { startVgdServer, vgdIsRunning, vgdRequest, type VgdServer } from '../runtime/vgd/index.js';\nimport type { WorkspaceRecord } from '../runtime/vgd/protocol.js';\n\nexport type RuntimeSessionKind = 'attached' | 'owned' | 'none';\n\nexport interface RuntimeSessionOptions {\n root: string;\n /** Override socket path (tests). */\n socketPath?: string;\n /** Injectable connect/start hooks (tests). */\n isRunning?: (socketPath?: string) => Promise<boolean>;\n request?: typeof vgdRequest;\n startServer?: (opts: { socketPath?: string }) => Promise<VgdServer>;\n}\n\nexport interface CodeRuntimeSession {\n readonly kind: RuntimeSessionKind;\n /** Daemon pid when known (attached status or owned process). */\n readonly pid: number | undefined;\n readonly workspace: WorkspaceRecord | undefined;\n readonly socketPath: string | undefined;\n /** Human label for the REPL intro line. */\n readonly label: string;\n dispose(): Promise<void>;\n}\n\n/**\n * Attach VG Code to vgd for one coding session. Always resolves (never throws).\n */\nexport async function startCodeRuntimeSession(options: RuntimeSessionOptions): Promise<CodeRuntimeSession> {\n const socketPath = options.socketPath;\n const isRunning = options.isRunning ?? ((sp?: string) => vgdIsRunning({ socketPath: sp }));\n const request = options.request ?? vgdRequest;\n const startServer = options.startServer ?? ((opts: { socketPath?: string }) => startVgdServer(opts));\n\n try {\n if (await isRunning(socketPath)) {\n return await attachExisting(options.root, socketPath, request);\n }\n return await startOwned(options.root, socketPath, startServer, request);\n } catch {\n return noneSession();\n }\n}\n\nasync function attachExisting(\n root: string,\n socketPath: string | undefined,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const clientOpts = { socketPath };\n const reg = await request({ op: 'register', root }, clientOpts);\n if (!reg.ok || !('workspace' in reg)) return noneSession();\n const status = await request({ op: 'status' }, clientOpts).catch(() => null);\n const pid = status && status.ok && 'pid' in status ? status.pid : undefined;\n let disposed = false;\n return {\n kind: 'attached',\n pid,\n workspace: reg.workspace,\n socketPath: status && status.ok && 'socketPath' in status ? status.socketPath : socketPath,\n label: pid != null ? `vgd ${pid}` : 'vgd',\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await request({ op: 'unregister', root }, clientOpts);\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nasync function startOwned(\n root: string,\n socketPath: string | undefined,\n startServer: (opts: { socketPath?: string }) => Promise<VgdServer>,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const server = await startServer({ socketPath });\n const clientOpts = { socketPath: server.socketPath };\n let workspace: WorkspaceRecord | undefined;\n try {\n const reg = await request({ op: 'register', root }, clientOpts);\n if (reg.ok && 'workspace' in reg) workspace = reg.workspace;\n } catch {\n /* registry optional for an empty session */\n }\n let disposed = false;\n return {\n kind: 'owned',\n pid: process.pid,\n workspace,\n socketPath: server.socketPath,\n label: `vgd (session)`,\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await server.close();\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nfunction noneSession(): CodeRuntimeSession {\n return {\n kind: 'none',\n pid: undefined,\n workspace: undefined,\n socketPath: undefined,\n label: '',\n async dispose() {\n /* no-op */\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-R2QNFXE5.js","sourcesContent":["/**\n * Session boundary between VG Code and the Fusion Runtime daemon (`vgd`).\n *\n * Replaces the old {@link GraphProcess} (`vg serve` child) for the interactive\n * coding REPL. Behaviour:\n *\n * 1. If a local vgd is already running — register this workspace and leave the\n * daemon running when the session ends (unregister only).\n * 2. Otherwise — start an **in-process** vgd for the life of the session and\n * tear it down on dispose. No second OS process, no `vg serve` spawn.\n *\n * Never throws: a failure to attach degrades to “no runtime session” and the\n * agent continues with the in-process graph only (same safety as GraphProcess).\n */\n\nimport { startVgdServer, vgdIsRunning, vgdRequest, type VgdServer } from '../runtime/vgd/index.js';\nimport type { WorkspaceRecord } from '../runtime/vgd/protocol.js';\n\nexport type RuntimeSessionKind = 'attached' | 'owned' | 'none';\n\nexport interface RuntimeSessionOptions {\n root: string;\n /** Override socket path (tests). */\n socketPath?: string;\n /** Injectable connect/start hooks (tests). */\n isRunning?: (socketPath?: string) => Promise<boolean>;\n request?: typeof vgdRequest;\n startServer?: (opts: { socketPath?: string }) => Promise<VgdServer>;\n}\n\nexport interface CodeRuntimeSession {\n readonly kind: RuntimeSessionKind;\n /** Daemon pid when known (attached status or owned process). */\n readonly pid: number | undefined;\n readonly workspace: WorkspaceRecord | undefined;\n readonly socketPath: string | undefined;\n /** Human label for the REPL intro line. */\n readonly label: string;\n dispose(): Promise<void>;\n}\n\n/**\n * Attach VG Code to vgd for one coding session. Always resolves (never throws).\n */\nexport async function startCodeRuntimeSession(options: RuntimeSessionOptions): Promise<CodeRuntimeSession> {\n const socketPath = options.socketPath;\n const isRunning = options.isRunning ?? ((sp?: string) => vgdIsRunning({ socketPath: sp }));\n const request = options.request ?? vgdRequest;\n const startServer = options.startServer ?? ((opts: { socketPath?: string }) => startVgdServer(opts));\n\n try {\n if (await isRunning(socketPath)) {\n return await attachExisting(options.root, socketPath, request);\n }\n return await startOwned(options.root, socketPath, startServer, request);\n } catch {\n return noneSession();\n }\n}\n\nasync function attachExisting(\n root: string,\n socketPath: string | undefined,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const clientOpts = { socketPath };\n const reg = await request({ op: 'register', root }, clientOpts);\n if (!reg.ok || !('workspace' in reg)) return noneSession();\n const status = await request({ op: 'status' }, clientOpts).catch(() => null);\n const pid = status && status.ok && 'pid' in status ? status.pid : undefined;\n let disposed = false;\n return {\n kind: 'attached',\n pid,\n workspace: reg.workspace,\n socketPath: status && status.ok && 'socketPath' in status ? status.socketPath : socketPath,\n label: pid != null ? `vgd ${pid}` : 'vgd',\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await request({ op: 'unregister', root }, clientOpts);\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nasync function startOwned(\n root: string,\n socketPath: string | undefined,\n startServer: (opts: { socketPath?: string }) => Promise<VgdServer>,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const server = await startServer({ socketPath });\n const clientOpts = { socketPath: server.socketPath };\n let workspace: WorkspaceRecord | undefined;\n try {\n const reg = await request({ op: 'register', root }, clientOpts);\n if (reg.ok && 'workspace' in reg) workspace = reg.workspace;\n } catch {\n /* registry optional for an empty session */\n }\n let disposed = false;\n return {\n kind: 'owned',\n pid: process.pid,\n workspace,\n socketPath: server.socketPath,\n label: `vgd (session)`,\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await server.close();\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nfunction noneSession(): CodeRuntimeSession {\n return {\n kind: 'none',\n pid: undefined,\n workspace: undefined,\n socketPath: undefined,\n label: '',\n async dispose() {\n /* no-op */\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { acquireHostSession, generateOnSession } from './chunk-K7REHDQS.js';
1
+ import { acquireHostSession, generateOnSession } from './chunk-6HX47EBL.js';
2
2
  import { annotateUnknownIdentifiers } from './chunk-JIBOJTGS.js';
3
3
  import { vibgrateRuntimeDir } from './chunk-BWPBB45M.js';
4
4
  import * as path from 'path';
@@ -378,5 +378,5 @@ function resolveInferenceIsolation(explicit, env = process.env) {
378
378
  }
379
379
 
380
380
  export { EmbeddedLlmHost, LLM_HOST_IPC_SCHEMA, ProcessBridgeLlmHost, ProcessLlmHost, createLlmHost, defaultProcessEndpoint, generateWithLlamaBinding, resolveInferenceIsolation, startProcessHostServer };
381
- //# sourceMappingURL=chunk-PXHNTC6D.js.map
382
- //# sourceMappingURL=chunk-PXHNTC6D.js.map
381
+ //# sourceMappingURL=chunk-SIPGDJT4.js.map
382
+ //# sourceMappingURL=chunk-SIPGDJT4.js.map