@vibgrate/cli 2026.826.1 → 2026.829.1
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/DOCS.md +204 -9
- package/README.md +2 -0
- package/dist/{agent-4RHH2FR2.js → agent-5GW7C7EB.js} +14 -14
- package/dist/{agent-4RHH2FR2.js.map → agent-5GW7C7EB.js.map} +1 -1
- package/dist/{approvals-XDFM346D.js → approvals-ISJFILVK.js} +5 -5
- package/dist/{approvals-XDFM346D.js.map → approvals-ISJFILVK.js.map} +1 -1
- package/dist/{attach-LGTCYNKC.js → attach-JUSALQ75.js} +3 -3
- package/dist/{attach-LGTCYNKC.js.map → attach-JUSALQ75.js.map} +1 -1
- package/dist/baseline-YL2IZZ4Y.js +9 -0
- package/dist/{baseline-PRY5HKL5.js.map → baseline-YL2IZZ4Y.js.map} +1 -1
- package/dist/{chunk-ZRDTI67N.js → chunk-5RW5PIBH.js} +3 -3
- package/dist/{chunk-ZRDTI67N.js.map → chunk-5RW5PIBH.js.map} +1 -1
- package/dist/{chunk-TUVB6Q6F.js → chunk-65YN3BG3.js} +1207 -40
- package/dist/chunk-65YN3BG3.js.map +1 -0
- package/dist/{chunk-TKUWEJZJ.js → chunk-B5VCPIKT.js} +7 -6
- package/dist/chunk-B5VCPIKT.js.map +1 -0
- package/dist/{chunk-WU2DVESP.js → chunk-BA6YBVNT.js} +3 -3
- package/dist/{chunk-WU2DVESP.js.map → chunk-BA6YBVNT.js.map} +1 -1
- package/dist/{chunk-IM7HME2T.js → chunk-BODXEZEY.js} +9 -9
- package/dist/{chunk-IM7HME2T.js.map → chunk-BODXEZEY.js.map} +1 -1
- package/dist/{chunk-PIB3YNJU.js → chunk-D3SV3JWB.js} +3 -3
- package/dist/{chunk-PIB3YNJU.js.map → chunk-D3SV3JWB.js.map} +1 -1
- package/dist/chunk-EGMBHPXV.js +127 -0
- package/dist/chunk-EGMBHPXV.js.map +1 -0
- package/dist/{chunk-7KOEEEIZ.js → chunk-FHSEK64W.js} +7 -7
- package/dist/{chunk-7KOEEEIZ.js.map → chunk-FHSEK64W.js.map} +1 -1
- package/dist/{chunk-PEHMRPYM.js → chunk-FKCN653F.js} +3 -3
- package/dist/{chunk-PEHMRPYM.js.map → chunk-FKCN653F.js.map} +1 -1
- package/dist/{chunk-K2IWOZEQ.js → chunk-FPIMNVLI.js} +12 -4
- package/dist/chunk-FPIMNVLI.js.map +1 -0
- package/dist/{chunk-BHDP7EVJ.js → chunk-HHMWE52J.js} +10 -135
- package/dist/chunk-HHMWE52J.js.map +1 -0
- package/dist/{chunk-5UG4UHKU.js → chunk-HUJZO4K5.js} +281 -106
- package/dist/chunk-HUJZO4K5.js.map +1 -0
- package/dist/{chunk-TQ75FB52.js → chunk-JWQ2JCQS.js} +4 -4
- package/dist/{chunk-TQ75FB52.js.map → chunk-JWQ2JCQS.js.map} +1 -1
- package/dist/{chunk-WGA4KUGS.js → chunk-K7QR7U3V.js} +12 -11
- package/dist/chunk-K7QR7U3V.js.map +1 -0
- package/dist/{chunk-E44I7635.js → chunk-KCKG3EEJ.js} +3 -3
- package/dist/{chunk-E44I7635.js.map → chunk-KCKG3EEJ.js.map} +1 -1
- package/dist/{chunk-WGSLN73L.js → chunk-MMIIVRQC.js} +7 -7
- package/dist/chunk-MMIIVRQC.js.map +1 -0
- package/dist/chunk-N6R4XPLX.js +27 -0
- package/dist/chunk-N6R4XPLX.js.map +1 -0
- package/dist/{chunk-WPQCJADP.js → chunk-NQQT75AN.js} +62 -22
- package/dist/chunk-NQQT75AN.js.map +1 -0
- package/dist/{chunk-TOHNVUDD.js → chunk-NSC7ZK62.js} +3 -3
- package/dist/{chunk-TOHNVUDD.js.map → chunk-NSC7ZK62.js.map} +1 -1
- package/dist/{chunk-LAYDXJEQ.js → chunk-OAYSRM7J.js} +12 -14
- package/dist/chunk-OAYSRM7J.js.map +1 -0
- package/dist/{chunk-R5BGRJ6X.js → chunk-QMROD7MI.js} +15 -8
- package/dist/chunk-QMROD7MI.js.map +1 -0
- package/dist/{chunk-SHD5TCZ5.js → chunk-R2FX4USU.js} +7 -7
- package/dist/chunk-R2FX4USU.js.map +1 -0
- package/dist/{chunk-7S4ELKK6.js → chunk-RL7JYG3D.js} +3 -3
- package/dist/{chunk-7S4ELKK6.js.map → chunk-RL7JYG3D.js.map} +1 -1
- package/dist/{chunk-QLNJ3VWO.js → chunk-RRSUNTZI.js} +3 -3
- package/dist/{chunk-QLNJ3VWO.js.map → chunk-RRSUNTZI.js.map} +1 -1
- package/dist/{chunk-QONHVC4H.js → chunk-TWFPHXPN.js} +3 -3
- package/dist/{chunk-QONHVC4H.js.map → chunk-TWFPHXPN.js.map} +1 -1
- package/dist/chunk-UGRUG2FA.js +6 -0
- package/dist/{chunk-JQ7OL4XG.js.map → chunk-UGRUG2FA.js.map} +1 -1
- package/dist/{chunk-XW4FCBL4.js → chunk-VOEEYCR3.js} +6 -6
- package/dist/{chunk-XW4FCBL4.js.map → chunk-VOEEYCR3.js.map} +1 -1
- package/dist/{chunk-WHNB3443.js → chunk-WBDRBP22.js} +4 -4
- package/dist/{chunk-WHNB3443.js.map → chunk-WBDRBP22.js.map} +1 -1
- package/dist/{chunk-NQU6E6OG.js → chunk-YL332BU2.js} +20 -15
- package/dist/chunk-YL332BU2.js.map +1 -0
- package/dist/{chunk-IEZCFMNL.js → chunk-ZQY5TWCB.js} +3 -3
- package/dist/{chunk-IEZCFMNL.js.map → chunk-ZQY5TWCB.js.map} +1 -1
- package/dist/cli.d.ts +16 -1
- package/dist/cli.js +2359 -340
- package/dist/cli.js.map +1 -1
- package/dist/{daemon-2YMCH7R2.js → daemon-NRIIDMX2.js} +10 -10
- package/dist/{daemon-2YMCH7R2.js.map → daemon-NRIIDMX2.js.map} +1 -1
- package/dist/embed-worker-main.js +3 -3
- package/dist/{ensure-map-S2GBW2UC.js → ensure-map-VAIYCCEJ.js} +17 -16
- package/dist/{ensure-map-S2GBW2UC.js.map → ensure-map-VAIYCCEJ.js.map} +1 -1
- package/dist/explain-EXPJTCB5.js +126 -0
- package/dist/explain-EXPJTCB5.js.map +1 -0
- package/dist/{graph-backend-QDEU5RIR.js → graph-backend-V5A2H5ZB.js} +7 -7
- package/dist/{graph-backend-QDEU5RIR.js.map → graph-backend-V5A2H5ZB.js.map} +1 -1
- package/dist/index.d.ts +217 -13
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/{interactive-GMGWUEQO.js → interactive-VQM2CTE2.js} +32 -31
- package/dist/interactive-VQM2CTE2.js.map +1 -0
- package/dist/load-UAVA732M.js +11 -0
- package/dist/{load-JXCTAAEI.js.map → load-UAVA732M.js.map} +1 -1
- package/dist/parse-worker.js +2 -2
- package/dist/{rules-ASYEUNB5.js → rules-TLRGB5L4.js} +12 -4
- package/dist/rules-TLRGB5L4.js.map +1 -0
- package/dist/{run-outcome-5NA7PI52.js → run-outcome-EATWIKLR.js} +5 -5
- package/dist/{run-outcome-5NA7PI52.js.map → run-outcome-EATWIKLR.js.map} +1 -1
- package/dist/{runtime-session-IEM6DZDP.js → runtime-session-Y2BRBXUW.js} +9 -9
- package/dist/{runtime-session-IEM6DZDP.js.map → runtime-session-Y2BRBXUW.js.map} +1 -1
- package/dist/{session-VYFLJ7KL.js → session-N2FTYIHQ.js} +9 -9
- package/dist/{session-VYFLJ7KL.js.map → session-N2FTYIHQ.js.map} +1 -1
- package/dist/{stream-json-2ISQLKPD.js → stream-json-GCZAHORX.js} +14 -14
- package/dist/{stream-json-2ISQLKPD.js.map → stream-json-GCZAHORX.js.map} +1 -1
- package/dist/version-XNZ4GLMQ.js +4 -0
- package/dist/{version-B62ELJRY.js.map → version-XNZ4GLMQ.js.map} +1 -1
- package/dist/{vg-mcp-bridge-CJIK5U56.js → vg-mcp-bridge-VDZWFEO2.js} +22 -11
- package/dist/vg-mcp-bridge-VDZWFEO2.js.map +1 -0
- package/dist/{vgd-4EB6SKFB.js → vgd-3A2TRNP5.js} +8 -8
- package/dist/vgd-3A2TRNP5.js.map +1 -0
- package/package.json +2 -2
- package/dist/baseline-PRY5HKL5.js +0 -9
- package/dist/chunk-5UG4UHKU.js.map +0 -1
- package/dist/chunk-BHDP7EVJ.js.map +0 -1
- package/dist/chunk-JQ7OL4XG.js +0 -6
- package/dist/chunk-K2IWOZEQ.js.map +0 -1
- package/dist/chunk-LAYDXJEQ.js.map +0 -1
- package/dist/chunk-NQU6E6OG.js.map +0 -1
- package/dist/chunk-R5BGRJ6X.js.map +0 -1
- package/dist/chunk-SHD5TCZ5.js.map +0 -1
- package/dist/chunk-TKUWEJZJ.js.map +0 -1
- package/dist/chunk-TUVB6Q6F.js.map +0 -1
- package/dist/chunk-WGA4KUGS.js.map +0 -1
- package/dist/chunk-WGSLN73L.js.map +0 -1
- package/dist/chunk-WPQCJADP.js.map +0 -1
- package/dist/chunk-YENM3HT7.js +0 -23
- package/dist/chunk-YENM3HT7.js.map +0 -1
- package/dist/interactive-GMGWUEQO.js.map +0 -1
- package/dist/load-JXCTAAEI.js +0 -11
- package/dist/rules-ASYEUNB5.js.map +0 -1
- package/dist/version-B62ELJRY.js +0 -4
- package/dist/vg-mcp-bridge-CJIK5U56.js.map +0 -1
- package/dist/vgd-4EB6SKFB.js.map +0 -1
package/dist/chunk-JQ7OL4XG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/snapshot.ts","../src/engine/report.ts","../src/engine/html.ts","../src/engine/relevance-provider.ts","../src/engine/artifacts.ts","../src/engine/relevance-enrich.ts"],"names":["crc32","fs","path","fs2","legacy","MAGIC","zlib2","newPackr","Packr","fs4","path3","cached","tags"],"mappings":";;;;;;;;;;;AAsCA,IAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAG/C,IAAMA,SAA2C,IAAA,CAAA,KAAA,IAAS,OAAA;AAE1D,IAAI,QAAA,GAA+B,IAAA;AAEnC,SAAS,QAAQ,IAAA,EAA0B;AACzC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,YAAY,GAAG,CAAA;AAC9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,UAAA,GAAc,CAAA,KAAM,CAAA,GAAK,CAAA,KAAM,CAAA;AACvE,MAAA,QAAA,CAAS,CAAC,IAAI,CAAA,KAAM,CAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,GAAM,UAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,GAAA,GAAM,QAAA,CAAA,CAAU,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,GAAI,IAAK,GAAA,KAAQ,CAAA;AACxF,EAAA,OAAA,CAAQ,MAAM,UAAA,MAAgB,CAAA;AAChC;AAgBO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,OAAO,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,KAAA,CAAA,GAAU,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA;AACtF;AAEA,SAAS,QAAA,GAAkB;AACzB,EAAA,OAAO,IAAI,KAAA,CAAM,EAAE,UAAA,EAAY,MAAM,CAAA;AACvC;AAGO,SAAS,mBAAmB,KAAA,EAAwB;AACzD,EAAA,OAAO,OAAO,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA;AAC3C;AAWO,SAAS,kBAAA,CACd,SAAA,EACA,KAAA,EACA,IAAA,GAAiC,EAAC,EACzB;AACT,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAA,GAAS,QAAA,GAAW,IAAA,CAAK;AAAA,QACvB,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAOA,OAAM,OAAO,CAAA;AAAA,QACpB,UAAA,EAAY;AAAA,OACY,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAUC,aAAS,SAAS,CAAA;AAClC,MAAA,MAAA,GAAS,QAAA,GAAW,IAAA,CAAK;AAAA,QACvB,MAAA,EAAQ,OAAA;AAAA,QACR,YAAY,IAAA,CAAK,IAAA;AAAA,QACjB,eAAe,IAAA,CAAK,OAAA;AAAA,QACpB,KAAA,EAAOD,OAAM,OAAO;AAAA,OACI,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC7B,IAAA,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,gBAAgB,SAAS,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,IAAA,CAAA;AAClC,IAAA,IAAI;AACF,MAAGC,GAAA,CAAA,aAAA,CAAc,GAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAAC,OAAO,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAC,CAAA;AACrE,MAAGA,GAAA,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAGA,GAAA,CAAA,MAAA,CAAO,GAAA,EAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAC9B,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaO,SAAS,kBAAkB,SAAA,EAAmC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,gBAAgB,SAAS,CAAA;AACtC,IAAA,IAAI,CAAIA,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAM,GAAA,GAASA,iBAAa,IAAI,CAAA;AAChC,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,MAAM,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,GAAG,OAAO,IAAA;AAC1F,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,SAAA;AACxC,IAAA,IAAI,YAAA,GAAe,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACtC,IAAA,MAAM,MAAA,GAAS,QAAA,EAAS,CAAE,MAAA,CAAO,GAAA,CAAI,SAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,YAAY,CAAC,CAAA;AAC7E,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACtB,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,OAAA,EAAS,OAAO,IAAA;AACtC,MAAA,MAAM,UAAA,GAAgBA,aAAS,SAAS,CAAA;AACxC,MAAA,IAAI,MAAA,CAAO,eAAe,UAAA,CAAW,IAAA,IAAQ,OAAO,aAAA,KAAkB,UAAA,CAAW,SAAS,OAAO,IAAA;AAAA,IACnG;AACA,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA;AACzC,IAAA,IAAID,MAAAA,CAAM,OAAO,CAAA,KAAM,MAAA,CAAO,OAAO,OAAO,IAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,QAAA,EAAS,CAAE,MAAA,CAAO,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,GAAG,OAAO,IAAA;AACjF,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,IAAOC,GAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,IAAA;AACrC,EAAA,OAAO,kBAAA,CAAmB,eAAA,CAAgB,SAAS,CAAC,GAAG,UAAA,KAAe,IAAA;AACxE;AAOO,SAAS,YAAY,SAAA,EAA6B;AACvD,EAAA,IAAI;AACF,IAAA,OAAUA,aAAS,SAAS,CAAA;AAAA,EAC9B,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAA,GAAO,gBAAgB,SAAS,CAAA;AACtC,IAAA,IAAOA,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG,OAAUA,aAAS,IAAI,CAAA;AAChD,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAGA,SAAS,mBAAmB,IAAA,EAAqC;AAC/D,EAAA,IAAI,EAAA,GAAoB,IAAA;AACxB,EAAA,IAAI;AACF,IAAA,EAAA,GAAQA,GAAA,CAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,OAAUA,GAAA,CAAA,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAC,CAAA;AACxD,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,GAAG,OAAO,IAAA;AACvF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAClD,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAM,OAAO,IAAA;AAChD,IAAA,OAAO,QAAA,EAAS,CAAE,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,EAC1F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,IAAI,EAAA,KAAO,IAAA,EAASA,GAAA,CAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EAClC;AACF;AASO,SAAS,0BAA0B,SAAA,EAAmC;AAC3E,EAAA,MAAM,IAAA,GAAO,kBAAkB,SAAS,CAAA;AACxC,EAAA,IAAI,MAAM,OAAO,IAAA;AACjB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAUA,GAAA,CAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,WAAW,IAAI,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,kBAAA,CAAmB,WAAW,KAAK,CAAA;AACnC,EAAA,OAAO,KAAA;AACT;;;ACvOO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,OAAM,GAAI,KAAA;AAC3C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,UAAA,CAAW,OAAO,CAAA,eAAA,EAAe,KAAA,CAAM,aAAa,CAAA,EAAA,CAAI,CAAA;AAC1F,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,cAAA,CAAe,OAAO,CAAC,CAAA,CAAE,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,cAAA,CAAe,OAAO,CAAC,CAAA,CAAE,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,cAAA,CAAe,OAAO,CAAC,CAAA,CAAE,CAAA;AACtE,EAAA,KAAA,CAAM,IAAA,CAAK,oBAAoB,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA,IAAK,QAAG,CAAA,CAAE,CAAA;AACjE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,KAAK,CAAA,iBAAA,EAAoB,UAAA,CAAW,SAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/D,EAAA,KAAA,CAAM,IAAA,CAAK,qBAAqB,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA,IAAK,QAAG,CAAA,CAAE,CAAA;AAClE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AACvD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,UAAA,EAAY;AAChD,IAAA,UAAA,CAAW,GAAA,CAAI,EAAE,IAAA,EAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,UAAA,CAAW,OAAA,EAAS,CAAA,CACtC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,CAAE,aAAA,CAAc,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CACtD,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACd,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,KAAK,mCAAmC,CAAA;AAC9C,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,wBAAwB,CAAA;AACnC,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,EAAA,CAAI,CAAA;AAC7E,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CACxD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,aAAA,CAAc,aAAA,CAAc,CAAA,CAAE,aAAa,CAAC,CAAA,CAC5F,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,uCAAuC,CAAA;AAClD,IAAA,KAAA,CAAM,KAAK,4BAA4B,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,OAAO,CAAA,CAAE,aAAa,QAAQ,CAAA,CAAE,IAAI,QAAQ,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,KAAK,CAAA,GAAA,EAAM,EAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,OACnG;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AACvE,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,CAAE,cAAc,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,EAAG;AAC1F,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,EAAM,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IACrC;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,SAAA,CAAU,MAAM,CAAA,gBAAA,EAAgB,UAAA,CAAW,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,SAAA,CAAM,CAAA;AAC9F,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACvEA,IAAM,gBAAA,GAAmB,GAAA;AAElB,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,UAAU,EACxD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,aAAA,CAAc,aAAA,CAAc,CAAA,CAAE,aAAa,CAAC,CAAA,CAC5F,KAAA,CAAM,GAAG,EAAE,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAC1B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA,CAC7C,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEd,EAAA,MAAM,OAAO,GAAA,CACV,GAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,cAAA,EAAiB,GAAA,CAAI,CAAA,CAAE,aAAa,CAAC,CAAA,gBAAA,EAAmB,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,eAAA,EACtD,IAAI,CAAA,CAAE,IAAI,CAAC,CAAA,QAAA,EAAW,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,SAAA,EAAY,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA;AAAA,GACtF,CACC,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,WAAW,KAAA,CACd,GAAA;AAAA,IACC,CAAC,MACC,CAAA,QAAA,EAAW,CAAA,CAAE,EAAE,CAAA,eAAA,EAAkB,GAAA,CAAI,EAAE,KAAK,CAAC,mBACtC,CAAA,CAAE,IAAI,YAAY,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAC,CAAA,SAAA,EAAY,CAAA,CAAE,aAAa,CAAA,UAAA;AAAA,GAC7E,CACC,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,gBAAA;AACxC,EAAA,MAAM,eAAe,KAAA,GACjB;AAAA,IACE,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAA,EAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,aAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,IAAA,EAAM,EAAE,IAAA,CAAK,KAAA;AAAA,MACb,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,MAAM,CAAA,CAAE;AAAA,KACV,CAAE,CAAA;AAAA,IACF,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvB,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,eAAe,CAAA,CAAE;AAAA,KACnB,CAAE,CAAA;AAAA,IACF,MAAM,CAAA,oBAAA,EAAuB,KAAA,CAAM,KAAK,MAAA,CAAO,KAAK,YAAY,gBAAgB,CAAA,8CAAA;AAAA,GAClF,GACA,KAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,YAAA,EAAc,CAAC,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,YAAA,IAAgB,MAAA;AAExC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAmBS,KAAA,CAAM,KAAK,MAAA,CAAO,KAAK,eAAY,KAAA,CAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1E,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,YAAA,EAAY,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,QAAG,CAAC,CAAA;AAAA,YAAA,EAClE,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,YAAA,EAAY,GAAA,CAAI,IAAI,CAAC,CAAA,SAAA,EAAS,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EAE9F,KAAA,GACI,CAAA,6BAAA,EAAgC,KAAA,CAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,4HAAA,CAAA,GAEvD,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,EAKE,YAAY,qDAAqD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjE,IAAI;AAAA;AAAA;AAAA,gBAAA,EAGY,KAAA,GAAQ,oBAAoB,YAAY,CAAA;AAAA;AAAA,EAExD,QAAQ;AAAA;AAAA;AAAA;AAAA,CAAA;AAKV;AAEA,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AC2CA,SAAS,QAAA,GAAoB;AAC3B,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,CAAI,kBAAA;AACtB,EAAA,OAAO,CAAA,KAAM,OAAO,CAAA,KAAM,MAAA;AAC5B;AAIO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,kBAAuBC,KAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,IAAW,QAAQ,CAAA;AAC3E,EAAA,OAAYA,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,WAAW,CAAA;AAC3D;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAYA,KAAA,CAAA,IAAA,CAAK,kBAAA,EAAmB,EAAG,UAAU,CAAA;AACnD;AAEA,SAAS,cAAA,GAA2B;AAClC,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,uBAAA;AAC3B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,CAAA,GAASA,cAAQ,MAAM,CAAA;AAC7B,IAAA,IAAI;AACF,MAAA,IAAOC,GAAA,CAAA,QAAA,CAAS,CAAC,CAAA,CAAE,WAAA,EAAY,SAAU,CAAMD,KAAA,CAAA,IAAA,CAAK,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,CAAC,CAAC,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAC,mBAAmB,CAAA;AAC7B;AAEA,IAAI,MAAA;AAGG,SAAS,2BAAA,GAAoC;AAClD,EAAA,MAAA,GAAS,MAAA;AACX;AAOA,eAAsB,qBAAA,GAA2D;AAC/E,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,MAAA,GAAS,IAAA;AACT,EAAA,IAAI,QAAA,IAAY,OAAO,MAAA;AACvB,EAAA,KAAA,MAAW,CAAA,IAAK,gBAAe,EAAG;AAChC,IAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,CAAC,CAAA,EAAG;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAO,MAAM,OAAO,aAAA,CAAc,CAAC,CAAA,CAAE,IAAA,CAAA;AAG3C,MAAA,MAAM,QAAA,GAAW,IAAI,uBAAA,IAA0B;AAC/C,MAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,KAAY,cAAc,OAAO,QAAA,CAAS,iBAAiB,UAAA,EAAY;AACrG,QAAA,MAAA,GAAS,QAAA;AACT,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAUA,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,YAAA,GAAe,GAAA;AAGrB,SAAS,SAAA,CAAU,KAAc,GAAA,EAAqB;AACpD,EAAA,OAAO,OAAO,GAAA,IAAO,EAAE,CAAA,CACpB,OAAA,CAAQ,2BAA2B,GAAG,CAAA,CACtC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,IAAA,EAAK,CACL,KAAA,CAAM,GAAG,GAAG,CAAA;AACjB;AASO,SAAS,YAAA,CAAa,KAAiB,QAAA,EAAqD;AACjG,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,CAAI,OAAA,KAAY,YAAY,OAAO,GAAA,CAAI,UAAA,KAAe,SAAA,EAAW,OAAO,IAAA;AAC3F,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,KAAA,EAAO;AACzB,IAAA,MAAM,KAAK,OAAO,CAAA,EAAG,EAAA,KAAO,QAAA,GAAW,EAAE,EAAA,GAAK,EAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAC9C,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AAC3C,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,UAAU,CAAA,CAAE,GAAA,EAAK,WAAW,CAAA,EAAG,CAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,UAAU,cAAA,EAAgB;AAAA,EACtC;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAM,SAAA,CAAU,GAAG,YAAY,CAAC,EACrC,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,KAAA,CAAM,GAAG,iBAAiB,CAAA;AAC7B,EAAA,OAAO,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,UAAA,EAAY,GAAA,CAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAC7F;AAGA,IAAM,eAAA,uBAAsB,OAAA,EAAiE;AAE7F,SAAS,aAAa,KAAA,EAE8B;AAClD,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA;AACrC,EAAA,IAAI,KAAK,OAAO,GAAA;AAChB,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,UAAA,EAAY;AAChD,IAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,aAAA,EAAe,CAAA,CAAE,eAAe,IAAA,EAAM,CAAA,CAAE,MAAM,UAAA,EAAY,CAAA,CAAE,YAAY,CAAA;AAC/G,IAAA,GAAA,CAAI,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,EACd;AACA,EAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAS,GAAA,EAAI;AAC5B,EAAA,eAAA,CAAgB,GAAA,CAAI,OAAO,IAAI,CAAA;AAC/B,EAAA,OAAO,IAAA;AACT;AASA,eAAsB,YAAA,CACpB,KAAA,EACA,QAAA,EACA,IAAA,GAA6G,EAAC,EAC/E;AAC/B,EAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,CAAS,WAAA,KAAgB,YAAY,OAAO,IAAA;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAI,GAAI,aAAa,KAAK,CAAA;AAC3C,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,GAAY,OAAO,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA;AACxE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,QAAA,EAAU,OAAA,EAAS;AAAA,MAClD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAA,EAAe,KAAK,aAAA,IAAiB,IAAA;AAAA,MACrC;AAAA,KACD,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACjSO,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AACpC;AAGO,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG,YAAY,CAAA;AAClD;AAMO,SAAS,iBAAA,CAAkB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AAC/E,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,sBAAA,EAAwB,IAAA,GAAO,WAAA,EAAY;AACzD,EAAA,OAAO,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,KAAA;AAC5C;AAQO,SAAS,gBAAA,CAAiB,IAAA,EAAc,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAa;AAC3F,EAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG,OAAO,gBAAgB,IAAI,CAAA;AACvD,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,aAAa,IAAI,CAAA;AACvC,EAAA,IAAI,SAAS,MAAA,IAAU,GAAA,SAAY,qBAAA,CAAsB,IAAA,EAAM,KAAK,GAAG,CAAA;AACvE,EAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAG,CAAA;AAC7C;AAYO,SAAS,gBAAA,CAAiB,IAAA,EAAc,QAAA,EAAmB,GAAA,GAAyB,QAAQ,GAAA,EAAa;AAC9G,EAAA,IAAI,UAAU,IAAA,EAAK,SAAe,KAAA,CAAA,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AACzD,EAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAMC,OAAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,IAAA,IAAO,GAAA,CAAA,UAAA,CAAWA,OAAM,CAAA,EAAG,OAAOA,OAAAA;AAClC,IAAA,OAAOA,OAAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,aAAa,IAAI,CAAA;AACvC,EAAA,IAAI,IAAA,KAAS,UAAU,GAAA,EAAK;AAC1B,IAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AACvD,IAAA,IAAI,aAAA,CAAc,UAAU,CAAA,EAAG,OAAO,UAAA;AAAA,EACxC;AACA,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAG,CAAA;AACvD,EAAA,IAAI,aAAA,CAAc,UAAU,CAAA,EAAG,OAAO,UAAA;AACtC,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,OAAO,gBAAA,CAAiB,MAAM,GAAG,CAAA;AACnC;AAmBA,IAAM,iBAAA,GAAoB;AAAA,EACxB,0EAAA;AAAA,EACA,2EAAA;AAAA,EACA,uEAAA;AAAA,EACA,0EAAA;AAAA,EACA,sDAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIA,uBAAA;AAAA,EACA,oBAAA;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIA;AACF,CAAA;AAGA,IAAM,gBAAA,GAAmB,4BAAA;AAElB,SAAS,wBAAwB,IAAA,EAAoB;AAC1D,EAAA,MAAM,IAAA,GAAY,KAAA,CAAA,IAAA,CAAK,WAAA,CAAY,IAAI,GAAG,YAAY,CAAA;AACtD,EAAG,cAAU,WAAA,CAAY,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,EAAA,IAAI,CAAI,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,IAAG,kBAAc,IAAA,EAAM,CAAA,EAAG,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC;AAAA,CAAI,CAAA;AAC1D,IAAA;AAAA,EACF;AAOA,EAAA,MAAM,QAAA,GAAc,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAC7C,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AACjE,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,CAAC,UAAU,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAC9F,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAG,GAAA,CAAA,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,CAAI,CAAA;AAAA,EACnF;AACF;AAMO,SAAS,oBAAA,CAAqB,IAAA,EAAc,SAAA,EAAmB,GAAA,GAAyB,QAAQ,GAAA,EAAa;AAClH,EAAA,MAAM,QAAA,GAAgB,cAAQ,SAAS,CAAA;AACvC,EAAA,MAAM,MAAA,GAAc,KAAA,CAAA,OAAA,CAAQ,eAAA,CAAgB,IAAI,CAAC,CAAA;AACjD,EAAA,IAAI,QAAA,KAAa,MAAA,EAAQ,OAAO,WAAA,CAAY,IAAI,CAAA;AAChD,EAAA,MAAM,gBAAqB,KAAA,CAAA,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAG,CAAC,CAAA;AACxE,EAAA,IAAI,QAAA,KAAa,aAAA,EAAe,OAAO,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAEnE,EAAA,OAAY,cAAQ,QAAQ,CAAA;AAC9B;AAEO,SAAS,cAAA,CAAe,OAAgB,OAAA,EAAyC;AACtF,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,gBAAA,CAAiB,QAAQ,IAAI,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,aAAa,UAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,IAAK,YAAA,CAAa,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAE7F,EAAG,cAAe,KAAA,CAAA,OAAA,CAAQ,SAAS,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACzD,EAAG,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5C,EAAA,IAAI,UAAU,YAAA,CAAa,UAAA,EAAY,YAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG;AACjE,IAAA,uBAAA,CAAwB,QAAQ,IAAI,CAAA;AAAA,EACtC,CAAA,MAAA,IAAgB,cAAQ,SAAS,CAAA,KAAW,cAAQ,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG;AAClF,IAAA,uBAAA,CAAwB,QAAQ,IAAI,CAAA;AAAA,EACtC;AAQA,EAAA,MAAM,YAAY,YAAA,CAAa,SAAA,EAAW,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAC,CAAA;AAM1E,EAAA,oBAAA,CAAqB,SAAS,CAAA;AAE9B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,CAAC,mBAAmB,SAAA,EAAW,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,CAGjE,MAAO;AAGL,MAAG,GAAA,CAAA,MAAA,CAAO,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,IAAa,CAAI,eAAW,eAAA,CAAgB,SAAS,CAAC,CAAA,EAAG;AAI5D,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,IAAA,CAAA;AACvC,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,GAAA,EAAK,cAAA,CAAe,KAAK,CAAC,CAAA;AAC3C,MAAG,GAAA,CAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAG,GAAA,CAAA,MAAA,CAAO,GAAA,EAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAC9B,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,kBAAA,CAAmB,WAAW,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,SAAA,EAAW,aAAa,CAAI,GAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAAI,eAAA,CAAgB,SAAS,CAAA,GAAI;AAAA,GACnF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,EAAO;AAC5B,IAAA,MAAM,UAAA,GAAkB,KAAA,CAAA,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAA;AAC1D,IAAG,GAAA,CAAA,aAAA,CAAc,UAAA,EAAY,YAAA,CAAa,KAAK,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,UAAA,GAAa,UAAA;AAAA,EACvB;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,EAAO;AAC1B,IAAA,MAAM,QAAA,GAAgB,KAAA,CAAA,IAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AACnD,IAAG,GAAA,CAAA,aAAA,CAAc,QAAA,EAAU,UAAA,CAAW,KAAK,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAAA,EACrB;AAGA,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AACrC,IAAA,MAAM,SAAA,GAAiB,KAAA,CAAA,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACrD,IAAG,GAAA,CAAA,aAAA,CAAc,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,IAAI,IAAI,CAAA;AACvF,IAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAAA,EACtB;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAA,CAAa,OAAe,MAAA,EAAyB;AAC5D,EAAA,MAAM,MAAW,KAAA,CAAA,QAAA,CAAc,KAAA,CAAA,OAAA,CAAQ,MAAM,CAAA,EAAQ,KAAA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnE,EAAA,OAAO,GAAA,KAAQ,MAAO,CAAC,GAAA,CAAI,WAAW,IAAI,CAAA,IAAK,CAAM,KAAA,CAAA,UAAA,CAAW,GAAG,CAAA;AACrE;;;ACvOA,IAAMC,MAAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAI/C,IAAML,MAAAA,GAA2CM,eAAU,MAAM,CAAA,CAAA;AASjE,SAASC,SAAAA,GAAkB;AACzB,EAAA,OAAO,IAAIC,KAAAA,CAAM,EAAE,UAAA,EAAY,MAAM,CAAA;AACvC;AAGO,SAAS,mBAAmB,SAAA,EAA2B;AAC5D,EAAA,OAAO,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,UAAA,CAAA,GAAe,CAAA,EAAG,SAAS,CAAA,UAAA,CAAA;AAC3F;AAGO,SAAS,qBAAqB,SAAA,EAAyB;AAC5D,EAAA,IAAI;AACF,IAAGC,WAAO,kBAAA,CAAmB,SAAS,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,WAAA,CAAY,MAAc,MAAA,EAAmF;AACpH,EAAA,IAAI;AACF,IAAA,IAAI,CAAIA,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAM,GAAA,GAASA,iBAAa,IAAI,CAAA;AAChC,IAAA,IAAI,GAAA,CAAI,MAAA,GAASJ,MAAAA,CAAM,MAAA,GAAS,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,CAAA,EAAGA,OAAM,MAAM,CAAA,CAAE,MAAA,CAAOA,MAAK,GAAG,OAAO,IAAA;AAC1F,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAaA,MAAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,WAAA,GAAcA,OAAM,MAAA,GAAS,CAAA;AACnC,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,WAAA,GAAc,SAAA,EAAW,OAAO,IAAA;AACjD,IAAA,MAAM,MAAA,GAASE,WAAS,CAAE,MAAA,CAAO,IAAI,QAAA,CAAS,WAAA,EAAa,WAAA,GAAc,SAAS,CAAC,CAAA;AACnF,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,OAAA,EAAS,OAAO,IAAA;AACtC,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,CAAO,QAAA,EAAU,OAAO,IAAA;AAChD,IAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA;AACpD,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,WAAA,GAAc,SAAS,CAAA;AACpD,IAAA,IAAKP,OAAM,OAAO,CAAA,KAAM,MAAQ,MAAA,CAAO,KAAA,KAAU,GAAI,OAAO,IAAA;AAC5D,IAAA,MAAM,IAAA,GAAOO,SAAAA,EAAS,CAAE,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,YAAA,CAAa,IAAA,EAAc,IAAA,EAAgD,IAAA,EAAsC;AACxH,EAAA,IAAI;AAEF,IAAA,MAAM,SAAS,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,IAAI,EAAE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAO,IAAI,CAAA,GAAI,CAAA,CAAA,GAAK,CAAE,CAAC,CAAA;AAC3F,IAAA,MAAM,OAAA,GAAUA,SAAAA,EAAS,CAAE,IAAA,CAAK,MAAM,CAAA;AACtC,IAAA,MAAM,MAAA,GAASA,SAAAA,EAAS,CAAE,IAAA,CAAK;AAAA,MAC7B,MAAA,EAAQ,OAAA;AAAA,MACR,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,KAAA,EAAOP,MAAAA,CAAM,OAAO,CAAA,KAAM;AAAA,KACN,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC7B,IAAA,MAAA,CAAO,aAAA,CAAc,OAAO,MAAM,CAAA;AAClC,IAAGS,cAAeC,KAAA,CAAA,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,IAAA,CAAA;AAClC,IAAGD,kBAAc,GAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAACJ,QAAO,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/F,IAAGI,GAAA,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAaA,eAAsB,aAAA,CACpB,KAAA,EACA,IAAA,EACA,SAAA,EACgD;AAChD,EAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,EAAsB;AAC7C,EAAA,IAAI,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,IAAA;AAC/B,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,SAAS,OAAA,EAAQ;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,UAAA,EAAY,UAAA;AACrC,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,SAAA,EAAW,IAAA,EAAK,GAASC,cAAQ,SAAS,CAAA,GAAI,gBAAA,CAAiB,IAAI,CAAC,CAAA;AACpG,EAAA,MAAMC,UAAS,WAAA,CAAY,IAAA,EAAM,EAAE,QAAA,EAAU,eAAA,EAAiB,YAAY,CAAA;AAC1E,EAAA,IAAIA,OAAAA,EAAQ;AACV,IAAA,MAAMC,KAAAA,uBAAW,GAAA,EAA+B;AAChD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQD,OAAM,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQC,KAAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1E,IAAA,OAAOA,KAAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA+B;AAChD,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,EAAE,aAAA,EAAe,IAAA,CAAK,aAAA,EAAe,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,EAAC;AAE9F,MAAA,MAAM,KAAA,GAAQ,SACX,MAAA,CAAO,CAAC,MAAM,OAAO,CAAA,KAAM,YAAY,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CACnD,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,KAAA;AAClB,MAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,YAAA,CAAa,MAAM,EAAE,QAAA,EAAU,eAAA,EAAiB,UAAA,IAAc,MAAM,CAAA;AACpE,EAAA,OAAO,IAAA;AACT","file":"chunk-K2IWOZEQ.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as zlib from 'node:zlib';\nimport { Packr } from 'msgpackr';\nimport { parseGraph } from './serialize.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Binary graph snapshot — a derived, local **cache** beside `graph.json`.\n *\n * `graph.json` stays the canonical, committed, human-diffable artifact and the\n * only interchange format (`vg export` / `share` / `bundle` are unchanged); the\n * determinism contract attaches to it, not to this file. The snapshot exists\n * purely so hot paths (`vg ask`/`serve`/`code`, vgd session attach) skip the\n * large-string `JSON.parse` on load and the pretty-print on write — measured\n * ~2.6× faster cold load and ~4× faster encode on XL maps, at ~40% of the size.\n *\n * Robustness rules (each one keeps JSON as the unquestioned fallback):\n * - The loader trusts a snapshot only when its recorded (size, mtimeMs) of\n * the source `graph.json` still match — any rebuild or hand-edit of the\n * JSON silently invalidates it. Staleness never needs to parse the JSON.\n * - A CRC-32 over the payload rejects torn/corrupted files; any decode error\n * (unknown magic, short file, bad msgpack, version skew) returns null\n * rather than throwing, and the caller re-reads JSON and rewrites the\n * snapshot (\"self-healing\" — first load after upgrade migrates for free).\n * - Writes are atomic (temp + rename) and best-effort: a full disk or\n * read-only store must never fail a build or a query.\n * - The engine VERSION is recorded and must match: the msgpack record layout\n * tracks the in-memory graph shape, which may change between releases.\n *\n * Format: MAGIC (\"VGSNAP1\\0\") · u32LE header length · msgpack header\n * {engine, sourceSize, sourceMtimeMs, crc32} · msgpack graph payload.\n * Everything is explicit little-endian via DataView/Buffer — no platform\n * variance. msgpackr runs its pure-JS path (its native accelerator is an\n * optional dependency we do not rely on); a fresh Packr per encode/decode\n * keeps record-id assignment deterministic for identical input.\n */\n\nconst MAGIC = Buffer.from('VGSNAP1\\0', 'latin1');\n\n/** node:zlib gained crc32 in 22.2; fall back to a table crc for 22.0/22.1. */\nconst crc32: (data: Uint8Array) => number = zlib.crc32 ?? jsCrc32;\n\nlet crcTable: Uint32Array | null = null;\n\nfunction jsCrc32(data: Uint8Array): number {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n crcTable[n] = c >>> 0;\n }\n }\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\ninterface SnapshotHeader {\n engine: string;\n crc32: number;\n /**\n * True when the snapshot IS the map (global-store mode, no graph.json\n * beside it). False/absent = sidecar of a canonical graph.json, valid only\n * while that JSON's recorded stat still matches.\n */\n standalone?: boolean;\n sourceSize?: number;\n sourceMtimeMs?: number;\n}\n\n/** Sidecar path for a map file: `…/graph.json` → `…/graph.snap`. */\nexport function snapshotPathFor(graphPath: string): string {\n return graphPath.endsWith('.json') ? `${graphPath.slice(0, -5)}.snap` : `${graphPath}.snap`;\n}\n\nfunction newPackr(): Packr {\n return new Packr({ useRecords: true });\n}\n\n/** Msgpack payload bytes for a graph (exported for the determinism test). */\nexport function encodeGraphPayload(graph: VgGraph): Buffer {\n return Buffer.from(newPackr().pack(graph));\n}\n\n/**\n * Write the snapshot beside `graphPath`.\n *\n * Sidecar mode (default): call after `graph.json` is on disk — the header\n * records its stat so readers can cheaply detect staleness.\n * `standalone: true` (global-store mode): the snapshot IS the map; no\n * `graph.json` is required or consulted.\n * Best-effort: returns false (never throws) when the file can't be written.\n */\nexport function writeGraphSnapshot(\n graphPath: string,\n graph: VgGraph,\n opts: { standalone?: boolean } = {},\n): boolean {\n try {\n const payload = encodeGraphPayload(graph);\n let header: Buffer;\n if (opts.standalone) {\n header = newPackr().pack({\n engine: VERSION,\n crc32: crc32(payload),\n standalone: true,\n } satisfies SnapshotHeader);\n } else {\n const stat = fs.statSync(graphPath);\n header = newPackr().pack({\n engine: VERSION,\n sourceSize: stat.size,\n sourceMtimeMs: stat.mtimeMs,\n crc32: crc32(payload),\n } satisfies SnapshotHeader);\n }\n const lenBuf = Buffer.alloc(4);\n lenBuf.writeUInt32LE(header.length, 0);\n const file = snapshotPathFor(graphPath);\n const tmp = `${file}.${process.pid}.tmp`;\n try {\n fs.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, header, payload]));\n fs.renameSync(tmp, file);\n } catch (err) {\n fs.rmSync(tmp, { force: true });\n throw err;\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load the snapshot for `graphPath`, or null when it is absent, stale,\n * or corrupted.\n *\n * Sidecar snapshots additionally require their source `graph.json` to exist\n * with an unchanged stat AND an identical engine version — the JSON fallback\n * is free, so any doubt invalidates. Standalone snapshots are the map itself:\n * they are accepted on magic + CRC + a structural sanity check, including\n * across engine versions (msgpack embeds its record layout, so an older\n * snapshot decodes the same way an older committed graph.json would parse).\n */\nexport function readGraphSnapshot(graphPath: string): VgGraph | null {\n try {\n const file = snapshotPathFor(graphPath);\n if (!fs.existsSync(file)) return null;\n const raw = fs.readFileSync(file);\n if (raw.length < MAGIC.length + 4 || !raw.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = raw.readUInt32LE(MAGIC.length);\n const payloadStart = MAGIC.length + 4 + headerLen;\n if (payloadStart > raw.length) return null;\n const header = newPackr().unpack(raw.subarray(MAGIC.length + 4, payloadStart)) as SnapshotHeader;\n if (!header.standalone) {\n if (header.engine !== VERSION) return null;\n const sourceStat = fs.statSync(graphPath); // no source JSON → nothing to be a cache of\n if (header.sourceSize !== sourceStat.size || header.sourceMtimeMs !== sourceStat.mtimeMs) return null;\n }\n const payload = raw.subarray(payloadStart);\n if (crc32(payload) !== header.crc32) return null;\n const graph = newPackr().unpack(payload) as VgGraph;\n if (!graph || !Array.isArray(graph.nodes) || !Array.isArray(graph.edges)) return null;\n return graph;\n } catch {\n return null;\n }\n}\n\n/**\n * Does a map exist at `graphPath` in either representation — the canonical\n * `graph.json`, or a standalone binary snapshot (global-store mode)?\n * Cheap: reads only the snapshot header, never the payload or the JSON.\n */\nexport function mapFileExists(graphPath: string): boolean {\n if (fs.existsSync(graphPath)) return true;\n return readSnapshotHeader(snapshotPathFor(graphPath))?.standalone === true;\n}\n\n/**\n * Stat for \"did the map change on disk\" mtime tracking: the JSON when\n * present, else the standalone snapshot file. Throws when neither exists —\n * same contract callers had with `fs.statSync(graphPath)`.\n */\nexport function mapFileStat(graphPath: string): fs.Stats {\n try {\n return fs.statSync(graphPath);\n } catch (err) {\n const snap = snapshotPathFor(graphPath);\n if (fs.existsSync(snap)) return fs.statSync(snap);\n throw err;\n }\n}\n\n/** Parse just the envelope header of a snapshot file (null on any problem). */\nfunction readSnapshotHeader(file: string): SnapshotHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(4096);\n const read = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (read < MAGIC.length + 4 || !prefix.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = prefix.readUInt32LE(MAGIC.length);\n if (MAGIC.length + 4 + headerLen > read) return null;\n return newPackr().unpack(prefix.subarray(MAGIC.length + 4, MAGIC.length + 4 + headerLen)) as SnapshotHeader;\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\n/**\n * Load a map file, preferring the binary snapshot and self-healing it.\n * Fast path: valid snapshot (sidecar or standalone) → decode it. Fallback:\n * parse `graph.json`, then (best-effort) rewrite the sidecar so the next load\n * takes the fast path. Returns null only when neither representation yields a\n * graph — exactly the cases the pre-snapshot code treated as \"no graph\".\n */\nexport function loadGraphFileWithSnapshot(graphPath: string): VgGraph | null {\n const snap = readGraphSnapshot(graphPath);\n if (snap) return snap;\n let json: string;\n try {\n json = fs.readFileSync(graphPath, 'utf8');\n } catch {\n return null;\n }\n let graph: VgGraph;\n try {\n graph = parseGraph(json);\n } catch {\n return null;\n }\n writeGraphSnapshot(graphPath, graph);\n return graph;\n}\n","import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic Markdown summary (`GRAPH_REPORT.md`). Given a pinned\n * `generatedAt`, the report is byte-stable. Numbers are derived purely from the\n * graph, so the report can be regenerated from a committed `graph.json`.\n */\nexport function renderReport(graph: VgGraph): string {\n const { meta, provenance, nodes, edges } = graph;\n const lines: string[] = [];\n\n lines.push('# Code Graph Report');\n lines.push('');\n lines.push(`Generated by \\`vg\\` ${provenance.version} · schema \\`${graph.schemaVersion}\\``);\n lines.push('');\n lines.push('## Summary');\n lines.push('');\n lines.push(`- **Nodes:** ${meta.counts.nodes.toLocaleString('en-US')}`);\n lines.push(`- **Edges:** ${meta.counts.edges.toLocaleString('en-US')}`);\n lines.push(`- **Areas:** ${meta.counts.areas.toLocaleString('en-US')}`);\n lines.push(`- **Languages:** ${meta.languages.join(', ') || '—'}`);\n lines.push(`- **Clustering:** ${meta.cluster}`);\n lines.push(`- **Resolvers:** ${provenance.resolver.join(', ')}`);\n lines.push(`- **Edge kinds:** ${meta.edgeKinds.join(', ') || '—'}`);\n lines.push('');\n\n // Files by definition count.\n const fileNodes = nodes.filter((n) => n.kind === 'file');\n const defsByFile = new Map<string, number>();\n for (const n of nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n defsByFile.set(n.file, (defsByFile.get(n.file) ?? 0) + 1);\n }\n const topFiles = [...defsByFile.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 15);\n if (topFiles.length) {\n lines.push('## Largest files (by definitions)');\n lines.push('');\n lines.push('| File | Definitions |');\n lines.push('| --- | ---: |');\n for (const [file, count] of topFiles) lines.push(`| \\`${file}\\` | ${count} |`);\n lines.push('');\n }\n\n // Most-connected nodes (Phase 0 importance = normalised degree).\n const topNodes = nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 15);\n if (topNodes.length) {\n lines.push('## Most-connected definitions');\n lines.push('');\n lines.push('| Symbol | Kind | File | Importance |');\n lines.push('| --- | --- | --- | ---: |');\n for (const n of topNodes) {\n lines.push(\n `| \\`${n.qualifiedName}\\` | ${n.kind} | \\`${n.file}\\`:${n.span.start} | ${n.importance.toFixed(3)} |`,\n );\n }\n lines.push('');\n }\n\n // Edge-kind breakdown.\n const byKind = new Map<string, number>();\n for (const e of edges) byKind.set(e.kind, (byKind.get(e.kind) ?? 0) + 1);\n if (byKind.size) {\n lines.push('## Edges by kind');\n lines.push('');\n lines.push('| Kind | Count |');\n lines.push('| --- | ---: |');\n for (const [kind, count] of [...byKind.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(`| ${kind} | ${count} |`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push(`_Files: ${fileNodes.length} · Corpus: \\`${provenance.corpusHash.slice(0, 16)}…\\`_`);\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { stableStringify } from './serialize.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * `graph.html`: self-contained, dependency-free, deterministic overview.\n *\n * For small/medium maps we embed the full graph JSON for tooling.\n * For large maps (default: >5k nodes) we embed only a\n * **hub + area summary** so the HTML stays openable; full data stays in\n * graph.json / graph.db. Interactive WebGL (sigma.js) remains a follow-up.\n */\n\nconst EMBED_NODE_LIMIT = 5_000;\n\nexport function renderHtml(graph: VgGraph): string {\n const top = graph.nodes\n .filter((n) => n.kind !== 'file' && n.kind !== 'external')\n .sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName))\n .slice(0, 50);\n\n const areas = [...graph.areas]\n .sort((a, b) => b.size - a.size || a.id - b.id)\n .slice(0, 40);\n\n const rows = top\n .map(\n (n) =>\n `<tr><td><code>${esc(n.qualifiedName)}</code></td><td>${esc(n.kind)}</td>` +\n `<td><code>${esc(n.file)}</code>:${n.span.start}</td><td>${n.importance.toFixed(3)}</td></tr>`,\n )\n .join('\\n');\n\n const areaRows = areas\n .map(\n (a) =>\n `<tr><td>${a.id}</td><td><code>${esc(a.label)}</code></td>` +\n `<td>${a.size}</td><td>${a.cohesion.toFixed(3)}</td><td>${a.externalEdges}</td></tr>`,\n )\n .join('\\n');\n\n const large = graph.meta.counts.nodes > EMBED_NODE_LIMIT;\n const embedPayload = large\n ? {\n schemaVersion: graph.schemaVersion,\n generatedAt: graph.generatedAt,\n provenance: graph.provenance,\n meta: graph.meta,\n hubs: top.map((n) => ({\n id: n.id,\n name: n.qualifiedName,\n kind: n.kind,\n file: n.file,\n line: n.span.start,\n importance: n.importance,\n area: n.area,\n })),\n areas: areas.map((a) => ({\n id: a.id,\n label: a.label,\n size: a.size,\n cohesion: a.cohesion,\n externalEdges: a.externalEdges,\n })),\n note: `Full graph omitted (${graph.meta.counts.nodes} nodes > ${EMBED_NODE_LIMIT}). Use graph.json or .vibgrate/cache/graph.db.`,\n }\n : graph;\n\n const embedded = stableStringify(embedPayload, 0);\n const tier = graph.meta.analysisTier ?? 'full';\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>vg · code graph</title>\n<style>\n :root { color-scheme: light dark; }\n body { font: 14px/1.5 system-ui, sans-serif; margin: 2rem auto; max-width: 60rem; padding: 0 1rem; }\n h1 { font-size: 1.4rem; } h2 { font-size: 1.1rem; margin-top: 2rem; }\n table { border-collapse: collapse; width: 100%; }\n th, td { text-align: left; padding: 4px 8px; border-bottom: 1px solid #8884; }\n td:last-child, th:last-child { text-align: right; }\n .meta { color: #888; } code { font-size: 0.9em; }\n .banner { background: #8882; padding: 0.6rem 0.8rem; border-radius: 6px; margin: 1rem 0; }\n</style>\n</head>\n<body>\n<h1>vg · code graph</h1>\n<p class=\"meta\">${graph.meta.counts.nodes} nodes · ${graph.meta.counts.edges} edges ·\n${graph.meta.counts.areas} areas · ${esc(graph.meta.languages.join(', ') || '—')} ·\nclustering: ${esc(graph.meta.cluster)} · tier: ${esc(tier)} · vg ${esc(graph.provenance.version)}</p>\n${\n large\n ? `<p class=\"banner\">Large map (${graph.meta.counts.nodes} nodes): HTML shows hubs + areas only.\nFull graph remains in <code>graph.json</code> / <code>.vibgrate/cache/graph.db</code> (query via <code>vg serve</code>).</p>`\n : ''\n}\n<h2>Areas (subsystems)</h2>\n<table>\n<thead><tr><th>Id</th><th>Label</th><th>Size</th><th>Cohesion</th><th>External</th></tr></thead>\n<tbody>\n${areaRows || '<tr><td colspan=\"5\" class=\"meta\">no areas</td></tr>'}\n</tbody>\n</table>\n<h2>Most-connected definitions (hubs)</h2>\n<table>\n<thead><tr><th>Symbol</th><th>Kind</th><th>Location</th><th>Importance</th></tr></thead>\n<tbody>\n${rows}\n</tbody>\n</table>\n<p class=\"meta\">${large ? 'Summary payload' : 'Full graph'} embedded below for tooling.</p>\n<script type=\"application/json\" id=\"vg-graph\">\n${embedded}\n</script>\n</body>\n</html>\n`;\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Relevance-provider seam for ask / Task Capsule seed ranking.\n *\n * Since the 2026-08 relevance relocation, the separately installed local\n * module (`@vibgrate/relevance`, auto-provisioned by the CLI) IS the ranking\n * engine: `rankQuestion` hands it the ask plus a name-only symbol view of\n * the loaded graph and receives an ordered, provenance-annotated seed list\n * and the plain-language concept map. When the module is unavailable —\n * offline install failure, explicit decline, `VIBGRATE_NO_KERNEL=1`, or a\n * pre-ranking module version — callers fall back to the host's mechanical\n * exact-name matcher (engine/query.ts) and proceed unchanged.\n *\n * Loading mirrors the optional-embedder pattern (engine/embeddings.ts):\n * - `VIBGRATE_NO_KERNEL=1` disables the seam entirely.\n * - `VIBGRATE_RELEVANCE_PATH` points at a provider module (a file, or a\n * directory containing `index.js`).\n * - Otherwise the default module location is probed:\n * `$XDG_CACHE_HOME|~/.cache /vibgrate/modules/relevance/index.js`.\n * The module contract: it exports `createRelevanceProvider()` returning\n * `{ version(), analyzeQuery(q), tagNode?(input), rankSymbols?(q, symbols, opts) }`.\n *\n * Trust boundary: everything a module returns is sanitized here before it\n * can shape a capsule. A ranking may only ORDER symbols the loaded graph\n * actually has (`sanitizeRank`: unknown ids dropped, scores validated,\n * every printable string stripped of control characters and length-capped).\n * Every failure path degrades to `null` (→ mechanical fallback), never to an\n * error: the module is the brain, not a dependency.\n *\n * Determinism: given the same question, graph, and provider version, the\n * sanitized ranking is deterministic; the provider version is surfaced so\n * capsules can record it as ranking provenance.\n */\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\nexport interface RelevanceExpansion {\n /** Single lowercase word, ready for identifier-part matching. */\n term: string;\n /** The question token/phrase (or topic id) that produced it. */\n from: string;\n /** 0..1 relative confidence; scales the expansion's scoring contribution. */\n weight: number;\n}\n\nexport interface RelevanceTopic {\n id: string;\n /** 0..1, normalized within one analysis. */\n score: number;\n}\n\n/** One level of a matched taxonomy path, root-first. */\nexport interface RelevanceTaxonomyLevel {\n id: string;\n path: string;\n /** 0..1 — never lower than the levels beneath it. */\n score: number;\n /** This level's own vocabulary. */\n terms: string[];\n}\n\n/** A hierarchical match: the most specific node plus its ancestor chain. */\nexport interface RelevanceTaxonomyMatch {\n /** \"infrastructure/networking/dns/cname\" */\n path: string;\n levels: RelevanceTaxonomyLevel[];\n score: number;\n /** Absolute evidence behind the match, not relative to other matches. */\n evidence: number;\n /** What matched — \"~\" prefixes a fuzzy repair. */\n via: string[];\n /** The matched node's OWN vocabulary, for explaining the domain. */\n terms: string[];\n /** Filenames and extensions this node's work lives in, nearest first. */\n files: string[];\n /** Standards governing this node, current revision first. */\n standards: RelevanceStandard[];\n}\n\n/** A product the ask names, including through a misspelling. */\nexport interface RelevanceVendorMatch {\n name: string;\n from: string;\n node?: string;\n topic: string;\n score: number;\n /** Filenames and extensions this vendor's configuration lives in. */\n files: string[];\n}\n\n/** A standard governing the matched area, at the revision the pack tracks. */\nexport interface RelevanceStandard {\n name: string;\n publisher: string;\n node: string;\n /** \"standard\" or \"regulation\". */\n kind: string;\n /** Lowercase category slugs from the website's own vocabulary. */\n categories: string[];\n}\n\n/** A misspelling the provider resolved. */\nexport interface RelevanceCorrection {\n from: string;\n to: string;\n distance: number;\n}\n\nexport interface RelevanceAnalysis {\n version: string;\n topics: RelevanceTopic[];\n expansions: RelevanceExpansion[];\n /** Hierarchical matches, most specific first. Absent from older providers. */\n taxonomy?: RelevanceTaxonomyMatch[];\n vendors?: RelevanceVendorMatch[];\n corrections?: RelevanceCorrection[];\n /** Every file hint the analysis implies, most specific first. */\n files?: string[];\n /** Standards governing what the ask is about, most specific node first. */\n standards?: RelevanceStandard[];\n /** Deduped lowercase category slugs across those standards. */\n categories?: string[];\n}\n\n/** One graph symbol, as handed to the provider's ranker: identity and name\n * material only — never source contents. */\nexport interface RankableSymbol {\n id: string;\n name: string;\n qualifiedName: string;\n file: string;\n importance: number;\n}\n\nexport interface RankOptions {\n limit?: number;\n priorQuestion?: string | null;\n topicTags?: Record<string, readonly string[]> | null;\n}\n\nexport interface RankedSeed {\n id: string;\n score: number;\n why: string;\n}\n\n/** The provider's full ranking answer (schema 5), pre-sanitization. */\nexport interface RankResult {\n version: string;\n hasContent: boolean;\n seeds: RankedSeed[];\n conceptMap: string[];\n}\n\nexport interface RelevanceProvider {\n version(): string;\n analyzeQuery(question: string): RelevanceAnalysis;\n /** Optional build-time enrichment: deterministic topic tags for one node\n * (path + identifier evidence). Providers without it still work. */\n tagNode?(input: { qualifiedName: string; file: string }): string[];\n /**\n * Schema-5: rank the given symbols for one ask. When present, the module\n * IS the relevance engine — the host delegates seed selection here and\n * keeps only mechanical name matching as its module-less fallback. A\n * provider without it is treated as no ranking engine at all.\n */\n rankSymbols?(question: string, symbols: RankableSymbol[], opts?: RankOptions): RankResult;\n}\n\nfunction disabled(): boolean {\n const v = process.env.VIBGRATE_NO_KERNEL;\n return v === '1' || v === 'true';\n}\n\n/** Default install location for the optional relevance module (shared with\n * the install flow in install/relevance-module.ts). */\nexport function relevanceModuleDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'modules', 'relevance');\n}\n\nfunction defaultModulePath(): string {\n return path.join(relevanceModuleDir(), 'index.js');\n}\n\nfunction candidatePaths(): string[] {\n const custom = process.env.VIBGRATE_RELEVANCE_PATH;\n if (custom) {\n const p = path.resolve(custom);\n try {\n if (fs.statSync(p).isDirectory()) return [path.join(p, 'index.js')];\n } catch {\n /* fall through — treat as a file path */\n }\n return [p];\n }\n return [defaultModulePath()];\n}\n\nlet cached: RelevanceProvider | null | undefined;\n\n/** Reset the memoized provider (tests only). */\nexport function resetRelevanceProviderCache(): void {\n cached = undefined;\n}\n\n/**\n * Load the optional relevance provider. Memoized per process; returns `null`\n * when disabled, not installed, or the module fails to load or violates the\n * contract — callers treat `null` as \"no analysis\" and proceed unchanged.\n */\nexport async function loadRelevanceProvider(): Promise<RelevanceProvider | null> {\n if (cached !== undefined) return cached;\n cached = null;\n if (disabled()) return cached;\n for (const p of candidatePaths()) {\n if (!fs.existsSync(p)) continue;\n try {\n const mod = (await import(pathToFileURL(p).href)) as {\n createRelevanceProvider?: () => RelevanceProvider;\n };\n const provider = mod.createRelevanceProvider?.();\n if (provider && typeof provider.version === 'function' && typeof provider.analyzeQuery === 'function') {\n cached = provider;\n return cached;\n }\n } catch {\n // A broken module must never break ask/capsule — fall through to null.\n }\n }\n return cached;\n}\n\n/** Sanitized module ranking, ready for `queryGraph({ ranked })`. */\nexport interface SanitizedRank {\n version: string;\n hasContent: boolean;\n seeds: RankedSeed[];\n conceptMap: string[];\n}\n\nconst MAX_RANK_SEEDS = 64;\nconst MAX_CONCEPT_LINES = 24;\nconst MAX_WHY_LEN = 240;\nconst MAX_LINE_LEN = 400;\n\n/** Printable one-line string, control characters stripped, length-capped. */\nfunction cleanLine(raw: unknown, cap: number): string {\n return String(raw ?? '')\n .replace(/[\\u0000-\\u001F\\u007F]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, cap);\n}\n\n/**\n * Enforce the trust boundary on a provider ranking (exported for tests).\n * Seed ids must name symbols the LOADED graph actually has — a module can\n * order the host's own symbols, never invent one — and every string the\n * capsule will print is stripped and capped. Malformed entries drop; a\n * malformed envelope drops the whole ranking (→ mechanical fallback).\n */\nexport function sanitizeRank(raw: RankResult, validIds: ReadonlySet<string>): SanitizedRank | null {\n if (!raw || typeof raw.version !== 'string' || typeof raw.hasContent !== 'boolean') return null;\n if (!Array.isArray(raw.seeds) || !Array.isArray(raw.conceptMap)) return null;\n const seen = new Set<string>();\n const seeds: RankedSeed[] = [];\n for (const s of raw.seeds) {\n const id = typeof s?.id === 'string' ? s.id : '';\n const score = Number(s?.score);\n if (!id || !validIds.has(id) || seen.has(id)) continue;\n if (!Number.isFinite(score) || score <= 0) continue;\n seen.add(id);\n seeds.push({ id, score, why: cleanLine(s.why, MAX_WHY_LEN) });\n if (seeds.length >= MAX_RANK_SEEDS) break;\n }\n const conceptMap = raw.conceptMap\n .map((l) => cleanLine(l, MAX_LINE_LEN))\n .filter((l) => l.length > 0)\n .slice(0, MAX_CONCEPT_LINES);\n return { version: raw.version.slice(0, 120), hasContent: raw.hasContent, seeds, conceptMap };\n}\n\n/** Per-graph symbol view for the ranker, cached on graph object identity. */\nconst symbolViewCache = new WeakMap<object, { symbols: RankableSymbol[]; ids: Set<string> }>();\n\nfunction symbolViewOf(graph: {\n nodes: Array<{ id: string; name: string; qualifiedName: string; file: string; kind: string; importance: number }>;\n}): { symbols: RankableSymbol[]; ids: Set<string> } {\n const hit = symbolViewCache.get(graph);\n if (hit) return hit;\n const symbols: RankableSymbol[] = [];\n const ids = new Set<string>();\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n symbols.push({ id: n.id, name: n.name, qualifiedName: n.qualifiedName, file: n.file, importance: n.importance });\n ids.add(n.id);\n }\n const view = { symbols, ids };\n symbolViewCache.set(graph, view);\n return view;\n}\n\n/**\n * Rank a question over a graph's symbols via the installed module. Returns\n * `null` when no module is installed, the installed module predates the\n * ranking API, or its output fails sanitization — callers fall back to the\n * host's mechanical matcher and proceed unchanged. Every failure path is a\n * degrade, never an error.\n */\nexport async function rankQuestion(\n graph: { nodes: Array<{ id: string; name: string; qualifiedName: string; file: string; kind: string; importance: number }> },\n question: string,\n opts: { limit?: number; priorQuestion?: string | null; topicTags?: Map<string, readonly string[]> | null } = {},\n): Promise<SanitizedRank | null> {\n const provider = await loadRelevanceProvider();\n if (!provider || typeof provider.rankSymbols !== 'function') return null;\n try {\n const { symbols, ids } = symbolViewOf(graph);\n const topicTags = opts.topicTags ? Object.fromEntries(opts.topicTags) : null;\n const raw = provider.rankSymbols(question, symbols, {\n limit: opts.limit,\n priorQuestion: opts.priorQuestion ?? null,\n topicTags,\n });\n return sanitizeRank(raw, ids);\n } catch {\n return null;\n }\n}\n\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { serializeGraph } from './serialize.js';\nimport { mapFileExists, snapshotPathFor, writeGraphSnapshot } from './snapshot.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport { globalGraphPath, globalGraphPathForRef, repositoryStoreDir } from '../runtime/paths.js';\nimport { deleteTagsSidecarFor } from './relevance-enrich.js';\nimport { detectGitRef } from '../runtime/git-ref.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Graph artifact layout (Fusion Runtime Phase 1).\n *\n * By default the code map lives in the **global** application store\n * (XDG / Application Support), keyed by repository id — not inside the repo.\n * That keeps `vg` / `vg serve` / auto-refresh from dirtying the working tree.\n *\n * Legacy in-repo path `.vibgrate/graph.json` is still **read** when present\n * (migration), and is still the write target when:\n * - `VIBGRATE_GRAPH_IN_REPO=1` (or true/yes), or\n * - callers pass an explicit `graphPath` / `--graph`.\n *\n * `vg share` continues to opt into a committed in-repo map by writing under\n * `.vibgrate/` (and rewriting its gitignore).\n */\n\nexport interface WriteOptions {\n root: string;\n html?: boolean; // default true\n report?: boolean; // default true\n graphPath?: string; // override graph.json path\n}\n\nexport interface WrittenArtifacts {\n graphPath: string;\n reportPath?: string;\n htmlPath?: string;\n factsPath?: string;\n}\n\nexport function vibgrateDir(root: string): string {\n return path.join(root, '.vibgrate');\n}\n\n/** Historical in-repo map path (still read as a fallback). */\nexport function legacyGraphPath(root: string): string {\n return path.join(vibgrateDir(root), 'graph.json');\n}\n\n/**\n * When true, default writes go to `.vibgrate/graph.json` (pre–Phase-1 layout).\n * Useful for CI that asserts in-repo artifacts, and for `vg share` workflows.\n */\nexport function preferInRepoGraph(env: NodeJS.ProcessEnv = process.env): boolean {\n const v = env.VIBGRATE_GRAPH_IN_REPO?.trim().toLowerCase();\n return v === '1' || v === 'true' || v === 'yes';\n}\n\n/**\n * Default **write** path for the map. Global store unless the operator opts\n * into the legacy in-repo layout. When git is available, prefer a\n * branch-keyed snapshot (Fusion §4.1.1) so switching branches does not\n * overwrite another ref's on-disk map.\n */\nexport function defaultGraphPath(root: string, env: NodeJS.ProcessEnv = process.env): string {\n if (preferInRepoGraph(env)) return legacyGraphPath(root);\n const { ref, kind } = detectGitRef(root);\n if (kind !== 'none' && ref) return globalGraphPathForRef(root, ref, env);\n return globalGraphPath(root, 'current', env);\n}\n\n/**\n * Resolve where to **read** the map from.\n * Order: explicit override → legacy in-repo when `VIBGRATE_GRAPH_IN_REPO` is set\n * → branch-keyed global (if on a git ref) → `current` global snapshot →\n * legacy in-repo → default write path.\n *\n * The in-repo env short-circuit matters for CI and the release benchmark: they\n * force portable `.vibgrate/graph.json` artifacts and must not pay a synchronous\n * `git rev-parse` (or prefer a leftover global snapshot) on every resolve.\n */\nexport function resolveGraphPath(root: string, override?: string, env: NodeJS.ProcessEnv = process.env): string {\n if (override?.trim()) return path.resolve(override.trim());\n if (preferInRepoGraph(env)) {\n const legacy = legacyGraphPath(root);\n if (fs.existsSync(legacy)) return legacy;\n return legacy;\n }\n const { ref, kind } = detectGitRef(root);\n if (kind !== 'none' && ref) {\n const branchPath = globalGraphPathForRef(root, ref, env);\n if (mapFileExists(branchPath)) return branchPath;\n }\n const globalPath = globalGraphPath(root, 'current', env);\n if (mapFileExists(globalPath)) return globalPath;\n const legacy = legacyGraphPath(root);\n if (fs.existsSync(legacy)) return legacy;\n return defaultGraphPath(root, env);\n}\n\n/**\n * By default the graph artifacts are *local*: builds and auto-refreshes rewrite\n * them constantly, and without an ignore file every `vg ask`/`vg serve` leaves\n * the branch dirty (untracked or modified `.vibgrate/` files) — irritating for\n * humans and a source of junk commits from AI agents. So the first time vg\n * writes into `.vibgrate/` it also drops a `.gitignore` covering the graph\n * artifacts, the cache, and itself.\n *\n * Deliberately create-once: an existing `.vibgrate/.gitignore` is NEVER\n * touched, whatever its content — `vg share` owns it after opt-in (rewritten to\n * commit `graph.json`), and a user-managed file (even an empty one) is theirs.\n * Scanner artifacts meant for git (`baseline.json`, `standards.json`,\n * `attestation.intoto.jsonl`) are intentionally not listed.\n *\n * With the global store default, this gitignore is only created when something\n * is still written under `.vibgrate/` (in-repo mode or other in-repo writers).\n */\nconst DEFAULT_GITIGNORE = [\n '# Created by vg — local graph artifacts stay out of git by default.',\n '# Run `vg share` to commit the map for your team (it rewrites this file).',\n '# vg appends newly-introduced local artifacts to this list while this',\n '# header line stays; remove the header (or empty the file) to manage the',\n '# ignores yourself and vg will never touch it again.',\n '.gitignore',\n 'cache/',\n 'graph.json',\n 'graph.snap',\n 'graph.tags.snap',\n // Binary semantic index next to the map (never model-named; never under cache/).\n 'embeddings',\n 'graph.html',\n 'GRAPH_REPORT.md',\n 'facts.jsonl',\n 'mcp-navigation.json',\n // Machine-local telemetry the LSP/`vg code` accrue over time — never meant\n // for git: score-history.jsonl is per-machine trend data (lsp/score-history.ts),\n // run-outcomes.jsonl is per-machine agent-run telemetry (code/run-outcome.ts).\n // Neither is a snapshot artifact like scan_result.json/baseline.json, which\n // are intentionally left out of this list for a user to commit if they choose.\n 'score-history.jsonl',\n // Per-machine drifted-dependency snapshot behind the inline \"new\" marker\n // (lsp/inventory-history.ts). ignore.json is deliberately NOT here — an\n // ignore with a reason is a team decision that belongs in review.\n 'inline-inventory.json',\n 'run-outcomes.jsonl',\n // Standing approval rules are one developer's consent — sharing them via git\n // would silently grant their \"Always allow\" decisions to every teammate's\n // agent runs (code/approvals.ts).\n 'code-approvals.json',\n // Isolated worktree checkouts for VG Code worktree sessions — full working\n // copies that must never be committed into the repository that hosts them\n // (code/worktree-session.ts).\n 'worktrees',\n];\n\n/** Marks a .vibgrate/.gitignore as vg-authored (safe to keep current). */\nconst GITIGNORE_MARKER = /^# Created (once )?by vg\\b/;\n\nexport function ensureVibgrateGitignore(root: string): void {\n const file = path.join(vibgrateDir(root), '.gitignore');\n fs.mkdirSync(vibgrateDir(root), { recursive: true });\n if (!fs.existsSync(file)) {\n fs.writeFileSync(file, `${DEFAULT_GITIGNORE.join('\\n')}\\n`);\n return;\n }\n // A vg-authored .gitignore written before an entry joined DEFAULT_GITIGNORE\n // would keep tracking the newer machine-local files (e.g.\n // code-approvals.json — one developer's consent must not ride into the team\n // repo), so vg keeps ITS OWN file current: entries are appended while the\n // vg header is present. A file without the header — including an emptied\n // one — is the user's, and is never touched (the documented opt-out).\n const existing = fs.readFileSync(file, 'utf8');\n if (!GITIGNORE_MARKER.test(existing.split(/\\r?\\n/, 1)[0] ?? '')) return;\n const have = new Set(existing.split(/\\r?\\n/).map((l) => l.trim()));\n const missing = DEFAULT_GITIGNORE.filter((entry) => !entry.startsWith('#') && !have.has(entry));\n if (missing.length) {\n fs.writeFileSync(file, `${existing.replace(/\\n*$/, '\\n')}${missing.join('\\n')}\\n`);\n }\n}\n\n/**\n * Directory for companion artifacts (report, html, facts) next to the map.\n * Global maps → repository store root; in-repo maps → `.vibgrate/`.\n */\nexport function companionArtifactDir(root: string, graphPath: string, env: NodeJS.ProcessEnv = process.env): string {\n const resolved = path.resolve(graphPath);\n const legacy = path.resolve(legacyGraphPath(root));\n if (resolved === legacy) return vibgrateDir(root);\n const globalDefault = path.resolve(globalGraphPath(root, 'current', env));\n if (resolved === globalDefault) return repositoryStoreDir(root, env);\n // Custom --graph: keep companions next to the map file.\n return path.dirname(resolved);\n}\n\nexport function writeArtifacts(graph: VgGraph, options: WriteOptions): WrittenArtifacts {\n const graphPath = options.graphPath ?? defaultGraphPath(options.root);\n const companions = companionArtifactDir(options.root, graphPath);\n const inRepo = isPathInside(companions, options.root) || isPathInside(graphPath, options.root);\n\n fs.mkdirSync(path.dirname(graphPath), { recursive: true });\n fs.mkdirSync(companions, { recursive: true });\n\n // Only drop `.vibgrate/.gitignore` when we still touch the in-repo layout.\n if (inRepo && isPathInside(companions, vibgrateDir(options.root))) {\n ensureVibgrateGitignore(options.root);\n } else if (path.resolve(graphPath) === path.resolve(legacyGraphPath(options.root))) {\n ensureVibgrateGitignore(options.root);\n }\n\n // Global-store maps are machine-consumed only, so the snapshot IS the map\n // there — skipping the pretty-JSON serialize is the bulk of the write cost\n // on large repos. Everywhere a human (or git) can see the file — legacy\n // in-repo layout, VIBGRATE_GRAPH_IN_REPO, `vg share`, an explicit --graph\n // path — the canonical graph.json is still written, with the snapshot as a\n // sidecar cache.\n const storeMode = isPathInside(graphPath, repositoryStoreDir(options.root));\n\n // A (re)written graph at this path is a NEW graph: drop the relevance-tags\n // sidecar bound to the previous content so nothing stale can outlive its\n // graph (the sidecar would also self-invalidate via corpusHash, but a\n // removed/replaced graph must take its derived artifacts with it).\n deleteTagsSidecarFor(graphPath);\n\n if (storeMode) {\n if (!writeGraphSnapshot(graphPath, graph, { standalone: true })) {\n // Store not writable for the binary — fall back to the JSON write below\n // rather than losing the build.\n } else {\n // Drop any JSON left by an older CLI at this path so a downgrade can\n // never silently serve a stale map from beside a newer snapshot.\n fs.rmSync(graphPath, { force: true });\n }\n }\n\n if (!storeMode || !fs.existsSync(snapshotPathFor(graphPath))) {\n // Atomic write (temp + rename): `vg serve` hot-reloads the map on mtime\n // change, so a rebuild — including its own in-process auto-refresh — must\n // never expose a half-written file to a concurrent reader.\n const tmp = `${graphPath}.${process.pid}.tmp`;\n try {\n fs.writeFileSync(tmp, serializeGraph(graph));\n fs.renameSync(tmp, graphPath);\n } catch (err) {\n fs.rmSync(tmp, { force: true });\n throw err;\n }\n // Binary sidecar cache for fast loads; best-effort, JSON stays canonical.\n writeGraphSnapshot(graphPath, graph);\n }\n\n const written: WrittenArtifacts = {\n graphPath: storeMode && !fs.existsSync(graphPath) ? snapshotPathFor(graphPath) : graphPath,\n };\n\n if (options.report !== false) {\n const reportPath = path.join(companions, 'GRAPH_REPORT.md');\n fs.writeFileSync(reportPath, renderReport(graph));\n written.reportPath = reportPath;\n }\n\n if (options.html !== false) {\n const htmlPath = path.join(companions, 'graph.html');\n fs.writeFileSync(htmlPath, renderHtml(graph));\n written.htmlPath = htmlPath;\n }\n\n // facts.jsonl (deterministic NDJSON) when facts were derived.\n if (graph.facts && graph.facts.length) {\n const factsPath = path.join(companions, 'facts.jsonl');\n fs.writeFileSync(factsPath, graph.facts.map((f) => JSON.stringify(f)).join('\\n') + '\\n');\n written.factsPath = factsPath;\n }\n\n return written;\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","/**\n * Graph enrichment via the optional relevance provider: per-node TOPIC TAGS,\n * stored as a binary sidecar BOUND TO ONE EXACT GRAPH.\n *\n * When the installed provider exposes `tagNode`, every graph node gets a\n * deterministic topic tag set derived from path/identifier evidence\n * (\"src/payments/DirectDebitMandate.ts\" → [\"payments\"]). Query-time ranking\n * then adds a bounded affinity bonus when the question's inferred topics\n * intersect a node's tags.\n *\n * Storage contract (the part that keeps everything in step):\n *\n * - Tags NEVER enter `graph.json` — byte-identical output for identical\n * input is a hard invariant of `vg build`.\n * - The sidecar lives BESIDE the resolved graph artifact\n * (`<id>.graph.tags.snap` next to `<id>.graph.json` / `.graph.snap`).\n * Graphs are branch-keyed in the global repository store (Fusion §4.1.1),\n * so switching branches resolves a different graph file — and therefore a\n * different sidecar — with zero extra bookkeeping. Legacy in-repo maps get\n * `.vibgrate/graph.tags.snap` (gitignored alongside `graph.snap`).\n * - The binding is CONTENT identity, not path or time: the header records\n * the graph's `provenance.corpusHash` (blake3 over the included file set)\n * and is trusted only when it matches the LOADED graph. A rebuild, a\n * branch switch served through the same path, or a hand-swapped file all\n * invalidate it exactly; anything published downstream (vgd scans) that\n * carries the graph's corpusHash can verify the tags belong to it.\n * - The provider version and engine VERSION are recorded and must match — a\n * kernel/pack or CLI upgrade recomputes cleanly.\n * - Any mismatch, torn file (CRC), decode error, or provider fault degrades\n * to recompute-or-null; a sidecar problem must never break ranking.\n * - Writes are atomic (temp + rename) and best-effort; the graph write path\n * (engine/artifacts.ts) deletes the sidecar whenever the graph at that\n * path is rewritten or removed, so an orphaned sidecar cannot outlive its\n * graph.\n *\n * Format (mirrors engine/snapshot.ts conventions): MAGIC (\"VGTAGS1\\0\") ·\n * u32LE header length · msgpack header {engine, provider, corpusHash, crc32}\n * · msgpack payload (node id → tags, sorted by id). Explicit little-endian,\n * pure-JS msgpackr, fresh Packr per encode/decode — no platform variance.\n */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as zlib from 'node:zlib';\nimport { Packr } from 'msgpackr';\nimport { loadRelevanceProvider } from './relevance-provider.js';\nimport { resolveGraphPath } from './artifacts.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\nconst MAGIC = Buffer.from('VGTAGS1\\0', 'latin1');\n\n/** node:zlib gained crc32 in 22.2; engines pins Node >= 22 so it's present,\n * but guard anyway (same posture as engine/snapshot.ts). */\nconst crc32: (data: Uint8Array) => number = zlib.crc32 ?? (() => 0);\n\ninterface TagsHeader {\n engine: string;\n provider: string;\n corpusHash: string;\n crc32: number;\n}\n\nfunction newPackr(): Packr {\n return new Packr({ useRecords: true });\n}\n\n/** Sidecar path for a resolved graph artifact path. */\nexport function tagsSidecarPathFor(graphPath: string): string {\n return graphPath.endsWith('.json') ? `${graphPath.slice(0, -5)}.tags.snap` : `${graphPath}.tags.snap`;\n}\n\n/** Remove the tags sidecar for a graph path (graph rewrite/removal hook). */\nexport function deleteTagsSidecarFor(graphPath: string): void {\n try {\n fs.rmSync(tagsSidecarPathFor(graphPath), { force: true });\n } catch {\n /* best-effort — a locked file self-invalidates via corpusHash anyway */\n }\n}\n\nfunction readSidecar(file: string, expect: { provider: string; corpusHash: string }): Record<string, string[]> | null {\n try {\n if (!fs.existsSync(file)) return null;\n const raw = fs.readFileSync(file);\n if (raw.length < MAGIC.length + 4 || !raw.subarray(0, MAGIC.length).equals(MAGIC)) return null;\n const headerLen = raw.readUInt32LE(MAGIC.length);\n const headerStart = MAGIC.length + 4;\n if (raw.length < headerStart + headerLen) return null;\n const header = newPackr().unpack(raw.subarray(headerStart, headerStart + headerLen)) as TagsHeader;\n if (header.engine !== VERSION) return null;\n if (header.provider !== expect.provider) return null;\n if (header.corpusHash !== expect.corpusHash) return null;\n const payload = raw.subarray(headerStart + headerLen);\n if ((crc32(payload) >>> 0) !== (header.crc32 >>> 0)) return null;\n const tags = newPackr().unpack(payload) as Record<string, string[]>;\n return tags && typeof tags === 'object' ? tags : null;\n } catch {\n return null;\n }\n}\n\nfunction writeSidecar(file: string, meta: { provider: string; corpusHash: string }, tags: Record<string, string[]>): void {\n try {\n // Deterministic payload: sorted node ids.\n const sorted = Object.fromEntries(Object.entries(tags).sort(([a], [b]) => (a < b ? -1 : 1)));\n const payload = newPackr().pack(sorted);\n const header = newPackr().pack({\n engine: VERSION,\n provider: meta.provider,\n corpusHash: meta.corpusHash,\n crc32: crc32(payload) >>> 0,\n } satisfies TagsHeader);\n const lenBuf = Buffer.alloc(4);\n lenBuf.writeUInt32LE(header.length);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.${process.pid}.tmp`;\n fs.writeFileSync(tmp, Buffer.concat([MAGIC, lenBuf, Buffer.from(header), Buffer.from(payload)]));\n fs.renameSync(tmp, file);\n } catch {\n // Best-effort: a full disk or read-only store never fails a query.\n }\n}\n\n/**\n * Topic tags for every scorable node of THIS graph, computed through the\n * provider and cached in the graph's own sidecar. Returns `null` when no\n * provider (or none with `tagNode`) is active — callers treat that as \"no\n * enrichment\" and proceed unchanged.\n *\n * `graphPath` should be the path the graph was actually loaded from (the MCP\n * server and `vg ask` pass it); when omitted it is re-resolved from the root\n * with the same branch-keyed rules `loadGraph` uses, so the sidecar always\n * sits beside the graph the current workspace state resolves to.\n */\nexport async function loadTopicTags(\n graph: VgGraph,\n root: string,\n graphPath?: string,\n): Promise<Map<string, readonly string[]> | null> {\n const provider = await loadRelevanceProvider();\n if (!provider?.tagNode) return null;\n let providerVersion: string;\n try {\n providerVersion = provider.version();\n } catch {\n return null;\n }\n const corpusHash = graph.provenance?.corpusHash;\n if (!corpusHash) return null; // no content identity → no cacheable binding\n\n const file = tagsSidecarPathFor(graphPath?.trim() ? path.resolve(graphPath) : resolveGraphPath(root));\n const cached = readSidecar(file, { provider: providerVersion, corpusHash });\n if (cached) {\n const tags = new Map<string, readonly string[]>();\n for (const [id, t] of Object.entries(cached)) if (t.length) tags.set(id, t);\n return tags;\n }\n\n const record: Record<string, string[]> = {};\n const tags = new Map<string, readonly string[]>();\n try {\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const computed = provider.tagNode({ qualifiedName: node.qualifiedName, file: node.file }) ?? [];\n // Sanitize at the trust boundary: strings only, lowercased, capped.\n const clean = computed\n .filter((t) => typeof t === 'string' && t.length > 0)\n .map((t) => t.toLowerCase())\n .slice(0, 3);\n record[node.id] = clean;\n if (clean.length) tags.set(node.id, clean);\n }\n } catch {\n return null; // a faulting provider must never break ranking\n }\n writeSidecar(file, { provider: providerVersion, corpusHash }, record);\n return tags;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/savings.ts","../src/code/context.ts","../src/code/capsule.ts"],"names":["estimateTokens","normalize"],"mappings":"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","file":"chunk-LAYDXJEQ.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from './cache.js';\n\n/**\n * Usage-savings tracking (VG-DEVELOPMENT-PLAN §5) — local, privacy-safe, and\n * **opt-in**. We record *counts only* — never code, never the question text —\n * comparing the context tokens vg returned against a grep/read baseline estimate.\n * `vg savings` reports it with the assumptions shown; figures are labelled\n * estimates, never a hero number.\n *\n * Each entry also carries which path served the call (`source`: an MCP tool call\n * vs a `vg <subcommand>` CLI invocation) and, when known, a coarse `client` label\n * (the AI on the other end). That powers the command-vs-MCP split and the\n * per-client breakdown in `vg savings`, and is the basis for the opt-in\n * `vg serve --share-stats` upload (see ./stats-share.ts). Nothing here leaves the\n * machine unless the operator explicitly enables sharing.\n */\n\nconst LEDGER = 'savings.jsonl';\n// A conservative, documented estimate: tokens an agent reads per file it opens.\nexport const PER_FILE_TOKENS = 400;\n\n/** The tools whose grep/read token baseline the savings summary is computed from.\n * search_symbols belongs here: it is the direct grep replacement (the server\n * instructions steer agents to it INSTEAD of grep), yet it used to contribute\n * zero to the estimate — on search-heavy sessions most of the real saving went\n * uncounted. Its baseline is the same measure as query_graph's: the distinct\n * files its matches point at, at PER_FILE_TOKENS each. */\nexport const SAVINGS_TOOLS = new Set(['query_graph', 'get_node', 'search_symbols']);\n\n/**\n * How a navigation call reached the map:\n * - `mcp` — a tool call over the local `vg serve` MCP server;\n * - `cli` — a `vg <subcommand>` invocation that identified itself with `--client`.\n * Both are recorded into one ledger under a shared tool vocabulary (CLI\n * subcommands are normalised to their MCP tool names via CLI_TOOL_ALIASES), so\n * `(tool, source)` is the command-vs-MCP split and the token math stays unified.\n * Absent on ledger lines written before sources existed → read as `mcp` (the\n * only path that recorded then).\n */\nexport type Source = 'mcp' | 'cli';\n\n/**\n * Canonical tool name a CLI navigation subcommand maps to — the same vocabulary\n * the MCP tools use, so a `vg ask --client=claude` and an MCP `query_graph` call\n * land on one row distinguished only by `source`. A subcommand with no MCP twin\n * (e.g. `tree`) keeps its own name.\n */\nexport const CLI_TOOL_ALIASES: Readonly<Record<string, string>> = {\n ask: 'query_graph',\n show: 'get_node',\n impact: 'impact_of',\n path: 'find_path',\n hubs: 'list_hubs',\n areas: 'list_areas',\n tree: 'tree',\n};\n\n/**\n * Normalise a free-form client name (from `--client` or the MCP `initialize`\n * handshake) to a short, bounded, non-PII token: lowercase, `[a-z0-9._-]` only,\n * ≤ 40 chars. Never carries arbitrary user input into the ledger or an upload —\n * it is a coarse client label (e.g. `claude`, `cursor`, `cline`), not identity.\n * Returns `'unknown'` when nothing usable is provided.\n */\nexport function sanitizeClient(name: string | undefined | null): string {\n if (typeof name !== 'string') return 'unknown';\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || 'unknown';\n}\n\n/**\n * Outcome of a recorded navigation call:\n * - `complete` — returned results, with nothing capped or paginated;\n * - `partial` — returned results, but more were available/truncated;\n * - `miss` — returned no result (no match, not-found, not-connected).\n */\nexport type Outcome = 'complete' | 'partial' | 'miss';\n\nexport interface SavingEntry {\n ts: number; // epoch ms (runtime ledger state, not part of any artifact)\n tool: string;\n // Optional for back-compat with ledger lines written before outcomes existed;\n // an absent value is read as `complete` (those lines only recorded hits).\n outcome?: Outcome;\n vgTokens: number;\n baselineTokens: number;\n // Optional for back-compat: absent `source` reads as `mcp`. `client` is a\n // sanitized coarse label (see sanitizeClient) or absent when unidentified.\n source?: Source;\n client?: string;\n // The model that made the call, for per-model savings auditing. `provider` is\n // a coarse provider label (e.g. `anthropic`, `ollama`), `model` the sanitized\n // model slug. VG Code sets both so `vg savings` can break usage down per model.\n // Absent on lines from callers that don't identify a model.\n provider?: string;\n model?: string;\n // Wall time of the call, ms. Optional: absent on lines written before timing\n // existed (and on CLI-sourced lines) — absent means \"not measured\", never 0.\n ms?: number;\n}\n\n/**\n * Normalise a model slug to a bounded, non-PII token — like {@link sanitizeClient}\n * but keeping the `/` and `:` that model ids use (`anthropic/claude-3.5-sonnet`,\n * `qwen2.5-coder:7b`). Returns undefined when nothing usable is given.\n */\nexport function sanitizeModelId(name: string | undefined | null): string | undefined {\n if (typeof name !== 'string') return undefined;\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._:/-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60);\n return cleaned || undefined;\n}\n\n/**\n * Record a CLI navigation call (`vg <subcommand> --client=<ai>`) into the same\n * local ledger the MCP path uses. Only ever called when the caller passed\n * `--client` — i.e. an AI host explicitly identified itself — so a human's bare\n * `vg ask` still records nothing. Counts only; never the question or code.\n */\nexport function recordCliCall(\n root: string,\n entry: { tool: string; client?: string; provider?: string; model?: string; outcome: Outcome; vgTokens?: number; baselineFiles?: number },\n now: number,\n): void {\n recordSaving(\n root,\n {\n tool: entry.tool,\n source: 'cli',\n client: sanitizeClient(entry.client),\n provider: entry.provider ? sanitizeClient(entry.provider) : undefined,\n model: sanitizeModelId(entry.model),\n outcome: entry.outcome,\n vgTokens: entry.vgTokens ?? 0,\n baselineTokens: (entry.baselineFiles ?? 0) * PER_FILE_TOKENS,\n },\n now,\n );\n}\n\n/**\n * Absolute path of the local usage ledger for this repo. Exported so the serve\n * status display can tail it live (mcp/ledger-tail.ts) — the file itself stays\n * local-only (GUARDRAILS §3.4; upload is the separate opt-in stats-share path).\n */\nexport function savingsLedgerPath(root: string): string {\n return path.join(cacheDir(root), LEDGER);\n}\n\nfunction ledgerPath(root: string): string {\n return savingsLedgerPath(root);\n}\n\n/** Whether a savings ledger exists for this repo (i.e. `vg serve --savings` has recorded). */\nexport function savingsRecorded(root: string): boolean {\n return fs.existsSync(ledgerPath(root));\n}\n\n/**\n * Delete the recorded usage data for this repo: the ledger itself plus the\n * stats-share state that indexes into it (a byte offset into the ledger and the\n * random per-install id) — a stale offset against a fresh ledger would silently\n * skip new entries, and clearing \"my data\" should also reset the id. Everything\n * removed lives under `.vibgrate/cache/`; nothing else is touched. Returns\n * whether a ledger existed.\n */\nexport function clearSavings(root: string): boolean {\n const file = ledgerPath(root);\n const existed = fs.existsSync(file);\n fs.rmSync(file, { force: true });\n fs.rmSync(path.join(cacheDir(root), 'stats-share.json'), { force: true });\n return existed;\n}\n\nexport function recordSaving(root: string, entry: Omit<SavingEntry, 'ts'>, now: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const line = JSON.stringify({ ts: now, ...entry });\n fs.appendFileSync(ledgerPath(root), line + '\\n');\n } catch {\n /* never let telemetry break a tool call */\n }\n}\n\nexport interface SavingsReport {\n enabled: boolean;\n days: number;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n ratio: number;\n estCostVg: number;\n estCostBaseline: number;\n saved: number;\n rateLabel: string;\n}\n\n// Published-style input rate ($/1M tokens), shipped with the CLI. Labelled\n// estimate; the user can pass their own model rate.\nconst DEFAULT_RATE_PER_M = 3.0; // e.g. a mid-tier model input rate\nconst DEFAULT_RATE_LABEL = 'input @ $3/1M';\n\nexport function readSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): SavingsReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n let queries = 0;\n let vgTokens = 0;\n let baselineTokens = 0;\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n // The token-savings figures compare only the tools with a meaningful\n // grep/read baseline; the full per-command breakdown lives in readUsage.\n if (!SAVINGS_TOOLS.has(e.tool)) continue;\n queries++;\n vgTokens += e.vgTokens;\n baselineTokens += e.baselineTokens;\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const estCostVg = (vgTokens / 1e6) * ratePerM;\n const estCostBaseline = (baselineTokens / 1e6) * ratePerM;\n return {\n enabled: savingsRecorded(root),\n days,\n queries,\n vgTokens,\n baselineTokens,\n ratio: vgTokens > 0 ? Math.round((baselineTokens / vgTokens) * 100) / 100 : 0,\n estCostVg: round2(estCostVg),\n estCostBaseline: round2(estCostBaseline),\n saved: round2(estCostBaseline - estCostVg),\n rateLabel: DEFAULT_RATE_LABEL,\n };\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\n/** Token + cost savings attributed to one model (VG Code per-model auditing). */\nexport interface ModelSaving {\n /** `provider/model`, the ledger's per-model key. */\n key: string;\n provider: string;\n model: string;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n saved: number;\n}\n\n/**\n * Per-model breakdown of the token-savings figures — the basis of \"full savings\n * auditing per model\". Only entries that carry a `model` and are savings-baseline\n * tools contribute, so it lines up with the headline `readSavings` totals.\n * Sorted by dollars saved (desc), then key.\n */\nexport function readModelSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): ModelSaving[] {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byModel = new Map<string, { provider: string; model: string; queries: number; vg: number; base: number }>();\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff || !e.model || !SAVINGS_TOOLS.has(e.tool)) continue;\n const provider = e.provider ?? 'unknown';\n const key = `${provider}/${e.model}`;\n const row = byModel.get(key) ?? { provider, model: e.model, queries: 0, vg: 0, base: 0 };\n row.queries++;\n row.vg += e.vgTokens;\n row.base += e.baselineTokens;\n byModel.set(key, row);\n } catch {\n /* skip corrupt line */\n }\n }\n }\n return [...byModel.entries()]\n .map(([key, r]) => ({\n key,\n provider: r.provider,\n model: r.model,\n queries: r.queries,\n vgTokens: r.vg,\n baselineTokens: r.base,\n saved: round2(((r.base - r.vg) / 1e6) * ratePerM),\n }))\n .sort((a, b) => b.saved - a.saved || a.key.localeCompare(b.key));\n}\n\n/** Per-command usage stats over the ledger window (all recorded tools). */\nexport interface CommandStat {\n tool: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** (complete + partial) / calls, as a whole-number percentage. */\n successPct: number;\n /** Mean wall time over the calls that recorded one; null when none did. */\n avgMs: number | null;\n}\n\n/** Calls attributed to one dimension value (a source, or a client). */\nexport interface DimensionStat {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n successPct: number;\n}\n\nexport interface UsageReport {\n enabled: boolean;\n days: number;\n /** One row per tool used, ordered by call count (desc), then name. */\n commands: CommandStat[];\n /** The command-vs-MCP split: calls grouped by `source` (`cli` / `mcp`). */\n sources: DimensionStat[];\n /** Which AI is calling: calls grouped by coarse `client` label. */\n clients: DimensionStat[];\n /** Column sums across all commands. */\n totals: { calls: number; complete: number; partial: number; miss: number };\n /** The mean of the per-command success percentages (each command weighted equally). */\n avgSuccessPct: number;\n}\n\ninterface OutcomeCounts {\n complete: number;\n partial: number;\n miss: number;\n}\n\n/** Turn a name→outcome-count map into sorted DimensionStat rows. */\nfunction toDimensionStats(byKey: Map<string, OutcomeCounts>): DimensionStat[] {\n return [...byKey.entries()]\n .map(([key, r]) => {\n const calls = r.complete + r.partial + r.miss;\n return {\n key,\n calls,\n complete: r.complete,\n partial: r.partial,\n miss: r.miss,\n successPct: calls ? Math.round(((r.complete + r.partial) / calls) * 100) : 0,\n };\n })\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * Per-command breakdown of recorded navigation calls: how often each tool was\n * used and how those calls resolved (complete / partial / miss), plus column\n * totals and the average success rate. Complements the token-savings summary —\n * this counts *every* recorded tool, not just the grep-baseline ones.\n */\nexport function readUsage(root: string, days: number, now: number): UsageReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byTool = new Map<string, OutcomeCounts>();\n const bySource = new Map<string, OutcomeCounts>();\n const byClient = new Map<string, OutcomeCounts>();\n // Per-tool timing over the entries that recorded a duration (older ledger\n // lines and CLI-sourced calls carry none — \"not measured\", never zero).\n const msByTool = new Map<string, { sum: number; n: number }>();\n const bump = (m: Map<string, OutcomeCounts>, key: string, outcome: Outcome): void => {\n const row = m.get(key) ?? { complete: 0, partial: 0, miss: 0 };\n row[outcome]++;\n m.set(key, row);\n };\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n const outcome: Outcome = e.outcome ?? 'complete';\n // Back-compat: lines written before these dims existed are MCP calls\n // from an unidentified client.\n bump(byTool, e.tool, outcome);\n bump(bySource, e.source ?? 'mcp', outcome);\n bump(byClient, e.client ?? 'unknown', outcome);\n if (typeof e.ms === 'number' && e.ms >= 0) {\n const timing = msByTool.get(e.tool) ?? { sum: 0, n: 0 };\n timing.sum += e.ms;\n timing.n++;\n msByTool.set(e.tool, timing);\n }\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const commands: CommandStat[] = toDimensionStats(byTool).map((d) => {\n const timing = msByTool.get(d.key);\n return {\n tool: d.key,\n calls: d.calls,\n complete: d.complete,\n partial: d.partial,\n miss: d.miss,\n successPct: d.successPct,\n avgMs: timing && timing.n > 0 ? Math.round(timing.sum / timing.n) : null,\n };\n });\n const totals = commands.reduce(\n (t, c) => ({\n calls: t.calls + c.calls,\n complete: t.complete + c.complete,\n partial: t.partial + c.partial,\n miss: t.miss + c.miss,\n }),\n { calls: 0, complete: 0, partial: 0, miss: 0 },\n );\n const avgSuccessPct = commands.length\n ? Math.round(commands.reduce((s, c) => s + c.successPct, 0) / commands.length)\n : 0;\n return {\n enabled: savingsRecorded(root),\n days,\n commands,\n sources: toDimensionStats(bySource),\n clients: toDimensionStats(byClient),\n totals,\n avgSuccessPct,\n };\n}\n","/**\n * Graph-grounded context assembly for `vg code` (VG-CLI-CODE §3).\n *\n * A generic coding agent starts blind and reconstructs structure by grepping and\n * reading whole files — which is exactly what blows the context window and\n * degrades the model. This module instead uses the deterministic code graph to\n * hand the planner a *small, high-signal, budget-bounded* context: the symbols\n * most relevant to the instruction, their immediate relations, the blast radius\n * of changing them, and any declared facts (hard constraints) that must not be\n * dropped by later compaction. Deterministic given a graph + instruction, so it\n * is fully offline-testable and benchmarkable.\n */\n\nimport { extractLiteralNeedles, queryGraph } from '../engine/query.js';\nimport type { SanitizedRank } from '../engine/relevance-provider.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport type { CodeContext } from './types.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport { userAskFromInstruction } from '../engine/user-ask.js';\n\nexport interface BuildContextOptions {\n /** Approx token budget for the rendered block (default 3000). */\n budget?: number;\n /** How many retrieval seeds to expand (default 8). */\n seeds?: number;\n /** Impact BFS depth for the blast radius (default 2). */\n impactDepth?: number;\n /** Restrict the edit surface to these files (from `--file`), if given. */\n files?: string[];\n /** Sanitized module ranking (engine/relevance-provider.ts rankQuestion),\n * computed by the async caller over the user's ask — carries the seed\n * ordering AND the plain-language concept map. Absent → the mechanical\n * fallback ranks and the concept map is empty. */\n ranked?: SanitizedRank | null;\n}\n\n/**\n * Build the context block for a coding instruction. The ordering is\n * cache-stable by design (see router.ts): the invariant, repo-derived material\n * (facts, symbols, relations) comes first and the volatile instruction is\n * echoed last, so a provider's prompt cache can reuse the stable prefix across\n * turns.\n */\nexport function buildCodeContext(graph: VgGraph, instruction: string, options: BuildContextOptions = {}): CodeContext {\n const budget = options.budget ?? 3000;\n const seedLimit = options.seeds ?? 8;\n const impactDepth = options.impactDepth ?? 2;\n const index = indexFor(graph);\n\n // Hosts (VS Code panel) append a \"User attachments\" block with backticked\n // filenames/paths. Ranking and literal-locate pins must use only the user's\n // ask — otherwise `image.png` becomes a hard constraint that aborts the task.\n // The full instruction (with attachments) still goes in the Task section.\n const ask = userAskFromInstruction(instruction);\n\n // Retrieval seeds: the module ranking when the async caller supplied one\n // (options.ranked — the relevance engine), the mechanical fallback\n // otherwise. When `--file` narrows the surface, keep only seeds in those\n // files (but still let impact reach outside them, so the review is honest).\n const q = queryGraph(graph, ask, {\n budget: Math.floor(budget * 0.6),\n limit: seedLimit * 2,\n ranked: options.ranked,\n });\n let seeds = q.matches.map((m) => ({ node: m.node, why: m.why }));\n if (options.files && options.files.length) {\n const set = new Set(options.files.map(normalize));\n const inScope = seeds.filter((s) => set.has(normalize(s.node.file)));\n // If nothing matched inside the named files, keep the best global seeds but\n // still steer target files to what the caller asked for.\n if (inScope.length) seeds = inScope;\n }\n seeds = seeds.slice(0, seedLimit);\n\n // Blast radius: who depends on the seeds. This is the impact-aware review\n // signal — an edit to a hub is riskier and the context says so.\n const impacted = new Map<string, { node: GraphNode; via: string }>();\n for (const s of seeds) {\n const impact = impactOf(graph, s.node.id, { depth: impactDepth });\n for (const item of impact.affected.slice(0, 6)) {\n const node = index.node(item.id);\n if (node && !impacted.has(node.id)) impacted.set(node.id, { node, via: s.node.qualifiedName });\n }\n }\n\n // Target files: the seed files (or the explicit --file set), stable order.\n const targetFiles = options.files?.length\n ? [...new Set(options.files.map(normalize))].sort()\n : [...new Set(seeds.map((s) => s.node.file))].sort();\n\n // Pinned facts: declared invariants/contracts that touch the seeds. These are\n // hard constraints; they are surfaced explicitly and never summarized away.\n const seedIds = new Set(seeds.map((s) => s.node.id));\n const pinnedFacts = [\n ...literalNeedleFacts(ask),\n ...pinnedFactsFor(graph, seedIds),\n ];\n\n // The plain-language interpretation is authored by the relevance module\n // (and sanitized at the seam); the mechanical fallback has none to offer.\n const conceptMap = options.ranked?.conceptMap ?? [];\n const rendered = render(instruction, seeds, [...impacted.values()], targetFiles, pinnedFacts, conceptMap, index, budget);\n return {\n instruction,\n seeds,\n targetFiles,\n impacted: [...impacted.values()],\n pinnedFacts,\n conceptMap,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n };\n}\n\n/** Pin URL / quoted needles so the agent does not treat path tokens as symbols. */\nfunction literalNeedleFacts(ask: string): string[] {\n const needles = extractLiteralNeedles(ask);\n if (!needles.length) return [];\n return needles.map(\n (n) =>\n `literal-locate: search the workspace for the exact string \\`${n}\\` (use search_code with the quoted needle). This is not a graph symbol name. If there are zero hits, report that honestly and finish — do not invent an edit.`,\n );\n}\n\nfunction pinnedFactsFor(graph: VgGraph, seedIds: Set<string>): string[] {\n if (!graph.facts?.length) return [];\n const out: string[] = [];\n for (const f of graph.facts) {\n if (f.kind === 'characterization') continue; // keep hard constraints only\n if (!f.subjectIds.some((id) => seedIds.has(id))) continue;\n const subjects = f.subjectIds\n .map((id) => graph.nodes.find((n) => n.id === id)?.qualifiedName ?? id)\n .join(', ');\n out.push(`${f.kind}: ${subjects} — ${JSON.stringify(f.predicate)}`);\n }\n return out.sort().slice(0, 12);\n}\n\nfunction render(\n instruction: string,\n seeds: { node: GraphNode; why: string }[],\n impacted: { node: GraphNode; via: string }[],\n targetFiles: string[],\n pinnedFacts: string[],\n conceptMap: string[],\n index: ReturnType<typeof indexFor>,\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Repository context (from the deterministic code graph)');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n if (conceptMap.length) {\n lines.push('## How the ask was interpreted');\n for (const l of conceptMap) lines.push(l);\n lines.push('');\n }\n\n lines.push('## Relevant symbols');\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`### ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start}-${node.span.end})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = uniqueNames(index.callees(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n const callers = uniqueNames(index.callers(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n if (callees.length) block.push(`calls: ${callees.join(', ')}`);\n if (callers.length) block.push(`called by: ${callers.join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)}${node.isHub ? ' · hub (high blast radius)' : ''} · ${why}`);\n block.push('');\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 3) break;\n lines.push(...block);\n }\n\n if (impacted.length) {\n lines.push('## Blast radius (would be affected by a change here)');\n for (const { node, via } of impacted.slice(0, 10)) {\n lines.push(`- ${node.qualifiedName} (${node.file}:${node.span.start}) — depends on ${via}`);\n }\n lines.push('');\n }\n\n lines.push('## Files in scope for this edit');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction uniqueNames(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","/**\n * Source-bearing Context Capsule compiler (Fusion Runtime Phase 0).\n *\n * Today's {@link buildCodeContext} pays for graph metadata, then the model still\n * calls `read_file` — double payment. This module compiles a Context Capsule that\n * includes exact source ranges (from Tree-sitter spans already on graph nodes)\n * so the first inference can solve without navigation tool calls (ZNS@1 path).\n *\n * Deterministic given (graph, instruction, file contents, options). Injectable\n * `readFile` keeps unit tests offline and pure.\n *\n * Schema: docs/fusion/task-capsule-v0.schema.json\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport { hashString } from '../engine/hash.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport type { CodeContext } from './types.js';\nimport { buildCodeContext, type BuildContextOptions } from './context.js';\n\nexport const TASK_CAPSULE_SCHEMA_VERSION = 'task-capsule/0' as const;\n/** Frozen ranking policy id — bump when the heuristic changes (benchmark gate). */\n/** Bumped 2026.07.1: strip URL/quoted needles from seed ranking (no path-token false positives). */\n/** Bumped 2026.08.1: term roles (weak process verbs never seed alone), concept/bigram\n * expansion, multi-term coverage bonus, directory-segment evidence. */\n/** Bumped 2026.08.2: optional relevance-provider seam — sanitized provider expansions\n * join term preparation (own 0..1 weight capped at EXPANSION_WEIGHT; weak-provenance\n * dropped); provider version recorded as `relevanceVersion` provenance. Absent\n * provider = 2026.08.1 behaviour exactly — gated by the same corpus, dual-mode. */\n/** Bumped 2026.08.3: multi-turn field report (\"do we support direct debits?\" after a\n * stripe ask seeded direct* distractors). (a) Tokens consumed by a fired bigram\n * concept are demoted to the weak role — \"direct\" corroborates, never seeds.\n * (b) Conversation carry-over: the previous ask's content terms join ranking at\n * CARRY_WEIGHT when the caller passes `priorInstruction`. (c) A plain-language\n * \"how the ask was interpreted\" concept map is rendered for small local models.\n * No prior instruction + no bigram ask = 2026.08.2 behaviour exactly. */\n/** Bumped 2026.08.4: relevance relocation — the ranking engine (lexicon, term\n * roles, IDF, tiers, typo repair, morphology, diversification, concept map)\n * moved into the auto-provisioned relevance module behind the seam's\n * rankSymbols API; the host keeps mechanical name matching as the\n * module-less fallback. Seed content with the module active matches\n * 2026.08.3 + the coding-prompt-corpus improvements; the recorded\n * relevanceVersion says which engine ranked this capsule. */\nexport const CAPSULE_RANKING_VERSION = 'capsule-rank@2026.08.4' as const;\nexport const CAPSULE_COMPILER_ID = 'vg-task-capsule/0' as const;\n\nexport interface BuildCapsuleOptions extends BuildContextOptions {\n /**\n * Read file contents relative to the repository root. Required for source\n * slices; when omitted, the capsule still builds metadata + empty slices\n * (useful for schema/shape tests).\n */\n readFile?: (relativePath: string) => string | null;\n /** Extra lines of context around each symbol span (default 1). */\n padding?: number;\n /** Max source slices after merge (default 12). */\n maxSlices?: number;\n repositoryId?: string | null;\n /** Optional provenance from the Model Execution Profile / security ladder. */\n provenance?: CapsuleProvenanceExtras;\n /**\n * Extra pinned facts (e.g. high-confidence federation bridge edges) appended\n * after graph-derived facts. Secret-free, short strings only.\n */\n extraPinnedFacts?: string[];\n}\n\nexport interface CapsuleSymbolRef {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n span: { start: number; end: number };\n signature?: string | null;\n why: string;\n importance: number;\n}\n\nexport interface SourceSlice {\n file: string;\n start: number;\n end: number;\n content: string;\n contentHash: string;\n symbolIds: string[];\n}\n\nexport interface CapsuleRelationship {\n kind: 'calls' | 'called-by' | 'impacts' | 'contains' | 'other';\n from: string;\n to: string;\n}\n\nexport interface VerificationPlan {\n syntaxFiles: string[];\n suggestedTests: string[];\n notes: string[];\n}\n\nexport interface TaskCapsule {\n schemaVersion: typeof TASK_CAPSULE_SCHEMA_VERSION;\n instruction: string;\n primary: CapsuleSymbolRef[];\n supporting: CapsuleSymbolRef[];\n sourceSlices: SourceSlice[];\n relationships: CapsuleRelationship[];\n pinnedFacts: string[];\n /** Plain-language interpretation of the ask (concept expansions, relevance\n * topics, carried prior-turn terms) — see engine/query.ts conceptMapLines. */\n conceptMap: string[];\n targetFiles: string[];\n verificationPlan: VerificationPlan;\n rendered: string;\n tokensEstimate: number;\n provenance: {\n compiler: string;\n rankingVersion: string;\n graphCorpusHash: string | null;\n repositoryId: string | null;\n /** Model Execution Profile id when resolved (Fusion Phase 4/7). */\n modelProfileId?: string | null;\n /** Security tier for shell during this task. */\n securityTier?: string | null;\n /** Frozen policy / ranking patch id if any. */\n policyVersion?: string | null;\n /** Version of the optional relevance provider that widened seed\n * vocabulary for this capsule, or null when none was active. */\n relevanceVersion?: string | null;\n };\n}\n\nexport interface CapsuleProvenanceExtras {\n modelProfileId?: string | null;\n securityTier?: string | null;\n policyVersion?: string | null;\n}\n\n/** Host-safe capsule summary for VS Code / stream-json capsule transparency. */\nexport interface CapsuleSummary {\n schemaVersion: string;\n instruction: string;\n primary: Array<{ qualifiedName: string; file: string; kind: string; why: string }>;\n supporting: Array<{ qualifiedName: string; file: string; kind: string; why: string }>;\n sourceSliceCount: number;\n sourceFiles: string[];\n tokensEstimate: number;\n rankingVersion: string;\n /**\n * How the ask was interpreted, ready to show a human: the capsule's concept\n * map with the model-facing seed-notation legend dropped and the leading\n * \"- \" bullet stripped. Empty when no relevance engine widened the ask.\n */\n interpretation: string[];\n /** Truncated rendered capsule for display (not the full prompt dump). */\n preview: string;\n}\n\n/**\n * The concept map, projected for a human surface. The rendered capsule ends its\n * concept map with a notation legend that exists so a small local model can\n * decode the `a→b` slugs on each seed line; a terminal or panel reader has the\n * `why` strings spelled out next to the symbol, so the legend is noise there.\n */\nfunction interpretationFor(conceptMap: string[]): string[] {\n return conceptMap\n .filter((line) => !/^\\s*-?\\s*Seed notation\\b/i.test(line))\n .map((line) => line.replace(/^\\s*-\\s+/, '').trim())\n .filter(Boolean);\n}\n\n/** Host-safe capsule summary (capsule transparency UI / stream-json). */\nexport function summarizeCapsule(capsule: TaskCapsule): CapsuleSummary {\n const sourceFiles = [...new Set(capsule.sourceSlices.map((s) => s.file))].sort();\n const preview = capsule.rendered.length > 4000 ? `${capsule.rendered.slice(0, 4000)}\\n… (truncated)` : capsule.rendered;\n return {\n schemaVersion: capsule.schemaVersion,\n instruction: capsule.instruction,\n primary: capsule.primary.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind, why: p.why })),\n supporting: capsule.supporting.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind, why: p.why })),\n sourceSliceCount: capsule.sourceSlices.length,\n sourceFiles,\n tokensEstimate: capsule.tokensEstimate,\n rankingVersion: capsule.provenance.rankingVersion,\n interpretation: interpretationFor(capsule.conceptMap),\n preview,\n };\n}\n\n/**\n * Interpretation lines shown before the seeds. Matches the VS Code panel's cap\n * so the two surfaces explain an ask the same way. Three was too few in\n * practice: the concept map orders broad taxonomy lines ahead of the specific\n * ones, so a typo repair (\"read \\\"chekout\\\" as \\\"checkout\\\"\") — the line a\n * reader who typed the typo most needs — fell past the cut.\n */\nconst TRANSPARENCY_INTERPRETATION_LINES = 6;\n/** Seeds shown with their match provenance. */\nconst TRANSPARENCY_SEED_LINES = 3;\n\n/**\n * The capsule transparency block for a text surface: how the ask was read, and\n * which symbols that reached, with the reason each one matched.\n *\n * Returns indented, ready-to-print lines (the caller applies dimming). Both\n * sections are capped — a coding session prints one of these per turn, and the\n * complete block already travels inside the capsule itself. Empty when there is\n * nothing to explain (no relevance engine active and no seeds).\n */\nexport function capsuleTransparencyLines(summary: CapsuleSummary): string[] {\n const lines: string[] = [];\n\n const interpretation = summary.interpretation ?? [];\n for (const line of interpretation.slice(0, TRANSPARENCY_INTERPRETATION_LINES)) {\n lines.push(` read: ${line}`);\n }\n const hiddenInterpretation = interpretation.length - TRANSPARENCY_INTERPRETATION_LINES;\n if (hiddenInterpretation > 0) lines.push(` read: … ${hiddenInterpretation} more`);\n\n const seeds = (summary.primary ?? []).filter((p) => p.qualifiedName);\n for (const seed of seeds.slice(0, TRANSPARENCY_SEED_LINES)) {\n // An external/module node carries no file of its own — no dangling separator.\n const where = seed.file ? ` · ${seed.file}` : '';\n const why = seed.why ? ` — ${seed.why}` : '';\n lines.push(` seed: ${seed.qualifiedName}${where}${why}`);\n }\n const hiddenSeeds = seeds.length - TRANSPARENCY_SEED_LINES;\n if (hiddenSeeds > 0) lines.push(` seed: … ${hiddenSeeds} more`);\n\n return lines;\n}\n\n/**\n * Compile a source-bearing Context Capsule. Reuses the same seed / impact /\n * fact-pinning path as {@link buildCodeContext}, then attaches exact source\n * slices and a verification sketch.\n */\nexport function buildTaskCapsule(graph: VgGraph, instruction: string, options: BuildCapsuleOptions = {}): TaskCapsule {\n const base = buildCodeContext(graph, instruction, options);\n const padding = options.padding ?? 1;\n const maxSlices = options.maxSlices ?? 12;\n const budget = options.budget ?? 3000;\n const index = indexFor(graph);\n\n const primary = base.seeds.map((s) => toRef(s.node, s.why));\n const primaryIds = new Set(primary.map((p) => p.id));\n\n const supporting: CapsuleSymbolRef[] = [];\n for (const { node, via } of base.impacted) {\n if (primaryIds.has(node.id)) continue;\n supporting.push(toRef(node, `depends on ${via}`));\n }\n\n const relationships = collectRelationships(base, index);\n const sourceSlices = options.readFile\n ? buildSourceSlices(\n [...base.seeds.map((s) => s.node), ...base.impacted.map((i) => i.node)],\n options.readFile,\n padding,\n maxSlices,\n )\n : [];\n\n const extraFacts = (options.extraPinnedFacts ?? []).filter((f) => typeof f === 'string' && f.trim());\n const pinnedFacts = [...base.pinnedFacts, ...extraFacts];\n const verificationPlan = buildVerificationPlan(graph, base);\n const rendered = renderCapsule(instruction, primary, supporting, sourceSlices, pinnedFacts, base.conceptMap, base.targetFiles, verificationPlan, relationships, budget);\n\n return {\n schemaVersion: TASK_CAPSULE_SCHEMA_VERSION,\n instruction,\n primary,\n supporting,\n sourceSlices,\n relationships,\n pinnedFacts,\n conceptMap: base.conceptMap,\n targetFiles: base.targetFiles,\n verificationPlan,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n provenance: {\n compiler: CAPSULE_COMPILER_ID,\n rankingVersion: CAPSULE_RANKING_VERSION,\n graphCorpusHash: graph.provenance?.corpusHash ?? null,\n repositoryId: options.repositoryId ?? null,\n modelProfileId: options.provenance?.modelProfileId ?? null,\n securityTier: options.provenance?.securityTier ?? null,\n policyVersion: options.provenance?.policyVersion ?? null,\n relevanceVersion: options.ranked?.version ?? null,\n },\n };\n}\n\n/**\n * Project a capsule into the legacy {@link CodeContext} shape so the existing\n * agent prompt path can consume it without a full rewrite (A/B flag).\n */\nexport function capsuleToCodeContext(capsule: TaskCapsule): CodeContext {\n return {\n instruction: capsule.instruction,\n seeds: capsule.primary.map((p) => ({\n node: {\n id: p.id,\n qualifiedName: p.qualifiedName,\n kind: p.kind,\n file: p.file,\n span: p.span,\n signature: p.signature ?? undefined,\n importance: p.importance,\n } as GraphNode,\n why: p.why,\n })),\n targetFiles: capsule.targetFiles,\n conceptMap: capsule.conceptMap,\n impacted: capsule.supporting.map((s) => ({\n node: {\n id: s.id,\n qualifiedName: s.qualifiedName,\n kind: s.kind,\n file: s.file,\n span: s.span,\n signature: s.signature ?? undefined,\n importance: s.importance,\n } as GraphNode,\n via: s.why.replace(/^depends on /, ''),\n })),\n pinnedFacts: capsule.pinnedFacts,\n rendered: capsule.rendered,\n tokensEstimate: capsule.tokensEstimate,\n };\n}\n\nfunction toRef(node: GraphNode, why: string): CapsuleSymbolRef {\n return {\n id: node.id,\n qualifiedName: node.qualifiedName,\n kind: node.kind,\n file: normalize(node.file),\n span: { start: node.span.start, end: node.span.end },\n signature: node.signature ?? null,\n why,\n importance: node.importance,\n };\n}\n\nfunction collectRelationships(\n base: CodeContext,\n index: ReturnType<typeof indexFor>,\n): CapsuleRelationship[] {\n const out: CapsuleRelationship[] = [];\n const seen = new Set<string>();\n const push = (kind: CapsuleRelationship['kind'], from: string, to: string) => {\n const key = `${kind}|${from}|${to}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({ kind, from, to });\n };\n\n for (const { node } of base.seeds) {\n for (const c of index.callees(node.id).slice(0, 6)) {\n push('calls', node.qualifiedName, c.node.qualifiedName);\n }\n for (const c of index.callers(node.id).slice(0, 6)) {\n push('called-by', node.qualifiedName, c.node.qualifiedName);\n }\n }\n for (const { node, via } of base.impacted.slice(0, 10)) {\n push('impacts', via, node.qualifiedName);\n }\n\n // Stable order for determinism.\n return out.sort((a, b) => a.kind.localeCompare(b.kind) || a.from.localeCompare(b.from) || a.to.localeCompare(b.to));\n}\n\nfunction buildSourceSlices(\n nodes: GraphNode[],\n readFile: (relativePath: string) => string | null,\n padding: number,\n maxSlices: number,\n): SourceSlice[] {\n // Prefer concrete symbols over file/module containers for source evidence.\n const eligible = nodes.filter((n) => !['file', 'module', 'package'].includes(n.kind));\n const byFile = new Map<string, GraphNode[]>();\n for (const n of eligible) {\n const file = normalize(n.file);\n const list = byFile.get(file) ?? [];\n list.push(n);\n byFile.set(file, list);\n }\n\n type Range = { file: string; start: number; end: number; symbolIds: string[]; score: number };\n const ranges: Range[] = [];\n\n for (const [file, fileNodes] of [...byFile.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n const sorted = [...fileNodes].sort((a, b) => a.span.start - b.span.start || b.importance - a.importance);\n let current: Range | null = null;\n for (const n of sorted) {\n const start = Math.max(1, n.span.start - padding);\n const end = n.span.end + padding;\n const score = n.importance + (n.isHub ? 0.25 : 0);\n if (current && current.file === file && start <= current.end + 2) {\n current.end = Math.max(current.end, end);\n current.symbolIds.push(n.id);\n current.score = Math.max(current.score, score);\n } else {\n if (current) ranges.push(current);\n current = { file, start, end, symbolIds: [n.id], score };\n }\n }\n if (current) ranges.push(current);\n }\n\n ranges.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file) || a.start - b.start);\n\n const slices: SourceSlice[] = [];\n for (const range of ranges) {\n if (slices.length >= maxSlices) break;\n const raw = readFile(range.file);\n if (raw === null) continue;\n const lines = raw.split('\\n');\n const start = Math.min(range.start, lines.length);\n const end = Math.min(range.end, lines.length);\n if (start < 1 || end < start) continue;\n const content = lines.slice(start - 1, end).join('\\n');\n slices.push({\n file: range.file,\n start,\n end,\n content,\n contentHash: hashString(content),\n symbolIds: [...new Set(range.symbolIds)].sort(),\n });\n }\n\n // Stable final order: file then start line (score only used for selection).\n return slices.sort((a, b) => a.file.localeCompare(b.file) || a.start - b.start);\n}\n\nfunction buildVerificationPlan(graph: VgGraph, base: CodeContext): VerificationPlan {\n const syntaxFiles = [...base.targetFiles].sort();\n const seedIds = new Set(base.seeds.map((s) => s.node.id));\n const suggestedTests: string[] = [];\n\n for (const n of graph.nodes) {\n if (n.kind !== 'test') continue;\n // Prefer tests that share a file with seeds or whose name mentions a seed.\n const sameFile = base.seeds.some((s) => normalize(s.node.file) === normalize(n.file));\n const nameHit = base.seeds.some((s) => n.qualifiedName.toLowerCase().includes(s.node.name.toLowerCase()));\n if (sameFile || nameHit || seedIds.has(n.id)) {\n suggestedTests.push(n.qualifiedName);\n }\n }\n suggestedTests.sort();\n\n const notes: string[] = [];\n if (!suggestedTests.length) {\n notes.push('No graph-linked tests found for seed symbols; run the nearest project test command after apply.');\n }\n if (base.impacted.some((i) => i.node.isHub || i.node.importance >= 0.7)) {\n notes.push('High-importance dependents in blast radius — prefer targeted tests before a full build.');\n }\n\n return {\n syntaxFiles,\n suggestedTests: suggestedTests.slice(0, 12),\n notes,\n };\n}\n\nfunction renderCapsule(\n instruction: string,\n primary: CapsuleSymbolRef[],\n supporting: CapsuleSymbolRef[],\n slices: SourceSlice[],\n pinnedFacts: string[],\n conceptMap: string[],\n targetFiles: string[],\n verification: VerificationPlan,\n relationships: CapsuleRelationship[],\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Context capsule (source-bearing, from the deterministic code graph)');\n lines.push('');\n lines.push('Use the exact source evidence below. Search or read outside it only if this capsule is insufficient.');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n // Rendered before the symbol list on purpose: a small local model reads the\n // interpretation first, so the `a→b` provenance slugs on each seed line are\n // decodable instead of noise.\n if (conceptMap.length) {\n lines.push('## How the ask was interpreted');\n for (const l of conceptMap) lines.push(l);\n lines.push('');\n }\n\n lines.push('## Primary symbols');\n for (const s of primary) {\n lines.push(`- ${s.qualifiedName} (${s.kind}, ${s.file}:${s.span.start}-${s.span.end})${s.signature ? ` — \\`${s.signature}\\`` : ''} — ${s.why}`);\n }\n lines.push('');\n\n if (supporting.length) {\n lines.push('## Supporting / blast radius');\n for (const s of supporting.slice(0, 10)) {\n lines.push(`- ${s.qualifiedName} (${s.file}:${s.span.start}) — ${s.why}`);\n }\n lines.push('');\n }\n\n if (relationships.length) {\n lines.push('## Relationships');\n for (const r of relationships.slice(0, 24)) {\n lines.push(`- ${r.kind}: ${r.from} → ${r.to}`);\n }\n lines.push('');\n }\n\n lines.push('## Exact source evidence');\n if (!slices.length) {\n lines.push('_No source slices available (file reader missing or spans unreadable)._');\n lines.push('');\n } else {\n let included = 0;\n for (const slice of slices) {\n const block = [\n `### ${slice.file}:${slice.start}-${slice.end}`,\n `\\`\\`\\`${langFor(slice.file)}`,\n slice.content,\n '```',\n '',\n ];\n const candidate = [...lines, ...block, '## Task', instruction].join('\\n');\n if (estimateTokens(candidate) > budget && included > 0) break;\n lines.push(...block);\n included += 1;\n }\n }\n\n lines.push('## Files in scope');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Verification plan');\n for (const f of verification.syntaxFiles) lines.push(`- syntax: ${f}`);\n for (const t of verification.suggestedTests) lines.push(`- test: ${t}`);\n for (const n of verification.notes) lines.push(`- note: ${n}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction langFor(file: string): string {\n const ext = file.split('.').pop()?.toLowerCase() ?? '';\n const map: Record<string, string> = {\n ts: 'ts',\n tsx: 'tsx',\n js: 'js',\n jsx: 'jsx',\n mjs: 'js',\n cjs: 'js',\n py: 'python',\n rs: 'rust',\n go: 'go',\n java: 'java',\n cs: 'csharp',\n md: 'md',\n json: 'json',\n };\n return map[ext] ?? '';\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n// Re-export query touch so tree-shaking keeps the dependency explicit for tests.\nexport const __testing = { queryGraph, impactOf };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/relations.ts","../src/engine/user-ask.ts","../src/engine/query.ts","../src/engine/impact.ts"],"names":["push","text","round"],"mappings":"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","file":"chunk-NQU6E6OG.js","sourcesContent":["import type { EdgeKind, GraphEdge, GraphNode, VgGraph } from '../schema.js';\n\n/** Indexes over a graph for O(1) neighbor lookups (built once per command). */\nexport class GraphIndex {\n readonly nodeById = new Map<string, GraphNode>();\n private outById = new Map<string, GraphEdge[]>();\n private inById = new Map<string, GraphEdge[]>();\n\n constructor(readonly graph: VgGraph) {\n for (const n of graph.nodes) this.nodeById.set(n.id, n);\n for (const e of graph.edges) {\n push(this.outById, e.src, e);\n push(this.inById, e.dst, e);\n }\n }\n\n out(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.outById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n in(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.inById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n node(id: string): GraphNode | undefined {\n return this.nodeById.get(id);\n }\n\n /**\n * Resolved nodes called by `id` — invocations (`call`) plus structural\n * dependency references (`references`, e.g. a constructor-injected field's\n * type), since both represent real usage a caller/impact question cares\n * about. `references` is otherwise only emitted by the precise SCIP/tsc\n * rungs and (for Java DI wiring) the heuristic rung — never a guess.\n */\n callees(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.out(id).filter(isUsageEdge), 'dst');\n }\n\n /** Resolved nodes that call or structurally reference `id`. */\n callers(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.in(id).filter(isUsageEdge), 'src');\n }\n\n private resolveTargets(edges: GraphEdge[], end: 'src' | 'dst') {\n const out: { edge: GraphEdge; node: GraphNode }[] = [];\n for (const e of edges) {\n const node = this.nodeById.get(e[end]);\n if (node) out.push({ edge: e, node });\n }\n return out;\n }\n}\n\nconst USAGE_KINDS: ReadonlySet<EdgeKind> = new Set(['call', 'references']);\nfunction isUsageEdge(e: GraphEdge): boolean {\n return USAGE_KINDS.has(e.kind);\n}\n\nfunction push(map: Map<string, GraphEdge[]>, key: string, value: GraphEdge): void {\n const list = map.get(key);\n if (list) list.push(value);\n else map.set(key, [value]);\n}\n\n/**\n * Memoized `GraphIndex`, keyed on the graph object's identity.\n *\n * The index (node-by-id + in/out adjacency) is a pure function of the graph's\n * content, and every read path rebuilds it from scratch — an O(nodes + edges)\n * pass that, on a large map, costs hundreds of milliseconds *per query*. Under\n * `vg serve` the same parsed graph object is reused across many tool calls\n * (`GraphSource` caches it by file mtime and only replaces the reference when\n * `graph.json` actually changes), so rebuilding the index on every call is pure\n * waste. Keying a `WeakMap` on that object identity builds the index once and\n * reuses it until the file is rebuilt — at which point `GraphSource` hands back a\n * *new* object, this map misses, and the stale index is collected with the old\n * graph. Correct and stale-safe by construction: a different graph is a\n * different object, so there is no cross-graph reuse and nothing to invalidate.\n *\n * `GraphIndex` is read-only (no method mutates its maps), so sharing one\n * instance across callers is safe.\n */\nconst INDEX_CACHE = new WeakMap<VgGraph, GraphIndex>();\n\nexport function indexFor(graph: VgGraph): GraphIndex {\n let idx = INDEX_CACHE.get(graph);\n if (!idx) {\n idx = new GraphIndex(graph);\n INDEX_CACHE.set(graph, idx);\n }\n return idx;\n}\n","/**\n * Split the user's ask from host-injected attachment metadata.\n *\n * The VS Code panel (`codeAttachments.ts`) and other hosts append a markdown\n * block after a `---` fence:\n *\n * ## User attachments (always include in your reasoning for this turn)\n * ### Attached image: `image.png`\n * … saved at: `.vibgrate/code-attachments/…`\n *\n * Those backticks are for the model. If the full instruction is fed into\n * {@link extractLiteralNeedles} / seed ranking, attachment basenames and paths\n * become **literal-locate hard constraints** (\"0 hits → finish, do not invent\n * an edit\") and the agent aborts a real coding task. Field report: version-badge\n * health UI with a screenshot — agent searched for `image.png` and stopped.\n *\n * Retrieval, needle pinning, locate-only detection, and relevance analysis must\n * use {@link userAskFromInstruction}. The full instruction (with attachments)\n * still belongs in the Task / user message so the model can see the appendix.\n */\n\n/** Heading written by hosts when packing panel attachments into the instruction. */\nexport const USER_ATTACHMENTS_HEADING_PREFIX = '## User attachments';\n\n/**\n * Return only the user-authored portion of an instruction, dropping a trailing\n * host \"User attachments\" appendix when present. Unchanged when no appendix.\n */\nexport function userAskFromInstruction(instruction: string): string {\n if (!instruction) return instruction;\n\n // Canonical host shape: blank line, --- fence, then the attachments heading.\n const fenced = /\\n---\\s*\\n## User attachments\\b[^\\n]*\\n?/;\n const m = fenced.exec(instruction);\n if (m && m.index != null) {\n return instruction.slice(0, m.index).trimEnd();\n }\n\n // Defensive: heading without the fence (older hosts / hand-edited prompts).\n const bare = instruction.search(/(?:^|\\n)## User attachments\\b/);\n if (bare > 0) {\n return instruction.slice(0, bare).trimEnd();\n }\n if (bare === 0) {\n // Instruction is only the appendix — no user ask left.\n return '';\n }\n\n return instruction;\n}\n","import { indexFor, type GraphIndex } from './relations.js';\nimport { cosine, type Embedder } from './embeddings.js';\nimport type { SanitizedRank } from './relevance-provider.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport { userAskFromInstruction } from './user-ask.js';\n\n/**\n * Retrieval front-end for `vg ask` / `vg code` capsule seeds (VG-CLI-SPEC\n * §3.2).\n *\n * Since the 2026-08 relevance relocation, the RANKING ENGINE lives in the\n * optional relevance module (`@vibgrate/relevance`, auto-provisioned): the\n * async callers run the ask through the module via\n * `relevance-provider.rankQuestion` and pass the SANITIZED result in as\n * `options.ranked`. This file keeps only what is mechanical:\n *\n * - literal string/URL needle handling (the locate path — exact-text\n * matching, not relevance);\n * - a deliberately dumb module-less fallback: exact identifier-name and\n * name-part matching, nothing that understands language (no lexicon, no\n * term roles, no IDF, no typo repair, no expansion) — enough that an ask\n * NAMING a symbol still pins its file when the module is unavailable;\n * - context-block rendering and the semantic Reciprocal Rank Fusion\n * plumbing (`--semantic`), which fuses ORDERINGS and carries no ranking\n * heuristics of its own.\n */\n\nexport interface QueryOptions {\n budget?: number; // approx token budget for the context block (default 2000)\n limit?: number; // max seed matches to expand (default 12)\n /** Sanitized module ranking (engine/relevance-provider.ts rankQuestion),\n * injected by async callers so this module stays pure and sync. When\n * absent — module not installed, predates the ranking API, or failed —\n * the mechanical fallback below answers. */\n ranked?: SanitizedRank | null;\n}\n\nexport interface QueryMatch {\n node: GraphNode;\n score: number;\n why: string;\n}\n\nexport interface QueryResult {\n question: string;\n matches: QueryMatch[];\n context: string;\n tokensEstimate: number;\n}\n\n/**\n * Function-word hygiene for the mechanical fallback tokenizer. This is NOT a\n * relevance stopword model (that moved into the module): nothing here scores,\n * ranks, weights, or reorders anything. It is a purely SUBTRACTIVE floor —\n * the words a caller uses to FRAME an ask rather than to name the code they\n * mean, which therefore cannot be identifier evidence.\n *\n * The floor exists because `mechanicalRank` treats every surviving token as\n * equal evidence, and English framing words collide with real identifier\n * parts constantly. Without it, `\"add a new feature\"` scores `AddBlogForm`\n * on the camel-part tier (`add`) and `FeatureFlagStore` (`feature`) and fills\n * the entire seed window — a grab-bag Task Capsule for an ask that named\n * nothing. That is the capsule-poisoning failure of the 2026-07 field report,\n * and an empty result is the correct answer.\n *\n * Note this is the floor ONLY. Deciding which of several genuine candidates\n * is most relevant remains the module's job, and no part of that logic —\n * term roles, weighting, expansion, morphology — belongs in this file.\n */\nconst FUNCTION_WORDS = new Set([\n // Closed-class English: could only ever match by coincidence.\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'to', 'of', 'in', 'on', 'for', 'and', 'or',\n 'where', 'what', 'which', 'how', 'do', 'does', 'did', 'i', 'we', 'it', 'this', 'that', 'with',\n 'when', 'who', 'why', 'can', 'should', 'my', 'our', 'you', 'your', 'from', 'by', 'at', 'as',\n // Process verbs. A caller says what they want DONE with these; they never\n // name the code it should be done to. Left in, bare `add` seeds every\n // Add*/*Add* symbol in the repo ahead of the terms that carry the subject.\n 'add', 'adds', 'added', 'adding',\n 'create', 'creates', 'created', 'creating',\n 'make', 'makes', 'making', 'made',\n 'remove', 'removes', 'removed', 'removing',\n 'delete', 'deletes', 'deleted', 'deleting',\n 'update', 'updates', 'updated', 'updating',\n 'change', 'changes', 'changed', 'changing',\n 'set', 'sets', 'setting', 'setup', 'get', 'gets', 'getting',\n 'use', 'uses', 'used', 'using', 'want', 'wants', 'wanted', 'doing', 'done',\n 'support', 'supports', 'supported', 'supporting',\n 'enable', 'enables', 'enabled', 'enabling',\n 'disable', 'disables', 'disabled', 'disabling',\n 'allow', 'allows', 'allowed', 'handle', 'handles', 'handling',\n 'implement', 'implements', 'implemented', 'implementing',\n 'build', 'builds', 'building', 'built', 'need', 'needs', 'needed',\n // Filler nouns and connectives: the generic scaffolding of a request.\n 'new', 'newly', 'via', 'through', 'into', 'onto',\n 'way', 'ways', 'thing', 'things', 'stuff',\n 'feature', 'features', 'functionality',\n 'method', 'methods', 'option', 'options', 'ability',\n 'form', 'forms', 'page', 'pages', 'screen', 'screens', 'button', 'buttons',\n 'help', 'start', 'begin', 'work', 'works', 'working',\n 'also', 'currently', 'properly', 'correctly', 'please',\n 'happens', 'happen', 'something', 'somewhere',\n 'step', 'steps', 'flow', 'process',\n // Discovery-question scaffolding: words that FRAME the search itself\n // (\"find the code responsible for X\", \"explain how X works\").\n 'find', 'code', 'responsible', 'modify', 'me',\n 'implementation', 'explain', 'codebase', 'contains', 'file',\n // Bug-report framing: says something is WRONG, never what is wrong.\n // `fix` alone lit up `export_fixed_width_records`, `out` lit up every\n // *Router*/*rollout* symbol (vg code prompt-relevance corpus).\n 'fix', 'fixes', 'fixing', 'bug', 'bugs', 'broken', 'busted', 'borked',\n 'wrong', 'incorrect', 'incorrectly', 'figure', 'out', 'sure',\n]);\n\n/**\n * Strip sentence punctuation from a URL match without breaking real query\n * strings (`?key=value`). A lone trailing `?` / `!` is English punctuation\n * (\"where is https://…/signup?\") — leaving it in the needle makes the literal\n * sweep miss the bare path in source.\n */\nfunction cleanUrlNeedle(raw: string): string {\n let s = raw.trim();\n // Trailing ) ] } > , ; : ! . from markdown links / sentence ends.\n s = s.replace(/[.,;:!)\\]}>]+$/g, '');\n // Lone trailing `?` → drop. Keep `?key=…` (content after `?`).\n if (s.endsWith('?')) {\n const qi = s.lastIndexOf('?');\n if (qi === s.length - 1) s = s.slice(0, -1);\n }\n return s;\n}\n\n/**\n * Extract string/URL needles a caller is asking to *locate as text*, not as\n * bag-of-words symbol terms. URLs and quoted phrases are exact-match material\n * for the literal sweep (`search_symbols` / `search_code`); feeding their path\n * segments into lexical symbol ranking produces confidently wrong seeds\n * (dash → dashboard package, exist → NonExisting, …).\n */\nexport function extractLiteralNeedles(question: string): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n const push = (raw: string, kind: 'url' | 'quote') => {\n let s = raw.trim();\n s = kind === 'url' ? cleanUrlNeedle(s) : s.replace(/[.,;:!)\\]}>?]+$/g, '');\n if (s.length < 2 || seen.has(s)) return;\n seen.add(s);\n out.push(s);\n };\n for (const m of question.matchAll(/https?:\\/\\/[^\\s\"'`<>]+/gi)) push(m[0]!, 'url');\n for (const m of question.matchAll(/([\"'`])((?:(?!\\1)[^\\\\]|\\\\.){2,})\\1/g)) {\n push(m[2]!.replace(/\\\\(.)/g, '$1'), 'quote');\n }\n return out;\n}\n\n/** Question text with URL/quoted needles removed so residual tokens can name symbols. */\nexport function stripLiteralNeedles(question: string): string {\n let s = question;\n // Strip raw URL spans first (may still carry a trailing `?` from the ask).\n for (const m of question.matchAll(/https?:\\/\\/[^\\s\"'`<>]+/gi)) {\n s = s.split(m[0]!).join(' ');\n }\n for (const lit of extractLiteralNeedles(question)) {\n s = s.split(lit).join(' ');\n }\n // Also strip bare quote pairs left behind.\n s = s.replace(/([\"'`])\\s*\\1/g, ' ');\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Residual ask used for graph symbol ranking when the question embeds a\n * URL/quote. Empty when only framing words remain (\"where is …?\") so we do\n * not light up unrelated symbols like `applyPlan.where`.\n */\nexport function residualForSymbolSearch(question: string): string {\n const literals = extractLiteralNeedles(question);\n if (literals.length === 0) return question.trim();\n const stripped = stripLiteralNeedles(question);\n return tokenize(stripped).length === 0 ? '' : stripped;\n}\n\n/**\n * True when the instruction is a string/URL occurrence locate (not an edit).\n * Used to skip PatchIR grammar and answer from the literal sweep without\n * dumping constrained-decoding JSON into the VG Code panel.\n */\nexport function isLocateOnlyInstruction(instruction: string): boolean {\n // Drop host-injected \"User attachments\" appendix (backticked image paths)\n // before classify — same rule as buildCodeContext. Avoids treating a screenshot\n // filename as a locate-only occurrence search.\n const q = userAskFromInstruction(instruction).trim();\n if (!q) return false;\n const needles = extractLiteralNeedles(q);\n const hasLocateFrame =\n /\\b(where\\s+is|where\\s+are|find\\s+(all\\s+|every\\s+)?occurrence|find\\s+occurrences|does\\s+not\\s+exist|locate|search\\s+for)\\b/i.test(\n q,\n ) ||\n (needles.length > 0 && /^https?:\\/\\//i.test(q));\n // Strong edit verbs cancel locate-only (ignore \"does not exist\" as non-edit).\n const withoutExist = q.replace(/\\bdoes\\s+not\\s+exist\\b/gi, ' ');\n if (\n /\\b(fix|edit|change|replace|implement|refactor|rename|patch|create\\s+file|delete\\s+file|add\\s+a\\b|remove\\s+the\\b)\\b/i.test(\n withoutExist,\n )\n ) {\n return false;\n }\n if (needles.some((n) => /^https?:\\/\\//i.test(n))) return true;\n return hasLocateFrame && needles.length > 0;\n}\n\nexport function queryGraph(graph: VgGraph, question: string, options: QueryOptions = {}): QueryResult {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const literals = extractLiteralNeedles(question);\n const index = indexFor(graph);\n\n let seeds: QueryMatch[];\n if (options.ranked) {\n // Module ranking (already sanitized: every id names a real symbol).\n // An honest miss from the engine stays an honest miss here.\n const byId = new Map<string, GraphNode>();\n for (const node of graph.nodes) byId.set(node.id, node);\n seeds = options.ranked.hasContent\n ? options.ranked.seeds\n .map((s) => {\n const node = byId.get(s.id);\n return node ? { node, score: s.score, why: s.why } : null;\n })\n .filter((m): m is QueryMatch => m !== null)\n .slice(0, limit)\n : [];\n } else {\n seeds = mechanicalRank(graph, question, literals).slice(0, limit);\n }\n\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);\n return { question, matches: seeds, context, tokensEstimate };\n}\n\n/**\n * The module-less fallback: mechanical identifier matching, deliberately free\n * of language understanding. A token scores only when it IS a symbol's name,\n * one of its camel/snake parts, or (length ≥ 4) a substring of the qualified\n * name — so \"write tests for chargeCard\" or a pasted `src/…/File.ts` path\n * still pins the right file, while intent phrasings honestly miss until the\n * relevance module is available. No lexicon, no term roles, no IDF, no typo\n * repair, no expansions — that is the module's job now.\n */\nfunction mechanicalRank(graph: VgGraph, question: string, literals: string[]): QueryMatch[] {\n const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;\n let tokens = tokenize(forTokens);\n // A literal ask's residual framing (\"does not exist\", \"find occurrences\")\n // must not light up DoesNot*/NonExisting*/commandExists lookalikes — the\n // honest-miss contract of the locate path holds module-less too.\n if (literals.length > 0) tokens = tokens.filter((t) => !LOCATE_SCAFFOLD.has(t));\n if (tokens.length === 0) return [];\n const scored: QueryMatch[] = [];\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const name = node.name.toLowerCase();\n const qn = node.qualifiedName.toLowerCase();\n const parts = identifierParts(node.name);\n let score = 0;\n const hits: string[] = [];\n for (const t of tokens) {\n if (name === t) {\n score += 10;\n hits.push(t);\n } else if (parts.has(t)) {\n score += 6;\n hits.push(t);\n } else if (t.length >= 4 && qn.includes(t)) {\n score += 3;\n hits.push(t);\n }\n }\n if (score > 0) {\n scored.push({\n node,\n score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)),\n why: `matched: ${hits.join(', ')}`,\n });\n }\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n return diversifyByFile(scored);\n}\n\nfunction tokenize(q: string): string[] {\n return [\n ...new Set(\n q\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length >= 1 && !FUNCTION_WORDS.has(t)),\n ),\n ];\n}\n\n/**\n * Importance is a mild tiebreaker, not a doubling: at 0.4 a top hub adds at\n * most 40%, enough to break genuine ties without overriding term evidence.\n */\nconst IMPORTANCE_WEIGHT = 0.4;\n\n/** Residual framing of a string/URL locate ask — never symbol evidence. */\nconst LOCATE_SCAFFOLD = new Set([\n 'not', 'no', 'exist', 'exists', 'existing', 'occurrence', 'occurrences',\n 'occurence', 'occurences', 'find', 'every', 'place', 'places', 'string',\n 'literal', 'text', 'search', 'locate', 'look', 'looking', 'show', 'list', 'all',\n]);\n\n/**\n * Stable file-diversity pass over the ranked list: each file's best node\n * keeps its rank; further nodes from an already-represented file are demoted\n * behind the first representative of every other matching file (never\n * dropped). Mechanical presentation hygiene — the seed window is a coverage\n * budget either way.\n */\nfunction diversifyByFile(matches: QueryMatch[]): QueryMatch[] {\n const seen = new Set<string>();\n const firstPerFile: QueryMatch[] = [];\n const rest: QueryMatch[] = [];\n for (const m of matches) {\n if (seen.has(m.node.file)) {\n rest.push(m);\n } else {\n seen.add(m.node.file);\n firstPerFile.push(m);\n }\n }\n return firstPerFile.concat(rest);\n}\n\nexport interface SemanticQueryOptions extends QueryOptions {\n /** Local embedder. Optional only when {@link semanticRanked} supplies the pass. */\n embedder?: Embedder;\n /** Precomputed node vectors (from getNodeEmbeddings); falls back to lexical for nodes without one. */\n nodeVectors?: Map<string, number[]>;\n /**\n * A semantic pass someone else already ran — vgd ranking the question\n * against its resident slot index. Supplied instead of `embedder` +\n * `nodeVectors` so the caller pays neither a model load nor a vector scan,\n * and no vectors cross the socket.\n *\n * Only the ORDER of this list is consumed (RRF fuses rankings, not scores),\n * so a truncated top-K is not an approximation: a candidate ranked past a\n * few hundred cannot reach a 12-row answer.\n */\n semanticRanked?: Array<{ id: string; score: number }>;\n}\n\n/**\n * Reciprocal Rank Fusion constant (the standard k=60). Fusing RANKINGS\n * instead of blending raw scores removes the need to calibrate two\n * incomparable scales: a node's fused score is Σ 1/(k + rankᵢ) over the\n * lists it appears in, so agreement between signals dominates and a single\n * signal's outlier magnitude cannot.\n */\nconst RRF_K = 60;\n\n/** 1-based ranks for a scored id list (desc score, qualifiedName tiebreak). */\nfunction ranksOf(scores: Map<string, number>, nameOf: (id: string) => string): Map<string, number> {\n const ids = [...scores.entries()]\n .filter(([, s]) => s > 0)\n .sort((a, b) => b[1] - a[1] || nameOf(a[0]).localeCompare(nameOf(b[0])))\n .map(([id]) => id);\n return new Map(ids.map((id, i) => [id, i + 1]));\n}\n\n/**\n * Hybrid retrieval, combined with Reciprocal Rank Fusion: the module ranking\n * (or the mechanical fallback) is one arm, the local-embedding pass the\n * other, so a question like \"where do we handle auth failures?\" can surface\n * `verify_token` even with no shared word. Deterministic given the same\n * model + cached vectors; embeddings live in a binary sidecar next to the\n * map, never in `graph.json`.\n */\nexport async function queryGraphSemantic(\n graph: VgGraph,\n question: string,\n options: SemanticQueryOptions,\n): Promise<QueryResult> {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const literals = extractLiteralNeedles(question);\n const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;\n const residualTokens = tokenize(forTokens);\n // Embed the residual ask (without URL/quote noise) so semantic neighbours\n // aren't dragged toward package names that share host path segments. Skipped\n // entirely when the ranking arrives pre-computed (vgd already embedded it).\n const queryVec = options.semanticRanked\n ? null\n : await options.embedder?.embedQuery(forTokens || question);\n const index = indexFor(graph);\n\n // Lexical arm: module ranking order when available, mechanical otherwise.\n // RRF consumes only the ORDER. An honest miss contributes an empty arm.\n const lexRaw = new Map<string, number>();\n const whyById = new Map<string, string>();\n const lexSeeds = options.ranked\n ? options.ranked.hasContent\n ? options.ranked.seeds.map((s) => ({ id: s.id, score: s.score, why: s.why }))\n : []\n : mechanicalRank(graph, question, literals).map((m) => ({ id: m.node.id, score: m.score, why: m.why }));\n for (const s of lexSeeds) {\n lexRaw.set(s.id, s.score);\n whyById.set(s.id, s.why);\n }\n\n const scored: QueryMatch[] = [];\n // Literal-only asks: skip the semantic loop entirely — embeddings over\n // \"does not exist find occurrences\" still surface unrelated hubs.\n if (residualTokens.length > 0 || literals.length === 0) {\n const semRaw = new Map<string, number>();\n const nodeById = new Map<string, GraphNode>();\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n nodeById.set(node.id, node);\n if (options.semanticRanked || !queryVec) continue;\n const vec = options.nodeVectors?.get(node.id);\n const sem = vec && residualTokens.length > 0 ? Math.max(0, cosine(queryVec, vec)) : 0;\n if (sem > 0) semRaw.set(node.id, sem);\n }\n if (options.semanticRanked && residualTokens.length > 0) {\n // Ignore ids the ranking knows about but this graph no longer has: the\n // daemon's index can be one publish behind a locally refreshed map.\n for (const { id, score } of options.semanticRanked) {\n if (score > 0 && nodeById.has(id)) semRaw.set(id, score);\n }\n }\n const nameOf = (id: string) => nodeById.get(id)?.qualifiedName ?? id;\n const lexRanks = ranksOf(lexRaw, nameOf);\n const semRanks = ranksOf(semRaw, nameOf);\n for (const [id, node] of nodeById) {\n const lr = lexRanks.get(id);\n const sr = semRanks.get(id);\n if (lr === undefined && sr === undefined) continue;\n const fused = (lr !== undefined ? 1 / (RRF_K + lr) : 0) + (sr !== undefined ? 1 / (RRF_K + sr) : 0);\n const sem = semRaw.get(id) ?? 0;\n const lexWhy = whyById.get(id);\n const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : 'weak match');\n scored.push({ node, score: round(fused * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n }\n\n const seeds = diversifyByFile(scored).slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);\n return { question, matches: seeds, context, tokensEstimate };\n}\n\n/**\n * camelCase / snake_case / kebab / letter↔digit split of an identifier →\n * lowercased parts. The separator alternative is Unicode-letter-aware\n * (`\\p{L}\\p{N}`, not ASCII-only) so non-Latin identifiers split on\n * punctuation without losing every character to it; the camelCase boundary\n * lookaround stays ASCII-only since casing is itself an ASCII-script concept.\n * Letter↔digit boundaries split too, so `Session2` keeps `session` reachable.\n */\nexport function identifierParts(name: string): Set<string> {\n return new Set(\n name\n .split(/[^\\p{L}\\p{N}]+|(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[\\p{L}])(?=[0-9])|(?<=[0-9])(?=[\\p{L}])/u)\n .filter(Boolean)\n .map((s) => s.toLowerCase()),\n );\n}\n\nfunction buildContext(\n graph: VgGraph,\n index: GraphIndex,\n question: string,\n seeds: QueryMatch[],\n budget: number,\n literals: string[] = [],\n): { context: string; tokensEstimate: number } {\n const lines: string[] = [];\n lines.push(`# Context for: ${question}`);\n lines.push('');\n if (literals.length) {\n lines.push('## Literal string(s) to locate (exact text, not symbol names)');\n for (const lit of literals) lines.push(`- \\`${lit}\\``);\n lines.push(\n '_Use a quoted phrase / URL search (`search_symbols` or `search_code` with the exact needle) for occurrences. Graph symbols below (if any) are residual identifier hints only._',\n );\n lines.push('');\n }\n if (seeds.length === 0) {\n lines.push(\n literals.length\n ? '_No graph symbols matched residual terms — this is expected for a pure string/URL occurrence search. Run a literal sweep on the needle(s) above._'\n : '_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._',\n );\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n }\n\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`## ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = index.callees(node.id).map((x) => x.node.qualifiedName);\n const callers = index.callers(node.id).map((x) => x.node.qualifiedName);\n if (callees.length) block.push(`calls: ${unique(callees).slice(0, 8).join(', ')}`);\n if (callers.length) block.push(`called by: ${unique(callers).slice(0, 8).join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)} · area #${node.area}${node.isHub ? ' · hub' : ''} · ${why}`);\n block.push('');\n\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 2) break;\n lines.push(...block);\n }\n\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n}\n\nfunction unique(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction estimateTokens(text: string): number {\n // ~4 chars per token, the standard rough estimate.\n return Math.ceil(text.length / 4);\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n","import { indexFor } from './relations.js';\nimport type { EdgeKind, VgGraph } from '../schema.js';\n\n/**\n * Deterministic reverse-reachability impact analysis (VG-CLI-SPEC §3.5).\n *\n * \"What breaks if `<node>` changes\" = everything that (transitively) depends on\n * it: its callers, importers, and subtypes. We BFS *backwards* along dependency\n * edges, bounded by depth, with a confidence that decays with distance (direct =\n * high; transitive lower; ambiguous/dynamic edges already carry lower edge\n * confidence which we fold in). Test-impact selection (`--tests`) lands in\n * Phase 2; this is the structural blast radius.\n */\n\nconst DEPEND_EDGES = new Set<EdgeKind>(['call', 'import', 'extends', 'implements', 'references']);\n\nexport interface ImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface ImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: ImpactItem[];\n direct: number;\n transitive: number;\n /** Lowest edge confidence encountered (e.g. a dynamic-dispatch edge). */\n minEdgeConfidence: number;\n}\n\nexport function impactOf(graph: VgGraph, rootId: string, opts: { depth?: number } = {}): ImpactResult {\n const maxDepth = Math.max(1, opts.depth ?? 4);\n const index = indexFor(graph);\n const root = index.node(rootId);\n\n const affected = new Map<string, ImpactItem>();\n let minEdgeConfidence = 1;\n\n // BFS over incoming dependency edges (dependents of the frontier).\n let frontier: { id: string; conf: number }[] = [{ id: rootId, conf: 1 }];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: { id: string; conf: number }[] = [];\n for (const { id, conf } of frontier) {\n for (const e of index.in(id)) {\n if (!DEPEND_EDGES.has(e.kind)) continue;\n minEdgeConfidence = Math.min(minEdgeConfidence, e.confidence);\n const dependentId = e.src;\n if (dependentId === rootId || affected.has(dependentId)) continue;\n const node = index.node(dependentId);\n if (!node) continue;\n const conf2 = round(conf * e.confidence * 0.9); // decay with distance\n affected.set(dependentId, {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n depth,\n confidence: conf2,\n });\n nextFrontier.push({ id: dependentId, conf: conf2 });\n }\n }\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n const items = [...affected.values()].sort(\n (a, b) => a.depth - b.depth || b.confidence - a.confidence || a.name.localeCompare(b.name),\n );\n\n return {\n root: { id: rootId, name: root?.qualifiedName ?? rootId },\n depth: maxDepth,\n affected: items,\n direct: items.filter((i) => i.depth === 1).length,\n transitive: items.filter((i) => i.depth > 1).length,\n minEdgeConfidence: round(minEdgeConfidence),\n };\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code/capsule-mode.ts"],"names":[],"mappings":"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","file":"chunk-R5BGRJ6X.js","sourcesContent":["/**\n * Whether to send a ranked Context Capsule, paste the mapped tree, or send\n * neither. Independent of Model Execution Profiles (those describe how a\n * local model is run). Mass × greppability, not file count.\n *\n * See docs/graph/VG-CAPSULE-SMALL-REPO-DISABLE.md.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { userAskFromInstruction } from '../engine/user-ask.js';\nimport type { VgGraph } from '../schema.js';\n\nexport type CapsuleMode = 'off' | 'whole-repo' | 'compile';\n\n/** Trees this small are cheaper to paste (or grep) than to rank. */\nexport const WHOLE_REPO_MAX_SOURCE_TOKENS = 1_500;\n/** Above this, discovery has a real bill — always compile. */\nexport const COMPILE_MIN_SOURCE_TOKENS = 8_000;\n\nexport function estimateSourceTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/** Unique mapped paths from the graph, stable order. */\nexport function mappedFilePaths(graph: VgGraph): string[] {\n const files = new Set<string>();\n for (const n of graph.nodes) {\n const f = normalize(n.file);\n if (!f || skipMappedPath(f)) continue;\n files.add(f);\n }\n return [...files].sort();\n}\n\nexport function sourceTokenMass(contents: Iterable<string>): number {\n let bytes = 0;\n for (const c of contents) bytes += c.length;\n return Math.ceil(bytes / 4);\n}\n\n/**\n * True when the mechanical fallback would pin an identifier the ask actually\n * names (F0/F1). Does not use the relevance module.\n */\nexport function askNamesSymbol(graph: VgGraph, instruction: string): boolean {\n const ask = userAskFromInstruction(instruction);\n const q = queryGraph(graph, ask, { budget: 400, limit: 8 });\n // Score 6 = camel-part; 10 = exact name. Substring hits (3) are not \"named\".\n return q.matches.some((m) => m.score >= 6);\n}\n\nexport function capsuleMode(input: { sourceTokens: number; askNamesSymbol: boolean }): CapsuleMode {\n const mass = Math.max(0, input.sourceTokens);\n if (mass <= WHOLE_REPO_MAX_SOURCE_TOKENS) return 'whole-repo';\n if (mass > COMPILE_MIN_SOURCE_TOKENS) return 'compile';\n // Modest mass: greppable asks lose to grep (measured). Symptom-only in this\n // band is unmeasured — fail closed to off.\n if (input.askNamesSymbol) return 'off';\n return 'off';\n}\n\nexport interface WholeRepoFile {\n path: string;\n content: string;\n}\n\nexport interface WholeRepoPacket {\n rendered: string;\n tokensEstimate: number;\n files: string[];\n sourceTokens: number;\n}\n\n/**\n * First-turn packet = the mapped files, not a ranked dump. Files are sorted\n * by path. `budget` caps the paste (default {@link WHOLE_REPO_MAX_SOURCE_TOKENS});\n * at least one file is always included when any exist.\n */\nexport function buildWholeRepoPacket(\n instruction: string,\n files: WholeRepoFile[],\n budget: number = WHOLE_REPO_MAX_SOURCE_TOKENS,\n): WholeRepoPacket {\n const sorted = [...files]\n .map((f) => ({ path: normalize(f.path), content: f.content }))\n .filter((f) => f.path && f.content.length > 0)\n .sort((a, b) => a.path.localeCompare(b.path));\n const sourceTokens = sourceTokenMass(sorted.map((f) => f.content));\n\n const lines: string[] = [\n '# Repository source (entire mapped tree)',\n '',\n 'The files below are the repository. Use them; search or read outside only if they are insufficient.',\n '',\n ];\n const included: string[] = [];\n for (const f of sorted) {\n const block = [`### \\`${f.path}\\``, `\\`\\`\\`${langFor(f.path)}`, f.content.replace(/\\n$/, ''), '```', ''];\n const candidate = [...lines, ...block, '## Task', instruction].join('\\n');\n if (included.length > 0 && estimateSourceTokens(candidate) > budget) break;\n lines.push(...block);\n included.push(f.path);\n }\n lines.push('## Task');\n lines.push(instruction);\n const rendered = lines.join('\\n');\n return {\n rendered,\n tokensEstimate: estimateSourceTokens(rendered),\n files: included,\n sourceTokens,\n };\n}\n\nfunction skipMappedPath(file: string): boolean {\n return (\n file.startsWith('node_modules/') ||\n file.includes('/node_modules/') ||\n file.startsWith('.git/') ||\n file.startsWith('.vibgrate/')\n );\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction langFor(file: string): string {\n const ext = file.split('.').pop()?.toLowerCase() ?? '';\n const map: Record<string, string> = {\n ts: 'ts',\n tsx: 'tsx',\n js: 'js',\n jsx: 'jsx',\n mjs: 'js',\n cjs: 'js',\n py: 'python',\n rs: 'rust',\n go: 'go',\n java: 'java',\n cs: 'csharp',\n md: 'md',\n json: 'json',\n };\n return map[ext] ?? '';\n}\n"]}
|