@vibgrate/cli 2026.817.1 → 2026.817.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/DOCS.md +61 -0
  2. package/README.md +1 -0
  3. package/dist/agent-UQC7QN77.js +27 -0
  4. package/dist/{agent-CUYQKC6S.js.map → agent-UQC7QN77.js.map} +1 -1
  5. package/dist/{approvals-IPMUDEDV.js → approvals-ASPJQUZK.js} +6 -5
  6. package/dist/{approvals-IPMUDEDV.js.map → approvals-ASPJQUZK.js.map} +1 -1
  7. package/dist/baseline-FIV6PR2M.js +9 -0
  8. package/dist/{baseline-NZFGLMER.js.map → baseline-FIV6PR2M.js.map} +1 -1
  9. package/dist/{chunk-4W5SYK2M.js → chunk-2FEB5KJS.js} +3 -3
  10. package/dist/{chunk-4W5SYK2M.js.map → chunk-2FEB5KJS.js.map} +1 -1
  11. package/dist/{chunk-MIYXVY57.js → chunk-3FMRFECC.js} +4 -4
  12. package/dist/{chunk-MIYXVY57.js.map → chunk-3FMRFECC.js.map} +1 -1
  13. package/dist/{chunk-NQUWC2IA.js → chunk-3H3SVJUY.js} +4 -4
  14. package/dist/{chunk-NQUWC2IA.js.map → chunk-3H3SVJUY.js.map} +1 -1
  15. package/dist/{chunk-UBEVY5UT.js → chunk-3NJUOIZQ.js} +5 -5
  16. package/dist/{chunk-UBEVY5UT.js.map → chunk-3NJUOIZQ.js.map} +1 -1
  17. package/dist/{chunk-3GZSDY35.js → chunk-5OL2TSHK.js} +4 -4
  18. package/dist/{chunk-3GZSDY35.js.map → chunk-5OL2TSHK.js.map} +1 -1
  19. package/dist/{chunk-2BURPMYA.js → chunk-6K3XK7C5.js} +69 -976
  20. package/dist/chunk-6K3XK7C5.js.map +1 -0
  21. package/dist/{chunk-2GSMCOIC.js → chunk-AXZZ5CCG.js} +4 -4
  22. package/dist/{chunk-2GSMCOIC.js.map → chunk-AXZZ5CCG.js.map} +1 -1
  23. package/dist/{chunk-NHB53JTV.js → chunk-C3LMWZKF.js} +3 -3
  24. package/dist/{chunk-NHB53JTV.js.map → chunk-C3LMWZKF.js.map} +1 -1
  25. package/dist/{chunk-FD2HPGX2.js → chunk-DVW3SVCW.js} +9 -8
  26. package/dist/chunk-DVW3SVCW.js.map +1 -0
  27. package/dist/{chunk-RJCRWQNS.js → chunk-E2FAQREZ.js} +164 -221
  28. package/dist/chunk-E2FAQREZ.js.map +1 -0
  29. package/dist/{chunk-45AKSS4A.js → chunk-EXV4QSAD.js} +4 -4
  30. package/dist/{chunk-45AKSS4A.js.map → chunk-EXV4QSAD.js.map} +1 -1
  31. package/dist/{chunk-OWSXI3PJ.js → chunk-GOGMS3ST.js} +5 -5
  32. package/dist/{chunk-OWSXI3PJ.js.map → chunk-GOGMS3ST.js.map} +1 -1
  33. package/dist/{chunk-YL4OIUA5.js → chunk-K6DXETMC.js} +11 -11
  34. package/dist/{chunk-YL4OIUA5.js.map → chunk-K6DXETMC.js.map} +1 -1
  35. package/dist/{chunk-NKRWKCME.js → chunk-KJT2R6WW.js} +4 -4
  36. package/dist/{chunk-NKRWKCME.js.map → chunk-KJT2R6WW.js.map} +1 -1
  37. package/dist/{chunk-FMS6G67U.js → chunk-KNGAZDGF.js} +5 -5
  38. package/dist/{chunk-FMS6G67U.js.map → chunk-KNGAZDGF.js.map} +1 -1
  39. package/dist/{chunk-JHLCKMKF.js → chunk-LHKQGVRF.js} +9 -8
  40. package/dist/chunk-LHKQGVRF.js.map +1 -0
  41. package/dist/{chunk-A7EKFLAN.js → chunk-M7IO3DXH.js} +9 -8
  42. package/dist/chunk-M7IO3DXH.js.map +1 -0
  43. package/dist/{chunk-QPXVTQ7O.js → chunk-MVPRPSXU.js} +7 -4
  44. package/dist/chunk-MVPRPSXU.js.map +1 -0
  45. package/dist/{chunk-DT4KIVRI.js → chunk-NG4KIJW6.js} +34 -2
  46. package/dist/chunk-NG4KIJW6.js.map +1 -0
  47. package/dist/{chunk-K267DHCF.js → chunk-O2DL2Q55.js} +6 -6
  48. package/dist/{chunk-K267DHCF.js.map → chunk-O2DL2Q55.js.map} +1 -1
  49. package/dist/chunk-O3LABX6I.js +43 -0
  50. package/dist/chunk-O3LABX6I.js.map +1 -0
  51. package/dist/chunk-PRG2ULPK.js +6 -0
  52. package/dist/{chunk-PV76EO4G.js.map → chunk-PRG2ULPK.js.map} +1 -1
  53. package/dist/{chunk-ZSECAGSU.js → chunk-Q3M6K3HY.js} +3 -3
  54. package/dist/{chunk-ZSECAGSU.js.map → chunk-Q3M6K3HY.js.map} +1 -1
  55. package/dist/{chunk-2TJ5EY4I.js → chunk-Q4G2BWE3.js} +4 -4
  56. package/dist/{chunk-2TJ5EY4I.js.map → chunk-Q4G2BWE3.js.map} +1 -1
  57. package/dist/chunk-T7RSQ5WD.js +227 -0
  58. package/dist/chunk-T7RSQ5WD.js.map +1 -0
  59. package/dist/{chunk-RQAKBRAV.js → chunk-TVDMNIUT.js} +3 -3
  60. package/dist/{chunk-RQAKBRAV.js.map → chunk-TVDMNIUT.js.map} +1 -1
  61. package/dist/{chunk-ANYL7SUI.js → chunk-WAKP7SK7.js} +4584 -976
  62. package/dist/chunk-WAKP7SK7.js.map +1 -0
  63. package/dist/{chunk-ENFSSUNK.js → chunk-WVMOGIPC.js} +5 -43
  64. package/dist/chunk-WVMOGIPC.js.map +1 -0
  65. package/dist/{chunk-6NOGNOE4.js → chunk-XLXJC7H3.js} +141 -13
  66. package/dist/chunk-XLXJC7H3.js.map +1 -0
  67. package/dist/cli.js +1476 -575
  68. package/dist/cli.js.map +1 -1
  69. package/dist/{daemon-J2HX4GY3.js → daemon-FPTRHO5N.js} +11 -10
  70. package/dist/{daemon-J2HX4GY3.js.map → daemon-FPTRHO5N.js.map} +1 -1
  71. package/dist/embed-worker-main.js +5 -4
  72. package/dist/embed-worker-main.js.map +1 -1
  73. package/dist/ensure-map-342G2IV3.js +33 -0
  74. package/dist/{ensure-map-5C6KG66X.js.map → ensure-map-342G2IV3.js.map} +1 -1
  75. package/dist/{fs-NTQUFCXV.js → fs-TLPOWC2D.js} +3 -3
  76. package/dist/fs-TLPOWC2D.js.map +1 -0
  77. package/dist/graph-backend-RNWQBT3P.js +15 -0
  78. package/dist/{graph-backend-HH5IIQ55.js.map → graph-backend-RNWQBT3P.js.map} +1 -1
  79. package/dist/index.d.ts +22 -3
  80. package/dist/index.js +18 -17
  81. package/dist/index.js.map +1 -1
  82. package/dist/{interactive-FXPAZAUJ.js → interactive-SR7TMF6M.js} +28 -27
  83. package/dist/interactive-SR7TMF6M.js.map +1 -0
  84. package/dist/load-AYFECIQB.js +11 -0
  85. package/dist/{load-OR2XVGAV.js.map → load-AYFECIQB.js.map} +1 -1
  86. package/dist/parse-worker.d.ts +1 -1
  87. package/dist/parse-worker.js +5 -2
  88. package/dist/parse-worker.js.map +1 -1
  89. package/dist/{run-outcome-M4546HLJ.js → run-outcome-YQQJG3LW.js} +7 -6
  90. package/dist/run-outcome-YQQJG3LW.js.map +1 -0
  91. package/dist/runtime-session-CNJ4DAV5.js +22 -0
  92. package/dist/{runtime-session-6KKMFS6Q.js.map → runtime-session-CNJ4DAV5.js.map} +1 -1
  93. package/dist/session-H34HUV2Y.js +17 -0
  94. package/dist/{session-HCFJUSKN.js.map → session-H34HUV2Y.js.map} +1 -1
  95. package/dist/{stream-json-4DL65D6U.js → stream-json-55YDNAFX.js} +15 -14
  96. package/dist/stream-json-55YDNAFX.js.map +1 -0
  97. package/dist/{types-8SYlXhzm.d.ts → types-DHqH0XIE.d.ts} +11 -0
  98. package/dist/version-WSE3QOPK.js +4 -0
  99. package/dist/{version-UPIC3F4P.js.map → version-WSE3QOPK.js.map} +1 -1
  100. package/dist/{vg-mcp-bridge-FZGX6DYO.js → vg-mcp-bridge-2CNLHNEL.js} +13 -12
  101. package/dist/vg-mcp-bridge-2CNLHNEL.js.map +1 -0
  102. package/dist/{vgd-QR26FAZD.js → vgd-URUZQORN.js} +10 -9
  103. package/dist/vgd-URUZQORN.js.map +1 -0
  104. package/package.json +7 -7
  105. package/dist/agent-CUYQKC6S.js +0 -26
  106. package/dist/baseline-NZFGLMER.js +0 -9
  107. package/dist/chunk-2BURPMYA.js.map +0 -1
  108. package/dist/chunk-6NOGNOE4.js.map +0 -1
  109. package/dist/chunk-A7EKFLAN.js.map +0 -1
  110. package/dist/chunk-ANYL7SUI.js.map +0 -1
  111. package/dist/chunk-DT4KIVRI.js.map +0 -1
  112. package/dist/chunk-ENFSSUNK.js.map +0 -1
  113. package/dist/chunk-FD2HPGX2.js.map +0 -1
  114. package/dist/chunk-JHLCKMKF.js.map +0 -1
  115. package/dist/chunk-PV76EO4G.js +0 -6
  116. package/dist/chunk-QPXVTQ7O.js.map +0 -1
  117. package/dist/chunk-RJCRWQNS.js.map +0 -1
  118. package/dist/chunk-RXP66R2E.js +0 -39
  119. package/dist/chunk-RXP66R2E.js.map +0 -1
  120. package/dist/ensure-map-5C6KG66X.js +0 -32
  121. package/dist/fs-NTQUFCXV.js.map +0 -1
  122. package/dist/graph-backend-HH5IIQ55.js +0 -14
  123. package/dist/interactive-FXPAZAUJ.js.map +0 -1
  124. package/dist/load-OR2XVGAV.js +0 -10
  125. package/dist/run-outcome-M4546HLJ.js.map +0 -1
  126. package/dist/runtime-session-6KKMFS6Q.js +0 -21
  127. package/dist/session-HCFJUSKN.js +0 -16
  128. package/dist/stream-json-4DL65D6U.js.map +0 -1
  129. package/dist/version-UPIC3F4P.js +0 -4
  130. package/dist/vg-mcp-bridge-FZGX6DYO.js.map +0 -1
  131. package/dist/vgd-QR26FAZD.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core-open/utils/semaphore.ts","../src/core-open/utils/glob.ts","../src/core-open/utils/fs.ts"],"names":["resolve","path","stat"],"mappings":";;;;;;;;;;AAIO,IAAM,YAAN,MAAgB;AAAA,EACb,SAAA;AAAA,EACA,QAA2B,EAAC;AAAA,EAEpC,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AAAA,EACnB;AAAA,EAEA,MAAM,IAAO,EAAA,EAAkC;AAC7C,IAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,OAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,SAAA,EAAA;AACL,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AACA,IAAA,OAAO,IAAI,QAAQ,CAACA,QAAAA,KAAY,KAAK,KAAA,CAAM,IAAA,CAAKA,QAAO,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEQ,OAAA,GAAU;AAChB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAC9B,IAAA,IAAI,MAAM,IAAA,EAAK;AAAA,SACV,IAAA,CAAK,SAAA,EAAA;AAAA,EACZ;AACF;ACCO,SAAS,qBAAqB,KAAA,EAAgD;AACnF,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAC;AACjC,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACjD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,SAAS,GAAA,EAAK;AACvB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AACtC,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,OAAA,EAAS,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AACzB;AAEO,SAAS,aAAa,QAAA,EAA2D;AACtF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,CAAC,MAAM,UAAA,CAAW,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AAE7D,EAAA,OAAO,CAAC,OAAA,KAAoB;AAC1B,IAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,IAAA,OAAO,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACrC,CAAA;AACF;AAEA,SAAS,UAAU,CAAA,EAAmB;AAEpC,EAAA,OAAO,CAAA,CAAE,MAAWC,KAAA,CAAA,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvD;AAEA,SAAS,WAAW,OAAA,EAAyC;AAG3D,EAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,GAAG,KAAK,CAAC,YAAA,CAAa,OAAO,CAAA,EAAG;AACpD,IAAA,MAAM,SAAS,OAAA,GAAU,GAAA;AACzB,IAAA,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAA,IAAW,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,EAAA,GAAK,YAAY,OAAO,CAAA;AAC9B,EAAA,OAAO,CAAC,CAAA,KAAM,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AACzB;AAEA,SAAS,aAAa,CAAA,EAAoB;AACxC,EAAA,OAAO,WAAA,CAAY,KAAK,CAAC,CAAA;AAC3B;AAEA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,EAAA,GAAK,GAAA;AACT,EAAA,MAAM,MAAM,OAAA,CAAQ,MAAA;AAEpB,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AAEpB,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,IAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAE1B,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK;AAEtB,UAAA,CAAA,EAAA;AACA,UAAA,EAAA,IAAM,UAAA;AAAA,QACR,CAAA,MAAO;AAEL,UAAA,EAAA,IAAM,IAAA;AAAA,QACR;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,CAAA,EAAA;AACA,QAAA,EAAA,IAAM,OAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,MAAA,CAAA,EAAA;AACA,MAAA,EAAA,IAAM,MAAA;AAAA,IACR,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AAErB,MAAA,MAAM,KAAA,GAAQ,CAAA;AACd,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,CAAA,GAAI,GAAA,IAAO,OAAA,CAAQ,CAAC,MAAM,GAAA,EAAK,CAAA,EAAA;AACtC,MAAA,CAAA,EAAA;AACA,MAAA,EAAA,IAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,CAAC,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AAErB,MAAA,CAAA,EAAA;AACA,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,OAAO,CAAA,GAAI,GAAA,IAAO,OAAA,CAAQ,CAAC,MAAM,GAAA,EAAK;AACpC,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAA,EAAK;AACtB,UAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AACzB,UAAA,OAAA,GAAU,EAAA;AAAA,QACZ,CAAA,MAAO;AACL,UAAA,OAAA,IAAW,QAAQ,CAAC,CAAA;AAAA,QACtB;AACA,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA,EAAA,IAAM,QAAQ,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,EAAA,IAAM,YAAY,EAAE,CAAA;AACpB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,EAAA,IAAM,GAAA;AACN,EAAA,OAAO,IAAI,OAAO,EAAE,CAAA;AACtB;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAChD;;;AClIA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAoBxC,eAAe,qBAAA,CAAsB,KAAa,MAAA,EAAqD;AACrG,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAS,EAAA,CAAA,QAAA,CAAc,WAAK,GAAA,EAAK,YAAY,GAAG,MAAM,CAAA;AAClE,IAAA,OAAO,CAAC,GAAG,MAAA,EAAQ,EAAE,GAAA,EAAK,EAAA,EAAI,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,CAAA,EAAG,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAQA,SAAS,YAAA,CAAa,MAAA,EAA0B,OAAA,EAAiB,KAAA,EAAyB;AACxF,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,EAAA,EAAG,IAAK,MAAA,EAAQ;AAChC,IAAA,MAAM,GAAA,GAAW,KAAA,CAAA,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAW,KAAA,CAAA,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,GAAM,QAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,GAAU,IAAA;AAAA,SAAA,IACrB,MAAA,CAAO,WAAW,OAAA,GAAU,KAAA;AAAA,EACvC;AACA,EAAA,OAAO,OAAA;AACT;AAoBO,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA;AAAA,EAE/B,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAChB,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,KAAA;AAAA;AAAA,EAEpB,SAAA;AAAA,EACA,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,QAAA;AAAA;AAAA,EAGpC,cAAA;AAAA;AAAA,EACA,kBAAA;AAAA;AAAA,EACA,eAAA;AAAA;AAAA,EACA,aAAA;AAAA;AAAA,EACA,aAAA;AAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,QAAA;AAAA,EAC5C,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,eAAA;AAAA,EAAiB,aAAA;AAAA,EACpD,kBAAA;AAAA;AAAA,EAGA,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,UAAA;AAAA;AAAA,EAGxB,QAAA;AAAA;AAAA,EACA,MAAA;AAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,YAAA;AAAA,EAAc,MAAA;AAAA,EAAQ,MAAA;AAAA,EACvC,aAAA;AAAA,EAAe,aAAA;AAAA,EAAe,eAAA;AAAA,EAAiB,aAAA;AAAA,EAC/C,OAAA;AAAA,EAAS,oBAAA;AAAA;AAAA,EAGT,SAAA;AAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,aAAA;AAAA;AAAA,EAGzB,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,aAAA;AAAA;AAAA,EAGtB,YAAA;AAAA;AAAA,EAGA,QAAA;AAAA,EAAU,MAAA;AAAA;AAAA,EAGV,eAAA;AAAA,EAAiB,aAAA;AAAA;AAAA,EAGjB,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,SAAA;AAAA,EAAW;AAC1C,CAAC;AAQM,SAAS,iBAAiB,IAAA,EAAuB;AACtD,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI,IAAA,CAAK,WAAW,OAAO,CAAA,IAAK,KAAK,UAAA,CAAW,OAAO,GAAG,OAAO,IAAA;AACjE,EAAA,IAAI,IAAA,KAAS,iBAAiB,OAAO,IAAA;AACrC,EAAA,OAAO,KAAA;AACT;AAGA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA;AAAA,EAE9B,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EAEnC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EACpF,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EAE1E,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EAE1F,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA;AAAA,EAEnF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA;AAAA,EAEtC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA;AAAA,EAE/D;AACF,CAAC,CAAA;AAID,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAY,EAAE,CAAA;AAgBnC,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA;AAAA,EAE1C,mBAAA;AAAA,EAAqB,qBAAA;AAAA,EAAuB,WAAA;AAAA,EAC5C,gBAAA;AAAA,EAAkB,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,WAAA;AAAA,EAC3C,UAAA;AAAA,EAAY,gBAAA;AAAA;AAAA;AAAA,EAEZ,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,UAAA;AAAA,EAAY,SAAA;AAAA,EAC3C,aAAA;AAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EAEA,cAAA;AAAA;AAAA,EAEA,eAAA;AAAA;AAAA,EAEA,YAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,YAAA;AAAA,EAAc,YAAA;AAAA;AAAA,EAEvC,oBAAA;AAAA;AAAA,EAEA,iBAAA;AAAA;AAAA,EAEA,kBAAA;AAAA;AAAA,EAEA,cAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEA,sBAAA;AAAA,EAAwB,iBAAA;AAAA;AAAA,EAExB,eAAA;AAAA;AAAA,EAEA,WAAA;AAAA;AAAA,EAEA,mBAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EAAgB,mBAAA;AAAA;AAAA,EAEhB,qBAAA;AAAA;AAAA,EAEA,YAAA;AAAA;AAAA,EAEA,YAAA;AAAA;AAAA,EAEA,mBAAA;AAAA;AAAA,EAEA;AACF,CAAC;AA0BD,IAAM,oBAAA,GAAuB,OAAA;AAgBtB,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA;AAAA,EAEb,SAAA,uBAAgB,GAAA,EAAiC;AAAA;AAAA,EAEjD,SAAA,uBAAgB,GAAA,EAA6B;AAAA;AAAA,EAE7C,SAAA,uBAAgB,GAAA,EAA8B;AAAA;AAAA,EAE9C,WAAA,uBAAkB,GAAA,EAA8B;AAAA;AAAA,EAEhD,gBAAA,GAA0D,IAAA;AAAA;AAAA,EAE1D,cAAwB,EAAC;AAAA;AAAA,EAEzB,qBAA+B,EAAC;AAAA;AAAA,EAEhC,YAAA,GAAe,CAAA;AAAA;AAAA,EAEf,mBAAA,GAAsB,IAAA;AAAA;AAAA,EAEtB,iBAAA,GAAoB,KAAA;AAAA;AAAA,EAEpB,QAAA,GAA0B,IAAA;AAAA;AAAA,EAE1B,WAAA,uBAAkB,GAAA,EAAuB;AAAA;AAAA,EAEzC,aAAA,uBAAoB,GAAA,EAAmC;AAAA;AAAA,EAEvD,SAAA,uBAAgB,GAAA,EAA6B;AAAA;AAAA,EAE7C,OAAA,GAAU,IAAI,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA,EAGlC,mBAAmB,QAAA,EAA0B;AAC3C,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAa,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,eAAe,KAAA,EAAqB;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,sBAAsB,EAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,IAAI,kBAAA,GAA6B;AAC/B,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACd;AAAA;AAAA,EAGA,aAAa,OAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAA,GAAiC;AAC/B,IAAA,IAAI,IAAA,CAAK,mBAAmB,OAAO,KAAA;AACnC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,UAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,iBAAA,GAAuC;AACzC,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAA,CAAQ,SAAiB,UAAA,EAAqF;AAC5G,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACzC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,eAAe,OAAA,EAAwC;AACrD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,OAAwB,UAAA,GAAa,eAAA;AAAA,EAErC,MAAc,OAAA,CAAQ,OAAA,EAAiB,UAAA,EAAqF;AAC1H,IAAA,MAAM,UAAsB,EAAC;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAU,EAAA,CAAA,oBAAA,KAAyB,UAAA,GAAgB,yBAAqB,GAAO,EAAA,CAAA,IAAA,GAAO,MAAA,IAAU,CAAA;AAC9G,IAAA,MAAM,kBAAA,GAAqB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC9D,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,eAAA,GAAkB,EAAA;AAKxB,IAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,kBAAkB,CAAA;AAC5C,IAAA,MAAM,mBAAmB,IAAA,CAAK,mBAAA;AAE9B,IAAA,MAAM,YAAY,UAAA,CAAU,UAAA;AAC5B,IAAA,MAAM,aAAa,IAAA,CAAK,gBAAA;AACxB,IAAA,MAAM,YAAY,IAAA,CAAK,WAAA;AAEvB,IAAA,eAAe,IAAA,CAAK,KAAa,eAAA,EAAmC;AAClE,MAAA,MAAM,MAAA,GAAc,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,GAAG,CAAA;AAIzC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,UAAA,EAAY,UAAU,GAAG,CAAA;AAAA,MACtC;AAKA,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,GAAA,EAAK,eAAe,CAAA;AAI/D,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,MAAM,GAAA,CAAI,GAAA,CAAI,YAAY;AAClC,UAAA,MAAM,cAAiB,EAAA,CAAA,OAAA,CAAQ,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,UAAA,IAAI,UAAA;AACJ,UAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,YAChC,WAAA,CAAY,KAAK,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,IAAA,EAAe,OAAA,EAAS,CAAA,EAAE,CAAE,CAAA;AAAA,YAC3D,IAAI,OAAA,CAAuB,CAACD,QAAAA,KAAY;AACtC,cAAA,UAAA,GAAa,UAAA,CAAW,MAAMA,QAAAA,CAAQ,EAAE,IAAI,KAAA,EAAO,GAAG,gBAAgB,CAAA;AACtE,cAAA,UAAA,CAAW,KAAA,EAAM;AAAA,YACnB,CAAC;AAAA,WACF,CAAA;AACD,UAAA,YAAA,CAAa,UAAW,CAAA;AACxB,UAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AAEd,YAAA,SAAA,CAAU,IAAA,CAAK,UAAU,GAAG,CAAA;AAC5B,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,MAAA,CAAO,OAAA;AAAA,QAChB,CAAC,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,WAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACrC,QAAA,MAAM,OAAA,GAAe,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAG9C,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,OAAO,CAAA,EAAG;AAEvC,QAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,UAAA,IAAI,gBAAA,CAAiB,EAAE,IAAI,CAAA,IAAK,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAKvD,UAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA,EAAG;AACzC,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,CAAA;AAGjF,UAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,QACrC,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,EAAO,EAAG;AAErB,UAAA,MAAM,GAAA,GAAW,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAC7C,UAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,UAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG;AAC1C,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,CAAA;AACjF,UAAA,UAAA,EAAA;AACA,UAAA,IAAI,UAAA,IAAc,UAAA,GAAa,YAAA,IAAgB,eAAA,EAAiB;AAC9D,YAAA,YAAA,GAAe,UAAA;AACf,YAAA,UAAA,CAAW,YAAY,OAAO,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAEtB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,MAAM,WAAA,EAAa,SAAA,EAAA;AACvB,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC3C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,IAAI,KAAA,CAAM,IAAA,EAAM,CAAC,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,OAAA,EAAS,EAAE,UAAA,EAAY,UAAA,EAAY,WAAW,CAAA;AACnE,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,aAAa,CAAA;AAG7C,IAAA,IAAI,UAAA,IAAc,eAAe,YAAA,EAAc;AAC7C,MAAA,UAAA,CAAW,YAAY,EAAE,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAA,CAAU,OAAA,EAAiB,SAAA,EAAyD;AACxF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAC1C,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,IAAU,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,EAClF;AAAA,EAEA,MAAM,qBAAqB,OAAA,EAAoC;AAC7D,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,cAAc,GAAA,CAAI,OAAO,GAAG,GAAA,CAAI,cAAc,KAAK,EAAC;AAAA,EAClE;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAoC;AACxD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAC1C,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,EAC3F;AAAA,EAEA,MAAM,kBAAkB,OAAA,EAAoC;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAC1C,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CAAgB,OAAA,EAAiB,GAAA,EAA8B;AACnE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,WAAW,MAAM,OAAA;AACvB,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAc,KAAA,CAAA,GAAG,CAAA,GAAI,MAAM,GAAA,GAAW,KAAA,CAAA,GAAA;AACzD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,CAAC,EAAE,MAAA,EAAQ;AAEf,MAAA,IAAI,EAAE,OAAA,KAAY,GAAA,IAAO,EAAE,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG;AACrD,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,SAAS,OAAA,EAAkC;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACzC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAY;AAC3C,MAAA,IAAI;AACF,QAAA,MAAME,KAAAA,GAAO,MAAS,EAAA,CAAA,IAAA,CAAK,OAAO,CAAA;AAClC,QAAA,OAAOA,KAAAA,CAAK,IAAA;AAAA,MACd,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACnC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,OAAA,EAAiB,GAAA,EAA8B;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,WAAW,MAAM,OAAA;AACvB,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAc,KAAA,CAAA,GAAG,CAAA,GAAI,MAAM,GAAA,GAAW,KAAA,CAAA,GAAA;AACzD,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,QAAA,CACG,OAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,CAAA,CAAE,OAAA,KAAY,GAAA,IAAO,CAAA,CAAE,OAAA,CAAQ,WAAW,MAAM,CAAA,CAAE,EAC7E,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,OAAO,CAAC;AAAA,KACxC;AACA,IAAA,OAAO,MAAM,MAAA,CAAO,CAAC,OAAO,IAAA,KAAS,KAAA,GAAQ,MAAM,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,GAAA,EAAgE;AACxG,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,eAAA,CAAgB,GAAG,CAAA,EAAG,UAAA,CAAW,GAAG,CAAC,CAAC,CAAA;AACxF,MAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAAA,IAChC;AACA,IAAA,MAAM,WAAW,MAAM,OAAA;AACvB,IAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAc,KAAA,CAAA,GAAG,CAAA,GAAI,MAAM,GAAA,GAAW,KAAA,CAAA,GAAA;AACzD,IAAA,MAAM,cAAc,QAAA,CAAS,MAAA;AAAA,MAC3B,CAAC,CAAA,KACC,CAAA,CAAE,WACD,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,CAAE,OAAA,CAAQ,UAAA,CAAW,MAAM,MACjD,CAAC,oBAAA,CAAqB,IAAI,CAAA,CAAE,IAAA,CAAK,aAAa;AAAA,KAClD;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAChF,IAAA,OAAO;AAAA,MACL,WAAW,WAAA,CAAY,MAAA;AAAA,MACvB,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,OAAO,IAAA,KAAS,KAAA,GAAQ,MAAM,CAAC;AAAA,KAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,QAAA,EAAmC;AAC9C,IAAA,MAAM,GAAA,GAAW,cAAQ,QAAQ,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAU,IAAA,CAAK,YAAA;AACrB,IAAA,MAAM,eAAe,IAAA,CAAK,kBAAA;AAC1B,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAGrB,IAAA,MAAM,WAAW,YAAY;AAE3B,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,IAAI;AACF,UAAA,MAAMA,KAAAA,GAAO,MAAS,EAAA,CAAA,IAAA,CAAK,GAAG,CAAA;AAC9B,UAAA,IAAIA,KAAAA,CAAK,OAAO,OAAA,EAAS;AACvB,YAAA,MAAM,GAAA,GAAM,OAAA,GAAe,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,GAAG,CAAA,GAAI,GAAA;AACpD,YAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,YAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AACzB,YAAA,OAAO,EAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAS,EAAA,CAAA,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA;AAC7C,MAAA,IAAI,OAAA,CAAQ,SAAS,oBAAA,EAAsB;AAEzC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,GAAG;AAIH,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAgB,QAAA,EAA8B;AAC5C,IAAA,MAAM,GAAA,GAAW,cAAQ,QAAQ,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAU,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAEnD,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AACzB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAIA,WAAW,CAAA,EAA6B;AACtC,IAAA,MAAM,GAAA,GAAW,cAAQ,CAAC,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,OAAA,GAAa,UAAO,GAAG,CAAA,CAAE,KAAK,MAAM,IAAA,EAAM,MAAM,KAAK,CAAA;AAC3D,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwB;AAAE,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EAAM;AAAA;AAAA,EAE1D,IAAI,aAAA,GAAwB;AAAE,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EAAM;AAC5D;AAkBA,eAAsB,cAAA,CAAe,SAAiB,eAAA,EAAgD;AACpG,EAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B,OAAA,EAAS,eAAe,CAAA;AACvE,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,OAAU,EAAA,CAAA,oBAAA,KAAyB,UAAA,GAAgB,yBAAqB,GAAO,EAAA,CAAA,IAAA,GAAO,MAAA,IAAU,CAAA;AAC9G,EAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,aAAa,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,eAAA;AAClB,EAAA,MAAM,UAAA,GAAa,eAAA,GAAkB,YAAA,CAAa,eAAe,CAAA,GAAI,IAAA;AAErE,EAAA,eAAe,KAAA,CAAM,KAAa,eAAA,EAAmC;AACnE,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,GAAA,CAAI,MAAS,EAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAAA,IACxE,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,GAAA,EAAK,eAAe,CAAA;AAC/D,IAAA,MAAM,OAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,OAAA,GAAe,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACrC,MAAA,MAAM,OAAA,GAAe,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC9C,MAAA,IAAI,UAAA,IAAc,UAAA,CAAW,OAAO,CAAA,EAAG;AAEvC,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,QAAA,IAAI,gBAAA,CAAiB,EAAE,IAAI,CAAA,IAAK,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,QAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA,EAAG;AACzC,QAAA,SAAA,EAAA;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,EAAO,EAAG;AACrB,QAAA,MAAM,GAAA,GAAW,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAC7C,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,QAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG;AAC1C,QAAA,UAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,KAAA,CAAM,OAAA,EAAS,EAAE,CAAA;AACvB,EAAA,OAAO,EAAE,YAAY,SAAA,EAAU;AACjC;AAIO,SAAS,wBAAwB,OAAA,EAAyB;AAC/D,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACnC;AAEA,eAAe,yBAAA,CAA0B,SAAiB,eAAA,EAAuD;AAQ/G,EAAA,MAAM,IAAA,GAAO,CAAC,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAA;AAE7C,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,IAAA,EAAO,GAAG,CAAA,GAAA,CAAK,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,IAAA,EAAO,GAAG,CAAA,GAAA,CAAK,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,EAC/B;AACA,EAAA,KAAA,MAAW,OAAA,IAAY,eAAA,IAAmB,EAAC,EAAI;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAA,CAAK,KAAK,IAAA,EAAM,CAAA,CAAA,EAAI,uBAAA,CAAwB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,MAAM,IAAA,EAAM,EAAE,GAAA,EAAK,OAAA,EAAS,WAAW,EAAA,GAAK,IAAA,GAAO,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAClH,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAE;AAElD,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAW,cAAQ,IAAI,CAAA;AAC7B,MAAA,IAAI,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAK,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,UAAA,EAAY,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,KAAK,IAAA,EAAK;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,eAAsB,eAAA,CAAgB,GAAA,EAAa,SAAA,GAAY,IAAA,EAAuB;AACpF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,OAAO,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,aAAa,CAAC,CAAA;AAE3E,EAAA,eAAe,KAAK,UAAA,EAAmC;AACrD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAS,EAAA,CAAA,OAAA,CAAQ,UAAA,EAAY,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,IAAI,gBAAA,CAAiB,EAAE,IAAI,CAAA,IAAK,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,KAAK,IAAA,CAAU,KAAA,CAAA,IAAA,CAAK,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,EAAO,EAAG;AACrB,QAAA,MAAM,GAAA,GAAW,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAC7C,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG,KAAA,EAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,MAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA;AACT;AAOA,eAAsB,UAAA,CAAW,GAAA,EAAa,SAAA,GAAY,IAAA,EAAuB;AAC/E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,OAAO,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,aAAa,CAAC,CAAA;AAE3E,EAAA,eAAe,KAAK,UAAA,EAAmC;AACrD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAS,EAAA,CAAA,OAAA,CAAQ,UAAA,EAAY,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,IAAI,gBAAA,CAAiB,EAAE,IAAI,CAAA,IAAK,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,KAAK,IAAA,CAAU,KAAA,CAAA,IAAA,CAAK,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,EAAO,EAAG;AACrB,QAAA,MAAM,GAAA,GAAW,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAC7C,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,QAAA,IAAI;AACF,UAAA,MAAMA,QAAO,MAAS,EAAA,CAAA,IAAA,CAAU,WAAK,UAAA,EAAY,CAAA,CAAE,IAAI,CAAC,CAAA;AACxD,UAAA,KAAA,IAASA,KAAAA,CAAK,IAAA;AAAA,QAChB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA;AACT;AAGA,eAAsB,SAAA,CACpB,SACA,SAAA,EACmB;AACnB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAU,EAAA,CAAA,oBAAA,KAAyB,UAAA,GAAgB,yBAAqB,GAAO,EAAA,CAAA,IAAA,GAAO,MAAA,IAAU,CAAA;AAC9G,EAAA,MAAM,kBAAA,GAAqB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,gBAAA,GAAmB,IAAI,SAAA,CAAU,kBAAkB,CAAA;AAEzD,EAAA,eAAe,KAAK,GAAA,EAAa;AAC/B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,gBAAA,CAAiB,GAAA,CAAI,MAAS,EAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAAA,IACrF,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,oBAAqC,EAAC;AAE5C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG;AACnB,QAAA,IAAI,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC9B,QAAA,iBAAA,CAAkB,KAAK,IAAA,CAAU,KAAA,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAAA,MACrD,WAAW,CAAA,CAAE,MAAA,MAAY,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1C,QAAA,MAAM,GAAA,GAAW,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,EAAE,WAAA,EAAY;AAC7C,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAU,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAK,OAAO,CAAA;AAClB,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,qBAAqB,OAAA,EAAoC;AAC7E,EAAA,OAAO,SAAA,CAAU,OAAA,EAAS,CAAC,IAAA,KAAS,SAAS,cAAc,CAAA;AAC7D;AAEA,eAAsB,kBAAkB,OAAA,EAAoC;AAC1E,EAAA,OAAO,UAAU,OAAA,EAAS,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAC3D;AAEA,eAAsB,gBAAgB,OAAA,EAAoC;AACxE,EAAA,OAAO,UAAU,OAAA,EAAS,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC9D;AAOO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,OAAO,IAAA,CAAK,WAAW,CAAC,CAAA,KAAM,QAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AACzD;AAEA,eAAsB,aAAgB,QAAA,EAA8B;AAClE,EAAA,MAAM,GAAA,GAAM,MAAS,EAAA,CAAA,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACjC;AAEA,eAAsB,aAAa,QAAA,EAAmC;AACpE,EAAA,OAAU,EAAA,CAAA,QAAA,CAAS,UAAU,MAAM,CAAA;AACrC;AAEA,eAAsB,WAAW,CAAA,EAA6B;AAC5D,EAAA,IAAI;AACF,IAAA,MAAS,UAAO,CAAC,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAsB,UAAU,GAAA,EAA4B;AAC1D,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACzC;AAEA,eAAsB,aAAA,CAAc,UAAkB,IAAA,EAA8B;AAClF,EAAA,MAAM,SAAA,CAAe,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACtC,EAAA,MAAS,EAAA,CAAA,SAAA,CAAU,UAAU,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC3E;AAEA,eAAsB,aAAA,CAAc,UAAkB,OAAA,EAAgC;AACpF,EAAA,MAAM,SAAA,CAAe,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACtC,EAAA,MAAS,EAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAC9C","file":"chunk-DT4KIVRI.js","sourcesContent":["// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/** Simple concurrency limiter */\nexport class Semaphore {\n private available: number;\n private queue: Array<() => void> = [];\n\n constructor(max: number) {\n this.available = max;\n }\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await fn();\n } finally {\n this.release();\n }\n }\n\n private acquire(): Promise<void> {\n if (this.available > 0) {\n this.available--;\n return Promise.resolve();\n }\n return new Promise((resolve) => this.queue.push(resolve));\n }\n\n private release() {\n const next = this.queue.shift();\n if (next) next();\n else this.available++;\n }\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport * as path from 'node:path';\n\n/**\n * Lightweight glob matcher — zero external dependencies.\n *\n * Supports the patterns most commonly used in vibgrate config `exclude`:\n * - `*` matches any sequence of non-separator chars\n * - `**` matches any sequence of chars including separators (recursive)\n * - `?` matches exactly one non-separator char\n * - `{a,b}` alternation\n * - `[abc]` character class\n * - Literal folder names like `legacy` match as a prefix (`legacy/**`)\n *\n * Paths are normalised to forward-slash before matching so patterns\n * work identically on Windows and Unix.\n */\n\n/**\n * Compile an array of glob patterns into a single predicate function\n * that tests a **relative** path (forward-slash separated).\n *\n * Returns `null` if the pattern list is empty (nothing excluded).\n */\n/**\n * Split one or more raw exclude inputs into individual glob patterns.\n *\n * Each input may contain multiple patterns separated by commas or\n * semicolons, e.g. `\"legacy/**, vendor/**; dist\"`. Surrounding\n * whitespace is trimmed and empty entries are dropped. Pass an array\n * (e.g. a repeated `--exclude` flag) and every element is expanded and\n * flattened into a single de-duplicated list.\n */\nexport function parseExcludePatterns(input: string | string[] | undefined): string[] {\n if (input === undefined) return [];\n const raw = Array.isArray(input) ? input : [input];\n const out: string[] = [];\n for (const entry of raw) {\n for (const part of entry.split(/[,;]/)) {\n const trimmed = part.trim();\n if (trimmed) out.push(trimmed);\n }\n }\n return [...new Set(out)];\n}\n\nexport function compileGlobs(patterns: string[]): ((relPath: string) => boolean) | null {\n if (patterns.length === 0) return null;\n\n const matchers = patterns.map((p) => compileOne(normalise(p)));\n\n return (relPath: string) => {\n const norm = normalise(relPath);\n return matchers.some((m) => m(norm));\n };\n}\n\nfunction normalise(p: string): string {\n // Always use forward-slash for matching\n return p.split(path.sep).join('/').replace(/\\/+$/, '');\n}\n\nfunction compileOne(pattern: string): (p: string) => boolean {\n // If the pattern has no glob metacharacters and no path separator,\n // treat it as a directory name prefix match (e.g. \"legacy\" → \"legacy/**\")\n if (!pattern.includes('/') && !hasGlobChars(pattern)) {\n const prefix = pattern + '/';\n return (p) => p === pattern || p.startsWith(prefix);\n }\n\n const re = globToRegex(pattern);\n return (p) => re.test(p);\n}\n\nfunction hasGlobChars(s: string): boolean {\n return /[*?[\\]{}]/.test(s);\n}\n\nfunction globToRegex(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n const len = pattern.length;\n\n while (i < len) {\n const ch = pattern[i]!;\n\n if (ch === '*') {\n if (pattern[i + 1] === '*') {\n // ** — match everything (including separators)\n i += 2;\n if (pattern[i] === '/') {\n // **/ — matches zero or more path segments followed by /\n i++;\n re += '(?:.+/)?';\n } else {\n // ** at end of pattern — matches everything remaining\n re += '.*';\n }\n } else {\n // * — match non-separator chars\n i++;\n re += '[^/]*';\n }\n } else if (ch === '?') {\n i++;\n re += '[^/]';\n } else if (ch === '[') {\n // Character class — pass through until ]\n const start = i;\n i++; // skip [\n while (i < len && pattern[i] !== ']') i++;\n i++; // skip ]\n re += pattern.slice(start, i);\n } else if (ch === '{') {\n // Alternation {a,b,c}\n i++; // skip {\n const alternatives: string[] = [];\n let current = '';\n while (i < len && pattern[i] !== '}') {\n if (pattern[i] === ',') {\n alternatives.push(current);\n current = '';\n } else {\n current += pattern[i];\n }\n i++;\n }\n alternatives.push(current);\n i++; // skip }\n re += '(?:' + alternatives.map(escapeRegex).join('|') + ')';\n } else {\n re += escapeRegex(ch);\n i++;\n }\n }\n\n re += '$';\n return new RegExp(re);\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport { execFile } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport type { Dirent } from 'node:fs';\nimport ignore, { type Ignore } from 'ignore';\nimport { Semaphore } from './semaphore.js';\nimport { compileGlobs } from './glob.js';\n\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * One `.gitignore`'s compiled matcher, scoped to the directory it lives in.\n * `.gitignore` patterns are relative to their own directory (not the walk\n * root), so each level is tested independently against a path relative to\n * `dir`, and results are combined root-to-leaf so a deeper `.gitignore` can\n * re-include (negate) something an ancestor ignored — the same precedence\n * git itself uses.\n */\ninterface GitignoreLevel {\n dir: string;\n ig: Ignore;\n}\n\n/**\n * Load `dir/.gitignore` if present and return a new level list with it\n * appended. Returns `levels` unchanged (no allocation) when the directory has\n * no `.gitignore`, which is the common case.\n */\nasync function extendGitignoreLevels(dir: string, levels: GitignoreLevel[]): Promise<GitignoreLevel[]> {\n try {\n const txt = await fs.readFile(path.join(dir, '.gitignore'), 'utf8');\n return [...levels, { dir, ig: ignore().add(txt) }];\n } catch {\n return levels;\n }\n}\n\n/**\n * Test whether `absPath` is ignored by any `.gitignore` level collected while\n * walking down from the repo root. Walks levels in root-to-leaf order so a\n * later (deeper) match — ignore or negated un-ignore — wins, matching git's\n * own precedence rules.\n */\nfunction isGitignored(levels: GitignoreLevel[], absPath: string, isDir: boolean): boolean {\n if (levels.length === 0) return false;\n let ignored = false;\n for (const { dir, ig } of levels) {\n const rel = path.relative(dir, absPath);\n if (!rel || rel.startsWith('..')) continue;\n const relPosix = rel.split(path.sep).join('/');\n const testPath = isDir ? `${relPosix}/` : relPosix;\n const result = ig.test(testPath);\n if (result.ignored) ignored = true;\n else if (result.unignored) ignored = false;\n }\n return ignored;\n}\n\n/**\n * Directories pruned entirely from the walk — third-party dependency trees,\n * build/output directories, and VCS/IDE metadata. Skipping them keeps their\n * contents out of BOTH project discovery (no phantom projects) AND the billing\n * source-size signals. Matched by exact directory name at any depth.\n *\n * Correctness is load-bearing for pricing: a *missing* entry lets vendored\n * third-party code inflate the project count and size (over-billing — e.g. a\n * React Native app's `Pods/` minting hundreds of phantom C/Obj-C projects),\n * while a *wrong* entry silently drops real source (under-billing). Every name\n * here must be one that is effectively never hand-written source in its\n * ecosystem. Keep in sync with `docs/DEPENDENCY-EXCLUSIONS.md`.\n *\n * Exported so other walkers (e.g. the graph engine's discovery, which keeps\n * its own self-contained copy) can assert in tests that they cover at least\n * this set — the scanner and the graph must never disagree on what is a\n * dependency/build tree.\n */\nexport const SKIP_DIRS = new Set([\n // ── Version control, IDE & tool metadata (never billable source) ──\n '.git', '.svn', '.hg',\n '.idea', '.vscode', '.vs',\n // Claude Code agent state / worktrees (full monorepo copies under .claude/worktrees/)\n '.claude',\n '.vibgrate', '.wrangler', '.turbo', '.cache',\n\n // ── JavaScript / Node — installed dependency trees ──\n 'node_modules', // npm / pnpm / yarn classic\n 'bower_components', // Bower (legacy)\n 'jspm_packages', // jspm (legacy)\n 'web_modules', // Snowpack (legacy)\n '.pnpm-store', // pnpm content-addressable store\n '.yarn', // Yarn Berry cache / unplugged / releases\n\n // ── JS/TS meta-framework & bundler build output ──\n '.next', '.nuxt', '.output', '.svelte-kit', '.astro',\n '.vercel', '.netlify', '.angular', '.parcel-cache', '.docusaurus',\n 'storybook-static',\n\n // ── Generic build / dist / coverage output ──\n 'dist', 'build', 'out', 'coverage',\n\n // ── Vendored third-party source trees ──\n 'vendor', // Go vendor/, PHP Composer, Rails vendor/bundle\n 'Pods', // CocoaPods (iOS/macOS)\n 'Carthage', // Carthage (iOS/macOS)\n\n // ── Python — virtualenvs & tool caches ──\n // Exact names only; custom-named envs (`.venv-foo`) and `site-packages`\n // are handled by {@link isSkippedDirName}.\n '.venv', 'venv', 'virtualenv', '.tox', '.nox',\n '__pycache__', '.mypy_cache', '.pytest_cache', '.ruff_cache',\n '.eggs', '.ipynb_checkpoints',\n\n // ── Ruby ──\n '.bundle', // bundler config / vendored gems\n\n // ── Rust / Maven / sbt / Clojure — all build into target/ ──\n 'target',\n\n // ── JVM (Gradle / Maven) & .NET build output ──\n '.gradle', 'bin', 'obj', 'TestResults',\n\n // ── Swift / Xcode ──\n '.build', '.swiftpm', 'DerivedData',\n\n // ── Dart / Flutter ──\n '.dart_tool',\n\n // ── Elixir / Erlang ──\n '_build', 'deps',\n\n // ── Haskell (Cabal / Stack) ──\n 'dist-newstyle', '.stack-work',\n\n // ── Infrastructure-as-code build/state ──\n '.terraform', '.serverless', 'cdk.out', '.aws-sam',\n]);\n\n/**\n * True when a directory basename must be pruned from discovery / billing walks.\n * Covers exact {@link SKIP_DIRS} names plus custom virtualenv names\n * (`.venv-contextbench`, `venv-tools`, …) and Python install trees\n * (`site-packages`) that otherwise mint phantom nested projects.\n */\nexport function isSkippedDirName(name: string): boolean {\n if (!name) return false;\n if (SKIP_DIRS.has(name)) return true;\n if (name.startsWith('.venv') || name.startsWith('venv-')) return true;\n if (name === 'site-packages') return true;\n return false;\n}\n\n/** File extensions skipped during the walk — binary/font/media that no scanner needs to read */\nconst SKIP_EXTENSIONS = new Set([\n // Fonts\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n // Images & vector\n '.png', '.jpg', '.jpeg', '.gif', '.ico', '.bmp', '.tiff', '.tif', '.webp', '.avif', '.svg',\n '.heic', '.heif', '.jfif', '.psd', '.ai', '.eps', '.raw', '.cr2', '.nef', '.dng',\n // Video\n '.mp4', '.webm', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.m4v', '.mpg', '.mpeg', '.3gp', '.ogv',\n // Audio\n '.mp3', '.wav', '.ogg', '.flac', '.aac', '.wma', '.m4a', '.opus', '.aiff', '.mid', '.midi',\n // Archives\n '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',\n // Compiled / binary\n '.exe', '.dll', '.so', '.dylib', '.o', '.a', '.class', '.pyc', '.pdb',\n // Source maps & lockfiles (large, not useful for drift analysis)\n '.map',\n]);\n\n// Folded into SKIP_DIRS above (single source of truth). Kept as an empty set\n// so the existing walk/ripgrep call sites that OR-check it stay valid.\nconst EXTRA_SKIP_DIRS = new Set<string>([]);\n\n/**\n * Lockfiles and generated dependency manifests excluded from the billing\n * source-size metrics. They are not hand-written source, and a single one\n * (e.g. a pnpm-lock.yaml) can exceed 1 MB on its own, which would otherwise\n * inflate a genuinely tiny project past the micro/small size thresholds.\n *\n * Unlike {@link SKIP_DIRS}, these files legitimately sit at a project root\n * (next to the manifest that declares the project), so they are filtered\n * per-file rather than by pruning a directory. Manifests that *define* a\n * project (package.json, go.mod, Cargo.toml, *.csproj, …) are deliberately NOT\n * here — they are the source of truth for project discovery. Compared\n * case-insensitively against the basename, so every entry must be lowercase.\n * Keep in sync with `docs/DEPENDENCY-EXCLUSIONS.md`.\n */\nexport const SOURCE_EXCLUDE_FILES = new Set([\n // JavaScript / Node\n 'package-lock.json', 'npm-shrinkwrap.json', 'yarn.lock',\n 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock', 'deno.lock',\n '.pnp.cjs', '.pnp.data.json', // Yarn PnP (generated, can be large)\n // Python\n 'poetry.lock', 'pipfile.lock', 'pdm.lock', 'uv.lock',\n 'pylock.toml', // PEP 751 standard lock\n 'conda-lock.yml',\n // Ruby\n 'gemfile.lock',\n // PHP\n 'composer.lock',\n // Rust\n 'cargo.lock',\n // Go\n 'go.sum', 'go.work.sum', 'gopkg.lock', 'glide.lock',\n // .NET\n 'packages.lock.json',\n // Java / JVM (Gradle)\n 'gradle.lockfile',\n // Swift / Xcode\n 'package.resolved',\n // Dart / Flutter\n 'pubspec.lock',\n // Elixir\n 'mix.lock',\n // Haskell (Cabal / Stack)\n 'cabal.project.freeze', 'stack.yaml.lock',\n // Julia\n 'manifest.toml',\n // R\n 'renv.lock',\n // Perl (Carton)\n 'cpanfile.snapshot',\n // CocoaPods / Carthage\n 'podfile.lock', 'cartfile.resolved',\n // Terraform / IaC\n '.terraform.lock.hcl',\n // Helm\n 'chart.lock',\n // C / C++ (Conan)\n 'conan.lock',\n // Bazel\n 'module.bazel.lock',\n // Nix\n 'flake.lock',\n]);\n\n// ── Directory entry gathered in a single walk ──\n\nexport interface DirEntry {\n /** Absolute path */\n absPath: string;\n /** Path relative to the walk root */\n relPath: string;\n /** Filename (basename) */\n name: string;\n /** Whether this is a regular file */\n isFile: boolean;\n /** Whether this is a directory */\n isDirectory: boolean;\n}\n\n// ── FileCache: walk once, read once ──\n\n/**\n * Maximum file size (in bytes) that will be held in the text cache.\n * Files larger than this are read from disk but NOT stored — this prevents\n * lockfiles (pnpm-lock.yaml, package-lock.json, etc.) from consuming\n * 50-200 MB of heap. Small config files like package.json (~1-5 KB each)\n * are cached normally.\n */\nconst TEXT_CACHE_MAX_BYTES = 1_048_576; // 1 MB\n\n/**\n * Shared cache that ensures the filesystem is walked at most once per root dir\n * and every small file is read at most once across all scanners.\n *\n * Memory-conscious design:\n * - Walk results are stored once; consumers filter in-memory.\n * - File content is only cached when ≤ TEXT_CACHE_MAX_BYTES (1 MB).\n * Large files (lockfiles) pass straight through without caching.\n * - readJsonFile evicts the raw-text entry after parsing so we never\n * hold *both* the string and the parsed object for the same file.\n * - No stat caching — only file-hotspots uses stat and there's no\n * cross-scanner reuse to justify holding thousands of Stats objects.\n * - Call `clear()` after the scan to release all remaining references.\n */\nexport class FileCache {\n /** Directory walk results keyed by rootDir */\n private walkCache = new Map<string, Promise<DirEntry[]>>();\n /** File content keyed by absolute path (only files ≤ TEXT_CACHE_MAX_BYTES) */\n private textCache = new Map<string, Promise<string>>();\n /** Parsed JSON keyed by absolute path */\n private jsonCache = new Map<string, Promise<unknown>>();\n /** pathExists keyed by absolute path */\n private existsCache = new Map<string, Promise<boolean>>();\n /** User-configured exclude predicate (compiled from glob patterns) */\n private excludePredicate: ((relPath: string) => boolean) | null = null;\n /** Directories that were auto-skipped because they were stuck */\n private _stuckPaths: string[] = [];\n /** Files skipped because they exceed maxFileSizeToScan */\n private _skippedLargeFiles: string[] = [];\n /** Maximum file size (bytes) we will read. 0 = unlimited. */\n private _maxFileSize = 0;\n /** Per-project / per-directory scan timeout in ms. */\n private _projectScanTimeout = 180_000;\n /** Whether we have already shown the \"increase projectScanTimeout\" hint */\n private _timeoutHintShown = false;\n /** Root dir for relative-path computation (set by the first walkDir call) */\n private _rootDir: string | null = null;\n /** Cached tree summary captured during the shared walk */\n private walkSummary = new Map<string, TreeCount>();\n /** Fast lookup for exact filename (e.g. package.json) */\n private fileNameIndex = new Map<string, Map<string, string[]>>();\n /** Per-file byte size keyed by absolute path (memoised so nested projects don't re-stat) */\n private sizeCache = new Map<string, Promise<number>>();\n /** Concurrency limiter for size stats */\n private sizeSem = new Semaphore(64);\n\n /** Set exclude patterns from config (call once before the walk) */\n setExcludePatterns(patterns: string[]): void {\n this.excludePredicate = compileGlobs(patterns);\n }\n\n /** Set the maximum file size in bytes that readTextFile / readJsonFile will process */\n setMaxFileSize(bytes: number): void {\n this._maxFileSize = bytes;\n }\n\n /** Set the per-project scan timeout (milliseconds). Scanners use this\n * instead of a hard-coded constant so the user can override it via config. */\n setProjectScanTimeout(ms: number): void {\n this._projectScanTimeout = ms;\n }\n\n /** Current per-project scan timeout in milliseconds */\n get projectScanTimeout(): number {\n return this._projectScanTimeout;\n }\n\n /** Record a path that timed out or was stuck during scanning */\n addStuckPath(relPath: string): void {\n this._stuckPaths.push(relPath);\n }\n\n /**\n * Returns true the first time it is called, false thereafter.\n * Used by scanners to print the \"increase projectScanTimeout\" hint\n * only once per scan run.\n */\n shouldShowTimeoutHint(): boolean {\n if (this._timeoutHintShown) return false;\n this._timeoutHintShown = true;\n return true;\n }\n\n /** Get all paths that were auto-skipped due to being stuck (dirs + scanner files) */\n get stuckPaths(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** @deprecated Use stuckPaths instead */\n get stuckDirs(): readonly string[] {\n return this._stuckPaths;\n }\n\n /** Get files that were skipped because they exceeded maxFileSizeToScan */\n get skippedLargeFiles(): readonly string[] {\n return this._skippedLargeFiles;\n }\n\n // ── Directory walking ──\n\n /**\n * Walk the directory tree from `rootDir` once, skipping SKIP_DIRS plus\n * common framework output dirs (.nuxt, .output, .svelte-kit).\n *\n * The result is memoised so every scanner filters the same array.\n * Consumers that need additional filtering (e.g. SOURCE_EXTENSIONS,\n * SKIP_EXTENSIONS) do so on the returned entries — no separate walk.\n */\n walkDir(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n this._rootDir = rootDir;\n const cached = this.walkCache.get(rootDir);\n if (cached) return cached;\n\n const promise = this._doWalk(rootDir, onProgress);\n this.walkCache.set(rootDir, promise);\n return promise;\n }\n\n /** Return tree summary from the cached walk, if available. */\n getWalkSummary(rootDir: string): TreeCount | undefined {\n return this.walkSummary.get(rootDir);\n }\n\n /** Additional dirs skipped only by the cached walk (framework outputs) */\n private static readonly EXTRA_SKIP = EXTRA_SKIP_DIRS;\n\n private async _doWalk(rootDir: string, onProgress?: (filesFound: number, currentPath: string) => void): Promise<DirEntry[]> {\n const results: DirEntry[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n let foundCount = 0;\n let lastReported = 0;\n const REPORT_INTERVAL = 50; // report every N files\n // Semaphore limits concurrent readdir I/O only — NOT the entire\n // recursive walk. Previously sem.run wrapped the whole walk(),\n // so parent directories held a slot while awaiting children,\n // starving deep trees into near-serial execution.\n const sem = new Semaphore(maxConcurrentReads);\n const STUCK_TIMEOUT_MS = this._projectScanTimeout;\n\n const extraSkip = FileCache.EXTRA_SKIP;\n const isExcluded = this.excludePredicate;\n const stuckDirs = this._stuckPaths;\n\n async function walk(dir: string, gitignoreLevels: GitignoreLevel[]) {\n const relDir = path.relative(rootDir, dir);\n\n // Report the directory we are ABOUT to read so the UI shows\n // where we are if this readdir gets stuck.\n if (onProgress) {\n onProgress(foundCount, relDir || '.');\n }\n\n // Extend the .gitignore chain with this directory's own file (if any)\n // BEFORE reading entries, so its rules apply to its own children —\n // matching git's precedence (deepest applicable .gitignore wins).\n const levels = await extendGitignoreLevels(dir, gitignoreLevels);\n\n // Acquire the semaphore ONLY for the readdir I/O, then release\n // immediately so parent dirs don't hold slots while awaiting children.\n let entries: Dirent[] | null;\n try {\n entries = await sem.run(async () => {\n const readPromise = fs.readdir(dir, { withFileTypes: true });\n let stuckTimer: ReturnType<typeof setTimeout>;\n const result = await Promise.race([\n readPromise.then((e) => ({ ok: true as const, entries: e })),\n new Promise<{ ok: false }>((resolve) => {\n stuckTimer = setTimeout(() => resolve({ ok: false }), STUCK_TIMEOUT_MS);\n stuckTimer.unref();\n }),\n ]);\n clearTimeout(stuckTimer!);\n if (!result.ok) {\n // Directory read timed out — record and skip\n stuckDirs.push(relDir || dir);\n return null;\n }\n return result.entries;\n });\n } catch {\n return;\n }\n if (!entries) return;\n\n const subWalks: Promise<void>[] = [];\n for (const e of entries) {\n const absPath = path.join(dir, e.name);\n const relPath = path.relative(rootDir, absPath);\n\n // Check user-configured excludes\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n // Respect .gitignore (root + any nested ones seen so far) so\n // repo-specific, non-canonically-named build/dependency/cache dirs\n // (e.g. a custom-named virtualenv) don't get walked just because\n // they aren't on the hardcoded SKIP_DIRS list.\n if (isGitignored(levels, absPath, true)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: false, isDirectory: true });\n // Launch sub-walk WITHOUT wrapping in sem.run — child walks\n // acquire the semaphore independently for their own readdir.\n subWalks.push(walk(absPath, levels));\n } else if (e.isFile()) {\n // Skip binary/font/media files that no scanner needs\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n if (isGitignored(levels, absPath, false)) continue;\n results.push({ absPath, relPath, name: e.name, isFile: true, isDirectory: false });\n foundCount++;\n if (onProgress && foundCount - lastReported >= REPORT_INTERVAL) {\n lastReported = foundCount;\n onProgress(foundCount, relPath);\n }\n }\n }\n await Promise.all(subWalks);\n }\n\n await walk(rootDir, []);\n\n let totalDirs = 0;\n const rootNameIndex = new Map<string, string[]>();\n for (const entry of results) {\n if (entry.isDirectory) totalDirs++;\n if (!entry.isFile) continue;\n const bucket = rootNameIndex.get(entry.name);\n if (bucket) {\n bucket.push(entry.absPath);\n } else {\n rootNameIndex.set(entry.name, [entry.absPath]);\n }\n }\n this.walkSummary.set(rootDir, { totalFiles: foundCount, totalDirs });\n this.fileNameIndex.set(rootDir, rootNameIndex);\n\n // Final progress report\n if (onProgress && foundCount !== lastReported) {\n onProgress(foundCount, '');\n }\n return results;\n }\n\n /**\n * Find files matching a predicate from the cached walk.\n * Returns absolute paths (same contract as the standalone `findFiles`).\n */\n async findFiles(rootDir: string, predicate: (name: string) => boolean): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && predicate(e.name)).map((e) => e.absPath);\n }\n\n async findPackageJsonFiles(rootDir: string): Promise<string[]> {\n await this.walkDir(rootDir);\n return this.fileNameIndex.get(rootDir)?.get('package.json') ?? [];\n }\n\n async findCsprojFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.csproj')).map((e) => e.absPath);\n }\n\n async findSolutionFiles(rootDir: string): Promise<string[]> {\n const entries = await this.walkDir(rootDir);\n return entries.filter((e) => e.isFile && e.name.endsWith('.sln')).map((e) => e.absPath);\n }\n\n /**\n * Count files under a given directory using the cached walk data.\n * Avoids a redundant recursive readdir that can be slow on large\n * project trees (the main cause of per-project timeout hits).\n * Falls back to the standalone `countFilesInDir` if the walk hasn't\n * been populated yet.\n */\n async countFilesUnder(rootDir: string, dir: string): Promise<number> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to standalone count\n return countFilesInDir(dir);\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n let count = 0;\n for (const e of resolved) {\n if (!e.isFile) continue;\n // File is directly in `dir` or in a subdirectory of `dir`\n if (e.absPath === dir || e.absPath.startsWith(prefix)) {\n count++;\n }\n }\n return count;\n }\n\n /** Stat a single file's byte size, memoised and concurrency-limited. */\n private statSize(absPath: string): Promise<number> {\n const cached = this.sizeCache.get(absPath);\n if (cached) return cached;\n const promise = this.sizeSem.run(async () => {\n try {\n const stat = await fs.stat(absPath);\n return stat.size;\n } catch {\n return 0;\n }\n });\n this.sizeCache.set(absPath, promise);\n return promise;\n }\n\n /**\n * Sum the byte size of every file under `dir` using the cached walk.\n * Mirrors {@link countFilesUnder}; per-file stats are memoised so nested\n * project trees are never stat-ed twice. Falls back to a standalone walk\n * when the cache has not been populated yet.\n */\n async bytesUnder(rootDir: string, dir: string): Promise<number> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to a standalone size walk\n return bytesInDir(dir);\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n const sizes = await Promise.all(\n resolved\n .filter((e) => e.isFile && (e.absPath === dir || e.absPath.startsWith(prefix)))\n .map((e) => this.statSize(e.absPath)),\n );\n return sizes.reduce((total, size) => total + size, 0);\n }\n\n /**\n * Source-only file count and byte size under `dir`, used for billing\n * classification. Identical to {@link countFilesUnder} / {@link bytesUnder}\n * but additionally excludes lockfiles and generated dependency manifests\n * (see {@link SOURCE_EXCLUDE_FILES}); vendored and build-output directories\n * are already excluded by the shared walk. Walks the cached entries once so\n * the count and size stay consistent. Falls back to the standalone walks\n * when the cache has not been populated yet.\n */\n async sourceMetricsUnder(rootDir: string, dir: string): Promise<{ fileCount: number; sizeBytes: number }> {\n const entries = this.walkCache.get(rootDir);\n if (!entries) {\n // Walk not done yet — fall back to standalone walks.\n const [fileCount, sizeBytes] = await Promise.all([countFilesInDir(dir), bytesInDir(dir)]);\n return { fileCount, sizeBytes };\n }\n const resolved = await entries;\n const prefix = dir.endsWith(path.sep) ? dir : dir + path.sep;\n const sourceFiles = resolved.filter(\n (e) =>\n e.isFile &&\n (e.absPath === dir || e.absPath.startsWith(prefix)) &&\n !SOURCE_EXCLUDE_FILES.has(e.name.toLowerCase()),\n );\n const sizes = await Promise.all(sourceFiles.map((e) => this.statSize(e.absPath)));\n return {\n fileCount: sourceFiles.length,\n sizeBytes: sizes.reduce((total, size) => total + size, 0),\n };\n }\n\n // ── File content reading ──\n\n /**\n * Read a text file. Files ≤ 1 MB are cached so subsequent calls from\n * different scanners return the same string. Files > 1 MB (lockfiles,\n * large generated files) are read directly and never retained.\n *\n * If maxFileSizeToScan is set and the file exceeds it, the file is\n * recorded as skipped and an empty string is returned.\n */\n readTextFile(filePath: string): Promise<string> {\n const abs = path.resolve(filePath);\n const cached = this.textCache.get(abs);\n if (cached) return cached;\n\n const maxSize = this._maxFileSize;\n const skippedLarge = this._skippedLargeFiles;\n const rootDir = this._rootDir;\n\n // Read file, then decide whether to cache based on size\n const promise = (async () => {\n // Check file size before reading when a limit is configured\n if (maxSize > 0) {\n try {\n const stat = await fs.stat(abs);\n if (stat.size > maxSize) {\n const rel = rootDir ? path.relative(rootDir, abs) : abs;\n skippedLarge.push(rel);\n this.textCache.delete(abs);\n return '';\n }\n } catch {\n // If stat fails, fall through and let readFile handle it\n }\n }\n\n const content = await fs.readFile(abs, 'utf8');\n if (content.length > TEXT_CACHE_MAX_BYTES) {\n // Too large for cache — evict so we don't hold it\n this.textCache.delete(abs);\n }\n return content;\n })();\n\n // Temporarily store the promise so concurrent callers during the same\n // tick await the same read (avoids double-reads even for large files).\n this.textCache.set(abs, promise);\n return promise;\n }\n\n /**\n * Read and parse a JSON file. The parsed object is cached; the raw\n * text is evicted immediately so we never hold both representations.\n */\n readJsonFile<T>(filePath: string): Promise<T> {\n const abs = path.resolve(filePath);\n const cached = this.jsonCache.get(abs);\n if (cached) return cached as Promise<T>;\n\n const promise = this.readTextFile(abs).then((txt) => {\n // Evict raw text — we now have the parsed object\n this.textCache.delete(abs);\n return JSON.parse(stripBom(txt)) as T;\n });\n this.jsonCache.set(abs, promise);\n return promise;\n }\n\n // ── Existence checks ──\n\n pathExists(p: string): Promise<boolean> {\n const abs = path.resolve(p);\n const cached = this.existsCache.get(abs);\n if (cached) return cached;\n const promise = fs.access(abs).then(() => true, () => false);\n this.existsCache.set(abs, promise);\n return promise;\n }\n\n // ── Lifecycle ──\n\n /** Release all cached data. Call after the scan completes. */\n clear(): void {\n this.walkCache.clear();\n this.walkSummary.clear();\n this.fileNameIndex.clear();\n this.textCache.clear();\n this.jsonCache.clear();\n this.existsCache.clear();\n this.sizeCache.clear();\n }\n\n /** Number of file content entries currently held */\n get textCacheSize(): number { return this.textCache.size; }\n /** Number of parsed JSON entries currently held */\n get jsonCacheSize(): number { return this.jsonCache.size; }\n}\n\n// ── Quick tree count (fast pre-scan) ──\n\nexport interface TreeCount {\n /** Total files discovered (excluding skipped dirs) */\n totalFiles: number;\n /** Total subdirectories discovered (excluding skipped dirs) */\n totalDirs: number;\n}\n\n/**\n * Fast, lightweight traversal that only *counts* files and directories\n * without storing entries. Used before the main scan so the progress\n * bar can show an accurate percentage.\n *\n * Respects the same SKIP_DIRS as the full walk.\n */\nexport async function quickTreeCount(rootDir: string, excludePatterns?: string[]): Promise<TreeCount> {\n const native = await quickTreeCountWithRipgrep(rootDir, excludePatterns);\n if (native) return native;\n\n let totalFiles = 0;\n let totalDirs = 0;\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrent = Math.max(8, Math.min(128, cores * 8));\n const sem = new Semaphore(maxConcurrent);\n const extraSkip = EXTRA_SKIP_DIRS;\n const isExcluded = excludePatterns ? compileGlobs(excludePatterns) : null;\n\n async function count(dir: string, gitignoreLevels: GitignoreLevel[]) {\n let entries: Dirent[];\n try {\n entries = await sem.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n const levels = await extendGitignoreLevels(dir, gitignoreLevels);\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n const absPath = path.join(dir, e.name);\n const relPath = path.relative(rootDir, absPath);\n if (isExcluded && isExcluded(relPath)) continue;\n\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n if (isGitignored(levels, absPath, true)) continue;\n totalDirs++;\n subs.push(count(absPath, levels));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n if (isGitignored(levels, absPath, false)) continue;\n totalFiles++;\n }\n }\n await Promise.all(subs);\n }\n\n await count(rootDir, []);\n return { totalFiles, totalDirs };\n}\n\n\n\nexport function normalizeGlobForRipgrep(pattern: string): string {\n return pattern.replace(/\\\\/g, '/');\n}\n\nasync function quickTreeCountWithRipgrep(rootDir: string, excludePatterns?: string[]): Promise<TreeCount | null> {\n // `--hidden` includes dotfiles/dot-dirs (ripgrep skips them by default);\n // deliberately NOT passing `--no-ignore` here so ripgrep applies its own\n // (correct, battle-tested) .gitignore handling — root, nested, and global\n // excludes — the same way `git status` would. This must stay in sync with\n // the manual .gitignore handling in the JS walk fallback (`_doWalk`,\n // `quickTreeCount`'s `count()`) below, which exists only for machines\n // without `rg` on PATH.\n const args = ['--files', '--hidden', '--null'];\n\n for (const dir of SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const dir of EXTRA_SKIP_DIRS) {\n args.push('-g', `!**/${dir}/**`);\n }\n for (const ext of SKIP_EXTENSIONS) {\n args.push('-g', `!**/*${ext}`);\n }\n for (const pattern of (excludePatterns ?? [])) {\n const trimmed = pattern.trim();\n if (!trimmed) continue;\n args.push('-g', `!${normalizeGlobForRipgrep(trimmed)}`);\n }\n\n try {\n const { stdout } = await execFileAsync('rg', args, { cwd: rootDir, maxBuffer: 64 * 1024 * 1024, encoding: 'utf8' });\n if (!stdout) return { totalFiles: 0, totalDirs: 0 };\n\n const files = stdout.split('\\0').filter(Boolean);\n const dirs = new Set<string>();\n for (const file of files) {\n const dir = path.dirname(file);\n if (dir && dir !== '.') dirs.add(dir);\n }\n\n return { totalFiles: files.length, totalDirs: dirs.size };\n } catch {\n return null;\n }\n}\n\n/**\n * Count the number of source files in a directory (non-recursive by default).\n * For project-level file counting, skips binary/media files.\n */\nexport async function countFilesInDir(dir: string, recursive = true): Promise<number> {\n let count = 0;\n const extraSkip = new Set(['obj', 'bin', 'Debug', 'Release', 'TestResults']);\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!recursive) continue;\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n subs.push(walk(path.join(currentDir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) count++;\n }\n }\n await Promise.all(subs);\n }\n\n await walk(dir);\n return count;\n}\n\n/**\n * Sum the byte size of all source files in a directory (recursive),\n * skipping common build/output dirs and binary/media files. Standalone\n * fallback for {@link FileCache.bytesUnder} when the cached walk is cold.\n */\nexport async function bytesInDir(dir: string, recursive = true): Promise<number> {\n let bytes = 0;\n const extraSkip = new Set(['obj', 'bin', 'Debug', 'Release', 'TestResults']);\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n const subs: Promise<void>[] = [];\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!recursive) continue;\n if (isSkippedDirName(e.name) || extraSkip.has(e.name)) continue;\n subs.push(walk(path.join(currentDir, e.name)));\n } else if (e.isFile()) {\n const ext = path.extname(e.name).toLowerCase();\n if (SKIP_EXTENSIONS.has(ext)) continue;\n try {\n const stat = await fs.stat(path.join(currentDir, e.name));\n bytes += stat.size;\n } catch {\n // ignore unreadable files\n }\n }\n }\n await Promise.all(subs);\n }\n\n await walk(dir);\n return bytes;\n}\n\n/** Recursively find files matching a predicate, skipping common build/output dirs */\nexport async function findFiles(\n rootDir: string,\n predicate: (name: string) => boolean,\n): Promise<string[]> {\n const results: string[] = [];\n const cores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length || 4;\n const maxConcurrentReads = Math.max(8, Math.min(64, cores * 4));\n const readDirSemaphore = new Semaphore(maxConcurrentReads);\n\n async function walk(dir: string) {\n let entries: Dirent[];\n try {\n entries = await readDirSemaphore.run(() => fs.readdir(dir, { withFileTypes: true }));\n } catch {\n return;\n }\n\n const subDirectoryWalks: Promise<void>[] = [];\n\n for (const e of entries) {\n if (e.isDirectory()) {\n if (isSkippedDirName(e.name)) continue;\n subDirectoryWalks.push(walk(path.join(dir, e.name)));\n } else if (e.isFile() && predicate(e.name)) {\n const ext = path.extname(e.name).toLowerCase();\n if (!SKIP_EXTENSIONS.has(ext)) results.push(path.join(dir, e.name));\n }\n }\n\n await Promise.all(subDirectoryWalks);\n }\n\n await walk(rootDir);\n return results;\n}\n\nexport async function findPackageJsonFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name === 'package.json');\n}\n\nexport async function findSolutionFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.sln'));\n}\n\nexport async function findCsprojFiles(rootDir: string): Promise<string[]> {\n return findFiles(rootDir, (name) => name.endsWith('.csproj'));\n}\n\n/**\n * Strip a UTF-8 byte-order mark — editors on Windows commonly save\n * manifests with a BOM, and JSON.parse rejects it, which silently\n * dropped the project from scan results.\n */\nexport function stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const txt = await fs.readFile(filePath, 'utf8');\n return JSON.parse(stripBom(txt)) as T;\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf8');\n}\n\nexport async function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf8');\n}\n\nexport async function writeTextFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf8');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/serialize.ts","../src/engine/snapshot.ts","../src/engine/report.ts","../src/engine/html.ts","../src/engine/concepts.ts","../src/engine/relevance-provider.ts","../src/engine/artifacts.ts","../src/engine/relevance-enrich.ts"],"names":["crc32","fs","path","fs2","raw","legacy","MAGIC","zlib2","newPackr","Packr","fs4","path3","cached","tags"],"mappings":"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","file":"chunk-ENFSSUNK.js","sourcesContent":["import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic serialization of `graph.json`.\n *\n * Object keys are sorted recursively and arrays are emitted in the (already\n * stable) order the engine produced them, so two runs over identical content\n * yield byte-identical output — the determinism contract (VG-CLI-SPEC §1.3).\n * Pretty-printed (2-space) and newline-terminated so the committed artifact is\n * human-diffable and plays well with the union merge driver.\n */\nexport function serializeGraph(graph: VgGraph, opts?: { compact?: boolean }): string {\n // Compact (no pretty-print) for large maps / CI artifacts — still deterministic.\n const indent = opts?.compact ? 0 : 2;\n return `${stableStringify(graph, indent)}\\n`;\n}\n\n/**\n * Drop heavy optional fields for export/sharing when size matters.\n * Does not mutate the input graph.\n */\nexport function slimGraphForExport(graph: VgGraph): VgGraph {\n return {\n ...graph,\n areas: graph.areas.map((a) => ({\n ...a,\n members: [], // member id lists dominate XL exports; area id still on nodes\n })),\n grounding: undefined,\n facts: graph.facts,\n // Keep summaries/unknowns — small and useful to agents.\n };\n}\n\nexport function stableStringify(value: unknown, indent = 2): string {\n return JSON.stringify(sortKeys(value), null, indent);\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(input).sort()) {\n const v = input[key];\n if (v === undefined) continue; // omit undefined for stable output\n out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\nexport function parseGraph(json: string): VgGraph {\n return JSON.parse(json) as VgGraph;\n}\n","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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n","/**\n * Term roles and deterministic concept expansion for `vg ask` / Task Capsule\n * seed ranking (engine/query.ts).\n *\n * Two failure modes motivated this module (field report, 2026-07):\n *\n * 1. Weak process verbs dominated intent asks. \"what do i need to do to add\n * payments via direct debit?\" seeded every `add*` symbol in the repo\n * (`addTeamMember`, `AddBlogForm`, `submitAdd`, …) because \"add\" scored on\n * equal footing with \"debit\". Verbs that describe the ACTION the caller\n * wants (\"add\", \"create\", \"via\") are not the TOPIC being asked about — they\n * may corroborate a topic match but must never be a seed's sole evidence.\n *\n * 2. No conceptual pull. \"payments\" never reached `StripeGateway` /\n * `InvoiceService` unless a symbol literally contained \"payment\". A small,\n * static, product-domain lexicon (payments → stripe/billing/invoice/…,\n * \"direct debit\" → sepa/bacs/mandate) closes the gap deterministically —\n * no embeddings, no network, stable across runs.\n *\n * Everything here is pure data + pure functions: same question in, same\n * expansion out, so capsule ranking stays benchmarkable and pinnable.\n */\n\n/**\n * Process verbs and feature-request scaffolding: words that describe what the\n * caller wants DONE, not what the code is ABOUT. They still contribute score\n * (down-weighted) to nodes that independently match a content term, but a node\n * matching only weak terms is suppressed — that is exactly the `add*` grab-bag\n * failure. Distinct from STOPWORDS (which are dropped outright): a weak term\n * still corroborates (\"add … to scanDir\" boosts an `addEntry` sibling of a\n * scanDir hit), it just cannot carry a seed alone.\n */\nexport const WEAK_TERMS = new Set([\n 'add', 'adds', 'added', 'adding',\n 'create', 'creates', 'created', 'creating',\n 'make', 'makes', 'making', 'made',\n 'new', 'newly',\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',\n 'get', 'gets', 'getting',\n 'use', 'uses', 'used', 'using',\n 'want', 'wants', 'wanted',\n 'do', 'does', 'doing', 'done',\n 'support', 'supports', 'supported', 'supporting',\n 'enable', 'enables', 'enabled', 'enabling',\n 'disable', 'disables', 'disabled', 'disabling',\n 'allow', 'allows', 'allowed',\n 'implement', 'implements', 'implemented', 'implementing',\n 'build', 'builds', 'building', 'built',\n 'via', 'through', 'into', 'onto',\n 'way', 'ways', 'thing', 'things', 'stuff',\n 'feature', 'features', 'functionality',\n 'method', 'methods', 'option', 'options', 'ability',\n 'help', 'start', 'begin', 'work', 'works', 'working',\n 'also', 'currently', 'properly', 'correctly', 'please',\n 'happens', 'happen', 'something', 'somewhere',\n 'step', 'steps', 'flow', 'process',\n 'you', 'can',\n]);\n\n/**\n * Product-domain concept lexicon: question token → identifier vocabulary that\n * OWNS the concept in real codebases. Expansion terms score at a reduced tier\n * (EXPANSION_WEIGHT in query.ts) and count as content evidence, with the\n * provenance kept in the seed's `why` (`payments→stripe`).\n *\n * Keep entries conservative: every value should be a word a maintainer would\n * plausibly put in an identifier or directory name for that concept. Do not\n * add framing words (\"code\", \"logic\") — they are stopwords, not concepts.\n */\nconst CONCEPTS: Record<string, readonly string[]> = {\n // ---- payments / billing ----\n payment: ['stripe', 'billing', 'invoice', 'checkout', 'charge', 'subscription', 'refund', 'payout', 'card', 'debit', 'mandate'],\n pay: ['payment', 'stripe', 'charge', 'billing', 'invoice'],\n paid: ['payment', 'invoice', 'charge'],\n billing: ['invoice', 'payment', 'subscription', 'stripe', 'charge', 'renewal'],\n checkout: ['stripe', 'payment', 'cart', 'session'],\n debit: ['mandate', 'sepa', 'bacs', 'ach', 'bank', 'payment'],\n mandate: ['sepa', 'bacs', 'debit'],\n sepa: ['mandate', 'debit', 'iban', 'bank'],\n bacs: ['mandate', 'debit', 'bank'],\n ach: ['mandate', 'debit', 'bank'],\n stripe: ['payment', 'billing', 'checkout', 'webhook', 'charge', 'card'],\n refund: ['payment', 'invoice', 'stripe', 'charge'],\n invoice: ['billing', 'payment', 'refund', 'subscription'],\n subscription: ['billing', 'renewal', 'invoice', 'plan', 'recurring'],\n recurring: ['subscription', 'renewal', 'mandate', 'debit'],\n renewal: ['subscription', 'billing', 'renew'],\n card: ['payment', 'charge', 'stripe'],\n credit: ['card', 'payment', 'charge'],\n bank: ['debit', 'mandate', 'sepa', 'iban', 'account'],\n charge: ['payment', 'card', 'stripe'],\n webhook: ['event', 'handler', 'callback'],\n price: ['payment', 'billing', 'plan'],\n customer: ['billing', 'account', 'user'],\n // ---- auth ----\n auth: ['login', 'session', 'token', 'oauth', 'password', 'credential'],\n authentication: ['auth', 'login', 'session', 'token', 'password'],\n authenticated: ['auth', 'login', 'session'],\n login: ['auth', 'session', 'password', 'signin', 'oauth'],\n signin: ['login', 'auth', 'session'],\n signup: ['register', 'onboard', 'account'],\n logout: ['session', 'auth', 'signout'],\n password: ['auth', 'login', 'credential', 'hash'],\n session: ['auth', 'login', 'token'],\n token: ['session', 'auth', 'jwt'],\n oauth: ['auth', 'login', 'callback', 'provider'],\n google: ['oauth', 'login', 'auth'],\n github: ['oauth', 'login', 'auth'],\n sso: ['oauth', 'auth', 'saml', 'login'],\n credential: ['auth', 'password', 'token', 'secret'],\n // ---- dependencies / supply chain ----\n dependency: ['package', 'audit', 'vulnerability', 'advisory', 'lockfile', 'version'],\n package: ['dependency', 'audit', 'vulnerability', 'advisory', 'lockfile'],\n vulnerability: ['advisory', 'cve', 'osv', 'audit', 'vulnerable'],\n vulnerable: ['vulnerability', 'advisory', 'audit', 'cve'],\n advisory: ['vulnerability', 'cve', 'osv', 'audit'],\n cve: ['vulnerability', 'advisory', 'osv'],\n risk: ['vulnerability', 'audit', 'advisory'],\n security: ['vulnerability', 'audit', 'advisory'],\n audit: ['dependency', 'vulnerability', 'advisory'],\n scan: ['audit', 'vulnerability', 'scanner'],\n // ---- notifications / messaging ----\n email: ['mail', 'smtp', 'sender', 'template', 'message'],\n mail: ['email', 'smtp', 'sender'],\n notification: ['notify', 'email', 'sms', 'push', 'alert'],\n notify: ['notification', 'email', 'alert'],\n sms: ['notification', 'message', 'twilio'],\n // ---- e-commerce ----\n cart: ['checkout', 'order', 'shop', 'basket', 'discount'],\n basket: ['cart', 'checkout', 'order'],\n order: ['cart', 'shipment', 'fulfillment', 'shop', 'checkout'],\n ship: ['order', 'fulfillment', 'delivery', 'shipment'],\n shipment: ['order', 'fulfillment', 'delivery', 'track'],\n shipping: ['order', 'fulfillment', 'delivery', 'shipment'],\n shipped: ['order', 'fulfillment', 'shipment'],\n inventory: ['stock', 'product', 'catalog', 'restock'],\n stock: ['inventory', 'product', 'restock'],\n product: ['catalog', 'inventory', 'shop'],\n discount: ['coupon', 'promo', 'cart', 'price'],\n coupon: ['discount', 'promo', 'code'],\n // ---- chat / social ----\n chat: ['message', 'room', 'conversation', 'presence'],\n message: ['chat', 'sms', 'notification', 'thread'],\n conversation: ['chat', 'message', 'thread'],\n presence: ['online', 'typing', 'status'],\n online: ['presence', 'status'],\n typing: ['presence', 'indicator', 'broadcast'],\n // ---- media / streaming ----\n video: ['media', 'transcode', 'playback', 'stream', 'thumbnail'],\n stream: ['video', 'playback', 'manifest', 'media'],\n streaming: ['video', 'playback', 'manifest', 'media'],\n playback: ['video', 'stream', 'media', 'watch'],\n transcode: ['video', 'media', 'encode'],\n thumbnail: ['video', 'image', 'media'],\n media: ['video', 'stream', 'playback', 'asset'],\n // ---- analytics ----\n analytics: ['event', 'track', 'metric', 'funnel', 'report'],\n event: ['track', 'analytics', 'webhook'],\n track: ['event', 'analytics'],\n funnel: ['conversion', 'analytics', 'event'],\n conversion: ['funnel', 'analytics'],\n report: ['metrics', 'export', 'analytics'],\n // ---- content / CMS ----\n article: ['publish', 'content', 'post', 'cms'],\n publish: ['article', 'release', 'post', 'content'],\n post: ['article', 'publish', 'message'],\n blog: ['article', 'publish', 'post', 'cms'],\n content: ['cms', 'article', 'markdown'],\n markdown: ['render', 'article', 'content'],\n cms: ['article', 'content', 'publish'],\n // ---- CI / deployment ----\n deploy: ['release', 'rollback', 'pipeline', 'deployment'],\n deployment: ['deploy', 'release', 'rollback', 'pipeline'],\n release: ['deploy', 'version', 'rollback'],\n rollback: ['deploy', 'release', 'deployment'],\n pipeline: ['stage', 'deploy', 'runner', 'ci'],\n canary: ['deploy', 'rollout', 'release'],\n // ---- mobile ----\n push: ['notification', 'device', 'token', 'mobile'],\n device: ['push', 'token', 'mobile', 'register'],\n deeplink: ['link', 'route', 'universal'],\n mobile: ['push', 'device', 'deeplink', 'app'],\n ios: ['mobile', 'universal', 'link', 'app'],\n android: ['mobile', 'push', 'device', 'app'],\n // ---- batch / ETL / mainframe ----\n batch: ['settlement', 'job', 'etl', 'reconcile'],\n settlement: ['batch', 'reconcile', 'ledger', 'clearing'],\n reconcile: ['ledger', 'settlement', 'batch'],\n ledger: ['settlement', 'reconcile', 'balance', 'journal'],\n mainframe: ['batch', 'settlement', 'ebcdic', 'cobol', 'fixed'],\n ebcdic: ['mainframe', 'record', 'convert', 'legacy'],\n cobol: ['mainframe', 'batch', 'ebcdic'],\n etl: ['batch', 'pipeline', 'extract', 'load', 'transform'],\n nightly: ['batch', 'cron', 'schedule', 'job'],\n // ---- geo / maps ----\n geocode: ['address', 'location', 'map', 'geo'],\n address: ['geocode', 'location'],\n map: ['geo', 'route', 'location'],\n route: ['distance', 'path', 'planner', 'geo'],\n distance: ['route', 'haversine', 'geo'],\n location: ['geo', 'geocode', 'map'],\n arrival: ['route', 'eta', 'estimate'],\n // ---- i18n ----\n translation: ['locale', 'i18n', 'language', 'translate'],\n translate: ['translation', 'locale', 'language'],\n locale: ['translation', 'i18n', 'language', 'format'],\n i18n: ['translation', 'locale', 'language'],\n language: ['locale', 'translation', 'i18n'],\n localized: ['locale', 'translation', 'format'],\n // ---- observability ----\n metric: ['counter', 'prometheus', 'telemetry', 'export'],\n prometheus: ['metric', 'exporter', 'monitoring'],\n trace: ['span', 'telemetry', 'observability'],\n span: ['trace', 'telemetry'],\n monitoring: ['metric', 'trace', 'alert', 'observability'],\n telemetry: ['metric', 'trace', 'span'],\n counter: ['metric', 'increment'],\n // ---- feature flags / experimentation ----\n flag: ['feature', 'rollout', 'toggle', 'experiment'],\n rollout: ['flag', 'percentage', 'release', 'experiment'],\n toggle: ['flag', 'feature', 'switch'],\n experiment: ['variant', 'assign', 'flag', 'exposure'],\n variant: ['experiment', 'assign'],\n // ---- generic infrastructure ----\n database: ['schema', 'migration', 'sql', 'query', 'orm'],\n db: ['database', 'schema', 'migration', 'sql'],\n migration: ['database', 'schema', 'migrate', 'sql'],\n cache: ['redis', 'ttl', 'store'],\n queue: ['job', 'worker', 'task', 'batch'],\n job: ['queue', 'worker', 'cron'],\n upload: ['file', 'storage', 'blob', 'asset'],\n storage: ['file', 'upload', 'bucket', 'blob'],\n permission: ['role', 'rbac', 'acl', 'access', 'grant'],\n role: ['permission', 'rbac', 'access'],\n error: ['exception', 'failure', 'handler'],\n config: ['settings', 'env', 'configuration'],\n};\n\n/**\n * Adjacent-word concepts: phrases whose meaning is NOT the sum of their\n * tokens. \"direct debit\" is a payments concept; \"direct\" alone is a URL /\n * filesystem word (`validDirectUrl`, `directoryListing` — real distractors\n * from the field report). Detected over the RAW ordered token stream, before\n * stopword filtering, so \"sign in\" / \"log in\" survive.\n */\nconst BIGRAM_CONCEPTS: Record<string, readonly string[]> = {\n 'direct debit': ['debit', 'mandate', 'sepa', 'bacs', 'bank'],\n 'direct debits': ['debit', 'mandate', 'sepa', 'bacs', 'bank'],\n 'sign in': ['login', 'signin', 'auth', 'session'],\n 'signs in': ['login', 'signin', 'auth', 'session'],\n 'log in': ['login', 'auth', 'session'],\n 'logs in': ['login', 'auth', 'session'],\n 'logged in': ['login', 'auth', 'session'],\n 'sign up': ['signup', 'register', 'account'],\n 'credit card': ['card', 'payment', 'charge', 'stripe'],\n 'credit cards': ['card', 'payment', 'charge', 'stripe'],\n 'bank transfer': ['bank', 'payment', 'sepa', 'transfer'],\n 'rate limit': ['ratelimit', 'throttle', 'quota'],\n 'two factor': ['totp', 'mfa', 'otp', 'auth'],\n 'payment method': ['payment', 'stripe', 'card', 'debit'],\n 'payment methods': ['payment', 'stripe', 'card', 'debit'],\n 'push notification': ['push', 'device', 'token', 'notification'],\n 'push notifications': ['push', 'device', 'token', 'notification'],\n 'deep link': ['deeplink', 'link', 'route'],\n 'deep links': ['deeplink', 'link', 'route'],\n 'universal link': ['deeplink', 'link', 'universal'],\n 'universal links': ['deeplink', 'link', 'universal'],\n 'feature flag': ['flag', 'rollout', 'toggle', 'experiment'],\n 'feature flags': ['flag', 'rollout', 'toggle', 'experiment'],\n 'shopping cart': ['cart', 'checkout', 'order'],\n 'roll back': ['rollback', 'deploy', 'release'],\n 'rolled back': ['rollback', 'deploy', 'release'],\n 'ab test': ['experiment', 'variant'],\n 'sign out': ['logout', 'session', 'auth'],\n 'fixed width': ['record', 'export', 'mainframe', 'batch'],\n};\n\nexport interface ConceptExpansion {\n /** The expansion vocabulary term to score against symbol names. */\n term: string;\n /** The question token (or bigram) that produced it — kept for `why`. */\n from: string;\n}\n\n/** Singularize the trivial English plurals that show up in questions. */\nfunction lexiconKey(token: string): string | null {\n if (token in CONCEPTS) return token;\n if (token.endsWith('ies')) {\n const singular = token.slice(0, -3) + 'y';\n if (singular in CONCEPTS) return singular;\n }\n if (token.endsWith('s')) {\n const singular = token.slice(0, -1);\n if (singular in CONCEPTS) return singular;\n }\n return null;\n}\n\n/**\n * Expand a question's ordered, lowercased token stream (stopwords INCLUDED —\n * bigrams like \"sign in\" need them) into concept vocabulary. Deterministic:\n * output order follows first appearance in the question, then lexicon order.\n * Tokens already present in the question are not re-emitted as expansions.\n */\nexport function expandConcepts(orderedTokens: string[]): ConceptExpansion[] {\n const present = new Set(orderedTokens);\n const out: ConceptExpansion[] = [];\n const emitted = new Set<string>();\n const emit = (term: string, from: string) => {\n if (present.has(term) || emitted.has(term)) return;\n emitted.add(term);\n out.push({ term, from });\n };\n\n for (let i = 0; i + 1 < orderedTokens.length; i++) {\n const bigram = `${orderedTokens[i]} ${orderedTokens[i + 1]}`;\n const terms = BIGRAM_CONCEPTS[bigram];\n if (terms) for (const t of terms) emit(t, bigram);\n }\n for (const token of orderedTokens) {\n const key = lexiconKey(token);\n if (key) for (const t of CONCEPTS[key]!) emit(t, token);\n }\n return out;\n}\n\n/**\n * Tokens CONSUMED by a fired bigram concept that carry no standalone domain\n * meaning of their own — \"direct\" in \"direct debit\", \"sign\" in \"sign in\".\n * The bigram's expansion vocabulary re-supplies the topical words (debit,\n * mandate, login, …), so the consumed token must stop acting as independent\n * content evidence: left at full weight it seeds every `directGet`/\n * `redirectUrl`/`directoryListing` in the repo — the exact distractor set the\n * BIGRAM_CONCEPTS comment above documents. A constituent that is itself a\n * lexicon concept (\"debit\", \"card\") keeps its content role.\n */\nexport function bigramConsumedTokens(orderedTokens: string[]): Set<string> {\n const consumed = new Set<string>();\n for (let i = 0; i + 1 < orderedTokens.length; i++) {\n const bigram = `${orderedTokens[i]} ${orderedTokens[i + 1]}`;\n if (!BIGRAM_CONCEPTS[bigram]) continue;\n for (const tok of [orderedTokens[i], orderedTokens[i + 1]]) {\n if (!lexiconKey(tok)) consumed.add(tok);\n }\n }\n return consumed;\n}\n","/**\n * Optional relevance-provider seam for ask / Task Capsule seed ranking.\n *\n * A relevance provider is an OPTIONAL, separately installed local module that\n * analyzes a natural-language question and returns weighted expansion terms\n * with provenance (plus inferred topics). When present, its expansions join\n * the built-in concept lexicon (engine/concepts.ts) inside `queryGraph`'s\n * term preparation; when absent (the default install), nothing changes —\n * the deterministic lexicon path is the complete, supported baseline.\n *\n * Loading mirrors the optional-embedder pattern (engine/embeddings.ts):\n * - `VIBGRATE_NO_KERNEL=1` disables the seam entirely (off by default).\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(): string, analyzeQuery(q: string): RelevanceAnalysis }`.\n *\n * Trust boundary: provider output is sanitized here — terms lowercased,\n * weights clamped to [0,1], expansions whose provenance is a weak process\n * verb dropped (they could re-open the `add*` grab-bag failure the term-role\n * model closed), and the total capped — so a buggy or adversarial module can\n * widen vocabulary but never bypass the ranking invariants. Every failure\n * path degrades to `null` (no provider), never to an error: relevance\n * analysis is an enhancement, not a dependency.\n *\n * Determinism: given the same question and the same provider version, the\n * sanitized analysis 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';\nimport { WEAK_TERMS } from './concepts.js';\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\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\n/** Upper bound on sanitized expansions accepted from a provider. */\nconst MAX_PROVIDER_EXPANSIONS = 24;\n/** Caps on the hierarchical fields, same posture as expansions. */\nconst MAX_PROVIDER_PATHS = 6;\nconst MAX_PROVIDER_LEVELS = 8;\nconst MAX_PROVIDER_TERMS = 10;\nconst MAX_PROVIDER_VENDORS = 8;\nconst MAX_PROVIDER_CORRECTIONS = 8;\nconst MAX_PROVIDER_FILES = 8;\nconst MAX_PROVIDER_STANDARDS = 4;\nconst MAX_PROVIDER_CATEGORIES = 10;\n/** A category is a lowercase slug from the site vocabulary — nothing else. */\nconst CATEGORY_SLUG = /^[a-z0-9][a-z0-9-]{1,40}$/;\n/**\n * A file hint is a filename, a path fragment or an extension — never an\n * absolute path, a parent traversal, or a glob. The capsule prints these, so\n * a provider must not be able to smuggle in something that reads as an\n * instruction or points outside the repository.\n */\nconst FILE_HINT = /^(?!\\/|~|\\.\\.)[A-Za-z0-9._*/-]{1,48}$/;\n/** A path segment is a slug: lowercase, digits, dash. Anything else is dropped. */\nconst PATH_SEGMENT = /^[a-z0-9][a-z0-9-]*$/;\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/**\n * Run the provider over a question and sanitize the result. Returns `null`\n * when no provider is available or its output is unusable; the caller passes\n * the analysis into `queryGraph({ relevance })` as-is.\n */\nexport async function analyzeQuestion(question: string): Promise<RelevanceAnalysis | null> {\n const provider = await loadRelevanceProvider();\n if (!provider) return null;\n try {\n return sanitizeAnalysis(provider.analyzeQuery(question));\n } catch {\n return null;\n }\n}\n\n/** Enforce the trust boundary on raw provider output (exported for tests). */\nexport function sanitizeAnalysis(raw: RelevanceAnalysis): RelevanceAnalysis | null {\n if (!raw || typeof raw.version !== 'string') return null;\n const seen = new Set<string>();\n const expansions: RelevanceExpansion[] = [];\n for (const e of raw.expansions ?? []) {\n const term = String(e?.term ?? '').toLowerCase().trim();\n const from = String(e?.from ?? '').toLowerCase().trim();\n const weight = Number(e?.weight);\n if (!term || !from || term.includes(' ')) continue;\n // A weak process verb as provenance means the provider expanded the ACTION\n // (\"add\", \"create\"), not the topic — exactly the grab-bag failure the\n // term-role model suppresses. Never accept those.\n if (WEAK_TERMS.has(from) || WEAK_TERMS.has(term)) continue;\n if (!Number.isFinite(weight) || weight <= 0) continue;\n if (seen.has(term)) continue;\n seen.add(term);\n expansions.push({ term, from, weight: Math.min(1, weight) });\n if (expansions.length >= MAX_PROVIDER_EXPANSIONS) break;\n }\n const topics = (raw.topics ?? [])\n .filter((t) => t && typeof t.id === 'string' && Number.isFinite(t.score))\n .map((t) => ({ id: t.id, score: Math.max(0, Math.min(1, t.score)) }));\n\n // Hierarchical fields (provider schema 4). Same trust posture as\n // expansions: shapes validated, scores clamped, everything capped, and a\n // malformed entry is dropped rather than repaired — a provider can widen\n // vocabulary and name a domain, never smuggle in a path the host will\n // treat as structure it did not verify.\n const clamp01 = (n: unknown) => (Number.isFinite(Number(n)) ? Math.max(0, Math.min(1, Number(n))) : 0);\n const cleanFiles = (raw: unknown, cap: number): string[] =>\n (Array.isArray(raw) ? raw : [])\n .filter((f): f is string => typeof f === 'string' && FILE_HINT.test(f) && !f.includes('..'))\n .slice(0, cap);\n const cleanStandards = (raw: unknown, cap: number): RelevanceStandard[] =>\n (Array.isArray(raw) ? raw : [])\n .filter(\n (st): st is RelevanceStandard =>\n !!st &&\n typeof st.name === 'string' &&\n st.name.length > 0 &&\n st.name.length <= 80 &&\n typeof st.publisher === 'string' &&\n st.publisher.length <= 80 &&\n validPath(st.node),\n )\n .map((st) => ({\n name: st.name,\n publisher: st.publisher,\n node: st.node,\n kind: st.kind === 'regulation' ? 'regulation' : 'standard',\n categories: cleanCategories(st.categories, MAX_PROVIDER_CATEGORIES),\n }))\n .slice(0, cap);\n const cleanCategories = (raw: unknown, cap: number): string[] => {\n const out: string[] = [];\n for (const c of Array.isArray(raw) ? raw : []) {\n const slug = String(c ?? '').toLowerCase().trim();\n if (!CATEGORY_SLUG.test(slug) || out.includes(slug)) continue;\n out.push(slug);\n if (out.length >= cap) break;\n }\n return out;\n };\n const cleanTerms = (raw: unknown, cap: number): string[] =>\n (Array.isArray(raw) ? raw : [])\n .filter((t): t is string => typeof t === 'string' && t.length > 0 && t.length <= 40)\n .map((t) => t.toLowerCase())\n .slice(0, cap);\n const validPath = (p: unknown): p is string =>\n typeof p === 'string' && p.length > 0 && p.length <= 120 && p.split('/').every((seg) => PATH_SEGMENT.test(seg));\n\n const taxonomy: RelevanceTaxonomyMatch[] = [];\n for (const m of raw.taxonomy ?? []) {\n if (!m || !validPath(m.path)) continue;\n const levels = (m.levels ?? [])\n .filter((l) => l && validPath(l.path) && typeof l.id === 'string')\n .slice(0, MAX_PROVIDER_LEVELS)\n .map((l) => ({ id: l.id, path: l.path, score: clamp01(l.score), terms: cleanTerms(l.terms, MAX_PROVIDER_TERMS) }));\n // A path with no chain is unusable for prefix matching — drop it.\n if (!levels.length || levels[levels.length - 1]!.path !== m.path) continue;\n taxonomy.push({\n path: m.path,\n levels,\n score: clamp01(m.score),\n evidence: Number.isFinite(Number(m.evidence)) ? Math.max(0, Number(m.evidence)) : 0,\n via: (m.via ?? []).filter((v): v is string => typeof v === 'string' && v.length <= 80).slice(0, 8),\n terms: cleanTerms(m.terms, MAX_PROVIDER_TERMS),\n files: cleanFiles(m.files, MAX_PROVIDER_FILES),\n standards: cleanStandards(m.standards, MAX_PROVIDER_STANDARDS),\n });\n if (taxonomy.length >= MAX_PROVIDER_PATHS) break;\n }\n\n const vendors: RelevanceVendorMatch[] = [];\n for (const v of raw.vendors ?? []) {\n const name = String(v?.name ?? '').toLowerCase().trim();\n const from = String(v?.from ?? '').toLowerCase().trim();\n if (!name || !from || name.length > 60) continue;\n vendors.push({\n name,\n from,\n ...(validPath(v.node) ? { node: v.node } : {}),\n topic: typeof v.topic === 'string' ? v.topic : '',\n score: clamp01(v.score),\n files: cleanFiles(v.files, MAX_PROVIDER_FILES),\n });\n if (vendors.length >= MAX_PROVIDER_VENDORS) break;\n }\n\n const corrections: RelevanceCorrection[] = [];\n for (const c of raw.corrections ?? []) {\n const from = String(c?.from ?? '').toLowerCase().trim();\n const to = String(c?.to ?? '').toLowerCase().trim();\n const distance = Number(c?.distance);\n if (!from || !to || from === to || from.length > 60 || to.length > 60) continue;\n if (!Number.isInteger(distance) || distance < 1 || distance > 3) continue;\n corrections.push({ from, to, distance });\n if (corrections.length >= MAX_PROVIDER_CORRECTIONS) break;\n }\n\n const files = cleanFiles(raw.files, MAX_PROVIDER_FILES);\n const standards = cleanStandards(raw.standards, MAX_PROVIDER_STANDARDS);\n const categories = cleanCategories(raw.categories, MAX_PROVIDER_CATEGORIES);\n\n return { version: raw.version, topics, expansions, taxonomy, vendors, corrections, files, standards, categories };\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"]}