@vibgrate/cli 2026.731.1 → 2026.731.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/{agent-33BMKWJC.js → agent-6XOI7RVW.js} +5 -5
  2. package/dist/{agent-33BMKWJC.js.map → agent-6XOI7RVW.js.map} +1 -1
  3. package/dist/baseline-PY6TETA5.js +9 -0
  4. package/dist/{baseline-4FBHW2X2.js.map → baseline-PY6TETA5.js.map} +1 -1
  5. package/dist/{chunk-KGWEBM2J.js → chunk-3VSU7G75.js} +27 -54
  6. package/dist/chunk-3VSU7G75.js.map +1 -0
  7. package/dist/{chunk-SKIMUFCI.js → chunk-5IA2TA57.js} +41 -65
  8. package/dist/chunk-5IA2TA57.js.map +1 -0
  9. package/dist/chunk-5XIEVZLW.js +65 -0
  10. package/dist/chunk-5XIEVZLW.js.map +1 -0
  11. package/dist/chunk-7G5S5KZN.js +99 -0
  12. package/dist/chunk-7G5S5KZN.js.map +1 -0
  13. package/dist/{chunk-DXSEG6SZ.js → chunk-AVCBKQKA.js} +3 -3
  14. package/dist/{chunk-DXSEG6SZ.js.map → chunk-AVCBKQKA.js.map} +1 -1
  15. package/dist/{chunk-J3BQ7FIT.js → chunk-B6S2DSBS.js} +7 -7
  16. package/dist/{chunk-J3BQ7FIT.js.map → chunk-B6S2DSBS.js.map} +1 -1
  17. package/dist/chunk-BMUTNUB7.js +326 -0
  18. package/dist/chunk-BMUTNUB7.js.map +1 -0
  19. package/dist/chunk-DEKGSQHL.js +6 -0
  20. package/dist/{chunk-2XTPGYR2.js.map → chunk-DEKGSQHL.js.map} +1 -1
  21. package/dist/{chunk-NJT4CA6K.js → chunk-DT4KIVRI.js} +17 -8
  22. package/dist/chunk-DT4KIVRI.js.map +1 -0
  23. package/dist/{chunk-GPDJOCUI.js → chunk-FF5ZQ6KI.js} +4 -4
  24. package/dist/{chunk-GPDJOCUI.js.map → chunk-FF5ZQ6KI.js.map} +1 -1
  25. package/dist/{chunk-WBMMRERH.js → chunk-KLO2XBUX.js} +3 -3
  26. package/dist/{chunk-WBMMRERH.js.map → chunk-KLO2XBUX.js.map} +1 -1
  27. package/dist/{chunk-T7OFJS3X.js → chunk-LTTVCI5C.js} +13 -328
  28. package/dist/chunk-LTTVCI5C.js.map +1 -0
  29. package/dist/{chunk-476KWSFM.js → chunk-MOLBANFB.js} +3 -3
  30. package/dist/{chunk-476KWSFM.js.map → chunk-MOLBANFB.js.map} +1 -1
  31. package/dist/{chunk-SE4JMB4W.js → chunk-PHGAUWWF.js} +3 -3
  32. package/dist/{chunk-SE4JMB4W.js.map → chunk-PHGAUWWF.js.map} +1 -1
  33. package/dist/{chunk-C22ZY3FV.js → chunk-RIWLXMMT.js} +3 -3
  34. package/dist/{chunk-C22ZY3FV.js.map → chunk-RIWLXMMT.js.map} +1 -1
  35. package/dist/chunk-SCTLOFNH.js +42 -0
  36. package/dist/chunk-SCTLOFNH.js.map +1 -0
  37. package/dist/{chunk-MYM5VIJ4.js → chunk-TRKRRX2S.js} +10 -6
  38. package/dist/chunk-TRKRRX2S.js.map +1 -0
  39. package/dist/{chunk-3NP2DO4G.js → chunk-WK52LWRX.js} +3 -3
  40. package/dist/{chunk-3NP2DO4G.js.map → chunk-WK52LWRX.js.map} +1 -1
  41. package/dist/{chunk-UVMP7DFF.js → chunk-XRN7DQGR.js} +11 -11
  42. package/dist/{chunk-UVMP7DFF.js.map → chunk-XRN7DQGR.js.map} +1 -1
  43. package/dist/{chunk-CWB6H553.js → chunk-Z7VH4RPO.js} +3 -3
  44. package/dist/{chunk-CWB6H553.js.map → chunk-Z7VH4RPO.js.map} +1 -1
  45. package/dist/cli.d.ts +5 -1
  46. package/dist/cli.js +166 -61
  47. package/dist/cli.js.map +1 -1
  48. package/dist/ensure-map-UQL7SM34.js +28 -0
  49. package/dist/ensure-map-UQL7SM34.js.map +1 -0
  50. package/dist/fs-NTQUFCXV.js +4 -0
  51. package/dist/fs-NTQUFCXV.js.map +1 -0
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.js +10 -9
  54. package/dist/index.js.map +1 -1
  55. package/dist/{interactive-V6IRYZTA.js → interactive-QWT7ERXJ.js} +22 -19
  56. package/dist/interactive-QWT7ERXJ.js.map +1 -0
  57. package/dist/load-WA53B3GW.js +10 -0
  58. package/dist/{load-KPHH26ND.js.map → load-WA53B3GW.js.map} +1 -1
  59. package/dist/{run-outcome-TZ53G67B.js → run-outcome-J2IDIVYI.js} +5 -5
  60. package/dist/{run-outcome-TZ53G67B.js.map → run-outcome-J2IDIVYI.js.map} +1 -1
  61. package/dist/{runtime-session-PZKXBDJT.js → runtime-session-52P2Y5LX.js} +7 -7
  62. package/dist/{runtime-session-PZKXBDJT.js.map → runtime-session-52P2Y5LX.js.map} +1 -1
  63. package/dist/{session-3OBIQLE4.js → session-L7SJNE55.js} +4 -4
  64. package/dist/{session-3OBIQLE4.js.map → session-L7SJNE55.js.map} +1 -1
  65. package/dist/session-store-SQECEXUU.js +4 -0
  66. package/dist/{session-store-O4XPXKOV.js.map → session-store-SQECEXUU.js.map} +1 -1
  67. package/dist/{stream-json-3YOPU3LF.js → stream-json-TSGYC2MQ.js} +5 -5
  68. package/dist/{stream-json-3YOPU3LF.js.map → stream-json-TSGYC2MQ.js.map} +1 -1
  69. package/dist/{vg-mcp-bridge-7NNVIVO7.js → vg-mcp-bridge-IFAXEQMZ.js} +6 -6
  70. package/dist/{vg-mcp-bridge-7NNVIVO7.js.map → vg-mcp-bridge-IFAXEQMZ.js.map} +1 -1
  71. package/dist/{vgd-Y2YCN75V.js → vgd-PNR7UKLL.js} +6 -6
  72. package/dist/vgd-PNR7UKLL.js.map +1 -0
  73. package/package.json +1 -1
  74. package/dist/baseline-4FBHW2X2.js +0 -9
  75. package/dist/chunk-2XTPGYR2.js +0 -6
  76. package/dist/chunk-K3SLGULW.js +0 -50
  77. package/dist/chunk-K3SLGULW.js.map +0 -1
  78. package/dist/chunk-KGWEBM2J.js.map +0 -1
  79. package/dist/chunk-MYM5VIJ4.js.map +0 -1
  80. package/dist/chunk-NJT4CA6K.js.map +0 -1
  81. package/dist/chunk-SKIMUFCI.js.map +0 -1
  82. package/dist/chunk-T7OFJS3X.js.map +0 -1
  83. package/dist/fs-HF5DOHYR.js +0 -4
  84. package/dist/fs-HF5DOHYR.js.map +0 -1
  85. package/dist/interactive-V6IRYZTA.js.map +0 -1
  86. package/dist/load-KPHH26ND.js +0 -10
  87. package/dist/session-store-O4XPXKOV.js +0 -4
  88. package/dist/vgd-Y2YCN75V.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { resolveIngestHost } from './chunk-HTLDXEHW.js';
2
- import { VERSION } from './chunk-2XTPGYR2.js';
2
+ import { VERSION } from './chunk-DEKGSQHL.js';
3
3
  import { cacheDir } from './chunk-ZKNB4YH4.js';
4
4
  import * as fs from 'fs';
5
5
  import * as os from 'os';
@@ -212,5 +212,5 @@ var StatsSharer = class {
212
212
  };
213
213
 
214
214
  export { StatsSharer, installId, isCI, statsEndpoint, telemetryOptOut };
