@vibgrate/cli 2026.728.2 → 2026.728.4

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 (143) hide show
  1. package/DOCS.md +3 -3
  2. package/dist/baseline-QD4HVNVJ.js +8 -0
  3. package/dist/{baseline-MRUM2P6H.js.map → baseline-QD4HVNVJ.js.map} +1 -1
  4. package/dist/{chunk-A2IYFNCQ.js → chunk-2ZHWF7C6.js} +227 -19
  5. package/dist/chunk-2ZHWF7C6.js.map +1 -0
  6. package/dist/{chunk-UZJS7GMK.js → chunk-3LSG7Z4I.js} +10 -6
  7. package/dist/chunk-3LSG7Z4I.js.map +1 -0
  8. package/dist/{chunk-KKRSQQ3A.js → chunk-7AVYKZEM.js} +4 -4
  9. package/dist/{chunk-KKRSQQ3A.js.map → chunk-7AVYKZEM.js.map} +1 -1
  10. package/dist/{chunk-3SDV6ADQ.js → chunk-CQDUBAQY.js} +3 -3
  11. package/dist/{chunk-3SDV6ADQ.js.map → chunk-CQDUBAQY.js.map} +1 -1
  12. package/dist/{chunk-R2QNFXE5.js → chunk-DBOT2ELH.js} +3 -3
  13. package/dist/{chunk-R2QNFXE5.js.map → chunk-DBOT2ELH.js.map} +1 -1
  14. package/dist/{chunk-6UK6QPTR.js → chunk-EETK7S43.js} +137 -34
  15. package/dist/chunk-EETK7S43.js.map +1 -0
  16. package/dist/{chunk-JRAGO6OB.js → chunk-EVWW3BPM.js} +4 -4
  17. package/dist/{chunk-JRAGO6OB.js.map → chunk-EVWW3BPM.js.map} +1 -1
  18. package/dist/chunk-G4HTI4ZM.js +1537 -0
  19. package/dist/chunk-G4HTI4ZM.js.map +1 -0
  20. package/dist/{chunk-NTW5UEKT.js → chunk-HY2RVURA.js} +3 -3
  21. package/dist/{chunk-NTW5UEKT.js.map → chunk-HY2RVURA.js.map} +1 -1
  22. package/dist/chunk-IPICO2RV.js +789 -0
  23. package/dist/chunk-IPICO2RV.js.map +1 -0
  24. package/dist/{chunk-IWP7MYIA.js → chunk-LYDH2PHN.js} +10 -10
  25. package/dist/{chunk-IWP7MYIA.js.map → chunk-LYDH2PHN.js.map} +1 -1
  26. package/dist/{chunk-PVZBYZZR.js → chunk-NZELMYT4.js} +27 -6
  27. package/dist/chunk-NZELMYT4.js.map +1 -0
  28. package/dist/{chunk-GYSOQH5C.js → chunk-OV4KGXPD.js} +30 -4
  29. package/dist/chunk-OV4KGXPD.js.map +1 -0
  30. package/dist/{chunk-6UQMXIAG.js → chunk-OWSFZQOP.js} +62 -12
  31. package/dist/chunk-OWSFZQOP.js.map +1 -0
  32. package/dist/{chunk-WH2N22S3.js → chunk-PRGCCW7D.js} +4 -4
  33. package/dist/{chunk-WH2N22S3.js.map → chunk-PRGCCW7D.js.map} +1 -1
  34. package/dist/{chunk-ZFTFCM7B.js → chunk-RCBMY7CR.js} +11 -11
  35. package/dist/{chunk-ZFTFCM7B.js.map → chunk-RCBMY7CR.js.map} +1 -1
  36. package/dist/{chunk-OSD546W7.js → chunk-REIGWTTH.js} +5 -3
  37. package/dist/chunk-REIGWTTH.js.map +1 -0
  38. package/dist/{chunk-B3YUO3NW.js → chunk-RYNAK4LK.js} +3 -3
  39. package/dist/{chunk-B3YUO3NW.js.map → chunk-RYNAK4LK.js.map} +1 -1
  40. package/dist/{chunk-YF43FOPP.js → chunk-RZEXHDCF.js} +33 -14
  41. package/dist/chunk-RZEXHDCF.js.map +1 -0
  42. package/dist/chunk-SA4BMEU6.js +2184 -0
  43. package/dist/chunk-SA4BMEU6.js.map +1 -0
  44. package/dist/{chunk-HK3AWUXH.js → chunk-TCJTQGAO.js} +3 -3
  45. package/dist/{chunk-HK3AWUXH.js.map → chunk-TCJTQGAO.js.map} +1 -1
  46. package/dist/{chunk-ZBTY6VV4.js → chunk-US2DAKCM.js} +15 -5
  47. package/dist/chunk-US2DAKCM.js.map +1 -0
  48. package/dist/{chunk-ON25BX6T.js → chunk-UTNNGKKX.js} +3 -3
  49. package/dist/{chunk-ON25BX6T.js.map → chunk-UTNNGKKX.js.map} +1 -1
  50. package/dist/chunk-WDJNUC6V.js +3059 -0
  51. package/dist/chunk-WDJNUC6V.js.map +1 -0
  52. package/dist/{chunk-UIOBFLE6.js → chunk-WHJMS7XC.js} +4 -4
  53. package/dist/{chunk-UIOBFLE6.js.map → chunk-WHJMS7XC.js.map} +1 -1
  54. package/dist/chunk-Z6ZWNWWR.js +30 -0
  55. package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
  56. package/dist/{chunk-WY6DGTBP.js → chunk-ZU7VD4QL.js} +7 -6
  57. package/dist/chunk-ZU7VD4QL.js.map +1 -0
  58. package/dist/cli.js +554 -175
  59. package/dist/cli.js.map +1 -1
  60. package/dist/{execution-env-ZU45JZ4G.js → execution-env-4MS5AYAN.js} +3 -3
  61. package/dist/{execution-env-ZU45JZ4G.js.map → execution-env-4MS5AYAN.js.map} +1 -1
  62. package/dist/{federation-SZWZIFZ7.js → federation-MDQPO3PW.js} +3 -3
  63. package/dist/{federation-SZWZIFZ7.js.map → federation-MDQPO3PW.js.map} +1 -1
  64. package/dist/{fs-O5IQYXHO.js → fs-4G5A65KS.js} +3 -3
  65. package/dist/fs-4G5A65KS.js.map +1 -0
  66. package/dist/{fs-B5HZ2MIU.js → fs-6JKZNQ3U.js} +3 -3
  67. package/dist/fs-6JKZNQ3U.js.map +1 -0
  68. package/dist/{git-ref-XDXB6JP5.js → git-ref-RSRAN4OH.js} +3 -3
  69. package/dist/{git-ref-XDXB6JP5.js.map → git-ref-RSRAN4OH.js.map} +1 -1
  70. package/dist/{graph-backend-UTOL3SHE.js → graph-backend-GBL33GMW.js} +5 -5
  71. package/dist/{graph-backend-UTOL3SHE.js.map → graph-backend-GBL33GMW.js.map} +1 -1
  72. package/dist/index.d.ts +3 -2
  73. package/dist/index.js +14 -12
  74. package/dist/index.js.map +1 -1
  75. package/dist/{interactive-36ZZ64WL.js → interactive-32LSIBRG.js} +48 -27
  76. package/dist/interactive-32LSIBRG.js.map +1 -0
  77. package/dist/{llm-host-XYBT4267.js → llm-host-5RE34322.js} +3 -3
  78. package/dist/{llm-host-XYBT4267.js.map → llm-host-5RE34322.js.map} +1 -1
  79. package/dist/load-SEFJA3M5.js +8 -0
  80. package/dist/{load-QPOWQD7C.js.map → load-SEFJA3M5.js.map} +1 -1
  81. package/dist/local-runtime-2ED33KK6.js +6 -0
  82. package/dist/{local-runtime-5O2NN3GA.js.map → local-runtime-2ED33KK6.js.map} +1 -1
  83. package/dist/mcp-tools-KAJS34TN.js +4 -0
  84. package/dist/{mcp-tools-I7JK3S2M.js.map → mcp-tools-KAJS34TN.js.map} +1 -1
  85. package/dist/{model-execution-profile-TFBKCNJG.js → model-execution-profile-ELWF3Z6H.js} +3 -3
  86. package/dist/{model-execution-profile-TFBKCNJG.js.map → model-execution-profile-ELWF3Z6H.js.map} +1 -1
  87. package/dist/model-manager-GJ2YSTSK.js +10 -0
  88. package/dist/{model-manager-OEPY4I7W.js.map → model-manager-GJ2YSTSK.js.map} +1 -1
  89. package/dist/{model-orchestrator-4VSYP4J4.js → model-orchestrator-LHYPJBFH.js} +4 -4
  90. package/dist/{model-orchestrator-4VSYP4J4.js.map → model-orchestrator-LHYPJBFH.js.map} +1 -1
  91. package/dist/parse-worker.js +2 -2
  92. package/dist/{paths-2RAH3GME.js → paths-62AKTFSR.js} +3 -3
  93. package/dist/{paths-2RAH3GME.js.map → paths-62AKTFSR.js.map} +1 -1
  94. package/dist/resolve-gguf-SDIYGGI6.js +9 -0
  95. package/dist/{resolve-gguf-Y6FH3CNB.js.map → resolve-gguf-SDIYGGI6.js.map} +1 -1
  96. package/dist/{runtime-session-EJQZXANB.js → runtime-session-4IACVDSY.js} +7 -7
  97. package/dist/{runtime-session-EJQZXANB.js.map → runtime-session-4IACVDSY.js.map} +1 -1
  98. package/dist/session-2JT4AUZT.js +13 -0
  99. package/dist/{session-ZJGENHKX.js.map → session-2JT4AUZT.js.map} +1 -1
  100. package/dist/session-store-O4XPXKOV.js +4 -0
  101. package/dist/{session-store-WFBX7HXL.js.map → session-store-O4XPXKOV.js.map} +1 -1
  102. package/dist/{sql-extract-JELDZA6W.js → sql-extract-6UJOLJDL.js} +3 -3
  103. package/dist/{sql-extract-JELDZA6W.js.map → sql-extract-6UJOLJDL.js.map} +1 -1
  104. package/dist/stream-json-Y45JBNYP.js +112 -0
  105. package/dist/stream-json-Y45JBNYP.js.map +1 -0
  106. package/dist/ui-K7D3BCHD.js +5 -0
  107. package/dist/ui-K7D3BCHD.js.map +1 -0
  108. package/dist/vg-mcp-bridge-E4SJFL7Q.js +75 -0
  109. package/dist/vg-mcp-bridge-E4SJFL7Q.js.map +1 -0
  110. package/dist/{vgd-3MHSB4KA.js → vgd-KDQFS33M.js} +6 -6
  111. package/dist/vgd-KDQFS33M.js.map +1 -0
  112. package/package.json +1 -1
  113. package/dist/baseline-MRUM2P6H.js +0 -8
  114. package/dist/chunk-6AXHLQBV.js +0 -1892
  115. package/dist/chunk-6AXHLQBV.js.map +0 -1
  116. package/dist/chunk-6UK6QPTR.js.map +0 -1
  117. package/dist/chunk-6UQMXIAG.js.map +0 -1
  118. package/dist/chunk-A2IYFNCQ.js.map +0 -1
  119. package/dist/chunk-DGUM43GV.js +0 -10
  120. package/dist/chunk-GQTWDKMJ.js +0 -5645
  121. package/dist/chunk-GQTWDKMJ.js.map +0 -1
  122. package/dist/chunk-GYSOQH5C.js.map +0 -1
  123. package/dist/chunk-OSD546W7.js.map +0 -1
  124. package/dist/chunk-PVZBYZZR.js.map +0 -1
  125. package/dist/chunk-UZJS7GMK.js.map +0 -1
  126. package/dist/chunk-WY6DGTBP.js.map +0 -1
  127. package/dist/chunk-YF43FOPP.js.map +0 -1
  128. package/dist/chunk-ZBTY6VV4.js.map +0 -1
  129. package/dist/fs-B5HZ2MIU.js.map +0 -1
  130. package/dist/fs-O5IQYXHO.js.map +0 -1
  131. package/dist/interactive-36ZZ64WL.js.map +0 -1
  132. package/dist/load-QPOWQD7C.js +0 -8
  133. package/dist/local-runtime-5O2NN3GA.js +0 -5
  134. package/dist/mcp-tools-I7JK3S2M.js +0 -4
  135. package/dist/model-manager-OEPY4I7W.js +0 -10
  136. package/dist/resolve-gguf-Y6FH3CNB.js +0 -9
  137. package/dist/session-ZJGENHKX.js +0 -13
  138. package/dist/session-store-WFBX7HXL.js +0 -4
  139. package/dist/stream-json-Z5KC2DM3.js +0 -78
  140. package/dist/stream-json-Z5KC2DM3.js.map +0 -1
  141. package/dist/ui-Q6DJ3GCU.js +0 -5
  142. package/dist/ui-Q6DJ3GCU.js.map +0 -1
  143. package/dist/vgd-3MHSB4KA.js.map +0 -1
