@vibgrate/cli 2026.818.2 → 2026.819.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 (187) hide show
  1. package/DOCS.md +3 -3
  2. package/dist/agent-ZJRWCMR6.js +30 -0
  3. package/dist/{agent-X6VYCE63.js.map → agent-ZJRWCMR6.js.map} +1 -1
  4. package/dist/{approvals-TPQFQSWG.js → approvals-YTUXBZWQ.js} +7 -7
  5. package/dist/{approvals-TPQFQSWG.js.map → approvals-YTUXBZWQ.js.map} +1 -1
  6. package/dist/attach-WOA25VNH.js +10 -0
  7. package/dist/{attach-G5JUIWIT.js.map → attach-WOA25VNH.js.map} +1 -1
  8. package/dist/baseline-TVRRUZGA.js +9 -0
  9. package/dist/{baseline-DXI64VLW.js.map → baseline-TVRRUZGA.js.map} +1 -1
  10. package/dist/{chunk-V6WONSIK.js → chunk-24HKTTFV.js} +5 -5
  11. package/dist/{chunk-V6WONSIK.js.map → chunk-24HKTTFV.js.map} +1 -1
  12. package/dist/{chunk-VMAIDM4K.js → chunk-2C4QT5D7.js} +5 -5
  13. package/dist/{chunk-VMAIDM4K.js.map → chunk-2C4QT5D7.js.map} +1 -1
  14. package/dist/{chunk-JGA63RGF.js → chunk-2ZBLZ2S3.js} +13 -13
  15. package/dist/{chunk-JGA63RGF.js.map → chunk-2ZBLZ2S3.js.map} +1 -1
  16. package/dist/{chunk-OV4KGXPD.js → chunk-57ZRSCHY.js} +3 -3
  17. package/dist/{chunk-OV4KGXPD.js.map → chunk-57ZRSCHY.js.map} +1 -1
  18. package/dist/{chunk-NDNNOAS6.js → chunk-6H2QV5DR.js} +3 -3
  19. package/dist/{chunk-NDNNOAS6.js.map → chunk-6H2QV5DR.js.map} +1 -1
  20. package/dist/{chunk-2C33WR5O.js → chunk-7BSUPHX6.js} +3 -3
  21. package/dist/{chunk-2C33WR5O.js.map → chunk-7BSUPHX6.js.map} +1 -1
  22. package/dist/{chunk-LJSJX6U4.js → chunk-A3WWRW7U.js} +3 -3
  23. package/dist/{chunk-LJSJX6U4.js.map → chunk-A3WWRW7U.js.map} +1 -1
  24. package/dist/{chunk-X2MQ7UFL.js → chunk-AP3JN33O.js} +12 -12
  25. package/dist/{chunk-X2MQ7UFL.js.map → chunk-AP3JN33O.js.map} +1 -1
  26. package/dist/{chunk-O5IJDMTB.js → chunk-AQZYDFEK.js} +4 -4
  27. package/dist/{chunk-O5IJDMTB.js.map → chunk-AQZYDFEK.js.map} +1 -1
  28. package/dist/{chunk-VQ5KMHW6.js → chunk-BQ6NTRRK.js} +44 -15
  29. package/dist/chunk-BQ6NTRRK.js.map +1 -0
  30. package/dist/{chunk-HF6R73UC.js → chunk-C2EZIAA3.js} +27 -13
  31. package/dist/chunk-C2EZIAA3.js.map +1 -0
  32. package/dist/{chunk-MRZHNUN7.js → chunk-CA4YQBA7.js} +4 -4
  33. package/dist/{chunk-MRZHNUN7.js.map → chunk-CA4YQBA7.js.map} +1 -1
  34. package/dist/{chunk-YF54UMOU.js → chunk-CBL3VY7J.js} +3 -3
  35. package/dist/{chunk-YF54UMOU.js.map → chunk-CBL3VY7J.js.map} +1 -1
  36. package/dist/{chunk-PRHH4DVO.js → chunk-FCMWHSQ6.js} +3 -3
  37. package/dist/{chunk-PRHH4DVO.js.map → chunk-FCMWHSQ6.js.map} +1 -1
  38. package/dist/{chunk-V2UGRUTL.js → chunk-GBXOAO5V.js} +176 -37
  39. package/dist/chunk-GBXOAO5V.js.map +1 -0
  40. package/dist/{chunk-JFE7XCAE.js → chunk-IASO2HCI.js} +3 -3
  41. package/dist/{chunk-JFE7XCAE.js.map → chunk-IASO2HCI.js.map} +1 -1
  42. package/dist/{chunk-ZUOBPKVK.js → chunk-IMI2VHHZ.js} +3 -3
  43. package/dist/{chunk-ZUOBPKVK.js.map → chunk-IMI2VHHZ.js.map} +1 -1
  44. package/dist/{chunk-NKLYDSB7.js → chunk-JPOYXG7Z.js} +10 -10
  45. package/dist/{chunk-NKLYDSB7.js.map → chunk-JPOYXG7Z.js.map} +1 -1
  46. package/dist/{chunk-L2OS4WHT.js → chunk-MMJFHEZ4.js} +4 -4
  47. package/dist/{chunk-L2OS4WHT.js.map → chunk-MMJFHEZ4.js.map} +1 -1
  48. package/dist/{chunk-E3O5UKNA.js → chunk-NKKOGJ63.js} +35 -17
  49. package/dist/chunk-NKKOGJ63.js.map +1 -0
  50. package/dist/{chunk-7AVYKZEM.js → chunk-NV7XNBX4.js} +4 -4
  51. package/dist/{chunk-7AVYKZEM.js.map → chunk-NV7XNBX4.js.map} +1 -1
  52. package/dist/{chunk-NJQZRM55.js → chunk-OGFOJG4H.js} +6 -6
  53. package/dist/{chunk-NJQZRM55.js.map → chunk-OGFOJG4H.js.map} +1 -1
  54. package/dist/{chunk-NZELMYT4.js → chunk-OLIMW4PQ.js} +8 -56
  55. package/dist/chunk-OLIMW4PQ.js.map +1 -0
  56. package/dist/{chunk-B4EXD5LK.js → chunk-PJRPSYFQ.js} +9 -7
  57. package/dist/chunk-PJRPSYFQ.js.map +1 -0
  58. package/dist/{chunk-NG4KIJW6.js → chunk-PVNALGTG.js} +10 -6
  59. package/dist/chunk-PVNALGTG.js.map +1 -0
  60. package/dist/{chunk-BMOFJIMG.js → chunk-QE6F62FR.js} +3 -3
  61. package/dist/{chunk-BMOFJIMG.js.map → chunk-QE6F62FR.js.map} +1 -1
  62. package/dist/{chunk-6ABMV74F.js → chunk-R5TQBIR6.js} +4 -4
  63. package/dist/{chunk-6ABMV74F.js.map → chunk-R5TQBIR6.js.map} +1 -1
  64. package/dist/{chunk-5I4VSBWQ.js → chunk-RTURQXQL.js} +372 -113
  65. package/dist/chunk-RTURQXQL.js.map +1 -0
  66. package/dist/{chunk-74UBGF4P.js → chunk-SHD5TCZ5.js} +3 -3
  67. package/dist/{chunk-74UBGF4P.js.map → chunk-SHD5TCZ5.js.map} +1 -1
  68. package/dist/{chunk-KU7FI5EV.js → chunk-USPMMVNH.js} +3 -3
  69. package/dist/{chunk-KU7FI5EV.js.map → chunk-USPMMVNH.js.map} +1 -1
  70. package/dist/{chunk-E53WBVUQ.js → chunk-VHRSG6CF.js} +3 -3
  71. package/dist/{chunk-E53WBVUQ.js.map → chunk-VHRSG6CF.js.map} +1 -1
  72. package/dist/{chunk-I5LP55B6.js → chunk-W44THEXF.js} +3 -3
  73. package/dist/{chunk-I5LP55B6.js.map → chunk-W44THEXF.js.map} +1 -1
  74. package/dist/{chunk-AEJYA6HZ.js → chunk-W6ASIMG5.js} +7 -7
  75. package/dist/{chunk-AEJYA6HZ.js.map → chunk-W6ASIMG5.js.map} +1 -1
  76. package/dist/{chunk-CQDUBAQY.js → chunk-WNKGRXUA.js} +3 -3
  77. package/dist/{chunk-CQDUBAQY.js.map → chunk-WNKGRXUA.js.map} +1 -1
  78. package/dist/{chunk-RHKOUPWT.js → chunk-WPLOEFZU.js} +7 -5
  79. package/dist/chunk-WPLOEFZU.js.map +1 -0
  80. package/dist/{chunk-FJG5AXKZ.js → chunk-WUFIXAEJ.js} +22 -6
  81. package/dist/chunk-WUFIXAEJ.js.map +1 -0
  82. package/dist/{chunk-6PFHDHOL.js → chunk-XLQ4YHS3.js} +16 -14
  83. package/dist/chunk-XLQ4YHS3.js.map +1 -0
  84. package/dist/{chunk-BWPBB45M.js → chunk-XP6UUCZZ.js} +3 -3
  85. package/dist/{chunk-BWPBB45M.js.map → chunk-XP6UUCZZ.js.map} +1 -1
  86. package/dist/{chunk-BPF3YX2U.js → chunk-XQNKCA2J.js} +6 -3
  87. package/dist/chunk-XQNKCA2J.js.map +1 -0
  88. package/dist/{chunk-FFXGWFAE.js → chunk-XW2XQM3C.js} +7 -7
  89. package/dist/{chunk-FFXGWFAE.js.map → chunk-XW2XQM3C.js.map} +1 -1
  90. package/dist/{chunk-7N4Y3E47.js → chunk-YJYEPYB2.js} +13 -18
  91. package/dist/chunk-YJYEPYB2.js.map +1 -0
  92. package/dist/chunk-ZUZHYAJK.js +6 -0
  93. package/dist/{chunk-4NTNMT6T.js.map → chunk-ZUZHYAJK.js.map} +1 -1
  94. package/dist/cli.js +112 -108
  95. package/dist/cli.js.map +1 -1
  96. package/dist/client-P5XSRFV4.js +8 -0
  97. package/dist/{client-UQIELEEZ.js.map → client-P5XSRFV4.js.map} +1 -1
  98. package/dist/daemon-YKOEP3XA.js +30 -0
  99. package/dist/{daemon-GUMWMKCA.js.map → daemon-YKOEP3XA.js.map} +1 -1
  100. package/dist/embed-worker-main.js +5 -5
  101. package/dist/ensure-map-BLRJDO2Y.js +40 -0
  102. package/dist/{ensure-map-FHDJTO7Y.js.map → ensure-map-BLRJDO2Y.js.map} +1 -1
  103. package/dist/federation-M4ZNXOPX.js +8 -0
  104. package/dist/{federation-MDQPO3PW.js.map → federation-M4ZNXOPX.js.map} +1 -1
  105. package/dist/fs-FO3NQHPT.js +4 -0
  106. package/dist/fs-FO3NQHPT.js.map +1 -0
  107. package/dist/git-ref-LMT3EXYY.js +4 -0
  108. package/dist/{git-ref-RSRAN4OH.js.map → git-ref-LMT3EXYY.js.map} +1 -1
  109. package/dist/graph-backend-NTYONTWW.js +16 -0
  110. package/dist/{graph-backend-W2D3HRRD.js.map → graph-backend-NTYONTWW.js.map} +1 -1
  111. package/dist/index.d.ts +1 -1
  112. package/dist/index.js +24 -25
  113. package/dist/index.js.map +1 -1
  114. package/dist/{interactive-2MK4TLRD.js → interactive-B3WTC7LB.js} +41 -42
  115. package/dist/interactive-B3WTC7LB.js.map +1 -0
  116. package/dist/{llm-host-XFYFOAAX.js → llm-host-QVTJJVER.js} +5 -5
  117. package/dist/{llm-host-XFYFOAAX.js.map → llm-host-QVTJJVER.js.map} +1 -1
  118. package/dist/load-AJROS77R.js +11 -0
  119. package/dist/{load-4R4HYMBB.js.map → load-AJROS77R.js.map} +1 -1
  120. package/dist/local-runtime-GA43KYS5.js +6 -0
  121. package/dist/{local-runtime-6SNWKSA7.js.map → local-runtime-GA43KYS5.js.map} +1 -1
  122. package/dist/model-manager-6H3TMZKK.js +10 -0
  123. package/dist/{model-manager-SXHZ5VD4.js.map → model-manager-6H3TMZKK.js.map} +1 -1
  124. package/dist/{model-orchestrator-LHYPJBFH.js → model-orchestrator-X3NE3Y2G.js} +6 -6
  125. package/dist/{model-orchestrator-LHYPJBFH.js.map → model-orchestrator-X3NE3Y2G.js.map} +1 -1
  126. package/dist/parse-worker.js +2 -2
  127. package/dist/{paths-62AKTFSR.js → paths-RVK6FKRN.js} +4 -4
  128. package/dist/{paths-62AKTFSR.js.map → paths-RVK6FKRN.js.map} +1 -1
  129. package/dist/publish-27S66NOW.js +9 -0
  130. package/dist/{publish-7YHRTBRA.js.map → publish-27S66NOW.js.map} +1 -1
  131. package/dist/resolve-gguf-WVKVDN45.js +9 -0
  132. package/dist/{resolve-gguf-SDIYGGI6.js.map → resolve-gguf-WVKVDN45.js.map} +1 -1
  133. package/dist/{run-outcome-H5GVDDZJ.js → run-outcome-SBBSTSH3.js} +7 -7
  134. package/dist/{run-outcome-H5GVDDZJ.js.map → run-outcome-SBBSTSH3.js.map} +1 -1
  135. package/dist/runtime-session-JYYKQVDX.js +26 -0
  136. package/dist/{runtime-session-JBIHHH5N.js.map → runtime-session-JYYKQVDX.js.map} +1 -1
  137. package/dist/session-2ZMHZ2O6.js +17 -0
  138. package/dist/{session-N5IU4K5Q.js.map → session-2ZMHZ2O6.js.map} +1 -1
  139. package/dist/{slot-subscription-25GOARW5.js → slot-subscription-C2ZUJED6.js} +5 -5
  140. package/dist/{slot-subscription-25GOARW5.js.map → slot-subscription-C2ZUJED6.js.map} +1 -1
  141. package/dist/{stream-json-4WLSUF6I.js → stream-json-ZWGB4C47.js} +17 -17
  142. package/dist/{stream-json-4WLSUF6I.js.map → stream-json-ZWGB4C47.js.map} +1 -1
  143. package/dist/version-5QIEUXU6.js +4 -0
  144. package/dist/{version-DTEU3SQD.js.map → version-5QIEUXU6.js.map} +1 -1
  145. package/dist/{vg-mcp-bridge-KDVYIMFX.js → vg-mcp-bridge-4FETMJ6M.js} +16 -15
  146. package/dist/vg-mcp-bridge-4FETMJ6M.js.map +1 -0
  147. package/dist/{vgd-M7UOPWLB.js → vgd-R524P5BJ.js} +13 -14
  148. package/dist/vgd-R524P5BJ.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/agent-X6VYCE63.js +0 -30
  151. package/dist/attach-G5JUIWIT.js +0 -10
  152. package/dist/baseline-DXI64VLW.js +0 -9
  153. package/dist/chunk-4NTNMT6T.js +0 -6
  154. package/dist/chunk-5I4VSBWQ.js.map +0 -1
  155. package/dist/chunk-6PFHDHOL.js.map +0 -1
  156. package/dist/chunk-7N4Y3E47.js.map +0 -1
  157. package/dist/chunk-B4EXD5LK.js.map +0 -1
  158. package/dist/chunk-BPF3YX2U.js.map +0 -1
  159. package/dist/chunk-E3O5UKNA.js.map +0 -1
  160. package/dist/chunk-FJG5AXKZ.js.map +0 -1
  161. package/dist/chunk-HF6R73UC.js.map +0 -1
  162. package/dist/chunk-NG4KIJW6.js.map +0 -1
  163. package/dist/chunk-NZELMYT4.js.map +0 -1
  164. package/dist/chunk-POOL355F.js +0 -237
  165. package/dist/chunk-POOL355F.js.map +0 -1
  166. package/dist/chunk-RHKOUPWT.js.map +0 -1
  167. package/dist/chunk-V2UGRUTL.js.map +0 -1
  168. package/dist/chunk-VQ5KMHW6.js.map +0 -1
  169. package/dist/client-UQIELEEZ.js +0 -8
  170. package/dist/daemon-GUMWMKCA.js +0 -31
  171. package/dist/ensure-map-FHDJTO7Y.js +0 -41
  172. package/dist/federation-MDQPO3PW.js +0 -7
  173. package/dist/fs-TLPOWC2D.js +0 -4
  174. package/dist/fs-TLPOWC2D.js.map +0 -1
  175. package/dist/git-ref-RSRAN4OH.js +0 -4
  176. package/dist/graph-backend-W2D3HRRD.js +0 -16
  177. package/dist/interactive-2MK4TLRD.js.map +0 -1
  178. package/dist/load-4R4HYMBB.js +0 -11
  179. package/dist/local-runtime-6SNWKSA7.js +0 -6
  180. package/dist/model-manager-SXHZ5VD4.js +0 -10
  181. package/dist/publish-7YHRTBRA.js +0 -9
  182. package/dist/resolve-gguf-SDIYGGI6.js +0 -9
  183. package/dist/runtime-session-JBIHHH5N.js +0 -27
  184. package/dist/session-N5IU4K5Q.js +0 -17
  185. package/dist/version-DTEU3SQD.js +0 -4
  186. package/dist/vg-mcp-bridge-KDVYIMFX.js.map +0 -1
  187. package/dist/vgd-M7UOPWLB.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { shortId } from './chunk-JFGYT6BI.js';
