@vibgrate/cli 2026.731.2 → 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.
- package/dist/{agent-6PPW5GIV.js → agent-6XOI7RVW.js} +4 -4
- package/dist/{agent-6PPW5GIV.js.map → agent-6XOI7RVW.js.map} +1 -1
- package/dist/{baseline-ZMHL6DXF.js → baseline-PY6TETA5.js} +3 -3
- package/dist/{baseline-ZMHL6DXF.js.map → baseline-PY6TETA5.js.map} +1 -1
- package/dist/{chunk-Q7HUXIUF.js → chunk-3VSU7G75.js} +26 -53
- package/dist/chunk-3VSU7G75.js.map +1 -0
- package/dist/{chunk-Y44GPOBL.js → chunk-5IA2TA57.js} +5 -5
- package/dist/{chunk-Y44GPOBL.js.map → chunk-5IA2TA57.js.map} +1 -1
- package/dist/{chunk-L6BRBFBP.js → chunk-5XIEVZLW.js} +4 -4
- package/dist/{chunk-L6BRBFBP.js.map → chunk-5XIEVZLW.js.map} +1 -1
- package/dist/chunk-7G5S5KZN.js +99 -0
- package/dist/chunk-7G5S5KZN.js.map +1 -0
- package/dist/{chunk-QWOJO32H.js → chunk-AVCBKQKA.js} +3 -3
- package/dist/{chunk-QWOJO32H.js.map → chunk-AVCBKQKA.js.map} +1 -1
- package/dist/{chunk-LZX5NH4V.js → chunk-B6S2DSBS.js} +6 -6
- package/dist/{chunk-LZX5NH4V.js.map → chunk-B6S2DSBS.js.map} +1 -1
- package/dist/{chunk-4TC6RJ7U.js → chunk-BMUTNUB7.js} +4 -4
- package/dist/{chunk-4TC6RJ7U.js.map → chunk-BMUTNUB7.js.map} +1 -1
- package/dist/chunk-DEKGSQHL.js +6 -0
- package/dist/{chunk-NNB2H4BA.js.map → chunk-DEKGSQHL.js.map} +1 -1
- package/dist/{chunk-WBMMRERH.js → chunk-KLO2XBUX.js} +3 -3
- package/dist/{chunk-WBMMRERH.js.map → chunk-KLO2XBUX.js.map} +1 -1
- package/dist/{chunk-5J45MN3K.js → chunk-LTTVCI5C.js} +6 -6
- package/dist/{chunk-5J45MN3K.js.map → chunk-LTTVCI5C.js.map} +1 -1
- package/dist/{chunk-IZNOMGR6.js → chunk-MOLBANFB.js} +3 -3
- package/dist/{chunk-IZNOMGR6.js.map → chunk-MOLBANFB.js.map} +1 -1
- package/dist/{chunk-4CGLQXSI.js → chunk-PHGAUWWF.js} +3 -3
- package/dist/{chunk-4CGLQXSI.js.map → chunk-PHGAUWWF.js.map} +1 -1
- package/dist/{chunk-4DZC3ADC.js → chunk-SCTLOFNH.js} +4 -4
- package/dist/{chunk-4DZC3ADC.js.map → chunk-SCTLOFNH.js.map} +1 -1
- package/dist/{chunk-MYM5VIJ4.js → chunk-TRKRRX2S.js} +10 -6
- package/dist/chunk-TRKRRX2S.js.map +1 -0
- package/dist/{chunk-EX2SH5CT.js → chunk-WK52LWRX.js} +3 -3
- package/dist/{chunk-EX2SH5CT.js.map → chunk-WK52LWRX.js.map} +1 -1
- package/dist/{chunk-TNCD5VFX.js → chunk-Z7VH4RPO.js} +3 -3
- package/dist/{chunk-TNCD5VFX.js.map → chunk-Z7VH4RPO.js.map} +1 -1
- package/dist/cli.js +58 -112
- package/dist/cli.js.map +1 -1
- package/dist/{ensure-map-C3NEC2GI.js → ensure-map-UQL7SM34.js} +8 -8
- package/dist/{ensure-map-C3NEC2GI.js.map → ensure-map-UQL7SM34.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -6
- package/dist/{interactive-2TAYVEHE.js → interactive-QWT7ERXJ.js} +17 -17
- package/dist/{interactive-2TAYVEHE.js.map → interactive-QWT7ERXJ.js.map} +1 -1
- package/dist/load-WA53B3GW.js +10 -0
- package/dist/{load-A5BGEQWP.js.map → load-WA53B3GW.js.map} +1 -1
- package/dist/{run-outcome-OSIVMVT7.js → run-outcome-J2IDIVYI.js} +5 -5
- package/dist/{run-outcome-OSIVMVT7.js.map → run-outcome-J2IDIVYI.js.map} +1 -1
- package/dist/{runtime-session-UPTC3E6N.js → runtime-session-52P2Y5LX.js} +7 -7
- package/dist/{runtime-session-UPTC3E6N.js.map → runtime-session-52P2Y5LX.js.map} +1 -1
- package/dist/{session-3OBIQLE4.js → session-L7SJNE55.js} +4 -4
- package/dist/{session-3OBIQLE4.js.map → session-L7SJNE55.js.map} +1 -1
- package/dist/session-store-SQECEXUU.js +4 -0
- package/dist/{session-store-O4XPXKOV.js.map → session-store-SQECEXUU.js.map} +1 -1
- package/dist/{stream-json-CFKBL3MR.js → stream-json-TSGYC2MQ.js} +4 -4
- package/dist/{stream-json-CFKBL3MR.js.map → stream-json-TSGYC2MQ.js.map} +1 -1
- package/dist/{vg-mcp-bridge-JHRKJBVT.js → vg-mcp-bridge-IFAXEQMZ.js} +3 -3
- package/dist/{vg-mcp-bridge-JHRKJBVT.js.map → vg-mcp-bridge-IFAXEQMZ.js.map} +1 -1
- package/dist/{vgd-HNPOSXKZ.js → vgd-PNR7UKLL.js} +6 -6
- package/dist/vgd-PNR7UKLL.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-K3SLGULW.js +0 -50
- package/dist/chunk-K3SLGULW.js.map +0 -1
- package/dist/chunk-MYM5VIJ4.js.map +0 -1
- package/dist/chunk-NNB2H4BA.js +0 -6
- package/dist/chunk-Q7HUXIUF.js.map +0 -1
- package/dist/load-A5BGEQWP.js +0 -10
- package/dist/session-store-O4XPXKOV.js +0 -4
- package/dist/vgd-HNPOSXKZ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp/server.ts","../src/engine/export.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAsCA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,IAAM,qBAAA,GAAwB,GAAA;AAE9B,IAAM,iBAAA,GAAoB,EAAA;AAUnB,IAAM,iBAAA,GAAoB,GAAA;AAEjC,IAAM,mBAAA,GAAsB,GAAA;AA8CrB,IAAM,cAAN,MAAkB;AAAA,EAYvB,YACW,SAAA,EACQ,OAAA,GAAU,KAAA,EAEV,MAAA,GAA4B,EAAC,EAC9C;AAJS,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAIjB,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,IAAa,IAAA,CAAA,OAAA,CAAa,IAAA,CAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,cAAA;AAAA,EAC3C;AAAA,EATW,SAAA;AAAA,EACQ,OAAA;AAAA,EAEA,MAAA;AAAA,EAfX,aAAA,GAAgB,EAAA;AAAA,EAChB,MAAA,GAAyB,IAAA;AAAA;AAAA,EAExB,IAAA;AAAA,EACD,WAAA,GAAc,CAAA;AAAA,EACd,WAAA,GAAc,CAAA;AAAA,EACd,QAAA,GAAiC,IAAA;AAAA;AAAA,EAEjC,eAAA,GAAkB,iBAAA;AAAA,EACT,WAAA;AAAA;AAAA,EAejB,MAAM,GAAA,GAAwB;AAC5B,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AAG1C,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AACvC,IAAA,IAAI,KAAK,OAAA,KAAY,IAAA,CAAK,aAAA,IAAiB,CAAC,KAAK,MAAA,EAAQ;AAEvD,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,CAAK,IAAA,EAAM,KAAK,SAAS,CAAA;AAChE,MAAA,IAAA,CAAK,MAAA,GAAS,YACV,SAAA,CAAU,KAAA,GACV,WAAc,EAAA,CAAA,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,MAAM,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,OAAA;AAAA,IAC5B;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAA,GAA8B;AAC1C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,IAAA,CAAK,eAAA;AACrD,MAAA,IAAI,MAAM,IAAA,CAAK,WAAA,IAAe,GAAA,GAAM,IAAA,CAAK,cAAc,QAAA,EAAU;AACjE,MAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AACnB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA,CACtE,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,QAAA,IAAI,EAAE,MAAA,KAAW,OAAA,OAAc,WAAA,GAAc,IAAA,CAAK,KAAI,GAAI,mBAAA;AAM1D,QAAA,MAAM,OACJ,CAAA,CAAE,MAAA,KAAW,eAAe,OAAO,CAAA,CAAE,OAAO,QAAA,GAAW,IAAA,CAAK,IAAI,CAAA,CAAE,EAAA,EAAI,KAAK,GAAA,EAAI,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,KAAI,GAAI,GAAA;AACzG,QAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,GAAA;AAAA,UAC1B,qBAAA;AAAA,UACA,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,IAAA,GAAO,iBAAiB;AAAA,SACtD;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,mBAAA;AAAA,MAClC,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACL;AACA,IAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,iBAAiB,CAAC,CAAC,CAAA;AAAA,EAC7F;AACF;AAEO,SAAS,YAAA,CAAa,MAAA,EAAqB,IAAA,GAAqB,EAAC,EAAW;AACjF,EAAA,MAAM,EAAE,OAAA,GAAU,KAAA,EAAO,UAAA,GAAa,KAAA,EAAO,QAAQ,KAAA,EAAO,KAAA,GAAQ,KAAA,EAAO,KAAA,EAAM,GAAI,IAAA;AAGrF,EAAA,MAAM,SAAS,OAAA,IAAW,UAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,IAAA;AAMjC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,IAAI,MAAA;AAAA,IACjB,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,OAAA,EAAQ;AAAA,IAC/B;AAAA,MACE,YAAA,EAAc,EAAE,KAAA,EAAO,EAAC,EAAE;AAAA;AAAA;AAAA;AAAA,MAI1B,YAAA,EACE;AAAA;AAoBJ,GACF;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkB,wBAAwB,aAAa;AAAA,IAC5D,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvB,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,WAAA,EAAa,EAAE,YAAA,EAAc,IAAA,EAAM,eAAe,KAAA;AAAM,KAC1D,CAAE;AAAA,GACJ,CAAE,CAAA;AAEF,EAAA,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC7D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,WAAA,CAAY,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,MAAM,OAAO,GAAA,EAAI;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,WAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,SAAA,IAAa,EAAC;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGxB,MAAA,KAAA,EAAO,MAAA,CAAO,EAAE,GAAG,WAAA,CAAY,KAAK,IAAA,EAAM,MAAM,CAAA,EAAG,MAAA,EAAQ,eAAe,YAAA,CAAa,MAAM,CAAC,CAAA,EAAG,IAAI,CAAA;AAKrG,MAAA,IAAI,MAAA,cAAoB,IAAA,EAAM,IAAA,CAAK,MAAM,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAA,EAAG,EAAE,CAAA;AAEzE,MAAA,OAAO,iBAAiB,MAAM,CAAA;AAAA,IAChC,SAAS,GAAA,EAAK;AAGZ,MAAA,KAAA,EAAO,MAAA,CAAO;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,cAAA,CAAe,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,QAC3C,OAAA,EAAS,MAAA;AAAA,QACT,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACjB,QAAA,EAAU,CAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,YAAY,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,UAAA,EAAc,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5E;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,UAAA,CAAW,SAAA,EAAmB,IAAA,GAAqB,EAAC,EAAkB;AAC1F,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,SAAA,EAAW,IAAA,CAAK,OAAA,KAAY,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACrF,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAA;AAIxC,EAAA,wBAAA,CAAyB,KAAK,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,oBAAA,EAAsB,CAAA;AACjD;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA;AACpC,IAAA,KAAA,CAAM,KAAA,IAAQ;AAAA,EAChB,CAAC,CAAA;AACH;AAcO,SAAS,WAAA,CAAY,IAAA,EAAc,IAAA,EAAc,MAAA,EAAiB,QAAiB,EAAA,EAAmB;AAC3G,EAAA,YAAA;AAAA,IACE,IAAA;AAAA,IACA,EAAE,GAAG,WAAA,CAAY,MAAM,MAAM,CAAA,EAAG,QAAQ,KAAA,EAAO,MAAA,EAAQ,eAAe,MAAM,CAAA,EAAG,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,EAAG,GAAI,EAAC,EAAG;AAAA,IACnH,KAAK,GAAA;AAAI,GACX;AACF;AAOA,SAAS,WAAA,CAAY,MAAc,MAAA,EAA+F;AAChI,EAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM,CAAA;AACtC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,cAAc,GAAA,CAAI,IAAI,KAAK,MAAA,IAAU,OAAO,WAAW,QAAA,EAAU;AACnE,IAAA,QAAA,GAAW,WAAA,CAAY,YAAA,CAAa,gBAAA,CAAiB,MAAM,CAAC,CAAC,CAAA;AAK7D,IAAA,cAAA,GAAiB,eAAA,CAAgB,MAAM,CAAA,CAAE,IAAA,GAAO,eAAA;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,cAAA,EAAe;AACnD;AAQA,SAAS,aAAa,MAAA,EAAoC;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAQ,OAAsE,gBAAA,IAAmB;AACvG,IAAA,OAAO,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,KAAA,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAUA,SAAS,gBAAgB,MAAA,EAA0B;AACjD,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAM,CAAA,SAAU,MAAA,CAAO,MAAA,KAAW,IAAI,MAAA,GAAS,UAAA;AACjE,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,MAAA;AAClD,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,OAAO,OAAO,MAAA;AACnD,EAAA,IAAI,CAAA,CAAE,SAAA,KAAc,KAAA,EAAO,OAAO,MAAA;AAClC,EAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC/D,EAAA,OAAO,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA,GAAY,UAAA;AACpC;AAGA,SAAS,UAAU,CAAA,EAAqC;AACtD,EAAA,IAAI,CAAA,CAAE,aAAA,KAAkB,IAAA,EAAM,OAAO,IAAA;AACrC,EAAA,IAAI,EAAE,UAAA,IAAc,OAAO,CAAA,CAAE,UAAA,KAAe,UAAU,OAAO,IAAA;AAG7D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC5C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACzD,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,QAAQ,MAAM,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,GAAK,CAAA,CAAE,IAAI,CAAA,CAAgB,MAAA,GAAS,CAAA;AACvE,IAAA,IAAI,KAAA,GAAQ,OAAO,OAAO,IAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,aAAa,QAAA,EAAkC;AACtD,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,EAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAC7D,EAAA,OAAO,KAAA,IAAS,UAAU,KAAA,IAAS,OAAO,MAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,EAAA;AACnF;AAGA,SAAS,gBAAgB,MAAA,EAA8B;AACrD,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,IAAI,OAAO,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC1D,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAClC,IAAA,MAAM,IAAK,CAAA,CAAyB,IAAA;AACpC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,EAAG,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAC7C;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG;AAChE,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAA,GAAI,GAAG,KAAA,CAAM,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAQ,CAAA,EAAuB;AACtC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAI,EAAC;AACjC;AAEA,SAAS,YAAY,OAAA,EAAiB;AACpC,EAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,IAAA,EAAK;AACrE;;;ACpZO,IAAM,kBAAA,GAAqB,GAAA;AAqB3B,SAAS,aAAa,GAAA,EAAkC;AAC7D,EAAA,QAAQ,GAAA,CAAI,aAAY;AAAG,IACzB,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAaO,SAAS,WAAA,CAAY,QAAsB,GAAA,EAA4B;AAC5E,EAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,GAAO,mBAAmB,GAAA,CAAI,KAAK,IAAI,GAAA,CAAI,KAAA;AAC7D,EAAA,MAAM,OAAA,GACJ,GAAA,CAAI,OAAA,KAAY,IAAA,IACf,GAAA,CAAI,OAAA,KAAY,KAAA,IAAS,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,kBAAA;AAE3E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,OAAO,cAAA,CAAe,KAAA,EAAO,EAAE,OAAA,EAAS,CAAA;AAAA,IAC1C,KAAK,IAAA;AACH,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC3B,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,KAAK,SAAA;AACH,MAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,IAAI,KAAK,CAAA;AAAA,IAClB,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,KAAK,KAAA;AACH,MAAA,OAAO,GAAA,CAAI,EAAE,GAAG,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9B,KAAK,WAAA;AACH,MAAA,OAAO,SAAA,CAAU,EAAE,GAAG,GAAA,EAAK,OAAO,CAAA;AAAA,IACpC,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,EAAE,GAAG,GAAA,EAAK,OAAO,CAAA;AAAA;AAEnC;AAEA,SAAS,OAAO,KAAA,EAAwB;AAEtC,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,IAAS,KAAA,CAAM,MAAM,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AACrE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzD;AAEA,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACpG;AAEA,SAAS,QAAQ,KAAA,EAAwB;AACvC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,wCAAwC,CAAA;AACnD,EAAA,KAAA,CAAM,KAAK,yDAAyD,CAAA;AACpE,EAAA,KAAA,CAAM,KAAK,mEAAmE,CAAA;AAC9E,EAAA,KAAA,CAAM,KAAK,mEAAmE,CAAA;AAC9E,EAAA,KAAA,CAAM,KAAK,mEAAmE,CAAA;AAC9E,EAAA,KAAA,CAAM,KAAK,oEAAoE,CAAA;AAC/E,EAAA,KAAA,CAAM,KAAK,kCAAkC,CAAA;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,aAAa,CAAC,CAAA,wBAAA,EAA2B,GAAA,CAAI,EAAE,IAAI,CAAC,2BAA2B,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,cAAA,CAAgB,CAAA;AAAA,EAC7K;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA,UAAA,EAAa,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA,oBAAA,EAAuB,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,cAAA,CAAgB,CAAA;AAAA,EACrH;AACA,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAEA,SAAS,IAAI,KAAA,EAAwB;AACnC,EAAA,MAAM,KAAA,GAAkB,CAAC,cAAc,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,MAAA,CAAO,CAAA,CAAE,aAAa,CAAC,CAAA,GAAA,CAAK,CAAA;AAC3F,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,GAAG,CAAA,MAAA,EAAS,CAAA,CAAE,GAAG,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,GAAA,CAAK,CAAA;AACzF,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AACA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC9B;AAEA,SAAS,OAAO,KAAA,EAAwB;AACtC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,cAAc,WAAA,CAAY,CAAA,CAAE,IAAI,CAAC,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,EAAE,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,EAAE,aAAa,CAAC,UAAU,CAAA,CAAE,CAAA,CAAE,IAAI,CAAC,CAAA,GAAA;AAAA,KACnG;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,aAAA,EAAgB,CAAA,CAAE,CAAA,CAAE,GAAG,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,CAAA,CAAE,GAAG,CAAC,CAAA,kBAAA,EAAqB,WAAA,CAAY,CAAA,CAAE,IAAI,CAAC,CAAA,SAAA;AAAA,KACvF;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AACA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACxC;AACA,SAAS,EAAE,CAAA,EAAmB;AAC5B,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB;AAaA,SAAS,IAAI,GAAA,EAA4B;AACvC,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAGnB,EAAA,KAAA,CAAM,KAAK,qEAAqE,CAAA;AAChF,EAAA,MAAM,IAAA,GAAkC;AAAA,IACtC,CAAC,eAAA,EAAiB,KAAA,CAAM,aAAa,CAAA;AAAA,IACrC,CAAC,aAAA,EAAe,GAAA,CAAI,WAAW,CAAA;AAAA,IAC/B,CAAC,YAAA,EAAc,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA;AAAA,IAC1C,CAAC,MAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA;AAAA,IAC9B,CAAC,aAAA,EAAe,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,IACxC,CAAC,UAAA,EAAY,KAAA,CAAM,WAAW,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAChD,CAAC,aAAA,EAAe,KAAA,CAAM,UAAA,CAAW,SAAA,EAAW,eAAe,IAAI;AAAA,GACjE;AACA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAM,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAG7F,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ;AAAA,GACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,6BAA6B,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,aAAa,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,SAAS,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAA;AAAA,KAClW;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ;AAAA,GACF;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAE,IAAI,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,GAAG,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,GAAG,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAE,UAAU,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,SAAS,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAE,QAAQ,CAAC,KAAK,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAA;AAAA,KACvN;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,KAAK,6HAA6H,CAAA;AACxI,EAAA,KAAA,CAAM,KAAK,0EAA0E,CAAA;AACrF,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0BAAA,EAA6B,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAE,IAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,aAAa,CAAC,CAAA,EAAA,CAAI,CAAA;AAClJ,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,iCAAA,EAAoC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC1G;AAGA,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACrC,IAAA,KAAA,CAAM,KAAK,2HAA2H,CAAA;AACtI,IAAA,KAAA,CAAM,KAAK,wEAAwE,CAAA;AACnF,IAAA,KAAA,CAAM,KAAK,2GAA2G,CAAA;AACtH,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0BAAA,EAA6B,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,SAAS,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,CAAI,CAAA;AACpK,MAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,kCAAA,EAAqC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAC5G,MAAA,KAAA,MAAW,EAAA,IAAM,CAAA,CAAE,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,kCAAA,EAAqC,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAA,CAAG,IAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IACrK;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAGA,SAAS,OAAO,CAAA,EAAsC;AACpD,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,MAAA;AACtB,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAClC;AAEA,SAAS,OAAO,CAAA,EAAsC;AACpD,EAAA,OAAO,CAAA,IAAK,QAAQ,CAAC,MAAA,CAAO,SAAS,CAAC,CAAA,GAAI,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA;AAC7D;AAEA,SAAS,QAAQ,CAAA,EAAuC;AACtD,EAAA,OAAO,CAAA,IAAK,IAAA,GAAO,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,GAAA;AACxC;AAEA,SAAS,UAAU,GAAA,EAA4B;AAI7C,EAAA,MAAM,aAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAG;AAC9B,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAA,EAAM,SAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAA,EAAS,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA;AAAA,MAC1B,IAAA,EAAM,CAAA,CAAE,SAAA,KAAc,KAAA,GAAQ,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA,CAAA,GAAK;AAAA,KAC1E,CAAA;AAAA,EACH;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG;AAChC,IAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,wBAAA,EAA0B,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,EAAY,CAAC,EAAE,MAAM,YAAA,EAAc,KAAA,EAAO,EAAE,OAAA,EAAS,GAAG,CAAA;AAAA,EAC1H;AACA,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,UAAU,EAAE,SAAA,EAAW,GAAA,CAAI,WAAA,EAAa,OAAO,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,OAAA,EAAS,CAAA,EAAE;AAAA,IACvG;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AACxC;AAEA,SAAS,KAAK,GAAA,EAA4B;AACxC,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5C,MAAA,EAAQ,CAAA,gBAAA,EAAmB,WAAA,CAAY,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA;AAAA,IAC9C,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,WAAA,EAAa,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA;AAAA,IAC9B,gBAAA,EAAkB;AAAA,GACpB,CAAE,CAAA;AACF,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,WAAA,EAAa,UAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA,IACb,MAAA,EAAQ,kBAAA;AAAA,IACR,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,EAAE,OAAA,EAAS,GAAA,CAAI,WAAA,EAAa,QAAA,EAAU,CAAC,CAAA,SAAA,EAAY,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,OAAO,EAAE,CAAA,EAAE;AAAA,IACjG;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AACxC","file":"chunk-LZX5NH4V.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { mapFileStat } from '../engine/snapshot.js';\nimport { loadGraphPreferIndex } from '../engine/index-db.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { TOOLS, warmEmbedderInBackground } from './tools.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits only a **micro-budget** so a warm probe can\n * land without stalling MCP tools — otherwise it answers from the current\n * map while the rebuild finishes for a later call (hot-reload picks it up).\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty tool calls. */\nconst PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nconst MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe/rebuild may consume at most ~1/PROBE_DUTY_FACTOR of serve wall-time (20 → ≤5%). */\nconst PROBE_DUTY_FACTOR = 20;\n/**\n * How long a tool call waits for an in-flight refresh before answering from\n * the current map. Kept deliberately small: MCP tool latency is sub-10ms on\n * warm maps, and a multi-second budget (the previous 5s ceiling matched\n * `git rev-parse`'s spawn timeout) turned every sequential tool call during a\n * large-repo rebuild into a multi-second stall — measured as TypeScript p50\n * ~5.2s on the release benchmark for the `vg-cli-public` corpus entry.\n * Warm probes still finish inside this window; heavy rebuilds never should.\n */\nexport const REFRESH_BUDGET_MS = 100;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nconst FAILURE_COOLDOWN_MS = 60_000;\n\nexport type RefreshImpl = typeof refreshIfStale;\n\nexport interface GraphSourceTuning {\n probeIntervalMs?: number;\n refreshBudgetMs?: number;\n /**\n * Workspace root for freshness probes. Prefer passing this explicitly —\n * deriving it from `graphPath` via `dirname` twice only works for the legacy\n * `root/.vibgrate/graph.json` layout, not the global branch-keyed store.\n */\n root?: string;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n}\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * Workspace root (project directory). When set, freshness probes and tools\n * use this instead of inferring root from the graph path.\n */\n root?: string;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n /** Project root used for freshness probes and rebuilds. */\n readonly root: string;\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */\n private probeIntervalMs = PROBE_INTERVAL_MS;\n private readonly refreshImpl: RefreshImpl;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing / root overrides (production passes `root`; tests may pass more). */\n private readonly tuning: GraphSourceTuning = {},\n ) {\n // Prefer an explicit root. Fallback assumes legacy `root/.vibgrate/graph.json`\n // (dirname twice); wrong for the global store — callers should pass `root`.\n this.root = tuning.root ?? path.dirname(path.dirname(graphPath));\n this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n // JSON when present, else the standalone snapshot (global-store mode);\n // throws if neither exists → surfaced as tool error.\n const stat = mapFileStat(this.graphPath);\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n // Prefer SQLite reconstruct when corpusHash matches (scale past JSON parse).\n const preferred = loadGraphPreferIndex(this.root, this.graphPath);\n this.cached = preferred\n ? preferred.graph\n : parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh. Never throws — a refresh problem must\n * degrade to \"answer from the current map\", not break the tool call.\n */\n private async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;\n if (now < this.failedUntil || now - this.lastProbeAt < interval) return;\n this.lastProbeAt = now;\n this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath })\n .then((r) => {\n if (r.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n // Self-tune off the full wall cost of *every* outcome — including a\n // multi-second incremental rebuild. Previously only probe-only\n // outcomes (fresh/no-snapshot/locked) backed off, so a 20s rebuild\n // of a large repo re-armed after the 2s floor and every sequential\n // tool call blocked on the refresh budget for the whole suite.\n const cost =\n r.status === 'refreshed' && typeof r.ms === 'number' ? Math.max(r.ms, Date.now() - now) : Date.now() - now;\n this.probeIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.tuning.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // Prefer GraphSource's explicit root (set by serve from the project cwd).\n const root = opts.root ?? source.root;\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n return renderToolResult(result);\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.(); // never keep the server process alive just for the budget timer\n });\n}\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph, slimGraphForExport } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Above this node count, JSON export defaults to compact (no pretty-print). */\nexport const COMPACT_JSON_NODES = 5_000;\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n /** Force compact JSON (no indent). Default: auto when nodes > COMPACT_JSON_NODES. */\n compact?: boolean;\n /** Drop area members + grounding for smaller artifacts. */\n slim?: boolean;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n const graph = ctx.slim ? slimGraphForExport(ctx.graph) : ctx.graph;\n const compact =\n ctx.compact === true ||\n (ctx.compact !== false && format === 'json' && graph.meta.counts.nodes > COMPACT_JSON_NODES);\n\n switch (format) {\n case 'json':\n return serializeGraph(graph, { compact });\n case 'md':\n return renderReport(graph);\n case 'html':\n return renderHtml(graph);\n case 'ndjson':\n return ndjson(graph);\n case 'graphml':\n return graphml(graph);\n case 'dot':\n return dot(graph);\n case 'cypher':\n return cypher(graph);\n case 'sql':\n return sql({ ...ctx, graph });\n case 'cyclonedx':\n return cyclonedx({ ...ctx, graph });\n case 'spdx':\n return spdx({ ...ctx, graph });\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) when the graph carried them.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp/server.ts","../src/engine/export.ts"],"names":[],"mappings":"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","file":"chunk-B6S2DSBS.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { mapFileStat } from '../engine/snapshot.js';\nimport { loadGraphPreferIndex } from '../engine/index-db.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { TOOLS, warmEmbedderInBackground } from './tools.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits only a **micro-budget** so a warm probe can\n * land without stalling MCP tools — otherwise it answers from the current\n * map while the rebuild finishes for a later call (hot-reload picks it up).\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty tool calls. */\nconst PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nconst MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe/rebuild may consume at most ~1/PROBE_DUTY_FACTOR of serve wall-time (20 → ≤5%). */\nconst PROBE_DUTY_FACTOR = 20;\n/**\n * How long a tool call waits for an in-flight refresh before answering from\n * the current map. Kept deliberately small: MCP tool latency is sub-10ms on\n * warm maps, and a multi-second budget (the previous 5s ceiling matched\n * `git rev-parse`'s spawn timeout) turned every sequential tool call during a\n * large-repo rebuild into a multi-second stall — measured as TypeScript p50\n * ~5.2s on the release benchmark for the `vg-cli-public` corpus entry.\n * Warm probes still finish inside this window; heavy rebuilds never should.\n */\nexport const REFRESH_BUDGET_MS = 100;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nconst FAILURE_COOLDOWN_MS = 60_000;\n\nexport type RefreshImpl = typeof refreshIfStale;\n\nexport interface GraphSourceTuning {\n probeIntervalMs?: number;\n refreshBudgetMs?: number;\n /**\n * Workspace root for freshness probes. Prefer passing this explicitly —\n * deriving it from `graphPath` via `dirname` twice only works for the legacy\n * `root/.vibgrate/graph.json` layout, not the global branch-keyed store.\n */\n root?: string;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n}\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * Workspace root (project directory). When set, freshness probes and tools\n * use this instead of inferring root from the graph path.\n */\n root?: string;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n /** Project root used for freshness probes and rebuilds. */\n readonly root: string;\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */\n private probeIntervalMs = PROBE_INTERVAL_MS;\n private readonly refreshImpl: RefreshImpl;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing / root overrides (production passes `root`; tests may pass more). */\n private readonly tuning: GraphSourceTuning = {},\n ) {\n // Prefer an explicit root. Fallback assumes legacy `root/.vibgrate/graph.json`\n // (dirname twice); wrong for the global store — callers should pass `root`.\n this.root = tuning.root ?? path.dirname(path.dirname(graphPath));\n this.refreshImpl = tuning.refreshImpl ?? refreshIfStale;\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n // JSON when present, else the standalone snapshot (global-store mode);\n // throws if neither exists → surfaced as tool error.\n const stat = mapFileStat(this.graphPath);\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n // Prefer SQLite reconstruct when corpusHash matches (scale past JSON parse).\n const preferred = loadGraphPreferIndex(this.root, this.graphPath);\n this.cached = preferred\n ? preferred.graph\n : parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh. Never throws — a refresh problem must\n * degrade to \"answer from the current map\", not break the tool call.\n */\n private async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n const interval = this.tuning.probeIntervalMs ?? this.probeIntervalMs;\n if (now < this.failedUntil || now - this.lastProbeAt < interval) return;\n this.lastProbeAt = now;\n this.inflight = this.refreshImpl(this.root, { graphPath: this.graphPath })\n .then((r) => {\n if (r.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n // Self-tune off the full wall cost of *every* outcome — including a\n // multi-second incremental rebuild. Previously only probe-only\n // outcomes (fresh/no-snapshot/locked) backed off, so a 20s rebuild\n // of a large repo re-armed after the 2s floor and every sequential\n // tool call blocked on the refresh budget for the whole suite.\n const cost =\n r.status === 'refreshed' && typeof r.ms === 'number' ? Math.max(r.ms, Date.now() - now) : Date.now() - now;\n this.probeIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.tuning.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // Prefer GraphSource's explicit root (set by serve from the project cwd).\n const root = opts.root ?? source.root;\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n return renderToolResult(result);\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.(); // never keep the server process alive just for the budget timer\n });\n}\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph, slimGraphForExport } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Above this node count, JSON export defaults to compact (no pretty-print). */\nexport const COMPACT_JSON_NODES = 5_000;\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n /** Force compact JSON (no indent). Default: auto when nodes > COMPACT_JSON_NODES. */\n compact?: boolean;\n /** Drop area members + grounding for smaller artifacts. */\n slim?: boolean;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n const graph = ctx.slim ? slimGraphForExport(ctx.graph) : ctx.graph;\n const compact =\n ctx.compact === true ||\n (ctx.compact !== false && format === 'json' && graph.meta.counts.nodes > COMPACT_JSON_NODES);\n\n switch (format) {\n case 'json':\n return serializeGraph(graph, { compact });\n case 'md':\n return renderReport(graph);\n case 'html':\n return renderHtml(graph);\n case 'ndjson':\n return ndjson(graph);\n case 'graphml':\n return graphml(graph);\n case 'dot':\n return dot(graph);\n case 'cypher':\n return cypher(graph);\n case 'sql':\n return sql({ ...ctx, graph });\n case 'cyclonedx':\n return cyclonedx({ ...ctx, graph });\n case 'spdx':\n return spdx({ ...ctx, graph });\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) when the graph carried them.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { managerFromProviderId, formatManagerBadgeLine } from './chunk-WHJMS7XC.js';
|
|
2
|
-
import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-
|
|
2
|
+
import { MockProvider, LocalLlamaProvider, OPENAI_COMPATIBLE, OllamaProvider, OpenAiCompatibleProvider } from './chunk-TRKRRX2S.js';
|
|
3
3
|
import { resolveGgufPath } from './chunk-7AVYKZEM.js';
|
|
4
|
-
import { CliError, ExitCode } from './chunk-
|
|
4
|
+
import { CliError, ExitCode } from './chunk-5IA2TA57.js';
|
|
5
5
|
import { discoverModels } from './chunk-CQDUBAQY.js';
|
|
6
6
|
import * as fs from 'fs';
|
|
7
7
|
import * as os from 'os';
|
|
@@ -322,5 +322,5 @@ function basename(p) {
|
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
export { fetchCatalog, resolveProviders, topProviders };
|
|
325
|
-
//# sourceMappingURL=chunk-
|
|
326
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
//# sourceMappingURL=chunk-BMUTNUB7.js.map
|
|
326
|
+
//# sourceMappingURL=chunk-BMUTNUB7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code/catalog.ts","../src/code/router.ts"],"names":["locals"],"mappings":"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","file":"chunk-4TC6RJ7U.js","sourcesContent":["/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['vibgrate-relay', 'openrouter', 'litellm', 'openai', 'together']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) Vibgrate Relay — the first-party hosted router, preferred when the user\n // has signed in. Nothing is dialled without their token, so this stays inside\n // the no-surprise-egress rule above.\n if (env.VIBGRATE_RELAY_TOKEN) {\n const model = resolveHostedModel(opts, env, 'vibgrate-relay');\n const primary = buildHosted('vibgrate-relay', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'vibgrate-relay', { allowLmStudio: false })],\n 'VIBGRATE_RELAY_TOKEN is set → Vibgrate Relay (with local fallback)',\n );\n }\n // 2) Another configured hosted router key.\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 3) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 4) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(providers: Provider[], reason: string): RouteResult {\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'));\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'));\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));\n throw new CliError(\n `unknown --provider \"${id}\". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n const config: OpenAiCompatibleConfig = { ...base, id };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/code/catalog.ts","../src/code/router.ts"],"names":["locals"],"mappings":"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","file":"chunk-BMUTNUB7.js","sourcesContent":["/**\n * Live model catalog for the `vg code` guided picker (VG-CLI-CODE §8).\n *\n * The guided flow offers the developer the current top providers and models\n * without us hard-coding a list that goes stale. OpenRouter publishes a public,\n * key-free catalog at `/api/v1/models`; we fetch it, group by provider, rank\n * coding-friendly models first, and cache it per-user with a TTL so repeat runs\n * are instant and offline runs still work. If the network and cache both fail we\n * fall back to a tiny curated provider list plus the always-available\n * \"enter a model slug yourself\" escape hatch — the picker is never empty.\n *\n * Pure over its injected `fetch`, `now`, and cache, so the parse/group/rank\n * logic is unit-testable with no network.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface CatalogModel {\n /** Full slug, e.g. `anthropic/claude-3.5-sonnet`. */\n id: string;\n name: string;\n /** Provider segment, e.g. `anthropic`. */\n provider: string;\n contextLength?: number;\n /** USD per 1M prompt tokens (derived from OpenRouter's per-token price). */\n promptPricePerM?: number;\n completionPricePerM?: number;\n}\n\nexport interface ProviderGroup {\n /** Provider id, e.g. `anthropic`. */\n id: string;\n /** Friendly label, e.g. `Anthropic (Claude)`. */\n label: string;\n models: CatalogModel[];\n}\n\nexport interface Catalog {\n providers: ProviderGroup[];\n /** true when served from network, false when from cache or the curated fallback. */\n fresh: boolean;\n source: 'network' | 'cache' | 'fallback';\n}\n\n/** Provider display names + the order we surface them (the \"top providers\" list). */\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: 'Anthropic (Claude)',\n openai: 'OpenAI (GPT)',\n 'x-ai': 'xAI (Grok)',\n google: 'Google (Gemini)',\n 'meta-llama': 'Meta (Llama)',\n deepseek: 'DeepSeek',\n mistralai: 'Mistral',\n qwen: 'Qwen',\n};\nconst FEATURED_ORDER = Object.keys(PROVIDER_LABELS);\n\nconst OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';\n/** Cache freshness window: a day is plenty; model lists move slowly. */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface FetchCatalogOptions {\n fetchImpl?: typeof fetch;\n now?: () => number;\n /** Bypass and refresh from network. */\n noCache?: boolean;\n /** Never touch the network (offline / --local): cache or curated only. */\n offline?: boolean;\n timeoutMs?: number;\n}\n\n/** The per-user catalog cache file (shared across repos, like the model cache). */\nexport function catalogCachePath(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'catalog', 'openrouter-models.json');\n}\n\nexport async function fetchCatalog(options: FetchCatalogOptions = {}): Promise<Catalog> {\n const now = options.now ?? (() => 0);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n // Serve from a warm cache when allowed.\n if (!options.noCache) {\n const cached = readCache();\n if (cached && (options.offline || now() - cached.ts < CACHE_TTL_MS)) {\n return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n }\n }\n if (options.offline) {\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n\n // Fetch fresh.\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n let raw: unknown;\n try {\n const res = await fetchImpl(OPENROUTER_MODELS_URL, { signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n raw = await res.json();\n } finally {\n clearTimeout(timer);\n }\n const models = parseModels(raw);\n if (models.length === 0) throw new Error('empty catalog');\n writeCache(models, now());\n return { providers: groupModels(models), fresh: true, source: 'network' };\n } catch {\n // Network failed → cache → curated.\n const cached = readCache();\n if (cached) return { providers: groupModels(cached.models), fresh: false, source: 'cache' };\n return { providers: curatedFallback(), fresh: false, source: 'fallback' };\n }\n}\n\n/** Parse OpenRouter's `/models` payload into our shape (defensive about fields). */\nexport function parseModels(raw: unknown): CatalogModel[] {\n const data = (raw as { data?: unknown[] })?.data;\n if (!Array.isArray(data)) return [];\n const out: CatalogModel[] = [];\n for (const entry of data) {\n const e = entry as {\n id?: unknown;\n name?: unknown;\n context_length?: unknown;\n pricing?: { prompt?: unknown; completion?: unknown };\n };\n if (typeof e.id !== 'string' || !e.id.includes('/')) continue;\n const provider = e.id.split('/')[0];\n out.push({\n id: e.id,\n name: typeof e.name === 'string' ? e.name : e.id,\n provider,\n contextLength: numeric(e.context_length),\n promptPricePerM: perMillion(e.pricing?.prompt),\n completionPricePerM: perMillion(e.pricing?.completion),\n });\n }\n return out;\n}\n\n/** Group models by provider, featured providers first, coding models first within each. */\nexport function groupModels(models: CatalogModel[]): ProviderGroup[] {\n const byProvider = new Map<string, CatalogModel[]>();\n for (const m of models) {\n const list = byProvider.get(m.provider) ?? [];\n list.push(m);\n byProvider.set(m.provider, list);\n }\n const groups: ProviderGroup[] = [];\n for (const [id, list] of byProvider) {\n groups.push({ id, label: PROVIDER_LABELS[id] ?? titleCase(id), models: list.sort(rankModels) });\n }\n // Featured providers in our order first, then the rest alphabetically.\n groups.sort((a, b) => {\n const ia = FEATURED_ORDER.indexOf(a.id);\n const ib = FEATURED_ORDER.indexOf(b.id);\n if (ia !== -1 || ib !== -1) return (ia === -1 ? 1e9 : ia) - (ib === -1 ? 1e9 : ib);\n return a.label.localeCompare(b.label);\n });\n return groups;\n}\n\n/** Coding-oriented models first, then larger context, then name — a helpful default order. */\nfunction rankModels(a: CatalogModel, b: CatalogModel): number {\n const ca = isCoding(a) ? 0 : 1;\n const cb = isCoding(b) ? 0 : 1;\n if (ca !== cb) return ca - cb;\n const la = a.contextLength ?? 0;\n const lb = b.contextLength ?? 0;\n if (la !== lb) return lb - la;\n return a.id.localeCompare(b.id);\n}\n\nfunction isCoding(m: CatalogModel): boolean {\n return /cod(e|er|ing)/i.test(m.id) || /cod(e|er|ing)/i.test(m.name);\n}\n\n/** Top N providers (the guided picker's first screen). */\nexport function topProviders(catalog: Catalog, n = 6): ProviderGroup[] {\n return catalog.providers.slice(0, n);\n}\n\ninterface CacheShape {\n ts: number;\n models: CatalogModel[];\n}\n\nfunction readCache(): CacheShape | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(catalogCachePath(), 'utf8')) as CacheShape;\n if (Array.isArray(parsed.models) && typeof parsed.ts === 'number') return parsed;\n } catch {\n /* no cache */\n }\n return null;\n}\n\nfunction writeCache(models: CatalogModel[], ts: number): void {\n try {\n const file = catalogCachePath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ts, models }));\n } catch {\n /* cache is best-effort */\n }\n}\n\n/**\n * A minimal, honestly-labelled offline fallback: just the provider names, so the\n * picker still works with no network and no cache. Model ids are intentionally\n * NOT hard-coded (they go stale) — the flow always offers \"enter a model slug\".\n */\nfunction curatedFallback(): ProviderGroup[] {\n return FEATURED_ORDER.map((id) => ({ id, label: PROVIDER_LABELS[id], models: [] }));\n}\n\nfunction numeric(v: unknown): number | undefined {\n const n = typeof v === 'string' ? Number(v) : typeof v === 'number' ? v : NaN;\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** OpenRouter prices are USD *per token* as strings; convert to per-million. */\nfunction perMillion(v: unknown): number | undefined {\n const n = numeric(v);\n if (n === undefined) return undefined;\n return Math.round(n * 1_000_000 * 1000) / 1000;\n}\n\nfunction titleCase(id: string): string {\n return id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n","/**\n * Model routing for `vg code` (VG-CLI-CODE §5.2).\n *\n * The \"best in breed\" story is an ordered set of backends with automatic\n * fallback — the OpenRouter/LiteLLM model — expressed as a *scheduling* decision\n * the session can execute: try the preferred provider, and on a transport\n * failure fall through to the next available one. This resolver is pure over its\n * injected inputs (flags, environment, the discovered local fleet), so it is\n * fully testable, and it holds two hard rules from the guardrails:\n *\n * - **No surprise egress or install.** With no explicit selection it picks a\n * backend only from signals already present (a configured hosted key, or a\n * model already pulled locally). It never dials a default cloud endpoint you\n * didn't configure, and never triggers an install to pick a default.\n * - **`--local` stays local.** Under `--local` only on-device backends are\n * eligible; if none are available it fails with an actionable message rather\n * than silently reaching the network.\n * - **Code Modes stay on the Vibgrate manager.** When {@link RouteOptions.codeMode}\n * is set, routing is fail-closed to embedded llama.cpp (first-party GGUF).\n * Ollama / LM Studio are never auto-selected for Code Modes.\n */\n\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { discoverModels, type LocalModel } from '../engine/models.js';\nimport { resolveGgufPath } from '../runtime/resolve-gguf.js';\nimport {\n formatManagerBadgeLine,\n managerFromProviderId,\n type ModelManagerId,\n} from '../runtime/model-manager.js';\nimport {\n LocalLlamaProvider,\n MockProvider,\n OllamaProvider,\n OpenAiCompatibleProvider,\n OPENAI_COMPATIBLE,\n type OpenAiCompatibleConfig,\n} from './providers.js';\nimport type { Provider } from './types.js';\n\nexport interface RouteOptions {\n /** Explicit `--provider` (vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp). */\n provider?: string;\n /** Explicit `--model`. */\n model?: string;\n /** `--local`: on-device backends only. */\n local?: boolean;\n /** `--yes`: consent to a first-use install (only relevant to llama-cpp). */\n consent?: boolean;\n /** Path to a gguf for the llama-cpp backend. */\n modelPath?: string;\n /**\n * Prefer embedded llama.cpp when a GGUF is resolvable (Code Mode preferredInference).\n * When false, Ollama may be tried first (VG_PREFER_OLLAMA).\n */\n preferEmbedded?: boolean;\n /**\n * Code Mode path (spark|flow|forge): fail-closed to the Vibgrate model manager.\n * Never auto-routes to Ollama / LM Studio / hosted.\n */\n codeMode?: boolean;\n /** A scripted reply → force the deterministic MockProvider (tests/`--mock`). */\n mockReply?: string;\n}\n\nexport interface RouteDeps {\n env?: NodeJS.ProcessEnv;\n discover?: () => LocalModel[];\n}\n\nexport interface RouteResult {\n /** Providers to try in order; the session falls through on transport failure. */\n providers: Provider[];\n /** A short, human explanation of the choice (for the run header / --json). */\n reason: string;\n /** Manager identity for the primary provider (badge / UX). */\n manager: ModelManagerId;\n /** e.g. \"[Vibgrate] Code Mode · first-party model manager …\" */\n managerLine: string;\n}\n\nconst HOSTED_IDS = new Set(['vibgrate-relay', 'openrouter', 'litellm', 'openai', 'together']);\n\n/** Resolve the ordered provider list for a run. Throws an actionable CliError when nothing is eligible. */\nexport function resolveProviders(opts: RouteOptions, deps: RouteDeps = {}): RouteResult {\n const env = deps.env ?? process.env;\n const discover = deps.discover ?? discoverModels;\n\n // Deterministic offline floor — used by tests, the benchmark, and `--mock`.\n if (opts.mockReply !== undefined) {\n const providers = [new MockProvider(opts.model ?? 'mock-1', opts.mockReply)];\n return finish(providers, 'mock provider (scripted, offline)');\n }\n\n // Code Modes: Vibgrate manager only (embedded GGUF). No third-party auto-route.\n // Even when code.ts pins provider=llama-cpp, never chain Ollama/LM Studio — a\n // grammar or load failure must surface the real error, not \"couldn't reach Ollama\".\n if (opts.codeMode && (!opts.provider || opts.provider === 'llama-cpp' || opts.provider === 'vibgrate')) {\n const gguf = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!gguf) {\n throw new CliError(\n 'Code Mode needs the Vibgrate model manager weights on disk. Run `vg models install spark|flow|forge` (or pass --model-path to a GGUF). Custom Ollama/LM Studio backends are only used when you set --provider explicitly.',\n ExitCode.NOT_FOUND,\n );\n }\n const providers = [\n new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent),\n ];\n return finish(providers, `Code Mode → Vibgrate model manager (embedded llama.cpp · ${gguf.path})`);\n }\n\n // Explicit provider wins.\n if (opts.provider) {\n const provider = buildExplicit(opts.provider, opts, env, discover);\n // Code Mode + explicit custom backend (ollama, lmstudio, …): still no surprise chain.\n if (opts.codeMode) {\n return finish([provider], `Code Mode → explicit --provider ${opts.provider} (no auto-fallback)`);\n }\n // Custom path: only fall through to other *local* adapters when --local, never LM Studio unless chosen.\n const fallbacks =\n opts.local || provider.local\n ? localFallbacks(opts, env, discover, provider.id, { allowLmStudio: opts.provider === 'lmstudio' })\n : [];\n return finish([provider, ...fallbacks], `explicit --provider ${opts.provider}`);\n }\n\n // --local: on-device only, in preference order (embedded → ollama; no surprise LM Studio).\n if (opts.local) {\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length === 0) {\n throw new CliError(\n 'no local model backend available for --local. Install a Code Mode (`vg models install spark`), start Ollama (`ollama serve` + pull), or point --provider llama-cpp at a gguf. See `vg models`.',\n ExitCode.NOT_FOUND,\n );\n }\n return finish(locals, '--local (on-device backends only)');\n }\n\n // No explicit selection: choose from signals already present, best first.\n // 1) Vibgrate Relay — the first-party hosted router, preferred when the user\n // has signed in. Nothing is dialled without their token, so this stays inside\n // the no-surprise-egress rule above.\n if (env.VIBGRATE_RELAY_TOKEN) {\n const model = resolveHostedModel(opts, env, 'vibgrate-relay');\n const primary = buildHosted('vibgrate-relay', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'vibgrate-relay', { allowLmStudio: false })],\n 'VIBGRATE_RELAY_TOKEN is set → Vibgrate Relay (with local fallback)',\n );\n }\n // 2) Another configured hosted router key.\n if (env.OPENROUTER_API_KEY) {\n const model = resolveHostedModel(opts, env, 'openrouter');\n const primary = buildHosted('openrouter', model);\n return finish(\n [primary, ...localFallbacks(opts, env, discover, 'openrouter', { allowLmStudio: false })],\n 'OPENROUTER_API_KEY is set → OpenRouter (with local fallback)',\n );\n }\n // 3) A locally-pulled model (embedded first; never auto LM Studio).\n const locals = localFallbacks(opts, env, discover, '', { allowLmStudio: false });\n if (locals.length) return finish(locals, 'a local model is available → on-device (no key needed)');\n // 4) Any other configured hosted key.\n for (const id of ['litellm', 'openai', 'together'] as const) {\n const keyEnv = OPENAI_COMPATIBLE[id].apiKeyEnv;\n if (keyEnv && env[keyEnv]) {\n const model = resolveHostedModel(opts, env, id);\n return finish([buildHosted(id, model)], `${keyEnv} is set → ${OPENAI_COMPATIBLE[id].label}`);\n }\n }\n\n throw new CliError(\n 'no model backend configured. Do one of: sign in to Vibgrate Relay (VIBGRATE_RELAY_TOKEN), set OPENROUTER_API_KEY for the hosted router, run `vg models install spark` for the Vibgrate manager, run Ollama locally, or use --local with a local model. Set the model with --model or VG_CODE_MODEL.',\n ExitCode.NOT_FOUND,\n );\n}\n\nfunction finish(providers: Provider[], reason: string): RouteResult {\n const primary = providers[0];\n const manager = managerFromProviderId(primary?.id);\n return {\n providers,\n reason,\n manager,\n managerLine: formatManagerBadgeLine(manager, primary?.model),\n };\n}\n\nfunction buildExplicit(id: string, opts: RouteOptions, env: NodeJS.ProcessEnv, discover: () => LocalModel[]): Provider {\n if (id === 'ollama') return new OllamaProvider(resolveLocalModel(opts, discover, 'ollama'), env.OLLAMA_HOST);\n if (id === 'llama-cpp' || id === 'vibgrate') {\n const resolved = resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover,\n });\n if (!resolved) {\n throw new CliError(\n '--provider llama-cpp needs a GGUF: pass --model-path, set VG_CODE_MODEL_PATH, or run `vg models install` so the weight store has a catalogued gguf. See `vg models`.',\n ExitCode.USAGE_ERROR,\n );\n }\n return new LocalLlamaProvider(opts.model ?? basename(resolved.path), resolved.path, undefined, !!opts.consent);\n }\n if (id === 'lmstudio') return buildHosted('lmstudio', resolveHostedModel(opts, env, 'lmstudio'));\n if (id === 'foundry-local' || id === 'foundry') {\n return buildHosted('foundry-local', resolveHostedModel(opts, env, 'foundry-local'));\n }\n if (HOSTED_IDS.has(id)) return buildHosted(id, resolveHostedModel(opts, env, id));\n throw new CliError(\n `unknown --provider \"${id}\". Known: vibgrate-relay, ollama, lmstudio, foundry-local, openrouter, litellm, openai, together, llama-cpp.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction buildHosted(id: string, model: string): OpenAiCompatibleProvider {\n const base = OPENAI_COMPATIBLE[id];\n const config: OpenAiCompatibleConfig = { ...base, id };\n return new OpenAiCompatibleProvider(model, config);\n}\n\ninterface LocalFallbackOpts {\n /** Only include LM Studio when the user explicitly asked for it. */\n allowLmStudio: boolean;\n}\n\n/** On-device backends in preference order, skipping the one already chosen as primary. */\nfunction localFallbacks(\n opts: RouteOptions,\n env: NodeJS.ProcessEnv,\n discover: () => LocalModel[],\n exclude: string,\n fb: LocalFallbackOpts,\n): Provider[] {\n const out: Provider[] = [];\n const models = safeDiscover(discover);\n\n // Approach B default: when a GGUF is already on disk, embedded is primary local.\n // Opt out with VG_PREFER_OLLAMA=1 if the user wants Ollama first.\n const preferOllama =\n env.VG_PREFER_OLLAMA === '1' ||\n env.VIBGRATE_PREFER_OLLAMA === '1' ||\n opts.preferEmbedded === false;\n const gguf =\n exclude === 'llama-cpp' || exclude === 'vibgrate'\n ? null\n : resolveGgufPath({\n modelPath: opts.modelPath || env.VG_CODE_MODEL_PATH,\n modelRef: opts.model,\n env,\n discover: () => models,\n });\n\n if (gguf && !preferOllama) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n\n const ollamaModel = opts.model ?? firstOfRuntime(models, 'ollama');\n if (exclude !== 'ollama' && ollamaModel) out.push(new OllamaProvider(ollamaModel, env.OLLAMA_HOST));\n\n // LM Studio only when explicitly allowed (user chose --provider lmstudio).\n if (fb.allowLmStudio && exclude !== 'lmstudio') {\n const lmModel = opts.model ?? firstOfRuntime(models, 'lm-studio');\n if (lmModel) out.push(buildHosted('lmstudio', lmModel));\n }\n\n // Foundry Local when server/env is configured.\n if (exclude !== 'foundry-local' && exclude !== 'foundry' && (env.FOUNDRY_LOCAL_BASE_URL || env.VG_CODE_PROVIDER === 'foundry-local')) {\n try {\n const m = opts.model || env.VG_CODE_MODEL;\n if (m) out.push(buildHosted('foundry-local', m));\n } catch {\n /* skip if no model */\n }\n }\n\n // Embedded last if user forced Ollama-first but GGUF still available.\n if (gguf && !out.some((p) => p.id === 'llama-cpp')) {\n out.push(new LocalLlamaProvider(opts.model ?? basename(gguf.path), gguf.path, undefined, !!opts.consent));\n }\n return out;\n}\n\nfunction resolveLocalModel(opts: RouteOptions, discover: () => LocalModel[], runtime: LocalModel['runtime']): string {\n if (opts.model) return opts.model;\n const found = firstOfRuntime(safeDiscover(discover), runtime);\n if (found) return found;\n throw new CliError(`--provider ${runtime} needs a model. Pull one (\\`ollama pull <model>\\`) then re-run, or pass --model. See \\`vg models\\`.`, ExitCode.NOT_FOUND);\n}\n\nfunction resolveHostedModel(opts: RouteOptions, env: NodeJS.ProcessEnv, id: string): string {\n const model = opts.model || env.VG_CODE_MODEL;\n if (model) return model;\n throw new CliError(\n `${OPENAI_COMPATIBLE[id].label} needs a model id — pass --model (e.g. a current best-in-breed coding model) or set VG_CODE_MODEL. We don't hard-code a model so you always pick the current best one.`,\n ExitCode.USAGE_ERROR,\n );\n}\n\nfunction firstOfRuntime(models: LocalModel[], runtime: LocalModel['runtime']): string | undefined {\n // Deterministic: discoverModels() already returns a sorted list.\n const m = models.find((x) => x.runtime === runtime);\n return m?.name;\n}\n\nfunction safeDiscover(discover: () => LocalModel[]): LocalModel[] {\n try {\n return discover();\n } catch {\n return [];\n }\n}\n\nfunction basename(p: string): string {\n return p.replace(/\\\\/g, '/').split('/').pop() ?? p;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"names":[],"mappings":";AACO,IAAM,OAAA,GAAU","file":"chunk-DEKGSQHL.js","sourcesContent":["// Calendar version (YYYY.DDD.PATCH), shared scheme with @vibgrate/cli.\nexport const VERSION = '2026.731.3';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-
|
|
1
|
+
import { buildMessages, parseEdits, applyEdits, unifiedDiff, redactSecrets } from './chunk-TRKRRX2S.js';
|
|
2
2
|
import { recordCliCall, CLI_TOOL_ALIASES, buildCodeContext, buildTaskCapsule, capsuleToCodeContext } from './chunk-US2DAKCM.js';
|
|
3
3
|
import { repositoryIdFromRoot } from './chunk-BWPBB45M.js';
|
|
4
4
|
import * as fs from 'fs';
|
|
@@ -251,5 +251,5 @@ function shortId() {
|
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
export { commitChanges, nodeCodeFs, runCodeSession, undoChanges };
|
|
254
|
-
//# sourceMappingURL=chunk-
|
|
255
|
-
//# sourceMappingURL=chunk-
|
|
254
|
+
//# sourceMappingURL=chunk-KLO2XBUX.js.map
|
|
255
|
+
//# sourceMappingURL=chunk-KLO2XBUX.js.map
|