215
- //# sourceMappingURL=chunk-CWB6H553.js.map
216
- //# sourceMappingURL=chunk-CWB6H553.js.map
215
+ //# sourceMappingURL=chunk-Z7VH4RPO.js.map
216
+ //# sourceMappingURL=chunk-Z7VH4RPO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/stats-share.ts"],"names":[],"mappings":";;;;;;;;AAiCA,IAAM,cAAA,GAAiB,GAAA;AAEvB,IAAM,WAAA,GAAc,kBAAA;AAEpB,IAAM,cAAA,GAAsB,IAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,EAAQ,EAAG,WAAW,CAAA;AAC1D,IAAM,eAAA,GAAuB,IAAA,CAAA,IAAA,CAAK,cAAA,EAAgB,YAAY,CAAA;AAE9D,IAAM,eAAA,GAAkB,GAAA;AAgCjB,SAAS,eAAA,CAAgB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAoB;AACnF,EAAA,MAAM,OAAO,GAAA,CAAI,YAAA,IAAgB,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AACxD,EAAA,IAAI,QAAQ,EAAA,IAAM,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,SAAS,OAAO,cAAA;AACzD,EAAA,MAAM,MAAM,GAAA,CAAI,kBAAA,IAAsB,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC7D,EAAA,IAAI,OAAO,GAAA,IAAO,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,OAAO,OAAO,oBAAA;AACzD,EAAA,OAAO,IAAA;AACT;AAGA,IAAM,WAAA,GAAc;AAAA,EAClB,IAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,IAAA,CAAK,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AAClE,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM;AAC7B,IAAA,MAAM,OAAO,GAAA,CAAI,CAAC,KAAK,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC9C,IAAA,OAAO,GAAA,KAAQ,EAAA,IAAM,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,OAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AAcO,SAAS,SAAA,CAAU,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAa;AACtE,EAAA,IAAI,eAAA,CAAgB,GAAG,CAAA,KAAM,IAAA,IAAQ,KAAK,GAAG,CAAA,SAAU,UAAA,EAAW;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAc,EAAA,CAAA,YAAA,CAAa,eAAA,EAAiB,MAAM,EAAE,IAAA,EAAK;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG,OAAO,QAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,KAAK,UAAA,EAAW;AACtB,EAAA,IAAI;AACF,IAAG,EAAA,CAAA,SAAA,CAAU,cAAA,EAAgB,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAG,iBAAc,eAAA,EAAiB,EAAA,GAAK,MAAM,EAAE,IAAA,EAAM,KAAO,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,OAAO,CAAA,EAAoB;AAClC,EAAA,OAAO,iEAAA,CAAkE,KAAK,CAAC,CAAA;AACjF;AAEA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,UAAA,EAAW;AACpB;AAGO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,uBAAA;AAC7B,EAAA,IAAI,QAAA,IAAY,cAAA,CAAe,IAAA,CAAK,QAAQ,GAAG,OAAO,QAAA;AACtD,EAAA,OAAO,CAAA,QAAA,EAAW,mBAAmB,CAAA,wBAAA,CAAA;AACvC;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAY,IAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,WAAW,CAAA;AAC9C;AAEA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAY,IAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,eAAe,CAAA;AAClD;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAS,EAAA,CAAA,YAAA,CAAa,WAAW,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAChE,IAAA,OAAO,OAAO,IAAI,MAAA,KAAW,QAAA,IAAY,IAAI,MAAA,IAAU,CAAA,GAAI,IAAI,MAAA,GAAS,CAAA;AAAA,EAC1E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,CAAY,MAAc,MAAA,EAAsB;AACvD,EAAA,IAAI;AACF,IAAG,aAAU,QAAA,CAAS,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAG,EAAA,CAAA,aAAA,CAAc,UAAA,CAAW,IAAI,CAAA,EAAG,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,CAAA,GAAI,IAAI,CAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAOO,SAAS,UAAA,CACd,IAAA,EACA,UAAA,EACA,EAAA,GAAK,WAAU,EACkC;AACjD,EAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI;AACF,IAAA,IAAA,GAAU,EAAA,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,IAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,CAAA,EAAE;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,IAAA,GAAO,CAAA,GAAI,UAAA;AACtC,EAAA,IAAI,SAAS,IAAA,EAAM,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,IAAA,EAAK;AAEzD,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAQ,EAAA,CAAA,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA;AACrC,MAAG,YAAS,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzC,MAAA,IAAA,GAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,IAC5B,CAAA,SAAE;AACA,MAAG,aAAU,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAA,EAAW;AAAA,EAC9C;AAIA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACpC,EAAA,IAAI,SAAS,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,WAAW,KAAA,EAAM;AACvD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA,QAAA;AACZ,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI;AACF,MAAA,CAAA,GAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAiB,EAAE,MAAA,IAAU,KAAA;AACnC,IAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,SAAA;AAC3B,IAAA,MAAM,OAAA,GAAmB,EAAE,OAAA,IAAW,UAAA;AACtC,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,MAC3B,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,QAAA,EAAU,CAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,GAAA,CAAI,KAAA,EAAA;AACJ,IAAA,GAAA,CAAI,QAAA,IAAY,EAAE,QAAA,IAAY,CAAA;AAC9B,IAAA,GAAA,CAAI,cAAA,IAAkB,EAAE,cAAA,IAAkB,CAAA;AAC1C,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,CAAA;AACjB,IAAA,KAAA,EAAA;AACA,IAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,EAAU;AAC5B,MAAA,IAAI,CAAA,CAAE,EAAA,GAAK,KAAA,EAAO,KAAA,GAAQ,CAAA,CAAE,EAAA;AAC5B,MAAA,IAAI,CAAA,CAAE,EAAA,GAAK,KAAA,EAAO,KAAA,GAAQ,CAAA,CAAE,EAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,IAAI,KAAA,KAAU,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS;AACtF,EAAA,MAAM,KAAA,GAAoB;AAAA,IACxB,aAAA,EAAe,cAAA;AAAA,IACf,SAAA,EAAW,EAAA;AAAA,IACX,SAAA,EAAW,OAAA;AAAA,IACX,IAAI,OAAA,CAAQ,QAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,WAAA,EAAa,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AAAA,IACzC,SAAA,EAAW,IAAI,IAAA,CAAK,KAAK,EAAE,WAAA,EAAY;AAAA,IACvC,UAAA,EAAY,KAAA;AAAA,IACZ,IAAA,EAAM,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA,GACzB;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAS;AACtC;AAMA,eAAe,UAAU,KAAA,EAAqC;AAC5D,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,eAAe,CAAA;AAClE,EAAA,KAAA,CAAM,KAAA,IAAQ;AACd,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,aAAA,EAAc,EAAG;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,YAAY,OAAA,EAAQ;AAAA,MACnE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,MAC1B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,EAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;AAOO,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAA6B,IAAA,EAAc;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,WAAW,IAAI,CAAA;AAAA,EAC/B;AAAA,EAF6B,IAAA;AAAA,EAJZ,KAAK,SAAA,EAAU;AAAA,EACxB,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnB,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,UAAA,CAAW,KAAK,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAA;AACvE,MAAA,IAAI,CAAC,KAAA,EAAO;AAEV,QAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,UAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,UAAA,WAAA,CAAY,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,QAClC;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,MAAM,SAAA,CAAU,KAAK,CAAA;AAChC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,WAAA,CAAY,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,IAClB;AAAA,EACF;AACF","file":"chunk-CWB6H553.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from '../reporting/regions.js';\nimport type { SavingEntry, Source, Outcome } from './savings.js';\n\n/**\n * Opt-in usage-stats sharing for `vg serve --share-stats`.\n *\n * This is the ONLY path in `vg serve` that sends anything off the machine, and\n * it is off unless the operator explicitly asks for it. What we send is the\n * same counts-only ledger `vg savings` reports locally — per (source, client,\n * tool, outcome): how many calls and the vg-vs-grep token figures — plus the vg\n * version, OS/arch, and a random per-install id. We never send code, file paths,\n * question text, repo identity, or any credential. See GUARDRAILS §3.4.\n *\n * Even when the flag is passed, the universal `DO_NOT_TRACK` opt-out (or\n * `VIBGRATE_TELEMETRY=0`) wins: nothing is uploaded and no install id is ever\n * minted or persisted (see `telemetryOptOut` / `installId`).\n *\n * Design:\n * - The local ledger (savings.jsonl) is the single source of truth; the flusher\n * reads only the tail past a persisted byte offset, so a batch is sent once.\n * - Fire-and-forget with a short timeout. A network problem never blocks a tool\n * call and never throws — the offset only advances on a confirmed 2xx, so a\n * failed batch is retried on the next flush.\n * - Fully offline-safe: under `--local` the sharer is never constructed.\n */\n\n/** Payload schema version — must match the server's `mcpUsageStatsSchema`. */\nconst SCHEMA_VERSION = '1';\n/** Where the offset (and cached install id) live, per repo, beside the ledger. */\nconst OFFSET_FILE = 'stats-share.json';\n/** The machine-global anonymous install id lives here (stable across repos). */\nconst INSTALL_ID_DIR = path.join(os.homedir(), '.vibgrate');\nconst INSTALL_ID_FILE = path.join(INSTALL_ID_DIR, 'install-id');\n/** Give a flush POST a hard ceiling so a hung endpoint never stalls shutdown. */\nconst SEND_TIMEOUT_MS = 4000;\n\n/** One aggregated row of the shared batch — counts only. */\nexport interface StatsRow {\n source: Source;\n client: string;\n tool: string;\n outcome: Outcome;\n calls: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\n/** The counts-only batch POSTed to the ingest endpoint. */\nexport interface StatsBatch {\n schemaVersion: string;\n installId: string;\n vgVersion: string;\n os: string;\n arch: string;\n windowStart: string;\n windowEnd: string;\n totalCalls: number;\n rows: StatsRow[];\n}\n\n/**\n * The universal opt-out (https://consoledonottrack.com) plus a tool-specific\n * alias, honoured even when `--share-stats` is passed explicitly. Pure function\n * of the environment for testability. Returns the name of the variable that\n * opted out (for the disclosure message), or null when sharing may proceed.\n */\nexport function telemetryOptOut(env: NodeJS.ProcessEnv = process.env): string | null {\n const dnt = (env.DO_NOT_TRACK ?? '').trim().toLowerCase();\n if (dnt !== '' && dnt !== '0' && dnt !== 'false') return 'DO_NOT_TRACK';\n const vt = (env.VIBGRATE_TELEMETRY ?? '').trim().toLowerCase();\n if (vt === '0' || vt === 'false' || vt === 'off') return 'VIBGRATE_TELEMETRY';\n return null;\n}\n\n/** Common CI environment markers — a CI runner is never an interactive session. */\nconst CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'TRAVIS',\n 'BUILDKITE',\n 'JENKINS_URL',\n 'TF_BUILD',\n] as const;\n\n/** True when running under a recognised CI system. Pure function of the env. */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return CI_ENV_VARS.some((v) => {\n const val = (env[v] ?? '').trim().toLowerCase();\n return val !== '' && val !== '0' && val !== 'false';\n });\n}\n\n/**\n * Read (or lazily create) the anonymous per-install id — a random UUID stored in\n * `~/.vibgrate/install-id`. It is *not* tied to the user, the repo, or any\n * account; it only lets us de-duplicate batches from the same install when\n * aggregating. If the home dir isn't writable we fall back to an ephemeral id\n * so sharing still works (it just can't be de-duplicated across restarts).\n *\n * Under an env opt-out no id is ever read or persisted (the sharing path isn't\n * reached then either — this is defence in depth), and on CI runners the id is\n * ephemeral: a persisted id on a shared/throwaway runner would be meaningless\n * for de-duplication and would leave state behind on machines we don't own.\n */\nexport function installId(env: NodeJS.ProcessEnv = process.env): string {\n if (telemetryOptOut(env) !== null || isCI(env)) return randomUuid();\n try {\n const existing = fs.readFileSync(INSTALL_ID_FILE, 'utf8').trim();\n if (isUuid(existing)) return existing;\n } catch {\n /* not created yet */\n }\n const id = randomUuid();\n try {\n fs.mkdirSync(INSTALL_ID_DIR, { recursive: true });\n fs.writeFileSync(INSTALL_ID_FILE, id + '\\n', { mode: 0o600 });\n } catch {\n /* home dir read-only — use the ephemeral id for this process */\n }\n return id;\n}\n\nfunction isUuid(s: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);\n}\n\nfunction randomUuid(): string {\n return randomUUID();\n}\n\n/** Resolve the ingest endpoint: env override wins, else the default region host. */\nexport function statsEndpoint(): string {\n const override = process.env.VIBGRATE_STATS_ENDPOINT;\n if (override && /^https?:\\/\\//.test(override)) return override;\n return `https://${resolveIngestHost()}/v1/ingest/cli-mcp-usage`;\n}\n\nfunction offsetPath(root: string): string {\n return path.join(cacheDir(root), OFFSET_FILE);\n}\n\nfunction ledgerFilePath(root: string): string {\n return path.join(cacheDir(root), 'savings.jsonl');\n}\n\nfunction readOffset(root: string): number {\n try {\n const raw = JSON.parse(fs.readFileSync(offsetPath(root), 'utf8')) as { offset?: number };\n return typeof raw.offset === 'number' && raw.offset >= 0 ? raw.offset : 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeOffset(root: string, offset: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(offsetPath(root), JSON.stringify({ offset }) + '\\n');\n } catch {\n /* best-effort; a lost offset just means one batch may re-send */\n }\n}\n\n/**\n * Aggregate the ledger entries after `fromOffset` into a counts-only batch.\n * Returns the batch (or null if there's nothing new) and the new byte offset to\n * persist once the batch is confirmed sent.\n */\nexport function buildBatch(\n root: string,\n fromOffset: number,\n id = installId(),\n): { batch: StatsBatch | null; newOffset: number } {\n const file = ledgerFilePath(root);\n let size = 0;\n try {\n size = fs.statSync(file).size;\n } catch {\n return { batch: null, newOffset: 0 };\n }\n // The ledger was truncated/recreated under us — re-read from the top.\n const start = fromOffset > size ? 0 : fromOffset;\n if (start >= size) return { batch: null, newOffset: size };\n\n let text = '';\n try {\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(size - start);\n fs.readSync(fd, buf, 0, buf.length, start);\n text = buf.toString('utf8');\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return { batch: null, newOffset: fromOffset };\n }\n\n // Only whole lines are complete; a trailing partial line (mid-append) is left\n // for the next flush by rewinding the offset to the last newline.\n const lastNl = text.lastIndexOf('\\n');\n if (lastNl < 0) return { batch: null, newOffset: start };\n const consumed = start + lastNl + 1;\n const rows = new Map<string, StatsRow>();\n let total = 0;\n let minTs = Infinity;\n let maxTs = -Infinity;\n for (const line of text.slice(0, lastNl).split('\\n')) {\n if (!line.trim()) continue;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n continue;\n }\n const source: Source = e.source ?? 'mcp';\n const client = e.client ?? 'unknown';\n const outcome: Outcome = e.outcome ?? 'complete';\n const key = `${source}|${client}|${e.tool}|${outcome}`;\n const row = rows.get(key) ?? {\n source,\n client,\n tool: e.tool,\n outcome,\n calls: 0,\n vgTokens: 0,\n baselineTokens: 0,\n };\n row.calls++;\n row.vgTokens += e.vgTokens ?? 0;\n row.baselineTokens += e.baselineTokens ?? 0;\n rows.set(key, row);\n total++;\n if (typeof e.ts === 'number') {\n if (e.ts < minTs) minTs = e.ts;\n if (e.ts > maxTs) maxTs = e.ts;\n }\n }\n if (total === 0 || !Number.isFinite(minTs)) return { batch: null, newOffset: consumed };\n const batch: StatsBatch = {\n schemaVersion: SCHEMA_VERSION,\n installId: id,\n vgVersion: VERSION,\n os: process.platform,\n arch: process.arch,\n windowStart: new Date(minTs).toISOString(),\n windowEnd: new Date(maxTs).toISOString(),\n totalCalls: total,\n rows: [...rows.values()],\n };\n return { batch, newOffset: consumed };\n}\n\n/**\n * POST a batch to the endpoint. Never throws; returns whether it was accepted.\n * A short timeout keeps a hung endpoint from stalling the caller (e.g. shutdown).\n */\nasync function postBatch(batch: StatsBatch): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);\n timer.unref?.();\n try {\n const res = await fetch(statsEndpoint(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Periodic + on-shutdown flusher for one serve session. Holds the install id and\n * the persisted offset so each flush reads only new ledger lines and advances the\n * offset only when the batch is confirmed sent.\n */\nexport class StatsSharer {\n private readonly id = installId();\n private offset: number;\n private flushing = false;\n\n constructor(private readonly root: string) {\n this.offset = readOffset(root);\n }\n\n /**\n * Flush any new ledger entries. Single-flight (a slow POST won't overlap the\n * next tick). Best-effort: any failure is swallowed and retried next time.\n */\n async flush(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n const { batch, newOffset } = buildBatch(this.root, this.offset, this.id);\n if (!batch) {\n // Nothing to send, but still advance past consumed blank/partial space.\n if (newOffset > this.offset) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n return;\n }\n const ok = await postBatch(batch);\n if (ok) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n } catch {\n /* never let sharing break serving */\n } finally {\n this.flushing = false;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/engine/stats-share.ts"],"names":[],"mappings":"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","file":"chunk-Z7VH4RPO.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { cacheDir } from './cache.js';\nimport { VERSION } from '../version.js';\nimport { resolveIngestHost } from '../reporting/regions.js';\nimport type { SavingEntry, Source, Outcome } from './savings.js';\n\n/**\n * Opt-in usage-stats sharing for `vg serve --share-stats`.\n *\n * This is the ONLY path in `vg serve` that sends anything off the machine, and\n * it is off unless the operator explicitly asks for it. What we send is the\n * same counts-only ledger `vg savings` reports locally — per (source, client,\n * tool, outcome): how many calls and the vg-vs-grep token figures — plus the vg\n * version, OS/arch, and a random per-install id. We never send code, file paths,\n * question text, repo identity, or any credential. See GUARDRAILS §3.4.\n *\n * Even when the flag is passed, the universal `DO_NOT_TRACK` opt-out (or\n * `VIBGRATE_TELEMETRY=0`) wins: nothing is uploaded and no install id is ever\n * minted or persisted (see `telemetryOptOut` / `installId`).\n *\n * Design:\n * - The local ledger (savings.jsonl) is the single source of truth; the flusher\n * reads only the tail past a persisted byte offset, so a batch is sent once.\n * - Fire-and-forget with a short timeout. A network problem never blocks a tool\n * call and never throws — the offset only advances on a confirmed 2xx, so a\n * failed batch is retried on the next flush.\n * - Fully offline-safe: under `--local` the sharer is never constructed.\n */\n\n/** Payload schema version — must match the server's `mcpUsageStatsSchema`. */\nconst SCHEMA_VERSION = '1';\n/** Where the offset (and cached install id) live, per repo, beside the ledger. */\nconst OFFSET_FILE = 'stats-share.json';\n/** The machine-global anonymous install id lives here (stable across repos). */\nconst INSTALL_ID_DIR = path.join(os.homedir(), '.vibgrate');\nconst INSTALL_ID_FILE = path.join(INSTALL_ID_DIR, 'install-id');\n/** Give a flush POST a hard ceiling so a hung endpoint never stalls shutdown. */\nconst SEND_TIMEOUT_MS = 4000;\n\n/** One aggregated row of the shared batch — counts only. */\nexport interface StatsRow {\n source: Source;\n client: string;\n tool: string;\n outcome: Outcome;\n calls: number;\n vgTokens: number;\n baselineTokens: number;\n}\n\n/** The counts-only batch POSTed to the ingest endpoint. */\nexport interface StatsBatch {\n schemaVersion: string;\n installId: string;\n vgVersion: string;\n os: string;\n arch: string;\n windowStart: string;\n windowEnd: string;\n totalCalls: number;\n rows: StatsRow[];\n}\n\n/**\n * The universal opt-out (https://consoledonottrack.com) plus a tool-specific\n * alias, honoured even when `--share-stats` is passed explicitly. Pure function\n * of the environment for testability. Returns the name of the variable that\n * opted out (for the disclosure message), or null when sharing may proceed.\n */\nexport function telemetryOptOut(env: NodeJS.ProcessEnv = process.env): string | null {\n const dnt = (env.DO_NOT_TRACK ?? '').trim().toLowerCase();\n if (dnt !== '' && dnt !== '0' && dnt !== 'false') return 'DO_NOT_TRACK';\n const vt = (env.VIBGRATE_TELEMETRY ?? '').trim().toLowerCase();\n if (vt === '0' || vt === 'false' || vt === 'off') return 'VIBGRATE_TELEMETRY';\n return null;\n}\n\n/** Common CI environment markers — a CI runner is never an interactive session. */\nconst CI_ENV_VARS = [\n 'CI',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'CIRCLECI',\n 'TRAVIS',\n 'BUILDKITE',\n 'JENKINS_URL',\n 'TF_BUILD',\n] as const;\n\n/** True when running under a recognised CI system. Pure function of the env. */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return CI_ENV_VARS.some((v) => {\n const val = (env[v] ?? '').trim().toLowerCase();\n return val !== '' && val !== '0' && val !== 'false';\n });\n}\n\n/**\n * Read (or lazily create) the anonymous per-install id — a random UUID stored in\n * `~/.vibgrate/install-id`. It is *not* tied to the user, the repo, or any\n * account; it only lets us de-duplicate batches from the same install when\n * aggregating. If the home dir isn't writable we fall back to an ephemeral id\n * so sharing still works (it just can't be de-duplicated across restarts).\n *\n * Under an env opt-out no id is ever read or persisted (the sharing path isn't\n * reached then either — this is defence in depth), and on CI runners the id is\n * ephemeral: a persisted id on a shared/throwaway runner would be meaningless\n * for de-duplication and would leave state behind on machines we don't own.\n */\nexport function installId(env: NodeJS.ProcessEnv = process.env): string {\n if (telemetryOptOut(env) !== null || isCI(env)) return randomUuid();\n try {\n const existing = fs.readFileSync(INSTALL_ID_FILE, 'utf8').trim();\n if (isUuid(existing)) return existing;\n } catch {\n /* not created yet */\n }\n const id = randomUuid();\n try {\n fs.mkdirSync(INSTALL_ID_DIR, { recursive: true });\n fs.writeFileSync(INSTALL_ID_FILE, id + '\\n', { mode: 0o600 });\n } catch {\n /* home dir read-only — use the ephemeral id for this process */\n }\n return id;\n}\n\nfunction isUuid(s: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s);\n}\n\nfunction randomUuid(): string {\n return randomUUID();\n}\n\n/** Resolve the ingest endpoint: env override wins, else the default region host. */\nexport function statsEndpoint(): string {\n const override = process.env.VIBGRATE_STATS_ENDPOINT;\n if (override && /^https?:\\/\\//.test(override)) return override;\n return `https://${resolveIngestHost()}/v1/ingest/cli-mcp-usage`;\n}\n\nfunction offsetPath(root: string): string {\n return path.join(cacheDir(root), OFFSET_FILE);\n}\n\nfunction ledgerFilePath(root: string): string {\n return path.join(cacheDir(root), 'savings.jsonl');\n}\n\nfunction readOffset(root: string): number {\n try {\n const raw = JSON.parse(fs.readFileSync(offsetPath(root), 'utf8')) as { offset?: number };\n return typeof raw.offset === 'number' && raw.offset >= 0 ? raw.offset : 0;\n } catch {\n return 0;\n }\n}\n\nfunction writeOffset(root: string, offset: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(offsetPath(root), JSON.stringify({ offset }) + '\\n');\n } catch {\n /* best-effort; a lost offset just means one batch may re-send */\n }\n}\n\n/**\n * Aggregate the ledger entries after `fromOffset` into a counts-only batch.\n * Returns the batch (or null if there's nothing new) and the new byte offset to\n * persist once the batch is confirmed sent.\n */\nexport function buildBatch(\n root: string,\n fromOffset: number,\n id = installId(),\n): { batch: StatsBatch | null; newOffset: number } {\n const file = ledgerFilePath(root);\n let size = 0;\n try {\n size = fs.statSync(file).size;\n } catch {\n return { batch: null, newOffset: 0 };\n }\n // The ledger was truncated/recreated under us — re-read from the top.\n const start = fromOffset > size ? 0 : fromOffset;\n if (start >= size) return { batch: null, newOffset: size };\n\n let text = '';\n try {\n const fd = fs.openSync(file, 'r');\n try {\n const buf = Buffer.alloc(size - start);\n fs.readSync(fd, buf, 0, buf.length, start);\n text = buf.toString('utf8');\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n return { batch: null, newOffset: fromOffset };\n }\n\n // Only whole lines are complete; a trailing partial line (mid-append) is left\n // for the next flush by rewinding the offset to the last newline.\n const lastNl = text.lastIndexOf('\\n');\n if (lastNl < 0) return { batch: null, newOffset: start };\n const consumed = start + lastNl + 1;\n const rows = new Map<string, StatsRow>();\n let total = 0;\n let minTs = Infinity;\n let maxTs = -Infinity;\n for (const line of text.slice(0, lastNl).split('\\n')) {\n if (!line.trim()) continue;\n let e: SavingEntry;\n try {\n e = JSON.parse(line) as SavingEntry;\n } catch {\n continue;\n }\n const source: Source = e.source ?? 'mcp';\n const client = e.client ?? 'unknown';\n const outcome: Outcome = e.outcome ?? 'complete';\n const key = `${source}|${client}|${e.tool}|${outcome}`;\n const row = rows.get(key) ?? {\n source,\n client,\n tool: e.tool,\n outcome,\n calls: 0,\n vgTokens: 0,\n baselineTokens: 0,\n };\n row.calls++;\n row.vgTokens += e.vgTokens ?? 0;\n row.baselineTokens += e.baselineTokens ?? 0;\n rows.set(key, row);\n total++;\n if (typeof e.ts === 'number') {\n if (e.ts < minTs) minTs = e.ts;\n if (e.ts > maxTs) maxTs = e.ts;\n }\n }\n if (total === 0 || !Number.isFinite(minTs)) return { batch: null, newOffset: consumed };\n const batch: StatsBatch = {\n schemaVersion: SCHEMA_VERSION,\n installId: id,\n vgVersion: VERSION,\n os: process.platform,\n arch: process.arch,\n windowStart: new Date(minTs).toISOString(),\n windowEnd: new Date(maxTs).toISOString(),\n totalCalls: total,\n rows: [...rows.values()],\n };\n return { batch, newOffset: consumed };\n}\n\n/**\n * POST a batch to the endpoint. Never throws; returns whether it was accepted.\n * A short timeout keeps a hung endpoint from stalling the caller (e.g. shutdown).\n */\nasync function postBatch(batch: StatsBatch): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);\n timer.unref?.();\n try {\n const res = await fetch(statsEndpoint(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Connection: 'close' },\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Periodic + on-shutdown flusher for one serve session. Holds the install id and\n * the persisted offset so each flush reads only new ledger lines and advances the\n * offset only when the batch is confirmed sent.\n */\nexport class StatsSharer {\n private readonly id = installId();\n private offset: number;\n private flushing = false;\n\n constructor(private readonly root: string) {\n this.offset = readOffset(root);\n }\n\n /**\n * Flush any new ledger entries. Single-flight (a slow POST won't overlap the\n * next tick). Best-effort: any failure is swallowed and retried next time.\n */\n async flush(): Promise<void> {\n if (this.flushing) return;\n this.flushing = true;\n try {\n const { batch, newOffset } = buildBatch(this.root, this.offset, this.id);\n if (!batch) {\n // Nothing to send, but still advance past consumed blank/partial space.\n if (newOffset > this.offset) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n return;\n }\n const ok = await postBatch(batch);\n if (ok) {\n this.offset = newOffset;\n writeOffset(this.root, newOffset);\n }\n } catch {\n /* never let sharing break serving */\n } finally {\n this.flushing = false;\n }\n }\n}\n"]}
package/dist/cli.d.ts CHANGED
@@ -50,7 +50,11 @@ interface BuildCmdOpts {
50
50
  attestation?: string;
51
51
  pub?: string;
52
52
  }