2
- import { branchGraphSnapshotId } from './chunk-BPF3YX2U.js';
2
+ import { branchGraphSnapshotId } from './chunk-XQNKCA2J.js';
3
3
  import * as os from 'os';
4
4
  import * as path from 'path';
5
5
 
@@ -84,5 +84,5 @@ function normalizeRoot(root) {
84
84
  }
85
85
 
86
86
  export { daemonDir, globalGraphPath, globalGraphPathForRef, repositoryIdFromRoot, repositoryStoreDir, resolveVibgratePaths, vibgrateCacheDir, vibgrateDataDir, vibgrateRuntimeDir };
87
- //# sourceMappingURL=chunk-BWPBB45M.js.map
88
- //# sourceMappingURL=chunk-BWPBB45M.js.map
87
+ //# sourceMappingURL=chunk-XP6UUCZZ.js.map
88
+ //# sourceMappingURL=chunk-XP6UUCZZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/paths.ts"],"names":[],"mappings":"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","file":"chunk-BWPBB45M.js","sourcesContent":["/**\n * Global application paths for the Fusion Runtime (Phase 1).\n *\n * Generated artefacts (graph snapshots, parser caches, session transcripts)\n * must not land inside repositories by default. This module resolves the\n * platform-correct data / cache / runtime roots and content-addressed\n * per-repository store directories.\n *\n * Layout (defaults):\n * Linux: $XDG_DATA_HOME/vibgrate | $XDG_CACHE_HOME/vibgrate | $XDG_RUNTIME_DIR/vibgrate\n * macOS: ~/Library/Application Support/Vibgrate | ~/Library/Caches/Vibgrate\n * Windows: %LOCALAPPDATA%\\Vibgrate\n *\n * Pure path construction — no mkdir side effects. Callers create directories\n * when they write. Override roots via VIBGRATE_DATA_DIR / VIBGRATE_CACHE_DIR /\n * VIBGRATE_RUNTIME_DIR for tests and locked-down installs.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { shortId } from '../engine/hash.js';\nimport { branchGraphSnapshotId } from './git-ref.js';\n\nconst APP = 'vibgrate';\nconst APP_MAC = 'Vibgrate';\nconst APP_WIN = 'Vibgrate';\n\nexport type VibgratePathKind = 'data' | 'cache' | 'runtime';\n\nexport interface VibgratePaths {\n data: string;\n cache: string;\n runtime: string;\n}\n\n/**\n * Resolve the three global roots. Deterministic given env + platform + homedir.\n * Does not create directories.\n */\nexport function resolveVibgratePaths(env: NodeJS.ProcessEnv = process.env, platform: NodeJS.Platform = process.platform, home: string = os.homedir()): VibgratePaths {\n return {\n data: overrideOr(env.VIBGRATE_DATA_DIR, () => defaultDataDir(env, platform, home)),\n cache: overrideOr(env.VIBGRATE_CACHE_DIR, () => defaultCacheDir(env, platform, home)),\n runtime: overrideOr(env.VIBGRATE_RUNTIME_DIR, () => defaultRuntimeDir(env, platform, home)),\n };\n}\n\nexport function vibgrateDataDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).data;\n}\n\nexport function vibgrateCacheDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).cache;\n}\n\nexport function vibgrateRuntimeDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).runtime;\n}\n\n/**\n * Stable repository id from an absolute (or cwd-resolved) root path.\n * Used as the directory key under the global data store so two checkouts of\n * the same path share artefacts, while distinct paths stay isolated.\n */\nexport function repositoryIdFromRoot(root: string): string {\n const normalized = normalizeRoot(root);\n return shortId(`repo:${normalized}`);\n}\n\n/** Global store for a repository's generated artefacts (graphs, sessions, …). */\nexport function repositoryStoreDir(root: string, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n const id = repositoryIdFromRoot(root);\n return path.join(vibgrateDataDir(env, platform, home), 'repos', id);\n}\n\n/** Default path for a content-addressed graph snapshot inside the global store. */\nexport function globalGraphPath(root: string, snapshotId = 'current', env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return path.join(repositoryStoreDir(root, env, platform, home), 'graphs', `${snapshotId}.graph.json`);\n}\n\n/**\n * Path for a branch-keyed graph snapshot (Fusion §4.1.1).\n * Uses {@link branchGraphSnapshotId} so branch names become a single path segment.\n */\nexport function globalGraphPathForRef(\n root: string,\n gitRef: string,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): string {\n return globalGraphPath(root, branchGraphSnapshotId(gitRef), env, platform, home);\n}\n\n/** Daemon / session IPC directory (sockets, pid files). */\nexport function daemonDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return path.join(vibgrateRuntimeDir(env, platform, home), 'daemon');\n}\n\nfunction overrideOr(value: string | undefined, fallback: () => string): string {\n const trimmed = value?.trim();\n if (trimmed) return path.resolve(trimmed);\n return fallback();\n}\n\nfunction defaultDataDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', APP_MAC);\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN);\n }\n const xdg = env.XDG_DATA_HOME?.trim() || path.join(home, '.local', 'share');\n return path.join(xdg, APP);\n}\n\nfunction defaultCacheDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n return path.join(home, 'Library', 'Caches', APP_MAC);\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN, 'Cache');\n }\n const xdg = env.XDG_CACHE_HOME?.trim() || path.join(home, '.cache');\n return path.join(xdg, APP);\n}\n\nfunction defaultRuntimeDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n // macOS has no XDG_RUNTIME_DIR; keep sockets under Application Support.\n return path.join(home, 'Library', 'Application Support', APP_MAC, 'run');\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN, 'Run');\n }\n const xdg = env.XDG_RUNTIME_DIR?.trim();\n if (xdg) return path.join(xdg, APP);\n // Fallback when the session has no runtime dir (some CI / SSH setups).\n return path.join(home, '.local', 'state', APP, 'run');\n}\n\nfunction normalizeRoot(root: string): string {\n const resolved = path.resolve(root);\n // Windows: drive letters vary in case; normalize for stable ids.\n return process.platform === 'win32' ? resolved.replace(/\\\\/g, '/').toLowerCase() : resolved;\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/paths.ts"],"names":[],"mappings":"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","file":"chunk-XP6UUCZZ.js","sourcesContent":["/**\n * Global application paths for the Fusion Runtime (Phase 1).\n *\n * Generated artefacts (graph snapshots, parser caches, session transcripts)\n * must not land inside repositories by default. This module resolves the\n * platform-correct data / cache / runtime roots and content-addressed\n * per-repository store directories.\n *\n * Layout (defaults):\n * Linux: $XDG_DATA_HOME/vibgrate | $XDG_CACHE_HOME/vibgrate | $XDG_RUNTIME_DIR/vibgrate\n * macOS: ~/Library/Application Support/Vibgrate | ~/Library/Caches/Vibgrate\n * Windows: %LOCALAPPDATA%\\Vibgrate\n *\n * Pure path construction — no mkdir side effects. Callers create directories\n * when they write. Override roots via VIBGRATE_DATA_DIR / VIBGRATE_CACHE_DIR /\n * VIBGRATE_RUNTIME_DIR for tests and locked-down installs.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { shortId } from '../engine/hash.js';\nimport { branchGraphSnapshotId } from './git-ref.js';\n\nconst APP = 'vibgrate';\nconst APP_MAC = 'Vibgrate';\nconst APP_WIN = 'Vibgrate';\n\nexport type VibgratePathKind = 'data' | 'cache' | 'runtime';\n\nexport interface VibgratePaths {\n data: string;\n cache: string;\n runtime: string;\n}\n\n/**\n * Resolve the three global roots. Deterministic given env + platform + homedir.\n * Does not create directories.\n */\nexport function resolveVibgratePaths(env: NodeJS.ProcessEnv = process.env, platform: NodeJS.Platform = process.platform, home: string = os.homedir()): VibgratePaths {\n return {\n data: overrideOr(env.VIBGRATE_DATA_DIR, () => defaultDataDir(env, platform, home)),\n cache: overrideOr(env.VIBGRATE_CACHE_DIR, () => defaultCacheDir(env, platform, home)),\n runtime: overrideOr(env.VIBGRATE_RUNTIME_DIR, () => defaultRuntimeDir(env, platform, home)),\n };\n}\n\nexport function vibgrateDataDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).data;\n}\n\nexport function vibgrateCacheDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).cache;\n}\n\nexport function vibgrateRuntimeDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return resolveVibgratePaths(env, platform, home).runtime;\n}\n\n/**\n * Stable repository id from an absolute (or cwd-resolved) root path.\n * Used as the directory key under the global data store so two checkouts of\n * the same path share artefacts, while distinct paths stay isolated.\n */\nexport function repositoryIdFromRoot(root: string): string {\n const normalized = normalizeRoot(root);\n return shortId(`repo:${normalized}`);\n}\n\n/** Global store for a repository's generated artefacts (graphs, sessions, …). */\nexport function repositoryStoreDir(root: string, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n const id = repositoryIdFromRoot(root);\n return path.join(vibgrateDataDir(env, platform, home), 'repos', id);\n}\n\n/** Default path for a content-addressed graph snapshot inside the global store. */\nexport function globalGraphPath(root: string, snapshotId = 'current', env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return path.join(repositoryStoreDir(root, env, platform, home), 'graphs', `${snapshotId}.graph.json`);\n}\n\n/**\n * Path for a branch-keyed graph snapshot (Fusion §4.1.1).\n * Uses {@link branchGraphSnapshotId} so branch names become a single path segment.\n */\nexport function globalGraphPathForRef(\n root: string,\n gitRef: string,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): string {\n return globalGraphPath(root, branchGraphSnapshotId(gitRef), env, platform, home);\n}\n\n/** Daemon / session IPC directory (sockets, pid files). */\nexport function daemonDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string {\n return path.join(vibgrateRuntimeDir(env, platform, home), 'daemon');\n}\n\nfunction overrideOr(value: string | undefined, fallback: () => string): string {\n const trimmed = value?.trim();\n if (trimmed) return path.resolve(trimmed);\n return fallback();\n}\n\nfunction defaultDataDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', APP_MAC);\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN);\n }\n const xdg = env.XDG_DATA_HOME?.trim() || path.join(home, '.local', 'share');\n return path.join(xdg, APP);\n}\n\nfunction defaultCacheDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n return path.join(home, 'Library', 'Caches', APP_MAC);\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN, 'Cache');\n }\n const xdg = env.XDG_CACHE_HOME?.trim() || path.join(home, '.cache');\n return path.join(xdg, APP);\n}\n\nfunction defaultRuntimeDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === 'darwin') {\n // macOS has no XDG_RUNTIME_DIR; keep sockets under Application Support.\n return path.join(home, 'Library', 'Application Support', APP_MAC, 'run');\n }\n if (platform === 'win32') {\n const base = env.LOCALAPPDATA?.trim() || path.join(home, 'AppData', 'Local');\n return path.join(base, APP_WIN, 'Run');\n }\n const xdg = env.XDG_RUNTIME_DIR?.trim();\n if (xdg) return path.join(xdg, APP);\n // Fallback when the session has no runtime dir (some CI / SSH setups).\n return path.join(home, '.local', 'state', APP, 'run');\n}\n\nfunction normalizeRoot(root: string): string {\n const resolved = path.resolve(root);\n // Windows: drive letters vary in case; normalize for stable ids.\n return process.platform === 'win32' ? resolved.replace(/\\\\/g, '/').toLowerCase() : resolved;\n}\n"]}
@@ -54,11 +54,14 @@ function defaultGitRun(args, cwd) {
54
54
  cwd,
55
55
  encoding: "utf8",
56
56
  timeout: 5e3,
57
- maxBuffer: 1024 * 1024
57
+ maxBuffer: 1024 * 1024,
58
+ // Called from console-less processes (the vgd daemon, background warms) —
59
+ // without this, each git call flashes a console window on Windows.
60
+ windowsHide: true
58
61
  });