@@ -1,8 +1,7 @@
1
+ import { __esm } from './chunk-Z6ZWNWWR.js';
1
2
  import * as fs from 'fs';
2
3
  import { execFileSync } from 'child_process';
3
4
 
4
- // src/util/cli-invocation.ts
5
- var NPX_INVOCATION = "npx @vibgrate/cli";
6
5
  function whichOnPath(cmd) {
7
6
  try {
8
7
  const out = execFileSync(process.platform === "win32" ? "where" : "which", [cmd], {
@@ -36,7 +35,6 @@ function isEphemeralNpxBinary(binPath) {
36
35
  function isInstalledOwnBinary(binPath) {
37
36
  return isOwnBinary(binPath) && !isEphemeralNpxBinary(binPath);
38
37
  }
39
- var cached;
40
38
  function resolveCliInvocation(which) {
41
39
  if (!which && cached !== void 0) return cached;
42
40
  const lookup = which ?? whichOnPath;
@@ -51,7 +49,13 @@ function resolveCliInvocation(which) {
51
49
  if (!which) cached = result;
52
50
  return result;
53
51
  }
52
+ var NPX_INVOCATION, cached;
53
+ var init_cli_invocation = __esm({
54
+ "src/util/cli-invocation.ts"() {
55
+ NPX_INVOCATION = "npx @vibgrate/cli";
56
+ }
57
+ });
54
58
 
55
- export { NPX_INVOCATION, isInstalledOwnBinary, resolveCliInvocation, whichOnPath };
56
- //# sourceMappingURL=chunk-UZJS7GMK.js.map
57
- //# sourceMappingURL=chunk-UZJS7GMK.js.map
59
+ export { NPX_INVOCATION, init_cli_invocation, isInstalledOwnBinary, resolveCliInvocation, whichOnPath };
60
+ //# sourceMappingURL=chunk-3LSG7Z4I.js.map
61
+ //# sourceMappingURL=chunk-3LSG7Z4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/cli-invocation.ts"],"names":[],"mappings":";;;;AAkCO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,OAAA,CAAQ,QAAA,KAAa,UAAU,OAAA,GAAU,OAAA,EAAS,CAAC,GAAG,CAAA,EAAG;AAAA,MAChF,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,CAAA,CACE,IAAA,GACA,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AACnB,IAAA,OAAO,GAAA,IAAO,IAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASO,SAAS,YAAY,OAAA,EAA0B;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAU,gBAAa,OAAO,CAAA;AACpC,IAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACrD,IAAA,MAAM,IAAA,GAAU,EAAA,CAAA,YAAA,CAAa,IAAA,EAAM,EAAE,QAAA,EAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AACtE,IAAA,OAAO,KAAK,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAYO,SAAS,qBAAqB,OAAA,EAA0B;AAC7D,EAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,WAAA,CAAY,IAAA,CAAQ,EAAA,CAAA,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASO,SAAS,qBAAqB,OAAA,EAA0B;AAC7D,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,IAAK,CAAC,qBAAqB,OAAO,CAAA;AAC9D;AAUO,SAAS,qBAAqB,KAAA,EAAgD;AACnF,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,KAAW,MAAA,EAAW,OAAO,MAAA;AAC3C,EAAA,MAAM,SAAS,KAAA,IAAS,WAAA;AAExB,EAAA,MAAM,EAAA,GAAK,OAAO,IAAI,CAAA;AACtB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,EAAA,IAAM,oBAAA,CAAqB,EAAE,CAAA,EAAG;AAClC,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,IAAA,MAAA,GAAS,QAAA,IAAY,oBAAA,CAAqB,QAAQ,CAAA,GAAI,UAAA,GAAa,cAAA;AAAA,EACrE;AAEA,EAAA,IAAI,CAAC,OAAO,MAAA,GAAS,MAAA;AACrB,EAAA,OAAO,MAAA;AACT;AAxHA,IA4Ba,cAAA,CAAA,CAqET;AAjGJ,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AA4BO,IAAM,cAAA,GAAiB,mBAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-3LSG7Z4I.js","sourcesContent":["import * as fs from 'node:fs';\nimport { execFileSync } from 'node:child_process';\n\n/**\n * How the user should re-invoke this CLI in a \"next step\" hint.\n *\n * A user who ran `npx @vibgrate/cli scan` has no *persistent* `vg` (or\n * `vibgrate`) on PATH, so a hint like `vg install` or `vg login` would fail for\n * them once the run ends. We answer the practical question \"what will actually\n * run this CLI for this user again?\" by checking whether an *installed* copy of\n * our binary is reachable on PATH:\n *\n * installed `vg` → `vg` (the normal installed case)\n * installed `vibgrate` → `vibgrate` (alias present, `vg` shadowed)\n * neither → `npx @vibgrate/cli` (npx / not installed globally)\n *\n * \"Installed\" is the key qualifier: `npx` prepends its own throwaway\n * `_npx/<hash>/node_modules/.bin` to PATH for the run, so `which vg` finds a `vg`\n * that is genuinely ours yet gone the moment the process exits. That ephemeral\n * binary is excluded (see {@link isEphemeralNpxBinary}) so npx users get the npx\n * form, not a `vg` they can't call again.\n *\n * This is deliberately the same ladder `detectServeLaunch` uses for the MCP\n * launch command — the underlying question (\"is an installed `vg` ours?\") is\n * identical.\n */\n\n/** The npx form that always works without a global install. */\nexport const NPX_INVOCATION = 'npx @vibgrate/cli';\n\n/**\n * Locate `cmd` on PATH, returning its resolved path or null. Best-effort: a\n * missing command or an unavailable `which`/`where` both yield null.\n */\nexport function whichOnPath(cmd: string): string | null {\n try {\n const out = execFileSync(process.platform === 'win32' ? 'where' : 'which', [cmd], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .trim()\n .split(/\\r?\\n/)[0];\n return out || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Does this PATH entry launch *this* package? Symlink installs resolve into a\n * `…/@vibgrate/cli/…` directory; script shims (pnpm/bun/yarn, Windows .cmd)\n * reference the package path in their first bytes. Best-effort: unreadable or\n * unrecognisable entries count as foreign, which only makes callers pick a safer\n * fallback.\n */\nexport function isOwnBinary(binPath: string): boolean {\n try {\n const real = fs.realpathSync(binPath);\n if (/[\\\\/]@vibgrate[\\\\/]cli[\\\\/]/.test(real)) return true;\n const head = fs.readFileSync(real, { encoding: 'utf8' }).slice(0, 2048);\n return head.includes('@vibgrate/cli') || head.includes('vibgrate');\n } catch {\n return false;\n }\n}\n\n/**\n * Is this resolved binary an *ephemeral* npx-cache entry rather than a persistent\n * install? `npx @vibgrate/cli …` unpacks the package into an npm `_npx/<hash>/`\n * cache directory and prepends its `node_modules/.bin` to PATH for the duration\n * of the run — so `which vg` finds a `vg` that is *ours* yet vanishes the instant\n * the process exits. Treating that as an installed `vg` is exactly what made the\n * post-scan hints tell npx users to run `vg login`/`vg push`, commands they have\n * no `vg` on PATH for. npm's cache segment is `_npx` on every platform; we test\n * the raw PATH entry and its realpath (symlink shims resolve into the same tree).\n */\nexport function isEphemeralNpxBinary(binPath: string): boolean {\n const NPX_SEGMENT = /[\\\\/]_npx[\\\\/]/;\n if (NPX_SEGMENT.test(binPath)) return true;\n try {\n return NPX_SEGMENT.test(fs.realpathSync(binPath));\n } catch {\n return false;\n }\n}\n\n/**\n * Does this PATH entry launch *this* CLI in a way that will still work after the\n * current process exits? True only for a persistent install of our package — an\n * ephemeral npx-cache binary does not count, because the user cannot re-invoke it\n * by name. This is the predicate \"next step\" hints and the MCP launch command\n * must use, not {@link isOwnBinary} alone.\n */\nexport function isInstalledOwnBinary(binPath: string): boolean {\n return isOwnBinary(binPath) && !isEphemeralNpxBinary(binPath);\n}\n\nlet cached: string | undefined;\n\n/**\n * The command prefix a user should type to re-run this CLI (see module doc).\n * Memoized per-process: PATH does not change mid-run, and each call would\n * otherwise spawn `which`. Pass `which` to override lookup in tests, which also\n * bypasses the cache.\n */\nexport function resolveCliInvocation(which?: (cmd: string) => string | null): string {\n if (!which && cached !== undefined) return cached;\n const lookup = which ?? whichOnPath;\n\n const vg = lookup('vg');\n let result: string;\n if (vg && isInstalledOwnBinary(vg)) {\n result = 'vg';\n } else {\n const vibgrate = lookup('vibgrate');\n result = vibgrate && isInstalledOwnBinary(vibgrate) ? 'vibgrate' : NPX_INVOCATION;\n }\n\n if (!which) cached = result;\n return result;\n}\n\n/** Reset the memoized invocation. Test-only. */\nexport function resetCliInvocationCache(): void {\n cached = undefined;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { discoverModels } from './chunk-3SDV6ADQ.js';
2
- import { isWeightCached, weightPathForRef, lookupCatalog, listCachedWeights } from './chunk-GYSOQH5C.js';
1
+ import { discoverModels } from './chunk-CQDUBAQY.js';
2
+ import { isWeightCached, weightPathForRef, lookupCatalog, listCachedWeights } from './chunk-OV4KGXPD.js';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
 
@@ -66,5 +66,5 @@ function embeddedLlamaReady(opts = {}) {
66
66
  }
67
67
 
68
68
  export { embeddedLlamaReady, resolveGgufPath };
69
- //# sourceMappingURL=chunk-KKRSQQ3A.js.map
70
- //# sourceMappingURL=chunk-KKRSQQ3A.js.map
69
+ //# sourceMappingURL=chunk-7AVYKZEM.js.map
70
+ //# sourceMappingURL=chunk-7AVYKZEM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/resolve-gguf.ts"],"names":[],"mappings":"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","file":"chunk-KKRSQQ3A.js","sourcesContent":["/**\n * Resolve a GGUF path for embedded llama.cpp — best-in-breed default path.\n *\n * Order (first hit wins):\n * 1. Explicit path (exists on disk)\n * 2. VG_CODE_MODEL_PATH / env override\n * 3. First-party weight store (catalogued ref or basename)\n * 4. Discovered local fleet (gguf / lm-studio)\n *\n * Pure path resolution — never downloads (install is `vg models install`).\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef } from './weight-store.js';\n\nexport interface ResolveGgufOptions {\n /** Explicit --model-path or absolute path. */\n modelPath?: string;\n /** Model id / weightsRef (e.g. qwen2.5-coder-3b-q4_k_m.gguf or qwen2.5-coder:3b). */\n modelRef?: string;\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface ResolveGgufResult {\n path: string;\n source: 'explicit' | 'env' | 'weight-store' | 'fleet' | 'catalog-path';\n ref?: string;\n}\n\n/**\n * Resolve an on-disk GGUF for local inference. Returns null when nothing is ready\n * (caller should fall back to Ollama or ask user to install).\n */\nexport function resolveGgufPath(opts: ResolveGgufOptions = {}): ResolveGgufResult | null {\n const env = opts.env ?? process.env;\n\n if (opts.modelPath && fs.existsSync(opts.modelPath) && fs.statSync(opts.modelPath).isFile()) {\n return { path: path.resolve(opts.modelPath), source: 'explicit', ref: opts.modelRef };\n }\n\n const envPath = env.VG_CODE_MODEL_PATH;\n if (envPath && fs.existsSync(envPath) && fs.statSync(envPath).isFile()) {\n return { path: path.resolve(envPath), source: 'env', ref: opts.modelRef };\n }\n\n const ref = opts.modelRef?.trim();\n if (ref) {\n // Direct weight-store hit.\n if (isWeightCached(ref, env)) {\n return { path: weightPathForRef(ref, env), source: 'weight-store', ref };\n }\n // Catalog basename may differ slightly from ollama-style refs.\n const catalog = lookupCatalog(ref);\n if (catalog && isWeightCached(catalog.ref, env)) {\n return { path: weightPathForRef(catalog.ref, env), source: 'weight-store', ref: catalog.ref };\n }\n // Ollama-style \"name:tag\" → try catalog aliases.\n const normalized = ref.includes(':')\n ? `${ref.replace(':', '-').replace(/\\//g, '-')}-q4_k_m.gguf`\n : ref.endsWith('.gguf')\n ? ref\n : `${ref}.gguf`;\n if (isWeightCached(normalized, env)) {\n return { path: weightPathForRef(normalized, env), source: 'weight-store', ref: normalized };\n }\n const cat2 = lookupCatalog(normalized);\n if (cat2 && isWeightCached(cat2.ref, env)) {\n return { path: weightPathForRef(cat2.ref, env), source: 'weight-store', ref: cat2.ref };\n }\n // Absolute path-looking ref\n if ((ref.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(ref)) && fs.existsSync(ref)) {\n return { path: path.resolve(ref), source: 'explicit', ref };\n }\n }\n\n // Any cached first-party weight (prefer matching ref substring).\n const cached = listCachedWeights(env);\n if (ref) {\n const hit = cached.find((w) => w.name.toLowerCase().includes(ref.toLowerCase().replace(/[:/]/g, '-')));\n if (hit) return { path: hit.path, source: 'weight-store', ref: hit.name };\n }\n\n // Fleet discovery: gguf / lm-studio paths.\n const fleet = (() => {\n try {\n return (opts.discover ?? discoverModels)();\n } catch {\n return [] as LocalModel[];\n }\n })();\n if (ref) {\n const want = ref.toLowerCase();\n const match = fleet.find(\n (m) =>\n (m.runtime === 'gguf' || m.runtime === 'lm-studio') &&\n (m.name.toLowerCase().includes(want) || m.path.toLowerCase().includes(want) || want.includes(m.name.toLowerCase())),\n );\n if (match && fs.existsSync(match.path)) {\n return { path: match.path, source: 'fleet', ref: match.name };\n }\n }\n const anyGguf = fleet.find((m) => (m.runtime === 'gguf' || m.runtime === 'lm-studio') && fs.existsSync(m.path));\n if (anyGguf) return { path: anyGguf.path, source: 'fleet', ref: anyGguf.name };\n\n // If only one weight in store, use it when no ref.\n if (!ref && cached.length === 1) {\n return { path: cached[0].path, source: 'weight-store', ref: cached[0].name };\n }\n\n return null;\n}\n\n/** Whether embedded llama.cpp is ready for this ref without a network install. */\nexport function embeddedLlamaReady(opts: ResolveGgufOptions = {}): boolean {\n return resolveGgufPath(opts) != null;\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/resolve-gguf.ts"],"names":[],"mappings":"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","file":"chunk-7AVYKZEM.js","sourcesContent":["/**\n * Resolve a GGUF path for embedded llama.cpp — best-in-breed default path.\n *\n * Order (first hit wins):\n * 1. Explicit path (exists on disk)\n * 2. VG_CODE_MODEL_PATH / env override\n * 3. First-party weight store (catalogued ref or basename)\n * 4. Discovered local fleet (gguf / lm-studio)\n *\n * Pure path resolution — never downloads (install is `vg models install`).\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { isWeightCached, listCachedWeights, lookupCatalog, weightPathForRef } from './weight-store.js';\n\nexport interface ResolveGgufOptions {\n /** Explicit --model-path or absolute path. */\n modelPath?: string;\n /** Model id / weightsRef (e.g. qwen2.5-coder-3b-q4_k_m.gguf or qwen2.5-coder:3b). */\n modelRef?: string;\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface ResolveGgufResult {\n path: string;\n source: 'explicit' | 'env' | 'weight-store' | 'fleet' | 'catalog-path';\n ref?: string;\n}\n\n/**\n * Resolve an on-disk GGUF for local inference. Returns null when nothing is ready\n * (caller should fall back to Ollama or ask user to install).\n */\nexport function resolveGgufPath(opts: ResolveGgufOptions = {}): ResolveGgufResult | null {\n const env = opts.env ?? process.env;\n\n if (opts.modelPath && fs.existsSync(opts.modelPath) && fs.statSync(opts.modelPath).isFile()) {\n return { path: path.resolve(opts.modelPath), source: 'explicit', ref: opts.modelRef };\n }\n\n const envPath = env.VG_CODE_MODEL_PATH;\n if (envPath && fs.existsSync(envPath) && fs.statSync(envPath).isFile()) {\n return { path: path.resolve(envPath), source: 'env', ref: opts.modelRef };\n }\n\n const ref = opts.modelRef?.trim();\n if (ref) {\n // Direct weight-store hit.\n if (isWeightCached(ref, env)) {\n return { path: weightPathForRef(ref, env), source: 'weight-store', ref };\n }\n // Catalog basename may differ slightly from ollama-style refs.\n const catalog = lookupCatalog(ref);\n if (catalog && isWeightCached(catalog.ref, env)) {\n return { path: weightPathForRef(catalog.ref, env), source: 'weight-store', ref: catalog.ref };\n }\n // Ollama-style \"name:tag\" → try catalog aliases.\n const normalized = ref.includes(':')\n ? `${ref.replace(':', '-').replace(/\\//g, '-')}-q4_k_m.gguf`\n : ref.endsWith('.gguf')\n ? ref\n : `${ref}.gguf`;\n if (isWeightCached(normalized, env)) {\n return { path: weightPathForRef(normalized, env), source: 'weight-store', ref: normalized };\n }\n const cat2 = lookupCatalog(normalized);\n if (cat2 && isWeightCached(cat2.ref, env)) {\n return { path: weightPathForRef(cat2.ref, env), source: 'weight-store', ref: cat2.ref };\n }\n // Absolute path-looking ref\n if ((ref.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(ref)) && fs.existsSync(ref)) {\n return { path: path.resolve(ref), source: 'explicit', ref };\n }\n }\n\n // Any cached first-party weight (prefer matching ref substring).\n const cached = listCachedWeights(env);\n if (ref) {\n const hit = cached.find((w) => w.name.toLowerCase().includes(ref.toLowerCase().replace(/[:/]/g, '-')));\n if (hit) return { path: hit.path, source: 'weight-store', ref: hit.name };\n }\n\n // Fleet discovery: gguf / lm-studio paths.\n const fleet = (() => {\n try {\n return (opts.discover ?? discoverModels)();\n } catch {\n return [] as LocalModel[];\n }\n })();\n if (ref) {\n const want = ref.toLowerCase();\n const match = fleet.find(\n (m) =>\n (m.runtime === 'gguf' || m.runtime === 'lm-studio') &&\n (m.name.toLowerCase().includes(want) || m.path.toLowerCase().includes(want) || want.includes(m.name.toLowerCase())),\n );\n if (match && fs.existsSync(match.path)) {\n return { path: match.path, source: 'fleet', ref: match.name };\n }\n }\n const anyGguf = fleet.find((m) => (m.runtime === 'gguf' || m.runtime === 'lm-studio') && fs.existsSync(m.path));\n if (anyGguf) return { path: anyGguf.path, source: 'fleet', ref: anyGguf.name };\n\n // If only one weight in store, use it when no ref.\n if (!ref && cached.length === 1) {\n return { path: cached[0].path, source: 'weight-store', ref: cached[0].name };\n }\n\n return null;\n}\n\n/** Whether embedded llama.cpp is ready for this ref without a network install. */\nexport function embeddedLlamaReady(opts: ResolveGgufOptions = {}): boolean {\n return resolveGgufPath(opts) != null;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { listCachedWeights } from './chunk-GYSOQH5C.js';
1
+ import { listCachedWeights } from './chunk-OV4KGXPD.js';
2
2
  import * as fs from 'fs';
3
3
  import * as os from 'os';
4
4
  import * as path from 'path';
@@ -74,5 +74,5 @@ function dedupe(models) {
74
74
  }
75
75
 
76
76
  export { discoverModels };
77
- //# sourceMappingURL=chunk-3SDV6ADQ.js.map
78
- //# sourceMappingURL=chunk-3SDV6ADQ.js.map
77
+ //# sourceMappingURL=chunk-CQDUBAQY.js.map
78
+ //# sourceMappingURL=chunk-CQDUBAQY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/models.ts"],"names":[],"mappings":"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","file":"chunk-3SDV6ADQ.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { listCachedWeights } from '../runtime/weight-store.js';\n\n/**\n * Local-model discovery (VG-LOCAL-MODELS §9.2) — be a no-key *consumer* of the\n * developer's local model fleet. Fully offline and deterministic: inspect the\n * on-disk layouts of Ollama / LM Studio / llama.cpp / the Vibgrate weight store,\n * never the network. No runtime is built or launched.\n */\n\nexport interface LocalModel {\n runtime: 'ollama' | 'lm-studio' | 'gguf';\n name: string;\n path: string;\n}\n\nexport function discoverModels(home = os.homedir()): LocalModel[] {\n return [...ollama(home), ...lmStudio(home), ...looseGguf(home), ...vibgrateWeightStore()].sort(\n (a, b) => a.runtime.localeCompare(b.runtime) || a.name.localeCompare(b.name),\n );\n}\n\n/** First-party GGUF cache (runtime/weight-store.ts). */\nfunction vibgrateWeightStore(): LocalModel[] {\n return listCachedWeights().map((w) => ({ runtime: 'gguf' as const, name: w.name, path: w.path }));\n}\n\nfunction ollama(home: string): LocalModel[] {\n const base = path.join(home, '.ollama', 'models', 'manifests');\n const out: LocalModel[] = [];\n walk(base, 4, (file) => {\n // .../library/<model>/<tag>\n const rel = path.relative(base, file).split(path.sep);\n if (rel.length >= 2) {\n const tag = rel[rel.length - 1];\n const model = rel[rel.length - 2];\n out.push({ runtime: 'ollama', name: `${model}:${tag}`, path: file });\n }\n });\n return dedupe(out);\n}\n\nfunction lmStudio(home: string): LocalModel[] {\n const bases = [path.join(home, '.lmstudio', 'models'), path.join(home, '.cache', 'lm-studio', 'models')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 5, (file) => {\n if (!file.endsWith('.gguf')) return;\n const rel = path.relative(base, file).replace(/\\\\/g, '/');\n out.push({ runtime: 'lm-studio', name: rel, path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction looseGguf(home: string): LocalModel[] {\n const bases = [path.join(home, 'models'), path.join(home, '.cache', 'huggingface')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 4, (file) => {\n if (!file.endsWith('.gguf')) return;\n out.push({ runtime: 'gguf', name: path.basename(file), path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction walk(dir: string, depth: number, onFile: (file: string) => void): void {\n if (depth < 0) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) walk(abs, depth - 1, onFile);\n else if (e.isFile()) onFile(abs);\n }\n}\n\nfunction dedupe(models: LocalModel[]): LocalModel[] {\n const seen = new Set<string>();\n const out: LocalModel[] = [];\n for (const m of models) {\n const key = `${m.runtime}:${m.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(m);\n }\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../src/engine/models.ts"],"names":[],"mappings":"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","file":"chunk-CQDUBAQY.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { listCachedWeights } from '../runtime/weight-store.js';\n\n/**\n * Local-model discovery (VG-LOCAL-MODELS §9.2) — be a no-key *consumer* of the\n * developer's local model fleet. Fully offline and deterministic: inspect the\n * on-disk layouts of Ollama / LM Studio / llama.cpp / the Vibgrate weight store,\n * never the network. No runtime is built or launched.\n */\n\nexport interface LocalModel {\n runtime: 'ollama' | 'lm-studio' | 'gguf';\n name: string;\n path: string;\n}\n\nexport function discoverModels(home = os.homedir()): LocalModel[] {\n return [...ollama(home), ...lmStudio(home), ...looseGguf(home), ...vibgrateWeightStore()].sort(\n (a, b) => a.runtime.localeCompare(b.runtime) || a.name.localeCompare(b.name),\n );\n}\n\n/** First-party GGUF cache (runtime/weight-store.ts). */\nfunction vibgrateWeightStore(): LocalModel[] {\n return listCachedWeights().map((w) => ({ runtime: 'gguf' as const, name: w.name, path: w.path }));\n}\n\nfunction ollama(home: string): LocalModel[] {\n const base = path.join(home, '.ollama', 'models', 'manifests');\n const out: LocalModel[] = [];\n walk(base, 4, (file) => {\n // .../library/<model>/<tag>\n const rel = path.relative(base, file).split(path.sep);\n if (rel.length >= 2) {\n const tag = rel[rel.length - 1];\n const model = rel[rel.length - 2];\n out.push({ runtime: 'ollama', name: `${model}:${tag}`, path: file });\n }\n });\n return dedupe(out);\n}\n\nfunction lmStudio(home: string): LocalModel[] {\n const bases = [path.join(home, '.lmstudio', 'models'), path.join(home, '.cache', 'lm-studio', 'models')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 5, (file) => {\n if (!file.endsWith('.gguf')) return;\n const rel = path.relative(base, file).replace(/\\\\/g, '/');\n out.push({ runtime: 'lm-studio', name: rel, path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction looseGguf(home: string): LocalModel[] {\n const bases = [path.join(home, 'models'), path.join(home, '.cache', 'huggingface')];\n const out: LocalModel[] = [];\n for (const base of bases) {\n walk(base, 4, (file) => {\n if (!file.endsWith('.gguf')) return;\n out.push({ runtime: 'gguf', name: path.basename(file), path: file });\n });\n }\n return dedupe(out);\n}\n\nfunction walk(dir: string, depth: number, onFile: (file: string) => void): void {\n if (depth < 0) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) walk(abs, depth - 1, onFile);\n else if (e.isFile()) onFile(abs);\n }\n}\n\nfunction dedupe(models: LocalModel[]): LocalModel[] {\n const seen = new Set<string>();\n const out: LocalModel[] = [];\n for (const m of models) {\n const key = `${m.runtime}:${m.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(m);\n }\n return out;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { startVgdServer } from './chunk-JRAGO6OB.js';
1
+ import { startVgdServer } from './chunk-EVWW3BPM.js';
2
2
  import { vgdIsRunning, vgdRequest } from './chunk-PMYWZRRS.js';
3
3
 
4
4
  // src/code/runtime-session.ts
@@ -78,5 +78,5 @@ function noneSession() {
78
78
  }
79
79
 
80
80
  export { startCodeRuntimeSession };
81
- //# sourceMappingURL=chunk-R2QNFXE5.js.map
82
- //# sourceMappingURL=chunk-R2QNFXE5.js.map
81
+ //# sourceMappingURL=chunk-DBOT2ELH.js.map
82
+ //# sourceMappingURL=chunk-DBOT2ELH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-R2QNFXE5.js","sourcesContent":["/**\n * Session boundary between VG Code and the Fusion Runtime daemon (`vgd`).\n *\n * Replaces the old {@link GraphProcess} (`vg serve` child) for the interactive\n * coding REPL. Behaviour:\n *\n * 1. If a local vgd is already running — register this workspace and leave the\n * daemon running when the session ends (unregister only).\n * 2. Otherwise — start an **in-process** vgd for the life of the session and\n * tear it down on dispose. No second OS process, no `vg serve` spawn.\n *\n * Never throws: a failure to attach degrades to “no runtime session” and the\n * agent continues with the in-process graph only (same safety as GraphProcess).\n */\n\nimport { startVgdServer, vgdIsRunning, vgdRequest, type VgdServer } from '../runtime/vgd/index.js';\nimport type { WorkspaceRecord } from '../runtime/vgd/protocol.js';\n\nexport type RuntimeSessionKind = 'attached' | 'owned' | 'none';\n\nexport interface RuntimeSessionOptions {\n root: string;\n /** Override socket path (tests). */\n socketPath?: string;\n /** Injectable connect/start hooks (tests). */\n isRunning?: (socketPath?: string) => Promise<boolean>;\n request?: typeof vgdRequest;\n startServer?: (opts: { socketPath?: string }) => Promise<VgdServer>;\n}\n\nexport interface CodeRuntimeSession {\n readonly kind: RuntimeSessionKind;\n /** Daemon pid when known (attached status or owned process). */\n readonly pid: number | undefined;\n readonly workspace: WorkspaceRecord | undefined;\n readonly socketPath: string | undefined;\n /** Human label for the REPL intro line. */\n readonly label: string;\n dispose(): Promise<void>;\n}\n\n/**\n * Attach VG Code to vgd for one coding session. Always resolves (never throws).\n */\nexport async function startCodeRuntimeSession(options: RuntimeSessionOptions): Promise<CodeRuntimeSession> {\n const socketPath = options.socketPath;\n const isRunning = options.isRunning ?? ((sp?: string) => vgdIsRunning({ socketPath: sp }));\n const request = options.request ?? vgdRequest;\n const startServer = options.startServer ?? ((opts: { socketPath?: string }) => startVgdServer(opts));\n\n try {\n if (await isRunning(socketPath)) {\n return await attachExisting(options.root, socketPath, request);\n }\n return await startOwned(options.root, socketPath, startServer, request);\n } catch {\n return noneSession();\n }\n}\n\nasync function attachExisting(\n root: string,\n socketPath: string | undefined,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const clientOpts = { socketPath };\n const reg = await request({ op: 'register', root }, clientOpts);\n if (!reg.ok || !('workspace' in reg)) return noneSession();\n const status = await request({ op: 'status' }, clientOpts).catch(() => null);\n const pid = status && status.ok && 'pid' in status ? status.pid : undefined;\n let disposed = false;\n return {\n kind: 'attached',\n pid,\n workspace: reg.workspace,\n socketPath: status && status.ok && 'socketPath' in status ? status.socketPath : socketPath,\n label: pid != null ? `vgd ${pid}` : 'vgd',\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await request({ op: 'unregister', root }, clientOpts);\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nasync function startOwned(\n root: string,\n socketPath: string | undefined,\n startServer: (opts: { socketPath?: string }) => Promise<VgdServer>,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const server = await startServer({ socketPath });\n const clientOpts = { socketPath: server.socketPath };\n let workspace: WorkspaceRecord | undefined;\n try {\n const reg = await request({ op: 'register', root }, clientOpts);\n if (reg.ok && 'workspace' in reg) workspace = reg.workspace;\n } catch {\n /* registry optional for an empty session */\n }\n let disposed = false;\n return {\n kind: 'owned',\n pid: process.pid,\n workspace,\n socketPath: server.socketPath,\n label: `vgd (session)`,\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await server.close();\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nfunction noneSession(): CodeRuntimeSession {\n return {\n kind: 'none',\n pid: undefined,\n workspace: undefined,\n socketPath: undefined,\n label: '',\n async dispose() {\n /* no-op */\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/code/runtime-session.ts"],"names":[],"mappings":"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","file":"chunk-DBOT2ELH.js","sourcesContent":["/**\n * Session boundary between VG Code and the Fusion Runtime daemon (`vgd`).\n *\n * Replaces the old {@link GraphProcess} (`vg serve` child) for the interactive\n * coding REPL. Behaviour:\n *\n * 1. If a local vgd is already running — register this workspace and leave the\n * daemon running when the session ends (unregister only).\n * 2. Otherwise — start an **in-process** vgd for the life of the session and\n * tear it down on dispose. No second OS process, no `vg serve` spawn.\n *\n * Never throws: a failure to attach degrades to “no runtime session” and the\n * agent continues with the in-process graph only (same safety as GraphProcess).\n */\n\nimport { startVgdServer, vgdIsRunning, vgdRequest, type VgdServer } from '../runtime/vgd/index.js';\nimport type { WorkspaceRecord } from '../runtime/vgd/protocol.js';\n\nexport type RuntimeSessionKind = 'attached' | 'owned' | 'none';\n\nexport interface RuntimeSessionOptions {\n root: string;\n /** Override socket path (tests). */\n socketPath?: string;\n /** Injectable connect/start hooks (tests). */\n isRunning?: (socketPath?: string) => Promise<boolean>;\n request?: typeof vgdRequest;\n startServer?: (opts: { socketPath?: string }) => Promise<VgdServer>;\n}\n\nexport interface CodeRuntimeSession {\n readonly kind: RuntimeSessionKind;\n /** Daemon pid when known (attached status or owned process). */\n readonly pid: number | undefined;\n readonly workspace: WorkspaceRecord | undefined;\n readonly socketPath: string | undefined;\n /** Human label for the REPL intro line. */\n readonly label: string;\n dispose(): Promise<void>;\n}\n\n/**\n * Attach VG Code to vgd for one coding session. Always resolves (never throws).\n */\nexport async function startCodeRuntimeSession(options: RuntimeSessionOptions): Promise<CodeRuntimeSession> {\n const socketPath = options.socketPath;\n const isRunning = options.isRunning ?? ((sp?: string) => vgdIsRunning({ socketPath: sp }));\n const request = options.request ?? vgdRequest;\n const startServer = options.startServer ?? ((opts: { socketPath?: string }) => startVgdServer(opts));\n\n try {\n if (await isRunning(socketPath)) {\n return await attachExisting(options.root, socketPath, request);\n }\n return await startOwned(options.root, socketPath, startServer, request);\n } catch {\n return noneSession();\n }\n}\n\nasync function attachExisting(\n root: string,\n socketPath: string | undefined,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const clientOpts = { socketPath };\n const reg = await request({ op: 'register', root }, clientOpts);\n if (!reg.ok || !('workspace' in reg)) return noneSession();\n const status = await request({ op: 'status' }, clientOpts).catch(() => null);\n const pid = status && status.ok && 'pid' in status ? status.pid : undefined;\n let disposed = false;\n return {\n kind: 'attached',\n pid,\n workspace: reg.workspace,\n socketPath: status && status.ok && 'socketPath' in status ? status.socketPath : socketPath,\n label: pid != null ? `vgd ${pid}` : 'vgd',\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await request({ op: 'unregister', root }, clientOpts);\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nasync function startOwned(\n root: string,\n socketPath: string | undefined,\n startServer: (opts: { socketPath?: string }) => Promise<VgdServer>,\n request: typeof vgdRequest,\n): Promise<CodeRuntimeSession> {\n const server = await startServer({ socketPath });\n const clientOpts = { socketPath: server.socketPath };\n let workspace: WorkspaceRecord | undefined;\n try {\n const reg = await request({ op: 'register', root }, clientOpts);\n if (reg.ok && 'workspace' in reg) workspace = reg.workspace;\n } catch {\n /* registry optional for an empty session */\n }\n let disposed = false;\n return {\n kind: 'owned',\n pid: process.pid,\n workspace,\n socketPath: server.socketPath,\n label: `vgd (session)`,\n async dispose() {\n if (disposed) return;\n disposed = true;\n try {\n await server.close();\n } catch {\n /* best-effort */\n }\n },\n };\n}\n\nfunction noneSession(): CodeRuntimeSession {\n return {\n kind: 'none',\n pid: undefined,\n workspace: undefined,\n socketPath: undefined,\n label: '',\n async dispose() {\n /* no-op */\n },\n };\n}\n"]}
@@ -497,57 +497,150 @@ var STOPWORDS = /* @__PURE__ */ new Set([
497
497
  "works",
498
498
  "codebase",
499
499
  "contains",
500
- "file"
500
+ "file",
501
+ // String/URL occurrence scaffolding: "does not exist", "find occurrences of …"
502
+ // must not light up DoesNot*/NonExisting*/commandExists via weak substrings
503
+ // (field report: https://…/signup does not exist find occurrences).
504
+ "not",
505
+ "no",
506
+ "exist",
507
+ "exists",
508
+ "existing",
509
+ "occurrence",
510
+ "occurrences",
511
+ "occurence",
512
+ "occurences",
513
+ "every",
514
+ "place",
515
+ "places",
516
+ "string",
517
+ "literal",
518
+ "text",
519
+ "search",
520
+ "locate",
521
+ "look",
522
+ "looking",
523
+ "show",
524
+ "list",
525
+ "all"
501
526
  ]);
527
+ function cleanUrlNeedle(raw) {
528
+ let s = raw.trim();
529
+ s = s.replace(/[.,;:!)\]}>]+$/g, "");
530
+ if (s.endsWith("?")) {
531
+ const qi = s.lastIndexOf("?");
532
+ if (qi === s.length - 1) s = s.slice(0, -1);
533
+ }
534
+ return s;
535
+ }
536
+ function extractLiteralNeedles(question) {
537
+ const out = [];
538
+ const seen = /* @__PURE__ */ new Set();
539
+ const push2 = (raw, kind) => {
540
+ let s = raw.trim();
541
+ s = kind === "url" ? cleanUrlNeedle(s) : s.replace(/[.,;:!)\]}>?]+$/g, "");
542
+ if (s.length < 2 || seen.has(s)) return;
543
+ seen.add(s);
544
+ out.push(s);
545
+ };
546
+ for (const m of question.matchAll(/https?:\/\/[^\s"'`<>]+/gi)) push2(m[0], "url");
547
+ for (const m of question.matchAll(/(["'`])((?:(?!\1)[^\\]|\\.){2,})\1/g)) {
548
+ push2(m[2].replace(/\\(.)/g, "$1"), "quote");
549
+ }
550
+ return out;
551
+ }
552
+ function stripLiteralNeedles(question) {
553
+ let s = question;
554
+ for (const m of question.matchAll(/https?:\/\/[^\s"'`<>]+/gi)) {
555
+ s = s.split(m[0]).join(" ");
556
+ }
557
+ for (const lit of extractLiteralNeedles(question)) {
558
+ s = s.split(lit).join(" ");
559
+ }
560
+ s = s.replace(/(["'`])\s*\1/g, " ");
561
+ return s.replace(/\s+/g, " ").trim();
562
+ }
563
+ function residualForSymbolSearch(question) {
564
+ const literals = extractLiteralNeedles(question);
565
+ if (literals.length === 0) return question.trim();
566
+ const stripped = stripLiteralNeedles(question);
567
+ return tokenize(stripped).length === 0 ? "" : stripped;
568
+ }
569
+ function isLocateOnlyInstruction(instruction) {
570
+ const q = instruction.trim();
571
+ if (!q) return false;
572
+ const needles = extractLiteralNeedles(q);
573
+ const hasLocateFrame = /\b(where\s+is|where\s+are|find\s+(all\s+|every\s+)?occurrence|find\s+occurrences|does\s+not\s+exist|locate|search\s+for)\b/i.test(
574
+ q
575
+ ) || needles.length > 0 && /^https?:\/\//i.test(q);
576
+ const withoutExist = q.replace(/\bdoes\s+not\s+exist\b/gi, " ");
577
+ if (/\b(fix|edit|change|replace|implement|refactor|rename|patch|create\s+file|delete\s+file|add\s+a\b|remove\s+the\b)\b/i.test(
578
+ withoutExist
579
+ )) {
580
+ return false;
581
+ }
582
+ if (needles.some((n) => /^https?:\/\//i.test(n))) return true;
583
+ return hasLocateFrame && needles.length > 0;
584
+ }
502
585
  function queryGraph(graph, question, options = {}) {
503
586
  const budget = options.budget ?? 2e3;
504
587
  const limit = options.limit ?? 12;
505
- const terms = tokenize(question);
588
+ const literals = extractLiteralNeedles(question);
589
+ const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
590
+ const terms = tokenize(forTokens);
506
591
  const weightOf = termWeights(graph, terms);
507
592
  const index = indexFor(graph);
508
593
  const scored = [];
509
- for (const node of graph.nodes) {
510
- if (node.kind === "file" || node.kind === "external") continue;
511
- const { score, why } = scoreNode(node, terms, weightOf);
512
- if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
594
+ if (terms.length > 0) {
595
+ for (const node of graph.nodes) {
596
+ if (node.kind === "file" || node.kind === "external") continue;
597
+ const { score, why } = scoreNode(node, terms, weightOf);
598
+ if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
599
+ }
600
+ scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
513
601
  }
514
- scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
515
602
  const seeds = scored.slice(0, limit);
516
- const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);
603
+ const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);
517
604
  return { question, matches: seeds, context, tokensEstimate };
518
605
  }
519
606
  async function queryGraphSemantic(graph, question, options) {
520
607
  const budget = options.budget ?? 2e3;
521
608
  const limit = options.limit ?? 12;
522
- const terms = tokenize(question);
609
+ const literals = extractLiteralNeedles(question);
610
+ const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;
611
+ const terms = tokenize(forTokens);
523
612
  const weightOf = termWeights(graph, terms);
524
613
  const index = indexFor(graph);
525
- const queryVec = await options.embedder.embedQuery(question);
614
+ const queryVec = await options.embedder.embedQuery(forTokens || question);
526
615
  const lexRaw = /* @__PURE__ */ new Map();
527
616
  let lexMax = 0;
528
617
  const whyById = /* @__PURE__ */ new Map();
529
- for (const node of graph.nodes) {
530
- if (node.kind === "file" || node.kind === "external") continue;
531
- const { score, why } = scoreNode(node, terms, weightOf);
532
- lexRaw.set(node.id, score);
533
- whyById.set(node.id, why);
534
- if (score > lexMax) lexMax = score;
618
+ if (terms.length > 0) {
619
+ for (const node of graph.nodes) {
620
+ if (node.kind === "file" || node.kind === "external") continue;
621
+ const { score, why } = scoreNode(node, terms, weightOf);
622
+ lexRaw.set(node.id, score);
623
+ whyById.set(node.id, why);
624
+ if (score > lexMax) lexMax = score;
625
+ }
535
626
  }
536
627
  const scored = [];
537
- for (const node of graph.nodes) {
538
- if (node.kind === "file" || node.kind === "external") continue;
539
- const lexNorm = lexMax > 0 ? (lexRaw.get(node.id) ?? 0) / lexMax : 0;
540
- const vec = options.nodeVectors.get(node.id);
541
- const sem = vec ? Math.max(0, cosine(queryVec, vec)) : 0;
542
- const hybrid = 0.5 * lexNorm + 0.5 * sem;
543
- if (hybrid <= 0) continue;
544
- const lexWhy = whyById.get(node.id);
545
- const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : "weak match");
546
- scored.push({ node, score: round(hybrid * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
547
- }
548
- scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
628
+ if (terms.length > 0 || literals.length === 0) {
629
+ for (const node of graph.nodes) {
630
+ if (node.kind === "file" || node.kind === "external") continue;
631
+ const lexNorm = lexMax > 0 ? (lexRaw.get(node.id) ?? 0) / lexMax : 0;
632
+ const vec = options.nodeVectors.get(node.id);
633
+ const sem = vec && terms.length > 0 ? Math.max(0, cosine(queryVec, vec)) : 0;
634
+ const hybrid = 0.5 * lexNorm + 0.5 * sem;
635
+ if (hybrid <= 0) continue;
636
+ const lexWhy = whyById.get(node.id);
637
+ const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : "weak match");
638
+ scored.push({ node, score: round(hybrid * (1 + IMPORTANCE_WEIGHT * node.importance)), why });
639
+ }
640
+ scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));
641
+ }
549
642
  const seeds = scored.slice(0, limit);
550
- const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);
643
+ const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);
551
644
  return { question, matches: seeds, context, tokensEstimate };
552
645
  }
553
646
  function tokenize(q) {
@@ -627,12 +720,22 @@ function sharedPrefixLen(a, b) {
627
720
  while (i < n && a[i] === b[i]) i++;
628
721
  return i;
629
722
  }
630
- function buildContext(graph, index, question, seeds, budget) {
723
+ function buildContext(graph, index, question, seeds, budget, literals = []) {
631
724
  const lines = [];
632
725
  lines.push(`# Context for: ${question}`);
633
726
  lines.push("");
727
+ if (literals.length) {
728
+ lines.push("## Literal string(s) to locate (exact text, not symbol names)");
729
+ for (const lit of literals) lines.push(`- \`${lit}\``);
730
+ lines.push(
731
+ "_Use a quoted phrase / URL search (`search_symbols` or `search_code` with the exact needle) for occurrences. Graph symbols below (if any) are residual identifier hints only._"
732
+ );
733
+ lines.push("");
734
+ }
634
735
  if (seeds.length === 0) {
635
- lines.push("_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._");
736
+ lines.push(
737
+ literals.length ? "_No graph symbols matched residual terms \u2014 this is expected for a pure string/URL occurrence search. Run a literal sweep on the needle(s) above._" : "_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._"
738
+ );
636
739
  const text2 = lines.join("\n");
637
740
  return { context: text2, tokensEstimate: estimateTokens(text2) };
638
741
  }
@@ -714,6 +817,6 @@ function round2(x) {
714
817
  return Math.round(x * 1e6) / 1e6;
715
818
  }
716
819
 
717
- export { GraphIndex, acquireLock, clearModelCache, cosine, countPending, embeddingsCached, getNodeEmbeddings, identifierParts, impactOf, indexFor, isModelReady, loadEmbedder, modelCacheInfo, nodeEmbedText, queryGraph, queryGraphSemantic, releaseLock, resolveEmbedModel, unavailableMessage, withTimeout };
718
- //# sourceMappingURL=chunk-6UK6QPTR.js.map
719
- //# sourceMappingURL=chunk-6UK6QPTR.js.map
820
+ export { GraphIndex, acquireLock, clearModelCache, cosine, countPending, embeddingsCached, extractLiteralNeedles, getNodeEmbeddings, identifierParts, impactOf, indexFor, isLocateOnlyInstruction, isModelReady, loadEmbedder, modelCacheInfo, nodeEmbedText, queryGraph, queryGraphSemantic, releaseLock, residualForSymbolSearch, resolveEmbedModel, unavailableMessage, withTimeout };
821
+ //# sourceMappingURL=chunk-EETK7S43.js.map
822
+ //# sourceMappingURL=chunk-EETK7S43.js.map