53
- declare function runBuild(paths: string[], opts: BuildCmdOpts, global: GlobalOpts): Promise<void>;
53
+ interface RunBuildHooks {
54
+ /** Invoked during the parse phase (even under --quiet / non-TTY hosts). */
55
+ onParseProgress?: (done: number, total: number) => void;
56
+ }
57
+ declare function runBuild(paths: string[], opts: BuildCmdOpts, global: GlobalOpts, hooks?: RunBuildHooks): Promise<void>;
54
58
 
55
59
  /** The set of registered subcommand names (kept in sync with registration). */
56
60
  declare const KNOWN_COMMANDS: Set<string>;
package/dist/cli.js CHANGED
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { sha256Hex, generateKeypair, dssePae, DSSE_PAYLOAD_TYPE, keyId, registerBuild, readGlobal, applyGlobalOptions, ProgressBar, printLogo, fetchCatalog, resolveProviders, runBuild } from './chunk-T7OFJS3X.js';
3
- export { runBuild } from './chunk-T7OFJS3X.js';
4
- import { telemetryOptOut, StatsSharer, statsEndpoint, isCI } from './chunk-CWB6H553.js';
5
- import { loadAdvancedScanHook, baselineCommand } from './chunk-GPDJOCUI.js';
2
+ import { loadAdvancedScanHook, baselineCommand } from './chunk-FF5ZQ6KI.js';
3
+ import { fetchCatalog, resolveProviders } from './chunk-BMUTNUB7.js';
4
+ import { VGD_PROTOCOL_VERSION, startVgdServer } from './chunk-WK52LWRX.js';
5
+ import { telemetryOptOut, StatsSharer, statsEndpoint, isCI } from './chunk-Z7VH4RPO.js';
6
6
  import { buildModelInstallPlan } from './chunk-WHJMS7XC.js';