59
62
  return { stdout: res.stdout ?? "", status: res.status ?? 1 };
60
63
  }
61
64
 
62
65
  export { activeGraphSlotKey, branchGraphSnapshotId, clearDetectGitRefCache, detectGitRef };
63
- //# sourceMappingURL=chunk-BPF3YX2U.js.map
64
- //# sourceMappingURL=chunk-BPF3YX2U.js.map
66
+ //# sourceMappingURL=chunk-XQNKCA2J.js.map
67
+ //# sourceMappingURL=chunk-XQNKCA2J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/git-ref.ts"],"names":[],"mappings":"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","file":"chunk-XQNKCA2J.js","sourcesContent":["/**\n * Detect the current git ref for a repository worktree (Fusion §4.1.1).\n *\n * Used to key ActiveGraph slots and on-disk snapshots: one graph per\n * (repositoryId, gitRef), not merely per clone path.\n *\n * Results are cached per absolute root for the process lifetime so a hot path\n * (path resolution, auto-refresh write) never re-spawns `git rev-parse` on\n * every call. The ref only changes when the user checks out another branch —\n * restart `vg serve` (or any long-lived process) after a checkout, same as\n * before this cache existed for slot identity.\n */\n\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nexport type GitRefKind = 'branch' | 'detached' | 'none';\n\nexport interface GitRefInfo {\n /** Symbolic branch name, full SHA when detached, or empty when not a git repo. */\n ref: string;\n kind: GitRefKind;\n}\n\nexport type GitRunner = (args: string[], cwd: string) => { stdout: string; status: number };\n\n/** Process-lifetime cache: abs(root) → ref. Bypassed when a custom `run` is passed (tests). */\nconst refCache = new Map<string, GitRefInfo>();\n\n/**\n * Resolve the current branch name, or detached HEAD SHA.\n * Never throws — returns kind `none` when git is missing or the path is not a repo.\n * When `run` is omitted (production), the result is cached per absolute root for\n * the process lifetime. Tests that pass a custom `run` always re-invoke it.\n */\nexport function detectGitRef(root: string, run?: GitRunner): GitRefInfo {\n const useCache = run === undefined;\n const runner = run ?? defaultGitRun;\n const key = useCache ? path.resolve(root) : '';\n if (useCache) {\n const hit = refCache.get(key);\n if (hit) return hit;\n }\n let info: GitRefInfo;\n try {\n const branch = runner(['rev-parse', '--abbrev-ref', 'HEAD'], root);\n if (branch.status !== 0) {\n info = { ref: '', kind: 'none' };\n } else {\n const name = branch.stdout.trim();\n if (!name || name === 'HEAD') {\n const sha = runner(['rev-parse', 'HEAD'], root);\n if (sha.status !== 0 || !sha.stdout.trim()) {\n info = { ref: '', kind: 'none' };\n } else {\n info = { ref: sha.stdout.trim(), kind: 'detached' };\n }\n } else {\n info = { ref: name, kind: 'branch' };\n }\n }\n } catch {\n info = { ref: '', kind: 'none' };\n }\n if (useCache) refCache.set(key, info);\n return info;\n}\n\n/** Tests / rare branch-switch mid-process: drop the cached ref for one root or all. */\nexport function clearDetectGitRefCache(root?: string): void {\n if (root === undefined) refCache.clear();\n else refCache.delete(path.resolve(root));\n}\n\n/**\n * Filesystem-safe snapshot id for a git ref.\n * `main` → `branch-main`; `feature/x` → `branch-feature__x`; SHA → `sha-<40hex>`.\n */\nexport function branchGraphSnapshotId(gitRef: string): string {\n const ref = gitRef.trim();\n if (!ref) return 'current';\n if (/^[0-9a-f]{40}$/i.test(ref)) return `sha-${ref.toLowerCase()}`;\n // Branch names may contain /, spaces, etc. — collapse to a single path segment.\n const safe = ref\n .replace(/\\\\/g, '/')\n .replace(/\\/+/g, '__')\n .replace(/[^A-Za-z0-9._@+-]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .slice(0, 120);\n return `branch-${safe || 'unnamed'}`;\n}\n\n/** Stable cache key for an ActiveGraph slot. */\nexport function activeGraphSlotKey(repositoryId: string, gitRef: string): string {\n return `${repositoryId}::${gitRef.trim() || 'unknown'}`;\n}\n\nfunction defaultGitRun(args: string[], cwd: string): { stdout: string; status: number } {\n const res = spawnSync('git', args, {\n cwd,\n encoding: 'utf8',\n timeout: 5_000,\n maxBuffer: 1024 * 1024,\n // Called from console-less processes (the vgd daemon, background warms) —\n // without this, each git call flashes a console window on Windows.\n windowsHide: true,\n });\n return { stdout: res.stdout ?? '', status: res.status ?? 1 };\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { lookupModelCapabilities } from './chunk-JGA63RGF.js';
2
- import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-74UBGF4P.js';
3
- import { resolveGgufPath } from './chunk-7AVYKZEM.js';
4
- import { managerFromProviderId, formatManagerBadgeLine } from './chunk-I5LP55B6.js';
5
- import { discoverModels } from './chunk-CQDUBAQY.js';
1
+ import { lookupModelCapabilities } from './chunk-2ZBLZ2S3.js';
2
+ import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-SHD5TCZ5.js';
3
+ import { resolveGgufPath } from './chunk-NV7XNBX4.js';
4
+ import { managerFromProviderId, formatManagerBadgeLine } from './chunk-W44THEXF.js';
5
+ import { discoverModels } from './chunk-WNKGRXUA.js';
6
6
  import { CliError, ExitCode } from './chunk-MS6V5XKB.js';