7
- import { runCodeSession } from './chunk-WBMMRERH.js';
7
+ import { runCodeSession } from './chunk-KLO2XBUX.js';
8
+ import { sha256Hex, generateKeypair, dssePae, DSSE_PAYLOAD_TYPE, keyId, registerBuild, readGlobal, applyGlobalOptions, ProgressBar, printLogo, runBuild } from './chunk-LTTVCI5C.js';
9
+ export { runBuild } from './chunk-LTTVCI5C.js';
8
10
  import { disableColor, info, c, json, out } from './chunk-CT5BS56U.js';
9
- import { VGD_PROTOCOL_VERSION, startVgdServer } from './chunk-3NP2DO4G.js';
10
11
  import './chunk-5I4VSBWQ.js';
11
12
  import './chunk-IS7VTH2Q.js';
12
13
  import { init_resolve_ollama, gatherSystemMemory, resolveOllamaBinary, hasOllamaBinary, resolve_ollama_exports } from './chunk-OWSFZQOP.js';
@@ -15,23 +16,24 @@ import { fmt, estimateModelBytes } from './chunk-7N4Y3E47.js';
15
16
  import './chunk-IZDH67DX.js';
16
17
  import { defaultProcessEndpoint, startProcessHostServer, resolveInferenceIsolation } from './chunk-EVLS2M5G.js';
17
18
  import { clearHostSessionPool, acquireHostSession, generateOnSession, listHostSessions, hostSessionPoolSize } from './chunk-X634FZVG.js';
18
- import { CONTEXT_POLICY_VERSION, computeFcsReport, renderFcsReportMarkdown, createTrajectoryCollector, runAgent } from './chunk-KGWEBM2J.js';
19
+ import { CONTEXT_POLICY_VERSION, computeFcsReport, renderFcsReportMarkdown, createTrajectoryCollector, runAgent } from './chunk-3VSU7G75.js';
19
20
  import './chunk-543E6WDJ.js';
20
- import { summarizeDiffs, ScriptedProvider } from './chunk-MYM5VIJ4.js';
21
+ import { summarizeDiffs, ScriptedProvider } from './chunk-TRKRRX2S.js';
21
22
  import { ensurePackage, ensureUnavailableMessage } from './chunk-REIGWTTH.js';
22
23
  import './chunk-RGEVBSLK.js';
23
24
  import { vgdSocketPath, vgdIsRunning, vgdRequest, vgdPidPath } from './chunk-RBIRXQR6.js';
24
25
  import { buildIdentifierTrieFromGraph } from './chunk-5HYCB55P.js';
25
26
  import './chunk-7AVYKZEM.js';
26
- import { serveStdio, exportGraph, GraphSource, createServer, formatForExt } from './chunk-J3BQ7FIT.js';
27
- import { CliError, ExitCode, refreshIfStale, driftCount, ASSISTANTS, detectAssistants, usageError, detectServeLaunch, installAssistant, writeNavigationConfig, uninstallAssistant, buildGraph, writeSnapshot, probeFreshness, discover, assistantById, SMALL_REPO_FILES, SKIP_DIRS, SKIP_FILES } from './chunk-SKIMUFCI.js';
28
- import { resolveDsn, createWorkspaceDsn, writeStoredCredentials, credentialsPath, findGitRoot, ensureGitignored, gitignoreEntryForCredentials, clearStoredCredentials, parseDsn as parseDsn$1, uploadScanArtifact, dsnCommand, pushCommand, countTokens, shortestPath, pathDisconnect, testsToRun, detectRunner, coveringTests, FREE_PACK, readScanArtifact, publishPrivateLibrary, assessDocQuality, symbolsFromApi, fetchHostedDocsCached, selectForBudget, hostedBase, readStoredCredentials, projectCredentialsPath, homeCredentialsPath } from './chunk-C22ZY3FV.js';
27
+ import { serveStdio, exportGraph, GraphSource, createServer, formatForExt } from './chunk-B6S2DSBS.js';
28
+ import { refreshIfStale } from './chunk-5XIEVZLW.js';
29
+ import { CliError, ExitCode, driftCount, ASSISTANTS, detectAssistants, isAssistantInstalled, usageError, detectServeLaunch, installAssistant, writeNavigationConfig, uninstallAssistant, buildGraph, writeSnapshot, probeFreshness, discover, assistantById, SMALL_REPO_FILES, isSkippedDirName, SKIP_FILES, SKIP_DIRS } from './chunk-5IA2TA57.js';
30
+ import { resolveDsn, createWorkspaceDsn, writeStoredCredentials, credentialsPath, findGitRoot, ensureGitignored, gitignoreEntryForCredentials, clearStoredCredentials, parseDsn as parseDsn$1, uploadScanArtifact, dsnCommand, pushCommand, countTokens, shortestPath, pathDisconnect, testsToRun, detectRunner, coveringTests, FREE_PACK, readScanArtifact, publishPrivateLibrary, assessDocQuality, symbolsFromApi, fetchHostedDocsCached, selectForBudget, hostedBase, readStoredCredentials, projectCredentialsPath, homeCredentialsPath } from './chunk-RIWLXMMT.js';
31
+ import { writeDefaultConfig, parseDsn, detectVcs, computeRepoFingerprint, resolveRepositoryName, fetchScanPreflight, runCoreScan, loadConfig, prepareCompressedUpload, computeDriftScore, titleBox, projectTypeToVulnEcosystem, driftBar, gitHistoryAvailable, buildVersionTimelines, findPackageAnyEcosystem, normalizeConstraint, findVersionCrossings, versionSatisfies, PROJECT_TYPE_TO_OSV_ECOSYSTEM, fetchRiskySymbols, perDependencyDrift } from './chunk-XRN7DQGR.js';
29
32
  import { resolveIngestHost, dashHostForIngestHost, availableRegionIds, ingestHostForRegionId } from './chunk-HTLDXEHW.js';
30
- import { writeDefaultConfig, parseDsn, detectVcs, computeRepoFingerprint, resolveRepositoryName, fetchScanPreflight, runCoreScan, loadConfig, prepareCompressedUpload, computeDriftScore, titleBox, projectTypeToVulnEcosystem, driftBar, gitHistoryAvailable, buildVersionTimelines, findPackageAnyEcosystem, normalizeConstraint, findVersionCrossings, versionSatisfies, PROJECT_TYPE_TO_OSV_ECOSYSTEM, fetchRiskySymbols, perDependencyDrift } from './chunk-UVMP7DFF.js';
31
33
  import { ensureDir, pathExists, readJsonFile, writeTextFile, writeJsonFile } from './chunk-CRAMOEBE.js';
34
+ import { recordCliCall, CLI_TOOL_ALIASES, savingsLedgerPath, clearSavings, readSavings, readUsage, readModelSavings, CAPSULE_RANKING_VERSION, SAVINGS_TOOLS, sanitizeClient } from './chunk-US2DAKCM.js';
32
35
  import './chunk-IPICO2RV.js';