7
7
  import * as fs from 'fs';
8
8
  import * as os from 'os';
@@ -501,5 +501,5 @@ function basename(p) {
501
501
  }
502
502
 
503
503
  export { fetchCatalog, resolveProviders, topProviders };
504
- //# sourceMappingURL=chunk-FFXGWFAE.js.map
505
- //# sourceMappingURL=chunk-FFXGWFAE.js.map
504
+ //# sourceMappingURL=chunk-XW2XQM3C.js.map
505
+ //# sourceMappingURL=chunk-XW2XQM3C.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/catalog.ts","../src/code/text-tool-protocol.ts","../src/code/router.ts"],"names":["result","locals"],"mappings":"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","file":"chunk-FFXGWFAE.js","sourcesContent":["/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Text-based tool-call protocol fallback (model-agnostic agent robustness).\n *\n * The agent loop speaks native (OpenAI-shaped) function calling, but many\n * backends can't: the embedded llama.cpp host has no tool API at all, and a\n * large share of local models served by Ollama / LM Studio either ignore the\n * native `tools` field or emit their chat-template tool markup — Hermes/Qwen\n * `<tool_call>{…}</tool_call>` tags — as plain assistant text. Leading OSS\n * agents (Cline, Roo Code, Aider) solve this with a *prompt-described* tool\n * protocol parsed from text; this module gives `vg code` the same floor, so the\n * core agent works with whatever model is picked underneath.\n *\n * Two layers, both provider-neutral and unit-tested:\n * - {@link parseTextToolCalls} — recover tool calls a model wrote as text\n * (`<tool_call>` tags, fenced ```tool_call blocks, or a bare JSON object\n * with `name` + `arguments`). Used as a *rescue* on every provider, so a\n * model that ignores native function calling still drives the loop.\n * - {@link withToolCallFallback} — a Provider decorator. For backends that\n * declare `supportsTools: false` it renders the tool list into the system\n * prompt, serializes prior tool rounds as text the model can read, and\n * parses the reply. For native backends it passes through and only rescues.\n */\n\nimport type { ChatMessage, ChatOptions, Provider, ProviderResult, ToolCall, ToolSpec } from './types.js';\n\n/** Formats we can recover a tool call from, in order of specificity. */\nconst TAG_RE = /<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/g;\nconst FENCE_RE = /```(?:tool_call|tool|json)?\\s*\\n?([\\s\\S]*?)```/g;\n\ninterface RawCall {\n name?: unknown;\n arguments?: unknown;\n parameters?: unknown;\n input?: unknown;\n}\n\n/**\n * A whole fence that is nothing but one call written in source syntax:\n * `finish(\"…\")`, `finish('…')`, or `finish({ \"summary\": \"…\" })`. Weaker models\n * routinely answer this way instead of emitting a tool call or the JSON form\n * above, and the result is that the user is shown a code block containing\n * their own answer rather than the answer.\n */\nconst CALL_SYNTAX_RE = /^([A-Za-z_][\\w]*)\\s*\\(([\\s\\S]*)\\)\\s*;?$/;\n\n/**\n * Recover a call written in source syntax, using the tool's schema to place a\n * bare positional argument. Deliberately narrow — a call is only recovered\n * when the tool is one we actually offer, the whole block is the call, and\n * either the argument is a JSON object or the tool takes exactly one required\n * parameter for a bare string to belong to. Anything looser would turn a model\n * *discussing* `edit_file(...)` in prose into a real edit.\n */\nfunction toCallSyntaxToolCall(blob: string, index: number, tools: ToolSpec[]): ToolCall | null {\n if (!tools.length) return null;\n const m = CALL_SYNTAX_RE.exec(blob.trim());\n if (!m) return null;\n const [, name, rawArgs] = m;\n const spec = tools.find((t) => t.name === name);\n if (!spec) return null;\n\n const args = rawArgs.trim();\n if (!args) return { id: `text_${index}`, name, arguments: {} };\n\n if (args.startsWith('{')) {\n try {\n const parsed = JSON.parse(args) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { id: `text_${index}`, name, arguments: parsed as Record<string, unknown> };\n }\n } catch {\n return null; // object-ish but not parseable — do not guess\n }\n return null;\n }\n\n // A bare positional argument only has an unambiguous home when the schema\n // has exactly one required parameter.\n const required = Array.isArray(spec.parameters?.required) ? (spec.parameters.required as string[]) : [];\n if (required.length !== 1) return null;\n const literal = parseStringLiteral(args);\n if (literal === null) return null;\n return { id: `text_${index}`, name, arguments: { [required[0]!]: literal } };\n}\n\n/** A single quoted string literal, or null for anything else (expressions, multiple args). */\nfunction parseStringLiteral(src: string): string | null {\n const s = src.trim();\n if (s.length < 2) return null;\n const quote = s[0];\n if ((quote !== '\"' && quote !== \"'\" && quote !== '`') || s[s.length - 1] !== quote) return null;\n const inner = s.slice(1, -1);\n // A second unescaped quote of the same kind means this was not one literal\n // (e.g. two positional args) — refuse rather than truncate the user's answer.\n if (new RegExp(`(?<!\\\\\\\\)${quote === '`' ? '`' : quote}`).test(inner)) return null;\n if (quote === '\"') {\n try {\n return JSON.parse(s) as string;\n } catch {\n return null;\n }\n }\n return inner.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t').replace(new RegExp(`\\\\\\\\${quote}`, 'g'), quote);\n}\n\n/** Parse one candidate JSON blob into a ToolCall, or null when it isn't one. */\nfunction toToolCall(blob: string, index: number): ToolCall | null {\n let parsed: RawCall;\n try {\n parsed = JSON.parse(blob) as RawCall;\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object' || typeof parsed.name !== 'string' || !parsed.name) return null;\n const args = parsed.arguments ?? parsed.parameters ?? parsed.input ?? {};\n return {\n id: `text_${index}`,\n name: parsed.name,\n arguments: args && typeof args === 'object' && !Array.isArray(args) ? (args as Record<string, unknown>) : {},\n };\n}\n\n/**\n * Extract tool calls a model emitted as plain text, returning the calls plus\n * the text with the call markup removed (what remains is the user-facing\n * prose, if any). Order of attempts: `<tool_call>` tags, then fenced blocks,\n * then one bare top-level JSON object. Anything that doesn't parse into a\n * `{name, arguments}` shape is left in the text untouched.\n */\nexport function parseTextToolCalls(text: string, tools: ToolSpec[] = []): { calls: ToolCall[]; text: string } {\n const calls: ToolCall[] = [];\n let cleaned = text ?? '';\n\n cleaned = cleaned.replace(TAG_RE, (whole, body: string) => {\n const call = toToolCall(body, calls.length);\n if (!call) return whole;\n calls.push(call);\n return '';\n });\n\n if (calls.length === 0) {\n cleaned = cleaned.replace(FENCE_RE, (whole, body: string) => {\n const blob = body.trim();\n const call = toToolCall(blob, calls.length) ?? toCallSyntaxToolCall(blob, calls.length, tools);\n if (!call) return whole;\n calls.push(call);\n return '';\n });\n }\n\n if (calls.length === 0) {\n const t = cleaned.trim();\n if (t.startsWith('{') && t.endsWith('}')) {\n const call = toToolCall(t, 0);\n if (call) {\n calls.push(call);\n cleaned = '';\n }\n } else {\n // Unfenced source syntax as the entire reply — same narrow rules.\n const call = toCallSyntaxToolCall(t, 0, tools);\n if (call) {\n calls.push(call);\n cleaned = '';\n }\n }\n }\n\n return { calls, text: cleaned.trim() };\n}\n\n/** The prompt block that teaches a non-tool-calling model the call format. */\nexport function textToolProtocolInstruction(tools: ToolSpec[]): string {\n const lines = tools.map((t) => {\n const params = JSON.stringify(t.parameters?.properties ?? {});\n return `- ${t.name}: ${t.description.split('\\n')[0]} · arguments schema: ${params}`;\n });\n return [\n '',\n '## Tool calling (text protocol)',\n 'This runtime has no native function-calling. To use a tool, reply with ONLY:',\n '<tool_call>{\"name\": \"<tool name>\", \"arguments\": { … }}</tool_call>',\n 'One tool call per reply. Wait for the tool result before the next call.',\n 'When the task is complete, call the `finish` tool with your Markdown summary.',\n 'Available tools:',\n ...lines,\n ].join('\\n');\n}\n\n/** Serialize a tool round into text for backends that lack tool roles. */\nfunction flattenToolRounds(messages: ChatMessage[]): ChatMessage[] {\n return messages.map((m): ChatMessage => {\n if (m.role === 'assistant' && m.toolCalls?.length) {\n const rendered = m.toolCalls\n .map((c) => `<tool_call>${JSON.stringify({ name: c.name, arguments: c.arguments })}</tool_call>`)\n .join('\\n');\n return { role: 'assistant', content: [m.content, rendered].filter(Boolean).join('\\n') };\n }\n if (m.role === 'tool') {\n return { role: 'user', content: `Tool result for ${m.name}:\\n${m.content}` };\n }\n return m;\n });\n}\n\n/**\n * Wrap a provider so the agent loop's tool calling works regardless of the\n * backend's native capability:\n * - `supportsTools === false` (embedded llama.cpp), or a model the\n * capability registry knows cannot tool-call natively: inject the text\n * protocol into the system prompt, flatten tool rounds to text, parse the\n * reply.\n * - native backends: call through unchanged; when the model returned no\n * native tool calls but its text contains parseable tool markup, rescue it.\n * Idempotent-safe: wrapping a wrapped provider changes nothing observable.\n */\nexport function withToolCallFallback(\n provider: Provider,\n caps?: { nativeTools: boolean | null },\n): Provider {\n return {\n id: provider.id,\n label: provider.label,\n local: provider.local,\n model: provider.model,\n supportsTools: provider.supportsTools,\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const native = provider.supportsTools !== false && caps?.nativeTools !== false;\n if (native || !opts.tools?.length) {\n const result = await provider.chat(messages, opts);\n if ((!result.toolCalls || result.toolCalls.length === 0) && result.text) {\n const rescued = parseTextToolCalls(result.text, opts.tools ?? []);\n if (rescued.calls.length) return { ...result, text: rescued.text, toolCalls: rescued.calls };\n }\n return result;\n }\n\n // Text-protocol path: teach the format, flatten history, parse the reply.\n const instruction = textToolProtocolInstruction(opts.tools);\n const flattened = flattenToolRounds(messages);\n const withProtocol: ChatMessage[] = flattened.map((m, i) =>\n i === 0 && m.role === 'system' ? { role: 'system', content: m.content + '\\n' + instruction } : m,\n );\n if (withProtocol[0]?.role !== 'system') {\n withProtocol.unshift({ role: 'system', content: instruction });\n }\n const result = await provider.chat(withProtocol, { ...opts, tools: undefined });\n const parsed = parseTextToolCalls(result.text ?? '', opts.tools);\n if (parsed.calls.length) return { ...result, text: parsed.text, toolCalls: parsed.calls };\n return result;\n },\n };\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport { withToolCallFallback } from './text-tool-protocol.js';\nimport { lookupModelCapabilities } from './model-capabilities.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['vibgrate-relay', 'openrouter', 'litellm', 'openai', 'together', 'vscode-lm']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n // vscode-lm requires the extension loopback proxy URL.\n if (opts.provider === 'vscode-lm' && !env.VSCODE_LM_BASE_URL) {\n throw new CliError(\n 'vscode-lm needs the VS Code extension proxy (VSCODE_LM_BASE_URL). Select a Language Model in Manage models from Vibgrate for VS Code, or use another --provider.',\n ExitCode.USAGE_ERROR,\n );\n }\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) Vibgrate Relay — the first-party hosted router, preferred when the user\n // has signed in. Nothing is dialled without their token, so this stays inside\n // the no-surprise-egress rule above.\n if (env.VIBGRATE_RELAY_TOKEN) {\n const model = resolveHostedModel(opts, env, 'vibgrate-relay');\n const primary = buildHosted('vibgrate-relay', model, env);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'vibgrate-relay', { allowLmStudio: false })],\n 'VIBGRATE_RELAY_TOKEN is set → Vibgrate Relay (with local fallback)',\n );\n }\n // 2) Another configured hosted router key.\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model, env);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 3) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 4) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model, env)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(rawProviders: Provider[], reason: string): RouteResult {\n // Every backend gets the tool-call fallback: native providers are passed\n // through (with a text-markup rescue), backends without native function\n // calling (embedded llama.cpp) — and models the capability registry knows\n // cannot tool-call natively — get the prompt-described text protocol. This\n // is what makes the agent work with whatever model is picked underneath.\n const providers = rawProviders.map((p) => withToolCallFallback(p, lookupModelCapabilities(p.model)));\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'), env);\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'), env);\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id), env);\n throw new CliError(\n `unknown --provider \"${id}\". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, vscode-lm, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string, env: NodeJS.ProcessEnv = process.env): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n // Resolve baseUrl at build time so VSCODE_LM_BASE_URL (and similar) from the\n // host process env are picked up even when the module was loaded earlier.\n let baseUrl = base.baseUrl;\n if (id === 'vscode-lm') {\n baseUrl = env.VSCODE_LM_BASE_URL || base.baseUrl;\n } else if (id === 'vibgrate-relay') {\n baseUrl = env.VIBGRATE_RELAY_URL || base.baseUrl;\n } else if (id === 'litellm') {\n baseUrl = env.LITELLM_BASE_URL || base.baseUrl;\n } else if (id === 'lmstudio') {\n baseUrl = env.LMSTUDIO_BASE_URL || base.baseUrl;\n } else if (id === 'foundry-local') {\n baseUrl = env.FOUNDRY_LOCAL_BASE_URL || base.baseUrl;\n }\n const config: OpenAiCompatibleConfig = { ...base, id, baseUrl };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel, env));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m, env));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
1
+ {"version":3,"sources":["../src/code/catalog.ts","../src/code/text-tool-protocol.ts","../src/code/router.ts"],"names":["result","locals"],"mappings":"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","file":"chunk-XW2XQM3C.js","sourcesContent":["/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Text-based tool-call protocol fallback (model-agnostic agent robustness).\n *\n * The agent loop speaks native (OpenAI-shaped) function calling, but many\n * backends can't: the embedded llama.cpp host has no tool API at all, and a\n * large share of local models served by Ollama / LM Studio either ignore the\n * native `tools` field or emit their chat-template tool markup — Hermes/Qwen\n * `<tool_call>{…}</tool_call>` tags — as plain assistant text. Leading OSS\n * agents (Cline, Roo Code, Aider) solve this with a *prompt-described* tool\n * protocol parsed from text; this module gives `vg code` the same floor, so the\n * core agent works with whatever model is picked underneath.\n *\n * Two layers, both provider-neutral and unit-tested:\n * - {@link parseTextToolCalls} — recover tool calls a model wrote as text\n * (`<tool_call>` tags, fenced ```tool_call blocks, or a bare JSON object\n * with `name` + `arguments`). Used as a *rescue* on every provider, so a\n * model that ignores native function calling still drives the loop.\n * - {@link withToolCallFallback} — a Provider decorator. For backends that\n * declare `supportsTools: false` it renders the tool list into the system\n * prompt, serializes prior tool rounds as text the model can read, and\n * parses the reply. For native backends it passes through and only rescues.\n */\n\nimport type { ChatMessage, ChatOptions, Provider, ProviderResult, ToolCall, ToolSpec } from './types.js';\n\n/** Formats we can recover a tool call from, in order of specificity. */\nconst TAG_RE = /<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/g;\nconst FENCE_RE = /```(?:tool_call|tool|json)?\\s*\\n?([\\s\\S]*?)```/g;\n\ninterface RawCall {\n name?: unknown;\n arguments?: unknown;\n parameters?: unknown;\n input?: unknown;\n}\n\n/**\n * A whole fence that is nothing but one call written in source syntax:\n * `finish(\"…\")`, `finish('…')`, or `finish({ \"summary\": \"…\" })`. Weaker models\n * routinely answer this way instead of emitting a tool call or the JSON form\n * above, and the result is that the user is shown a code block containing\n * their own answer rather than the answer.\n */\nconst CALL_SYNTAX_RE = /^([A-Za-z_][\\w]*)\\s*\\(([\\s\\S]*)\\)\\s*;?$/;\n\n/**\n * Recover a call written in source syntax, using the tool's schema to place a\n * bare positional argument. Deliberately narrow — a call is only recovered\n * when the tool is one we actually offer, the whole block is the call, and\n * either the argument is a JSON object or the tool takes exactly one required\n * parameter for a bare string to belong to. Anything looser would turn a model\n * *discussing* `edit_file(...)` in prose into a real edit.\n */\nfunction toCallSyntaxToolCall(blob: string, index: number, tools: ToolSpec[]): ToolCall | null {\n if (!tools.length) return null;\n const m = CALL_SYNTAX_RE.exec(blob.trim());\n if (!m) return null;\n const [, name, rawArgs] = m;\n const spec = tools.find((t) => t.name === name);\n if (!spec) return null;\n\n const args = rawArgs.trim();\n if (!args) return { id: `text_${index}`, name, arguments: {} };\n\n if (args.startsWith('{')) {\n try {\n const parsed = JSON.parse(args) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { id: `text_${index}`, name, arguments: parsed as Record<string, unknown> };\n }\n } catch {\n return null; // object-ish but not parseable — do not guess\n }\n return null;\n }\n\n // A bare positional argument only has an unambiguous home when the schema\n // has exactly one required parameter.\n const required = Array.isArray(spec.parameters?.required) ? (spec.parameters.required as string[]) : [];\n if (required.length !== 1) return null;\n const literal = parseStringLiteral(args);\n if (literal === null) return null;\n return { id: `text_${index}`, name, arguments: { [required[0]!]: literal } };\n}\n\n/** A single quoted string literal, or null for anything else (expressions, multiple args). */\nfunction parseStringLiteral(src: string): string | null {\n const s = src.trim();\n if (s.length < 2) return null;\n const quote = s[0];\n if ((quote !== '\"' && quote !== \"'\" && quote !== '`') || s[s.length - 1] !== quote) return null;\n const inner = s.slice(1, -1);\n // A second unescaped quote of the same kind means this was not one literal\n // (e.g. two positional args) — refuse rather than truncate the user's answer.\n if (new RegExp(`(?<!\\\\\\\\)${quote === '`' ? '`' : quote}`).test(inner)) return null;\n if (quote === '\"') {\n try {\n return JSON.parse(s) as string;\n } catch {\n return null;\n }\n }\n return inner.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t').replace(new RegExp(`\\\\\\\\${quote}`, 'g'), quote);\n}\n\n/** Parse one candidate JSON blob into a ToolCall, or null when it isn't one. */\nfunction toToolCall(blob: string, index: number): ToolCall | null {\n let parsed: RawCall;\n try {\n parsed = JSON.parse(blob) as RawCall;\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object' || typeof parsed.name !== 'string' || !parsed.name) return null;\n const args = parsed.arguments ?? parsed.parameters ?? parsed.input ?? {};\n return {\n id: `text_${index}`,\n name: parsed.name,\n arguments: args && typeof args === 'object' && !Array.isArray(args) ? (args as Record<string, unknown>) : {},\n };\n}\n\n/**\n * Extract tool calls a model emitted as plain text, returning the calls plus\n * the text with the call markup removed (what remains is the user-facing\n * prose, if any). Order of attempts: `<tool_call>` tags, then fenced blocks,\n * then one bare top-level JSON object. Anything that doesn't parse into a\n * `{name, arguments}` shape is left in the text untouched.\n */\nexport function parseTextToolCalls(text: string, tools: ToolSpec[] = []): { calls: ToolCall[]; text: string } {\n const calls: ToolCall[] = [];\n let cleaned = text ?? '';\n\n cleaned = cleaned.replace(TAG_RE, (whole, body: string) => {\n const call = toToolCall(body, calls.length);\n if (!call) return whole;\n calls.push(call);\n return '';\n });\n\n if (calls.length === 0) {\n cleaned = cleaned.replace(FENCE_RE, (whole, body: string) => {\n const blob = body.trim();\n const call = toToolCall(blob, calls.length) ?? toCallSyntaxToolCall(blob, calls.length, tools);\n if (!call) return whole;\n calls.push(call);\n return '';\n });\n }\n\n if (calls.length === 0) {\n const t = cleaned.trim();\n if (t.startsWith('{') && t.endsWith('}')) {\n const call = toToolCall(t, 0);\n if (call) {\n calls.push(call);\n cleaned = '';\n }\n } else {\n // Unfenced source syntax as the entire reply — same narrow rules.\n const call = toCallSyntaxToolCall(t, 0, tools);\n if (call) {\n calls.push(call);\n cleaned = '';\n }\n }\n }\n\n return { calls, text: cleaned.trim() };\n}\n\n/** The prompt block that teaches a non-tool-calling model the call format. */\nexport function textToolProtocolInstruction(tools: ToolSpec[]): string {\n const lines = tools.map((t) => {\n const params = JSON.stringify(t.parameters?.properties ?? {});\n return `- ${t.name}: ${t.description.split('\\n')[0]} · arguments schema: ${params}`;\n });\n return [\n '',\n '## Tool calling (text protocol)',\n 'This runtime has no native function-calling. To use a tool, reply with ONLY:',\n '<tool_call>{\"name\": \"<tool name>\", \"arguments\": { … }}</tool_call>',\n 'One tool call per reply. Wait for the tool result before the next call.',\n 'When the task is complete, call the `finish` tool with your Markdown summary.',\n 'Available tools:',\n ...lines,\n ].join('\\n');\n}\n\n/** Serialize a tool round into text for backends that lack tool roles. */\nfunction flattenToolRounds(messages: ChatMessage[]): ChatMessage[] {\n return messages.map((m): ChatMessage => {\n if (m.role === 'assistant' && m.toolCalls?.length) {\n const rendered = m.toolCalls\n .map((c) => `<tool_call>${JSON.stringify({ name: c.name, arguments: c.arguments })}</tool_call>`)\n .join('\\n');\n return { role: 'assistant', content: [m.content, rendered].filter(Boolean).join('\\n') };\n }\n if (m.role === 'tool') {\n return { role: 'user', content: `Tool result for ${m.name}:\\n${m.content}` };\n }\n return m;\n });\n}\n\n/**\n * Wrap a provider so the agent loop's tool calling works regardless of the\n * backend's native capability:\n * - `supportsTools === false` (embedded llama.cpp), or a model the\n * capability registry knows cannot tool-call natively: inject the text\n * protocol into the system prompt, flatten tool rounds to text, parse the\n * reply.\n * - native backends: call through unchanged; when the model returned no\n * native tool calls but its text contains parseable tool markup, rescue it.\n * Idempotent-safe: wrapping a wrapped provider changes nothing observable.\n */\nexport function withToolCallFallback(\n provider: Provider,\n caps?: { nativeTools: boolean | null },\n): Provider {\n return {\n id: provider.id,\n label: provider.label,\n local: provider.local,\n model: provider.model,\n supportsTools: provider.supportsTools,\n async chat(messages: ChatMessage[], opts: ChatOptions = {}): Promise<ProviderResult> {\n const native = provider.supportsTools !== false && caps?.nativeTools !== false;\n if (native || !opts.tools?.length) {\n const result = await provider.chat(messages, opts);\n if ((!result.toolCalls || result.toolCalls.length === 0) && result.text) {\n const rescued = parseTextToolCalls(result.text, opts.tools ?? []);\n if (rescued.calls.length) return { ...result, text: rescued.text, toolCalls: rescued.calls };\n }\n return result;\n }\n\n // Text-protocol path: teach the format, flatten history, parse the reply.\n const instruction = textToolProtocolInstruction(opts.tools);\n const flattened = flattenToolRounds(messages);\n const withProtocol: ChatMessage[] = flattened.map((m, i) =>\n i === 0 && m.role === 'system' ? { role: 'system', content: m.content + '\\n' + instruction } : m,\n );\n if (withProtocol[0]?.role !== 'system') {\n withProtocol.unshift({ role: 'system', content: instruction });\n }\n const result = await provider.chat(withProtocol, { ...opts, tools: undefined });\n const parsed = parseTextToolCalls(result.text ?? '', opts.tools);\n if (parsed.calls.length) return { ...result, text: parsed.text, toolCalls: parsed.calls };\n return result;\n },\n };\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport { withToolCallFallback } from './text-tool-protocol.js';\nimport { lookupModelCapabilities } from './model-capabilities.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['vibgrate-relay', 'openrouter', 'litellm', 'openai', 'together', 'vscode-lm']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n // vscode-lm requires the extension loopback proxy URL.\n if (opts.provider === 'vscode-lm' && !env.VSCODE_LM_BASE_URL) {\n throw new CliError(\n 'vscode-lm needs the VS Code extension proxy (VSCODE_LM_BASE_URL). Select a Language Model in Manage models from Vibgrate for VS Code, or use another --provider.',\n ExitCode.USAGE_ERROR,\n );\n }\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) Vibgrate Relay — the first-party hosted router, preferred when the user\n // has signed in. Nothing is dialled without their token, so this stays inside\n // the no-surprise-egress rule above.\n if (env.VIBGRATE_RELAY_TOKEN) {\n const model = resolveHostedModel(opts, env, 'vibgrate-relay');\n const primary = buildHosted('vibgrate-relay', model, env);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'vibgrate-relay', { allowLmStudio: false })],\n 'VIBGRATE_RELAY_TOKEN is set → Vibgrate Relay (with local fallback)',\n );\n }\n // 2) Another configured hosted router key.\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model, env);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 3) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 4) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model, env)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(rawProviders: Provider[], reason: string): RouteResult {\n // Every backend gets the tool-call fallback: native providers are passed\n // through (with a text-markup rescue), backends without native function\n // calling (embedded llama.cpp) — and models the capability registry knows\n // cannot tool-call natively — get the prompt-described text protocol. This\n // is what makes the agent work with whatever model is picked underneath.\n const providers = rawProviders.map((p) => withToolCallFallback(p, lookupModelCapabilities(p.model)));\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'), env);\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'), env);\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id), env);\n throw new CliError(\n `unknown --provider \"${id}\". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, vscode-lm, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string, env: NodeJS.ProcessEnv = process.env): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n // Resolve baseUrl at build time so VSCODE_LM_BASE_URL (and similar) from the\n // host process env are picked up even when the module was loaded earlier.\n let baseUrl = base.baseUrl;\n if (id === 'vscode-lm') {\n baseUrl = env.VSCODE_LM_BASE_URL || base.baseUrl;\n } else if (id === 'vibgrate-relay') {\n baseUrl = env.VIBGRATE_RELAY_URL || base.baseUrl;\n } else if (id === 'litellm') {\n baseUrl = env.LITELLM_BASE_URL || base.baseUrl;\n } else if (id === 'lmstudio') {\n baseUrl = env.LMSTUDIO_BASE_URL || base.baseUrl;\n } else if (id === 'foundry-local') {\n baseUrl = env.FOUNDRY_LOCAL_BASE_URL || base.baseUrl;\n }\n const config: OpenAiCompatibleConfig = { ...base, id, baseUrl };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel, env));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m, env));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
@@ -41,15 +41,17 @@ function detectQuant(lower) {
41
41
  for (const k of keys) if (lower.includes(k)) return k;
42
42
  return DEFAULT_QUANT;
43
43
  }
44
- function parseOllamaPs(stdout) {
45
- const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
44
+ function parseOllamaPsApi(body) {
45
+ const models = body?.models;
46
+ if (!Array.isArray(models)) return [];
46
47
  const out = [];
47
- for (const line of lines) {
48
- if (/^NAME\b/i.test(line)) continue;
49
- const sizeMatch = line.match(/(\d+(?:\.\d+)?)\s*(GB|GiB|MB|MiB|TB)/i);
50
- const name = line.split(/\s+/)[0];
51
- if (!name || !sizeMatch) continue;
52
- out.push({ name, bytes: toBytes(Number(sizeMatch[1]), sizeMatch[2]) });
48
+ for (const entry of models) {
49
+ const m = entry;
50
+ const name = typeof m?.name === "string" ? m.name.trim() : "";
51
+ if (!name) continue;
52
+ const size = typeof m?.size === "number" && m.size > 0 ? m.size : 0;
53
+ const sizeVram = typeof m?.size_vram === "number" && m.size_vram > 0 ? m.size_vram : 0;
54
+ out.push({ name, bytes: size || sizeVram });
53
55
  }
54
56
  return out;
55
57
  }
@@ -95,14 +97,7 @@ function fmt(bytes) {
95
97
  if (bytes >= GiB) return `${(bytes / GiB).toFixed(1)} GiB`;
96
98
  return `${(bytes / (1024 * 1024)).toFixed(0)} MiB`;
97
99
  }
98
- function toBytes(n, unit) {
99
- const u = unit.toLowerCase();
100
- if (u.startsWith("t")) return n * 1e3 ** 4;
101
- if (u.startsWith("g")) return n * (u.includes("i") ? GiB : 1e9);
102
- if (u.startsWith("m")) return n * (u.includes("i") ? 1024 * 1024 : 1e6);
103
- return n;
104
- }
105
100
 
106
- export { assessCapability, estimateModelBytes, fmt, parseNvidiaSmi, parseOllamaPs };
107
- //# sourceMappingURL=chunk-7N4Y3E47.js.map
108
- //# sourceMappingURL=chunk-7N4Y3E47.js.map
101
+ export { assessCapability, estimateModelBytes, fmt, parseNvidiaSmi, parseOllamaPsApi };
102
+ //# sourceMappingURL=chunk-YJYEPYB2.js.map
103
+ //# sourceMappingURL=chunk-YJYEPYB2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code/capability.ts"],"names":[],"mappings":"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","file":"chunk-YJYEPYB2.js","sourcesContent":["/**\n * Local capability + memory pre-flight for `vg code` (VG-CLI-CODE §10).\n *\n * Before we ever pull or run a local model we check the machine can actually\n * hold it: estimate the model's memory footprint from its parameter count and\n * quantization, read available system memory (and GPU VRAM where we can see\n * it), account for models already loaded, and produce a clear go / no-go with\n * actionable suggestions — free memory by unloading a model, pick a smaller\n * quant, or don't install. We never download a model the machine can't run.\n *\n * The estimators and parsers here are pure and unit-tested; the command layer\n * feeds them real `os` memory, `ollama ps`, and (best-effort) `nvidia-smi`\n * output.\n */\n\nconst GiB = 1024 ** 3;\n\n/** Approximate bytes-per-weight for common gguf quantizations. */\nconst QUANT_BYTES_PER_PARAM: Record<string, number> = {\n f16: 2.0, fp16: 2.0, f32: 4.0,\n q8: 1.06, q8_0: 1.06,\n q6: 0.82, q6_k: 0.82,\n q5: 0.7, q5_k_m: 0.72, q5_k_s: 0.68, q5_0: 0.71, q5_1: 0.77,\n q4: 0.58, q4_k_m: 0.6, q4_k_s: 0.56, q4_0: 0.56, q4_1: 0.63,\n q3: 0.46, q3_k_m: 0.48, q3_k_s: 0.44,\n q2: 0.36, q2_k: 0.4,\n};\nconst DEFAULT_QUANT = 'q4_k_m';\n/** Runtime overhead over raw weights: KV cache, context, activations. */\nconst RUNTIME_OVERHEAD = 1.2;\n\nexport interface ModelSizeEstimate {\n /** Parsed parameter count in billions (e.g. 7, 13, 70), or undefined if unknown. */\n paramsB?: number;\n quant: string;\n /** Estimated resident bytes to run the model (weights × quant × overhead). */\n bytes: number;\n /** True when we had to guess the size because the slug didn't state params. */\n guessed: boolean;\n}\n\n/**\n * Estimate a model's memory footprint from its slug/name/tag, e.g.\n * `qwen2.5-coder:7b-instruct-q4_K_M` → ~5 GiB. Falls back to a conservative\n * default size when the parameter count isn't stated.\n */\nexport function estimateModelBytes(slug: string, defaultParamsB = 7): ModelSizeEstimate {\n const lower = slug.toLowerCase();\n const paramMatch = lower.match(/(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n const paramsB = paramMatch ? Number(paramMatch[1]) : undefined;\n const quant = detectQuant(lower);\n const bytesPerParam = QUANT_BYTES_PER_PARAM[quant] ?? QUANT_BYTES_PER_PARAM[DEFAULT_QUANT];\n const effectiveParams = (paramsB ?? defaultParamsB) * 1e9;\n const bytes = Math.round(effectiveParams * bytesPerParam * RUNTIME_OVERHEAD);\n return { paramsB, quant, bytes, guessed: paramsB === undefined };\n}\n\nfunction detectQuant(lower: string): string {\n // Longest key match first so `q4_k_m` beats `q4`.\n const keys = Object.keys(QUANT_BYTES_PER_PARAM).sort((a, b) => b.length - a.length);\n for (const k of keys) if (lower.includes(k)) return k;\n return DEFAULT_QUANT;\n}\n\nexport interface LoadedModel {\n name: string;\n bytes: number;\n}\n\n/**\n * Parse the Ollama server's `GET /api/ps` JSON into currently-loaded models.\n * The body looks like `{ models: [{ name, size, size_vram, … }] }` with sizes\n * in bytes. Queried over HTTP — never via the `ollama ps` CLI, which\n * auto-launches the Ollama desktop app when the server is down (see\n * `local-runtime.ts`). Malformed or unexpected bodies parse to `[]`.\n */\nexport function parseOllamaPsApi(body: unknown): LoadedModel[] {\n const models = (body as { models?: unknown } | null)?.models;\n if (!Array.isArray(models)) return [];\n const out: LoadedModel[] = [];\n for (const entry of models) {\n const m = entry as { name?: unknown; size?: unknown; size_vram?: unknown } | null;\n const name = typeof m?.name === 'string' ? m.name.trim() : '';\n if (!name) continue;\n const size = typeof m?.size === 'number' && m.size > 0 ? m.size : 0;\n const sizeVram = typeof m?.size_vram === 'number' && m.size_vram > 0 ? m.size_vram : 0;\n out.push({ name, bytes: size || sizeVram });\n }\n return out;\n}\n\n/** Parse `nvidia-smi --query-gpu=memory.total,memory.used --format=csv,noheader,nounits` (MiB). */\nexport function parseNvidiaSmi(stdout: string): { totalBytes: number; usedBytes: number } | null {\n const line = stdout.split('\\n').map((l) => l.trim()).find(Boolean);\n if (!line) return null;\n const parts = line.split(',').map((p) => Number(p.trim()));\n if (parts.length < 2 || !Number.isFinite(parts[0]) || !Number.isFinite(parts[1])) return null;\n return { totalBytes: parts[0] * 1024 * 1024, usedBytes: parts[1] * 1024 * 1024 };\n}\n\nexport interface SystemMemory {\n totalRamBytes: number;\n /**\n * Bytes available for a new allocation right now (reclaim-aware on macOS/Linux —\n * not bare free pages from `os.freemem()`, which under-reports on macOS).\n */\n freeRamBytes: number;\n /** GPU total/free if a discrete GPU was detected (else undefined → CPU/unified). */\n vramTotalBytes?: number;\n vramFreeBytes?: number;\n loaded: LoadedModel[];\n}\n\nexport interface CapabilityReport {\n model: ModelSizeEstimate;\n /** Bytes available to a new model right now (the larger of free VRAM or free RAM). */\n availableBytes: number;\n /** Bytes available if every currently-loaded model were unloaded. */\n availableIfUnloadedBytes: number;\n canRun: boolean;\n /** True only after unloading currently-loaded models. */\n needsUnload: boolean;\n suggestions: string[];\n loaded: LoadedModel[];\n}\n\n/**\n * Decide whether `model` can run on `sys`, and if not, what to do about it.\n * Prefers GPU memory when a discrete GPU is present, else system RAM (covers\n * Apple-silicon unified memory too). Leaves a safety margin so we don't wedge\n * the machine at 100% memory.\n */\nexport function assessCapability(model: ModelSizeEstimate, sys: SystemMemory): CapabilityReport {\n const useVram = typeof sys.vramTotalBytes === 'number' && sys.vramTotalBytes > 0;\n const free = useVram ? (sys.vramFreeBytes ?? 0) : sys.freeRamBytes;\n const loadedBytes = sys.loaded.reduce((n, m) => n + m.bytes, 0);\n // A margin so we never fill memory completely.\n const margin = Math.min(2 * GiB, (useVram ? sys.vramTotalBytes! : sys.totalRamBytes) * 0.1);\n const available = Math.max(0, free - margin);\n const availableIfUnloaded = Math.max(0, free + loadedBytes - margin);\n\n const need = model.bytes;\n const canRunNow = available >= need;\n const canRunUnloaded = availableIfUnloaded >= need;\n\n const suggestions: string[] = [];\n if (!canRunNow && canRunUnloaded && sys.loaded.length) {\n const biggest = [...sys.loaded].sort((a, b) => b.bytes - a.bytes);\n suggestions.push(`unload a loaded model to free memory (e.g. \\`ollama stop ${biggest[0].name}\\` frees ~${fmt(biggest[0].bytes)})`);\n }\n if (!canRunUnloaded) {\n suggestions.push(`this model needs ~${fmt(need)} but only ~${fmt(availableIfUnloaded)} is available — choose a smaller model or a lower quant (e.g. q4_K_M)`);\n }\n if (model.guessed) {\n suggestions.push(`couldn't read the parameter count from the name — this estimate assumes a ~${(model.bytes / GiB).toFixed(1)} GiB model; verify before pulling`);\n }\n\n return {\n model,\n availableBytes: available,\n availableIfUnloadedBytes: availableIfUnloaded,\n canRun: canRunNow || canRunUnloaded,\n needsUnload: !canRunNow && canRunUnloaded,\n suggestions,\n loaded: sys.loaded,\n };\n}\n\n/** Human-readable byte size. */\nexport function fmt(bytes: number): string {\n if (bytes >= GiB) return `${(bytes / GiB).toFixed(1)} GiB`;\n return `${(bytes / (1024 * 1024)).toFixed(0)} MiB`;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ // src/version.ts
2
+ var VERSION = "2026.819.2";
3
+
4
+ export { VERSION };
5
+ //# sourceMappingURL=chunk-ZUZHYAJK.js.map
6
+ //# sourceMappingURL=chunk-ZUZHYAJK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-4NTNMT6T.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.818.2';\n"]}
1
+ {"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-ZUZHYAJK.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.819.2';\n"]}