33
36
  import { inventory, enrichOnline, ECOSYSTEMS, catalogPath, libDir, loadCatalog, driftFor, addLibrary, resolveLib, libId, resolveVersion, readDoc, localPackageDocs, localApiSurface } from './chunk-FHJBGPJZ.js';
34
- import { recordCliCall, CLI_TOOL_ALIASES, savingsLedgerPath, clearSavings, readSavings, readUsage, readModelSavings, CAPSULE_RANKING_VERSION, SAVINGS_TOOLS, sanitizeClient } from './chunk-US2DAKCM.js';
35
37
  import { init_cli_invocation, resolveCliInvocation, NPX_INVOCATION } from './chunk-3LSG7Z4I.js';
36
38
  import { resolveOne } from './chunk-J7LKEB2R.js';
37
39
  import { embeddingsCached, resolveEmbedModel, loadEmbedder, getNodeEmbeddings, queryGraphSemantic, queryGraph, unavailableMessage, countPending, indexFor, impactOf, modelCacheInfo, clearModelCache } from './chunk-EETK7S43.js';
@@ -39,14 +41,14 @@ import { discoverModels } from './chunk-CQDUBAQY.js';
39
41
  import { freeBytesOnVolume, weightStoreDir, listCachedWeights, ensureWeightCached, catalogIntegrityReport } from './chunk-OV4KGXPD.js';
40
42
  import { resolvedGrammarFiles, grammarSetVersion } from './chunk-UTNNGKKX.js';
41
43
  import './chunk-RXP66R2E.js';
42
- import { loadGraph, SCHEMA_VERSION } from './chunk-476KWSFM.js';
43
- import { resolveGraphPath, renderReport, loadGraphFileWithSnapshot, writeArtifacts, vibgrateDir, mapFileExists, ensureVibgrateGitignore } from './chunk-DXSEG6SZ.js';
44
- import { VERSION } from './chunk-2XTPGYR2.js';
44
+ import { loadGraph, SCHEMA_VERSION } from './chunk-MOLBANFB.js';
45
+ import { resolveGraphPath, renderReport, loadGraphFileWithSnapshot, writeArtifacts, vibgrateDir, mapFileExists, ensureVibgrateGitignore } from './chunk-AVCBKQKA.js';
46
+ import { VERSION } from './chunk-DEKGSQHL.js';
45
47
  import { cacheDir, serializeGraph, stableStringify } from './chunk-ZKNB4YH4.js';
46
48
  import './chunk-BWPBB45M.js';
47
49
  import { canonicalize, hashString, hashBytes } from './chunk-JFGYT6BI.js';
48
50
  import './chunk-BPF3YX2U.js';
49
- import { pathExists as pathExists$1, parseExcludePatterns } from './chunk-NJT4CA6K.js';
51
+ import { pathExists as pathExists$1, parseExcludePatterns } from './chunk-DT4KIVRI.js';
50
52
  import { __toCommonJS } from './chunk-Z6ZWNWWR.js';
51
53
  import * as fs7 from 'fs';
52
54
  import fs7__default, { realpathSync } from 'fs';
@@ -1707,7 +1709,7 @@ function manifestHash(root2) {
1707
1709
  for (const entry of entries) {
1708
1710
  const abs = path37.join(dir, entry.name);
1709
1711
  if (entry.isDirectory()) {
1710
- if (SKIP_DIRS.has(entry.name)) continue;
1712
+ if (isSkippedDirName(entry.name)) continue;
1711
1713
  walk2(abs);
1712
1714
  continue;
1713
1715
  }
@@ -1729,7 +1731,7 @@ function isDependencyFile(root2, filePath) {
1729
1731
  const rel = path37.relative(path37.resolve(root2), path37.resolve(filePath));
1730
1732
  if (rel === "" || rel.startsWith("..") || path37.isAbsolute(rel)) return false;
1731
1733
  const parts = rel.split(path37.sep);
1732
- if (parts.slice(0, -1).some((dir) => SKIP_DIRS.has(dir))) return false;
1734
+ if (parts.slice(0, -1).some((dir) => isSkippedDirName(dir))) return false;
1733
1735
  const base = parts[parts.length - 1].toLowerCase();
1734
1736
  return isManifest(filePath) || SKIP_FILES.has(base);
1735
1737
  }
@@ -2220,10 +2222,14 @@ async function scanWorkspaceVulns(targets, opts = { offline: false }) {
2220
2222
  else if (r.source === "error") anyError = true;
2221
2223
  const locations = t.locations.length ? t.locations : t.file ? [{ file: t.file, line: t.line ?? null }] : [];
2222
2224
  const seenIds = /* @__PURE__ */ new Set();
2225
+ const seenCves = /* @__PURE__ */ new Set();
2223
2226
  for (const v of r.vulns) {
2224
2227
  if (seenIds.has(v.id)) continue;
2228
+ const cveKeys = (v.cves ?? []).map((c2) => c2.toUpperCase()).filter(Boolean);
2229
+ if (cveKeys.length && cveKeys.every((c2) => seenCves.has(c2))) continue;
2225
2230
  seenIds.add(v.id);
2226
- const kevHit = v.cves.some((c2) => kev.cves.has(c2.toUpperCase()));
2231
+ for (const c2 of cveKeys) seenCves.add(c2);
2232
+ const kevHit = cveKeys.some((c2) => kev.cves.has(c2));
2227
2233
  findings.push({
2228
2234
  package: t.package,
2229
2235
  version: t.version,
@@ -2482,7 +2488,7 @@ var VibgrateLanguageServer = class {
2482
2488
  rootPath: a.rootPath,
2483
2489
  scannedAt: a.timestamp,
2484
2490
  ...delta !== void 0 ? { delta } : {},
2485
- ...buildBreakdown(a.drift, a.projects ?? []) ? { breakdown: buildBreakdown(a.drift, a.projects ?? []) } : {},
2491
+ ...buildBreakdown(this.opts.root, a.projects ?? []) ? { breakdown: buildBreakdown(this.opts.root, a.projects ?? []) } : {},
2486
2492
  ...buildEolHorizon(a.projects ?? []) ? { eolHorizon: buildEolHorizon(a.projects ?? []) } : {},
2487
2493
  ...buildProjectRefs(this.opts.root, a.projects ?? []) ? { projects: buildProjectRefs(this.opts.root, a.projects ?? []) } : {}
2488
2494
  };
@@ -2790,7 +2796,11 @@ function isPrunedWorkspacePath(relPath) {
2790
2796
  if (!relPath || relPath === "." || relPath === "") return false;
2791
2797
  const parts = relPath.split(/[/\\]/).filter(Boolean);
2792
2798
  if (parts.includes(".claude")) return true;
2793
- return parts.some((p) => SKIP_DIRS.has(p));
2799
+ return parts.some((p) => {
2800
+ if (SKIP_DIRS.has(p)) return true;
2801
+ if (p.startsWith(".venv") || p.startsWith("venv-") || p === "site-packages") return true;
2802
+ return false;
2803
+ });
2794
2804
  }
2795
2805
  function pruneArtifactProjects(a) {
2796
2806
  const projects = (a.projects ?? []).filter(
@@ -2814,22 +2824,34 @@ function projectByPath(a, projectPath) {
2814
2824
  }
2815
2825
  function buildProjectRefs(rootDir, projects) {
2816
2826
  if (projects.length === 0) return void 0;
2817
- return projects.map((p) => {
2827
+ const byPath = /* @__PURE__ */ new Map();
2828
+ for (const p of projects) {
2818
2829
  const rel = p.path === "" ? "." : p.path;
2819
- const base = rel === "." ? "." : path37.basename(rel);
2830
+ const prev = byPath.get(rel);
2831
+ if (!prev) {
2832
+ byPath.set(rel, p);
2833
+ continue;
2834
+ }
2835
+ if (!prev.drift && p.drift) byPath.set(rel, p);
2836
+ }
2837
+ const refs = [];
2838
+ for (const [rel, p] of byPath) {
2839
+ if (!p.drift) continue;
2820
2840
  const lockfilePath = lockfileRelativePath(rootDir, p);
2821
- return {
2841
+ refs.push({
2822
2842
  path: rel,
2823
- name: p.name || base,
2843
+ // Full relative path for display/identity; package name alone collides
2844
+ // across nested fixtures (e.g. two "mcp" leaves).
2845
+ name: rel,
2824
2846
  manifestPath: manifestRelativePath(p),
2825
2847
  ...lockfilePath ? { lockfilePath } : {},
2826
- ...p.drift ? {
2827
- score: p.drift.score,
2828
- band: p.drift.riskLevel ?? "low",
2829
- mode: p.drift.mode ?? "verified"
2830
- } : {}
2831
- };
2832
- }).sort((a, b) => a.path.localeCompare(b.path));
2848
+ score: p.drift.score,
2849
+ band: p.drift.riskLevel ?? "low",
2850
+ mode: p.drift.mode ?? "verified"
2851
+ });
2852
+ }
2853
+ refs.sort((a, b) => a.path.localeCompare(b.path));
2854
+ return refs.length > 0 ? refs : void 0;
2833
2855
  }
2834
2856
  function projectForFile(root2, a, filePath) {
2835
2857
  const dir = path37.dirname(path37.resolve(filePath));
@@ -2878,7 +2900,7 @@ function scoreForProject(rootDir, a, proj) {
2878
2900
  counts: { behind, eol, unmaintained, total },
2879
2901
  rootPath: proj.path === "" ? "." : proj.path,
2880
2902
  scannedAt: a.timestamp,
2881
- ...buildBreakdown(proj.drift, [proj]) ? { breakdown: buildBreakdown(proj.drift, [proj]) } : {},
2903
+ ...buildBreakdown(rootDir, [proj]) ? { breakdown: buildBreakdown(rootDir, [proj]) } : {},
2882
2904
  ...buildEolHorizon([proj]) ? { eolHorizon: buildEolHorizon([proj]) } : {},
2883
2905
  ...buildProjectRefs(rootDir, a.projects ?? []) ? { projects: buildProjectRefs(rootDir, a.projects ?? []) } : {}
2884
2906
  };
@@ -2909,17 +2931,52 @@ function bandForScore(n) {
2909
2931
  if (n <= 60) return "moderate";
2910
2932
  return "high";
2911
2933
  }
2912
- function buildBreakdown(_drift, projects) {
2934
+ function buildBreakdown(rootDir, projects) {
2913
2935
  const byPkg = /* @__PURE__ */ new Map();
2914
2936
  for (const p of projects) {
2937
+ const relManifest = manifestRelativePath(p);
2938
+ if (isPrunedWorkspacePath(p.path) || isPrunedWorkspacePath(relManifest)) continue;
2915
2939
  const ecosystem = osvEcosystem(p.type);
2940
+ const absManifest = path37.resolve(rootDir, relManifest);
2941
+ let text = null;
2942
+ try {
2943
+ if (fs7.existsSync(absManifest)) text = fs7.readFileSync(absManifest, "utf8");
2944
+ } catch {
2945
+ text = null;
2946
+ }
2947
+ const kind = manifestKind(absManifest);
2916
2948
  for (const d of p.dependencies ?? []) {
2917
- if (!byPkg.has(d.package)) byPkg.set(d.package, { row: d, ecosystem });
2949
+ let line = null;
2950
+ if (text && kind !== "unknown") {
2951
+ const l = findPackageLine(text, d.package, kind);
2952
+ if (l >= 0) line = l + 1;
2953
+ }
2954
+ const loc = { file: relManifest, line };
2955
+ const existing = byPkg.get(d.package);
2956
+ if (!existing) {
2957
+ byPkg.set(d.package, { row: d, ecosystem, locations: [loc] });
2958
+ continue;
2959
+ }
2960
+ if (!existing.locations.some((x) => x.file === loc.file && x.line === loc.line)) {
2961
+ existing.locations.push(loc);
2962
+ }
2963
+ const prev = perDependencyDrift(existing.row, {
2964
+ unsupported: existing.row.unsupported === true,
2965
+ abandoned: existing.row.abandoned === true
2966
+ });
2967
+ const next2 = perDependencyDrift(d, {
2968
+ unsupported: d.unsupported === true,
2969
+ abandoned: d.abandoned === true
2970
+ });
2971
+ if (!next2.excluded && (prev.excluded || next2.drift > prev.drift)) {
2972
+ existing.row = d;
2973
+ if (ecosystem) existing.ecosystem = ecosystem;
2974
+ }
2918
2975
  }
2919
2976
  }
2920
2977
  if (byPkg.size === 0) return void 0;
2921
2978
  const items = [];
2922
- for (const [, { row, ecosystem }] of byPkg) {
2979
+ for (const [, { row, ecosystem, locations }] of byPkg) {
2923
2980
  const scored = perDependencyDrift(row, {
2924
2981
  unsupported: row.unsupported === true,
2925
2982
  abandoned: row.abandoned === true
@@ -2939,7 +2996,8 @@ function buildBreakdown(_drift, projects) {
2939
2996
  mode: scored.mode,
2940
2997
  unsupported: scored.unsupported || row.unsupported === true,
2941
2998
  abandoned: scored.flags.includes("abandoned-floor") || row.abandoned === true,
2942
- flags: scored.flags
2999
+ flags: scored.flags,
3000
+ locations
2943
3001
  });
2944
3002
  }
2945
3003
  items.sort((a, b) => b.drift - a.drift || a.package.localeCompare(b.package));
@@ -3225,7 +3283,7 @@ function hoverMarkdown(dep, contribution) {
3225
3283
  majorsBehind: dep.majorsBehind ?? 0
3226
3284
  });
3227
3285
  const explainUri = commandUri("vibgrate.explain", { package: dep.package });
3228
- lines.push(`[Route this fix \u2192](${routeFixUri}) \xB7 [Explain this drift](${explainUri})`);
3286
+ lines.push(`[Fix \u2192](${routeFixUri}) \xB7 [Explain this drift](${explainUri})`);
3229
3287
  }
3230
3288
  lines.push("");
3231
3289
  lines.push("---");
@@ -3298,12 +3356,24 @@ function registerInstall(program) {
3298
3356
  return;
3299
3357
  }
3300
3358
  if (global.json) {
3301
- json(ASSISTANTS.map((a) => ({ id: a.id, label: a.label, mcp: !!a.mcp, skill: !!a.skill, nudge: !!a.nudge })));
3359
+ json(
3360
+ ASSISTANTS.map((a) => ({
3361
+ id: a.id,
3362
+ label: a.label,
3363
+ mcp: !!a.mcp,
3364
+ skill: !!a.skill,
3365
+ nudge: !!a.nudge,
3366
+ installed: isAssistantInstalled(a, root2)
3367
+ }))
3368
+ );
3302
3369
  } else {
3303
3370
  info(`${c.cyan("vg install")} \xB7 supported assistants`);
3304
3371
  const pad4 = Math.max(...ASSISTANTS.map((a) => a.id.length)) + 2;
3305
3372
  for (const a of ASSISTANTS) {
3306
- info(` ${c.bold(a.id.padEnd(pad4))} ${a.label} ${c.dim(`mcp:${a.mcp ? "\u2713" : "\u2014"} skill:${a.skill ? "\u2713" : "\u2014"} nudge:${a.nudge ? "\u2713" : "\u2014"}`)}`);
3373
+ const on = isAssistantInstalled(a, root2) ? c.green("on") : c.dim("off");
3374
+ info(
3375
+ ` ${c.bold(a.id.padEnd(pad4))} ${a.label} ${on} ${c.dim(`mcp:${a.mcp ? "\u2713" : "\u2014"} skill:${a.skill ? "\u2713" : "\u2014"} nudge:${a.nudge ? "\u2713" : "\u2014"}`)}`
3376
+ );
3307
3377
  }
3308
3378
  }
3309
3379
  return;
@@ -6289,7 +6359,7 @@ function registerCode(program) {
6289
6359
  try {
6290
6360
  const { parseMode: parseMode2, resolveMode: resolveMode2, readOrchestratorState: readOrchestratorState2, activePin: activePin2 } = await import('./model-orchestrator-LHYPJBFH.js');
6291
6361
  const { gatherSystemMemory: gatherSystemMemory2 } = await import('./local-runtime-2ED33KK6.js');
6292
- const { loadGraph: loadGraph2 } = await import('./load-KPHH26ND.js');
6362
+ const { loadGraph: loadGraph2 } = await import('./load-WA53B3GW.js');
6293
6363
  const state = readOrchestratorState2();
6294
6364
  const mode = parseMode2(modeFlag) ?? state.defaultMode ?? void 0;
6295
6365
  const pin = mode ? activePin2(mode, state) : null;
@@ -6373,7 +6443,7 @@ function registerCode(program) {
6373
6443
  if (!(process.stdin.isTTY && process.stdout.isTTY)) {
6374
6444
  throw usageError('say what to change, e.g. `vg code "add a --timeout flag to the scan command"` (guided mode needs an interactive terminal)');
6375
6445
  }
6376
- const { runInteractive } = await import('./interactive-V6IRYZTA.js');
6446
+ const { runInteractive } = await import('./interactive-QWT7ERXJ.js');
6377
6447
  await runInteractive(
6378
6448
  rootOf(global),
6379
6449
  global,
@@ -6402,6 +6472,40 @@ function registerCode(program) {
6402
6472
  return;
6403
6473
  }
6404
6474
  if (!instruction) throw usageError('say what to change, e.g. `vg code "add a --timeout flag to the scan command"`');
6475
+ {
6476
+ const { ensureCodeMap } = await import('./ensure-map-UQL7SM34.js');
6477
+ const mapRoot = rootOf(global);
6478
+ try {
6479
+ await ensureCodeMap(mapRoot, global, {
6480
+ onProgress: (p) => {
6481
+ if (opts.streamJson) {
6482
+ process.stdout.write(
6483
+ JSON.stringify({
6484
+ event: "event",
6485
+ type: "map_build",
6486
+ phase: p.phase,
6487
+ message: p.message,
6488
+ ...p.pct != null ? { pct: p.pct } : {}
6489
+ }) + "\n"
6490
+ );
6491
+ return;
6492
+ }
6493
+ if (!global.json && !global.quiet && (p.phase === "start" || p.phase === "done")) {
6494
+ info(c.dim(`vg code \xB7 ${p.message}`));
6495
+ }
6496
+ }
6497
+ });
6498
+ } catch (e) {
6499
+ const msg = e instanceof Error ? e.message : String(e);
6500
+ if (opts.streamJson) {
6501
+ process.stdout.write(
6502
+ JSON.stringify({ event: "error", message: `Could not build the code map: ${msg}` }) + "\n"
6503
+ );
6504
+ return;
6505
+ }
6506
+ throw e;
6507
+ }
6508
+ }
6405
6509
  const { root: root2, graph } = requireGraph(global);
6406
6510
  let mockReply;
6407
6511
  if (opts.mock) {
@@ -6454,20 +6558,20 @@ function registerCode(program) {
6454
6558
  process.stdout.write(JSON.stringify(line) + "\n");
6455
6559
  };
6456
6560
  try {
6457
- const { RunOutcomeRecorder, newOneShotRunId, turnRunId } = await import('./run-outcome-TZ53G67B.js');
6561
+ const { RunOutcomeRecorder, newOneShotRunId, turnRunId } = await import('./run-outcome-J2IDIVYI.js');
6458
6562
  const primarySlug = route.providers[0]?.model.includes("/") ? route.providers[0].model.split("/")[0] : route.providers[0]?.id;
6459
- const { runCodeStreamJson, parseHostMessage } = await import('./stream-json-3YOPU3LF.js');
6460
- const { nodeCodeFs } = await import('./session-3OBIQLE4.js');
6563
+ const { runCodeStreamJson, parseHostMessage } = await import('./stream-json-TSGYC2MQ.js');
6564
+ const { nodeCodeFs } = await import('./session-L7SJNE55.js');
6461
6565
  const readline5 = await import('readline');
6462
6566
  const child = await import('child_process');
6463
6567
  const { loadOrDiscoverFederation } = await import('./federation-MDQPO3PW.js');
6464
6568
  const { resolveExecutionEnv } = await import('./execution-env-4MS5AYAN.js');
6465
6569
  const { resolveModelExecutionProfile, mergeModelExecutionProfile } = await import('./model-execution-profile-ELWF3Z6H.js');
6466
- const { startCodeRuntimeSession } = await import('./runtime-session-PZKXBDJT.js');
6570
+ const { startCodeRuntimeSession } = await import('./runtime-session-52P2Y5LX.js');
6467
6571
  const { resolveGraphBackend } = await import('./graph-backend-G5Y6QQV4.js');
6468
6572
  const { detectGitRef } = await import('./git-ref-RSRAN4OH.js');
6469
6573
  const { repositoryIdFromRoot } = await import('./paths-62AKTFSR.js');
6470
- const { vgdRequest: vgdRequest2 } = await import('./vgd-Y2YCN75V.js');
6574
+ const { vgdRequest: vgdRequest2 } = await import('./vgd-PNR7UKLL.js');
6471
6575
  const federation = loadOrDiscoverFederation(root2);
6472
6576
  const modelProfile = mergeModelExecutionProfile(
6473
6577
  resolveModelExecutionProfile({
@@ -6525,7 +6629,7 @@ ${res.stderr}` : ""),
6525
6629
  exitCode: res.status ?? 1
6526
6630
  };
6527
6631
  };
6528
- const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge-7NNVIVO7.js');
6632
+ const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge-IFAXEQMZ.js');
6529
6633
  const vgBuiltin = createVgBuiltinMcpTools({
6530
6634
  getGraph: () => graph,
6531
6635
  root: root2,
@@ -6599,7 +6703,8 @@ ${res.stderr}` : ""),
6599
6703
  capsule,
6600
6704
  files: opts.file.length ? opts.file : void 0,
6601
6705
  worktreeOverlay: true,
6602
- advancedMode: !capsule,
6706
+ // Full coding agent: free discovery by default. Capsule is context only.
6707
+ advancedMode: true,
6603
6708
  externalTools,
6604
6709
  attribution: {
6605
6710
  client: "vg-code",
@@ -6612,15 +6717,15 @@ ${res.stderr}` : ""),
6612
6717
  };
6613
6718
  try {
6614
6719
  if (opts.session) {
6615
- const { runCodeStreamJsonSession } = await import('./stream-json-3YOPU3LF.js');
6616
- const { runAgent: runAgent2 } = await import('./agent-33BMKWJC.js');
6720
+ const { runCodeStreamJsonSession } = await import('./stream-json-TSGYC2MQ.js');
6721
+ const { runAgent: runAgent2 } = await import('./agent-6XOI7RVW.js');
6617
6722
  const {
6618
6723
  loadLatestSession,
6619
6724
  newSession,
6620
6725
  recordTask,
6621
6726
  saveSession,
6622
6727
  summarizeSession
6623
- } = await import('./session-store-O4XPXKOV.js');
6728
+ } = await import('./session-store-SQECEXUU.js');
6624
6729
  const resumedRecord = opts.continue ? loadLatestSession(root2) : void 0;
6625
6730
  let record = resumedRecord ?? newSession(
6626
6731
  `s${Date.now().toString(36)}`,
@@ -6761,17 +6866,17 @@ ${res.stderr}` : ""),
6761
6866
  if (!autonomous && !tty) {
6762
6867
  throw usageError("the agent approves each edit/command \u2014 run in a terminal to approve interactively, or pass --auto to run autonomously (or --single for a one-shot diff).");
6763
6868
  }
6764
- const { agentTask } = await import('./interactive-V6IRYZTA.js');
6765
- const { nodeCodeFs } = await import('./session-3OBIQLE4.js');
6869
+ const { agentTask } = await import('./interactive-QWT7ERXJ.js');
6870
+ const { nodeCodeFs } = await import('./session-L7SJNE55.js');
6766
6871
  const { TtyPrompter } = await import('./ui-K7D3BCHD.js');
6767
6872
  let priorSummary;
6768
6873
  if (opts.continue) {
6769
- const { loadLatestSession, summarizeSession } = await import('./session-store-O4XPXKOV.js');
6874
+ const { loadLatestSession, summarizeSession } = await import('./session-store-SQECEXUU.js');
6770
6875
  const prev = loadLatestSession(root2);
6771
6876
  if (prev) priorSummary = summarizeSession(prev);
6772
6877
  }
6773
6878
  const prompter = tty ? new TtyPrompter() : void 0;
6774
- const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge-7NNVIVO7.js');
6879
+ const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge-IFAXEQMZ.js');
6775
6880
  const vgBuiltin = createVgBuiltinMcpTools({
6776
6881
  getGraph: () => graph,
6777
6882
  root: root2,
@@ -6795,11 +6900,11 @@ ${res.stderr}` : ""),
6795
6900
  const { loadFederation } = await import('./federation-MDQPO3PW.js');
6796
6901
  const { resolveExecutionEnv } = await import('./execution-env-4MS5AYAN.js');
6797
6902
  const { resolveModelExecutionProfile, mergeModelExecutionProfile } = await import('./model-execution-profile-ELWF3Z6H.js');
6798
- const { startCodeRuntimeSession } = await import('./runtime-session-PZKXBDJT.js');
6903
+ const { startCodeRuntimeSession } = await import('./runtime-session-52P2Y5LX.js');
6799
6904
  const { resolveGraphBackend } = await import('./graph-backend-G5Y6QQV4.js');
6800
6905
  const { detectGitRef } = await import('./git-ref-RSRAN4OH.js');
6801
6906
  const { repositoryIdFromRoot } = await import('./paths-62AKTFSR.js');
6802
- const { vgdRequest: vgdRequest2 } = await import('./vgd-Y2YCN75V.js');
6907
+ const { vgdRequest: vgdRequest2 } = await import('./vgd-PNR7UKLL.js');
6803
6908
  const federation = loadFederation(root2);
6804
6909
  const modelProfile = mergeModelExecutionProfile(
6805
6910
  resolveModelExecutionProfile({
@@ -7689,7 +7794,7 @@ function registerDaemon(program) {
7689
7794
  throw new CliError(loaded.error, ExitCode.NOT_FOUND);
7690
7795
  }
7691
7796
  if (!loaded.ok) {
7692
- const { loadGraph: loadGraph2 } = await import('./load-KPHH26ND.js');
7797
+ const { loadGraph: loadGraph2 } = await import('./load-WA53B3GW.js');
7693
7798
  const { detectGitRef } = await import('./git-ref-RSRAN4OH.js');
7694
7799
  const { repositoryIdFromRoot } = await import('./paths-62AKTFSR.js');
7695
7800
  const graph = loadGraph2(root2, global.graph);
@@ -8094,7 +8199,7 @@ var initCommand = new Command("init").description("Initialize vibgrate in a proj
8094
8199
  console.log(chalk7.green("\u2714") + ` Created ${chalk7.bold("vibgrate.config.ts")}`);
8095
8200
  }
8096
8201
  if (opts.baseline) {
8097
- const { runBaseline } = await import('./baseline-4FBHW2X2.js');
8202
+ const { runBaseline } = await import('./baseline-PY6TETA5.js');
8098
8203
  await runBaseline(rootDir);
8099
8204
  }
8100
8205
  console.log("");