@vibgrate/cli 2026.814.1 → 2026.817.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DOCS.md +258 -22
- package/README.md +273 -11
- package/dist/agent-CUYQKC6S.js +26 -0
- package/dist/{agent-2ZISYEQF.js.map → agent-CUYQKC6S.js.map} +1 -1
- package/dist/{approvals-DOZ5RWJP.js → approvals-IPMUDEDV.js} +5 -5
- package/dist/{approvals-DOZ5RWJP.js.map → approvals-IPMUDEDV.js.map} +1 -1
- package/dist/baseline-NZFGLMER.js +9 -0
- package/dist/{baseline-AGX42TZM.js.map → baseline-NZFGLMER.js.map} +1 -1
- package/dist/{chunk-TFAXW7VM.js → chunk-2BURPMYA.js} +3 -3
- package/dist/{chunk-TFAXW7VM.js.map → chunk-2BURPMYA.js.map} +1 -1
- package/dist/{chunk-UJAOCFQQ.js → chunk-2GSMCOIC.js} +4 -4
- package/dist/{chunk-UJAOCFQQ.js.map → chunk-2GSMCOIC.js.map} +1 -1
- package/dist/{chunk-EBUTRJHX.js → chunk-2TJ5EY4I.js} +4 -4
- package/dist/{chunk-EBUTRJHX.js.map → chunk-2TJ5EY4I.js.map} +1 -1
- package/dist/{chunk-7CDW25VY.js → chunk-3GZSDY35.js} +4 -4
- package/dist/{chunk-7CDW25VY.js.map → chunk-3GZSDY35.js.map} +1 -1
- package/dist/{chunk-REIGWTTH.js → chunk-3HNPVXUK.js} +3 -3
- package/dist/{chunk-REIGWTTH.js.map → chunk-3HNPVXUK.js.map} +1 -1
- package/dist/{chunk-5KY5UCDJ.js → chunk-45AKSS4A.js} +4 -4
- package/dist/{chunk-5KY5UCDJ.js.map → chunk-45AKSS4A.js.map} +1 -1
- package/dist/{chunk-XEI7UU6G.js → chunk-4W5SYK2M.js} +11 -34
- package/dist/chunk-4W5SYK2M.js.map +1 -0
- package/dist/{chunk-UTNNGKKX.js → chunk-6NOGNOE4.js} +4 -4
- package/dist/chunk-6NOGNOE4.js.map +1 -0
- package/dist/{chunk-N3XFY3PX.js → chunk-74UBGF4P.js} +3 -3
- package/dist/{chunk-N3XFY3PX.js.map → chunk-74UBGF4P.js.map} +1 -1
- package/dist/{chunk-RNZP2XAL.js → chunk-A7EKFLAN.js} +8 -8
- package/dist/{chunk-RNZP2XAL.js.map → chunk-A7EKFLAN.js.map} +1 -1
- package/dist/{chunk-N6ZMZ5AI.js → chunk-ANYL7SUI.js} +349 -46
- package/dist/chunk-ANYL7SUI.js.map +1 -0
- package/dist/{chunk-K7MONYIM.js → chunk-ENFSSUNK.js} +7 -3
- package/dist/chunk-ENFSSUNK.js.map +1 -0
- package/dist/{chunk-3LSG7Z4I.js → chunk-EZ7UC5Y5.js} +25 -4
- package/dist/chunk-EZ7UC5Y5.js.map +1 -0
- package/dist/{chunk-BTYFZ3NM.js → chunk-FD2HPGX2.js} +8 -8
- package/dist/{chunk-BTYFZ3NM.js.map → chunk-FD2HPGX2.js.map} +1 -1
- package/dist/{chunk-OWSFZQOP.js → chunk-FJG5AXKZ.js} +3 -3
- package/dist/{chunk-OWSFZQOP.js.map → chunk-FJG5AXKZ.js.map} +1 -1
- package/dist/chunk-FMS6G67U.js +467 -0
- package/dist/chunk-FMS6G67U.js.map +1 -0
- package/dist/{chunk-WHJMS7XC.js → chunk-I5LP55B6.js} +3 -3
- package/dist/{chunk-WHJMS7XC.js.map → chunk-I5LP55B6.js.map} +1 -1
- package/dist/{chunk-6OP5U55G.js → chunk-JHLCKMKF.js} +16 -29
- package/dist/chunk-JHLCKMKF.js.map +1 -0
- package/dist/{chunk-QFCJY6FQ.js → chunk-K267DHCF.js} +6 -6
- package/dist/{chunk-QFCJY6FQ.js.map → chunk-K267DHCF.js.map} +1 -1
- package/dist/{chunk-BXPWVTGS.js → chunk-MIYXVY57.js} +7 -6
- package/dist/chunk-MIYXVY57.js.map +1 -0
- package/dist/chunk-MS6V5XKB.js +33 -0
- package/dist/chunk-MS6V5XKB.js.map +1 -0
- package/dist/{chunk-2HNPL4OB.js → chunk-NHB53JTV.js} +6 -6
- package/dist/{chunk-2HNPL4OB.js.map → chunk-NHB53JTV.js.map} +1 -1
- package/dist/{chunk-RBBP4SP7.js → chunk-NKRWKCME.js} +4 -4
- package/dist/{chunk-RBBP4SP7.js.map → chunk-NKRWKCME.js.map} +1 -1
- package/dist/{chunk-NXDYWBZB.js → chunk-NQUWC2IA.js} +13 -11
- package/dist/chunk-NQUWC2IA.js.map +1 -0
- package/dist/{chunk-2W3GBKSV.js → chunk-OWSXI3PJ.js} +8 -6
- package/dist/chunk-OWSXI3PJ.js.map +1 -0
- package/dist/chunk-OZ3IFXRD.js +22 -0
- package/dist/chunk-OZ3IFXRD.js.map +1 -0
- package/dist/chunk-PV76EO4G.js +6 -0
- package/dist/{chunk-QIUQH2ND.js.map → chunk-PV76EO4G.js.map} +1 -1
- package/dist/{chunk-JYY6G46J.js → chunk-QPXVTQ7O.js} +3 -3
- package/dist/{chunk-JYY6G46J.js.map → chunk-QPXVTQ7O.js.map} +1 -1
- package/dist/{chunk-J3IDTLF4.js → chunk-RJCRWQNS.js} +1855 -175
- package/dist/chunk-RJCRWQNS.js.map +1 -0
- package/dist/{chunk-HYC3A2AT.js → chunk-RQAKBRAV.js} +3 -3
- package/dist/{chunk-HYC3A2AT.js.map → chunk-RQAKBRAV.js.map} +1 -1
- package/dist/{chunk-VD6TVFGA.js → chunk-UBEVY5UT.js} +6 -6
- package/dist/{chunk-VD6TVFGA.js.map → chunk-UBEVY5UT.js.map} +1 -1
- package/dist/{chunk-WN2AAB5O.js → chunk-YL4OIUA5.js} +12 -12
- package/dist/{chunk-WN2AAB5O.js.map → chunk-YL4OIUA5.js.map} +1 -1
- package/dist/{chunk-A4F7ESUR.js → chunk-ZSECAGSU.js} +3 -3
- package/dist/{chunk-A4F7ESUR.js.map → chunk-ZSECAGSU.js.map} +1 -1
- package/dist/cli.js +417 -718
- package/dist/cli.js.map +1 -1
- package/dist/daemon-J2HX4GY3.js +25 -0
- package/dist/daemon-J2HX4GY3.js.map +1 -0
- package/dist/embed-worker-main.js +4 -4
- package/dist/ensure-map-5C6KG66X.js +32 -0
- package/dist/{ensure-map-EURJPSAK.js.map → ensure-map-5C6KG66X.js.map} +1 -1
- package/dist/graph-backend-HH5IIQ55.js +14 -0
- package/dist/{graph-backend-VUW2QWPI.js.map → graph-backend-HH5IIQ55.js.map} +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.js +18 -16
- package/dist/index.js.map +1 -1
- package/dist/{interactive-WRA477OW.js → interactive-FXPAZAUJ.js} +33 -31
- package/dist/interactive-FXPAZAUJ.js.map +1 -0
- package/dist/load-OR2XVGAV.js +10 -0
- package/dist/{load-XZV5LEGA.js.map → load-OR2XVGAV.js.map} +1 -1
- package/dist/local-runtime-6SNWKSA7.js +6 -0
- package/dist/{local-runtime-2ED33KK6.js.map → local-runtime-6SNWKSA7.js.map} +1 -1
- package/dist/model-manager-SXHZ5VD4.js +10 -0
- package/dist/{model-manager-GJ2YSTSK.js.map → model-manager-SXHZ5VD4.js.map} +1 -1
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +1 -1
- package/dist/{run-outcome-X5KS6AUE.js → run-outcome-M4546HLJ.js} +6 -6
- package/dist/{run-outcome-X5KS6AUE.js.map → run-outcome-M4546HLJ.js.map} +1 -1
- package/dist/runtime-session-6KKMFS6Q.js +21 -0
- package/dist/{runtime-session-J7GDVRFU.js.map → runtime-session-6KKMFS6Q.js.map} +1 -1
- package/dist/session-HCFJUSKN.js +16 -0
- package/dist/{session-3R34WA5S.js.map → session-HCFJUSKN.js.map} +1 -1
- package/dist/{stream-json-LKVPDKXP.js → stream-json-4DL65D6U.js} +16 -16
- package/dist/{stream-json-LKVPDKXP.js.map → stream-json-4DL65D6U.js.map} +1 -1
- package/dist/{types-DLH-Ritr.d.ts → types-8SYlXhzm.d.ts} +57 -6
- package/dist/version-UPIC3F4P.js +4 -0
- package/dist/{version-55TOTJTF.js.map → version-UPIC3F4P.js.map} +1 -1
- package/dist/{vg-mcp-bridge-ZPJAHP7T.js → vg-mcp-bridge-FZGX6DYO.js} +10 -10
- package/dist/{vg-mcp-bridge-ZPJAHP7T.js.map → vg-mcp-bridge-FZGX6DYO.js.map} +1 -1
- package/dist/{vgd-UIFH5TTW.js → vgd-QR26FAZD.js} +9 -9
- package/dist/vgd-QR26FAZD.js.map +1 -0
- package/grammars/tree-sitter-hcl.wasm +0 -0
- package/package.json +3 -2
- package/dist/agent-2ZISYEQF.js +0 -26
- package/dist/baseline-AGX42TZM.js +0 -9
- package/dist/chunk-2W3GBKSV.js.map +0 -1
- package/dist/chunk-3LSG7Z4I.js.map +0 -1
- package/dist/chunk-6OP5U55G.js.map +0 -1
- package/dist/chunk-BXPWVTGS.js.map +0 -1
- package/dist/chunk-J3IDTLF4.js.map +0 -1
- package/dist/chunk-K7MONYIM.js.map +0 -1
- package/dist/chunk-N6ZMZ5AI.js.map +0 -1
- package/dist/chunk-NXDYWBZB.js.map +0 -1
- package/dist/chunk-QIUQH2ND.js +0 -6
- package/dist/chunk-UTNNGKKX.js.map +0 -1
- package/dist/chunk-XEI7UU6G.js.map +0 -1
- package/dist/ensure-map-EURJPSAK.js +0 -30
- package/dist/graph-backend-VUW2QWPI.js +0 -14
- package/dist/interactive-WRA477OW.js.map +0 -1
- package/dist/load-XZV5LEGA.js +0 -10
- package/dist/local-runtime-2ED33KK6.js +0 -6
- package/dist/model-manager-GJ2YSTSK.js +0 -10
- package/dist/runtime-session-J7GDVRFU.js +0 -21
- package/dist/session-3R34WA5S.js +0 -16
- package/dist/version-55TOTJTF.js +0 -4
- package/dist/vgd-UIFH5TTW.js.map +0 -1
package/dist/agent-2ZISYEQF.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export { CONTEXT_POLICY_VERSION, DISCOVERY_TOOLS, MUTATION_TOOLS, compact, compactWithModel, runAgent } from './chunk-WN2AAB5O.js';
|
|
2
|
-
import './chunk-543E6WDJ.js';
|
|
3
|
-
import './chunk-A4F7ESUR.js';
|
|
4
|
-
import './chunk-HYC3A2AT.js';
|
|
5
|
-
import './chunk-RBIRXQR6.js';
|
|
6
|
-
import './chunk-5HYCB55P.js';
|
|
7
|
-
import './chunk-N3XFY3PX.js';
|
|
8
|
-
import './chunk-REIGWTTH.js';
|
|
9
|
-
import './chunk-VIWZ4QT7.js';
|
|
10
|
-
import './chunk-NXDYWBZB.js';
|
|
11
|
-
import './chunk-J7LKEB2R.js';
|
|
12
|
-
export { summarizeCapsule } from './chunk-RBBP4SP7.js';
|
|
13
|
-
import './chunk-EBUTRJHX.js';
|
|
14
|
-
import './chunk-3LSG7Z4I.js';
|
|
15
|
-
import './chunk-UTNNGKKX.js';
|
|
16
|
-
import './chunk-RXP66R2E.js';
|
|
17
|
-
import './chunk-UJAOCFQQ.js';
|
|
18
|
-
import './chunk-JYY6G46J.js';
|
|
19
|
-
import './chunk-K7MONYIM.js';
|
|
20
|
-
import './chunk-QIUQH2ND.js';
|
|
21
|
-
import './chunk-BWPBB45M.js';
|
|
22
|
-
import './chunk-JFGYT6BI.js';
|
|
23
|
-
import './chunk-BPF3YX2U.js';
|
|
24
|
-
import './chunk-Z6ZWNWWR.js';
|
|
25
|
-
//# sourceMappingURL=agent-2ZISYEQF.js.map
|
|
26
|
-
//# sourceMappingURL=agent-2ZISYEQF.js.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { baselineCommand, runBaseline } from './chunk-TFAXW7VM.js';
|
|
2
|
-
import './chunk-N6ZMZ5AI.js';
|
|
3
|
-
import './chunk-DT4KIVRI.js';
|
|
4
|
-
import './chunk-CRAMOEBE.js';
|
|
5
|
-
import './chunk-RXP66R2E.js';
|
|
6
|
-
import './chunk-QIUQH2ND.js';
|
|
7
|
-
import './chunk-Z6ZWNWWR.js';
|
|
8
|
-
//# sourceMappingURL=baseline-AGX42TZM.js.map
|
|
9
|
-
//# sourceMappingURL=baseline-AGX42TZM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/vgd/protocol.ts","../src/runtime/active-graph-cache.ts","../src/runtime/vgd/registry.ts","../src/runtime/vgd/host-broker.ts","../src/runtime/vgd/embed-broker.ts","../src/runtime/vgd/server.ts","../src/runtime/branch-graph-session.ts"],"names":["path","dropped","idx","resolve","path2","fs","path3","graph"],"mappings":";;;;;;;;;;;;;;AAOO,IAAM,oBAAA,GAAuB;AA6M7B,SAAS,aAAa,IAAA,EAA8C;AACzE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,OAAO,cAAA,EAAe;AAAA,EACjC;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,EAAE,OAAO,2BAAA,EAA4B;AACjF,EAAA,MAAM,KAAM,GAAA,CAAyB,EAAA;AACrC,EAAA,IAAI,EAAA,KAAO,MAAA,IAAU,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,cAAc,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAG;AACxF,EAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,kBAAA;AAAA,MACJ,YAAA,EAAc,OAAO,YAAA,KAAiB,QAAA,IAAY,aAAa,IAAA,EAAK,GAAI,YAAA,CAAa,IAAA,EAAK,GAAI;AAAA,KAChG;AAAA,EACF;AACA,EAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,sCAAA,EAAuC;AACrH,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,gCAAA,EAAiC;AACnG,IAAA,OAAO,EAAE,EAAA,EAAI,gBAAA,EAAkB,YAAA,EAAc,YAAA,CAAa,MAAK,EAAG,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAK,EAAE;AAAA,EAC1F;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,MAAM,QAAS,GAAA,CAA4B,KAAA;AAC3C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC;AAChH,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAC9F,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,UAAU,OAAO,EAAE,OAAO,iCAAA,EAAkC;AAC3F,IAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,YAAA,EAAc,YAAA,CAAa,IAAA,EAAK,EAAG,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAK,EAAG,KAAA,EAAM;AAAA,EAC5F;AACA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,MAAM,OAAQ,GAAA,CAA2B,IAAA;AACzC,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,MAAM,YAAa,GAAA,CAAgC,SAAA;AACnD,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,sCAAA,EAAuC;AACrG,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,YAAA;AAAA,MACJ,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,MAAA,EAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI,MAAA;AAAA,MACtE,SAAA,EAAW,OAAO,SAAA,KAAc,QAAA,IAAY,UAAU,IAAA,EAAK,GAAI,SAAA,CAAU,IAAA,EAAK,GAAI;AAAA,KACpF;AAAA,EACF;AACA,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,cAAA;AAAA,MACJ,YAAA,EAAc,OAAO,YAAA,KAAiB,QAAA,IAAY,aAAa,IAAA,EAAK,GAAI,YAAA,CAAa,IAAA,EAAK,GAAI;AAAA,KAChG;AAAA,EACF;AACA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,OAAQ,GAAA,CAA2B,IAAA;AACzC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAG1F,IAAA,OAAO,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,IAAA,CAAK,MAAK,CAAE,KAAA,CAAM,CAAA,EAAG,GAAK,CAAA,EAAE;AAAA,EAChE;AACA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,mCAAA,EAAoC;AAClH,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,aAAA;AAAA,MACJ,YAAA,EAAc,aAAa,IAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI;AAAA,KACxE;AAAA,EACF;AACA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,QAAS,GAAA,CAA4B,KAAA;AAC3C,IAAA,MAAM,QAAS,GAAA,CAA4B,KAAA;AAC3C,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,mCAAA,EAAoC;AAClH,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,4BAAA,EAA6B;AAC7F,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,aAAA;AAAA,MACJ,YAAA,EAAc,aAAa,IAAA,EAAK;AAAA,MAChC,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,MAClB,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MAClF,MAAA,EAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI;AAAA,KACxE;AAAA,EACF;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,MAAM,QAAS,GAAA,CAA4B,KAAA;AAC3C,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC;AAChH,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAC9F,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,WAAA;AAAA,MACJ,YAAA,EAAc,aAAa,IAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,OAAO,IAAA,EAAK;AAAA,MACpB,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MAClF,MAAA,EAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI;AAAA,KACxE;AAAA,EACF;AACA,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,MAAM,eAAgB,GAAA,CAAmC,YAAA;AACzD,IAAA,MAAM,SAAU,GAAA,CAA6B,MAAA;AAC7C,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,CAAC,YAAA,CAAa,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,qCAAA,EAAsC;AACpH,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,eAAA;AAAA,MACJ,YAAA,EAAc,aAAa,IAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,EAAK,GAAI;AAAA,KACxE;AAAA,EACF;AACA,EAAA,IAAI,EAAA,KAAO,UAAA,IAAc,EAAA,KAAO,YAAA,EAAc;AAC5C,IAAA,MAAM,OAAQ,GAAA,CAA2B,IAAA;AACzC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,CAAA,0BAAA,CAAA,EAA6B;AAChG,IAAA,MAAM,QAAS,GAAA,CAA4B,KAAA;AAC3C,IAAA,MAAM,OAAQ,GAAA,CAA2B,IAAA;AACzC,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,UAAA;AAAA,QACJ,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,QAChB,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAAA,QAC3C,IAAA,EAAM,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,WAAW,IAAA,GAAO;AAAA,OACzD;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,IAAA,CAAK,MAAK,EAAE;AAAA,EAC/C;AACA,EAAA,IAAI,OAAO,qBAAA,EAAuB;AAChC,IAAA,MAAM,cAAe,GAAA,CAAkC,WAAA;AACvD,IAAA,MAAM,UAAW,GAAA,CAA8B,OAAA;AAC/C,IAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,WAAA,CAAY,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,0CAAA,EAA2C;AACvH,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,wCAAA,EAAyC;AAC9G,IAAA,MAAM,SAA+E,EAAC;AACtF,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,MAAA,MAAM,OAAQ,CAAA,CAAyB,IAAA;AACvC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AAC9C,MAAA,MAAM,QAAS,CAAA,CAA0B,KAAA;AACzC,MAAA,MAAM,OAAQ,CAAA,CAAyB,IAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,QAChB,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAAA,QAC3C,IAAA,EAAM,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,WAAW,IAAA,GAAO;AAAA,OACxD,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAE,OAAO,4DAAA,EAA6D;AACjG,IAAA,OAAO,EAAE,IAAI,qBAAA,EAAuB,WAAA,EAAa,YAAY,IAAA,EAAK,EAAG,SAAS,MAAA,EAAO;AAAA,EACvF;AACA,EAAA,IAAI,EAAA,KAAO,aAAA,EAAe,OAAO,EAAE,IAAI,aAAA,EAAc;AACrD,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,YAAa,GAAA,CAAgC,SAAA;AACnD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,SAAA,CAAU,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,8BAAA,EAA+B;AACvG,IAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,SAAA,EAAW,SAAA,CAAU,MAAK,EAAE;AAAA,EACxD;AACA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,YAAa,GAAA,CAAgC,SAAA;AACnD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,aAAA;AAAA,MACJ,SAAA,EAAW,OAAO,SAAA,KAAc,QAAA,IAAY,UAAU,IAAA,EAAK,GAAI,SAAA,CAAU,IAAA,EAAK,GAAI;AAAA,KACpF;AAAA,EACF;AACA,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,MAAM,YAAa,GAAA,CAAgC,SAAA;AACnD,IAAA,MAAM,WAAY,GAAA,CAA+B,QAAA;AACjD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,SAAA,CAAU,MAAK,EAAG,OAAO,EAAE,KAAA,EAAO,kCAAA,EAAmC;AAC3G,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,mCAAA,EAAoC;AAC3G,IAAA,MAAM,SAAmD,EAAC;AAC1D,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,MAAA,MAAM,OAAQ,CAAA,CAAyB,IAAA;AACvC,MAAA,MAAM,UAAW,CAAA,CAA4B,OAAA;AAC7C,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,YAAY,QAAA,EAAU;AAC7D,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAE,OAAO,kDAAA,EAAmD;AACvF,IAAA,MAAM,UAAW,GAAA,CAA8B,OAAA;AAC/C,IAAA,MAAM,iBAAkB,GAAA,CAAqC,cAAA;AAC7D,IAAA,MAAM,YAAa,GAAA,CAAgC,SAAA;AACnD,IAAA,MAAM,cAAe,GAAA,CAAkC,WAAA;AACvD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,eAAA;AAAA,MACJ,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,MAC1B,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,MAAA;AAAA,MACjD,gBAAgB,cAAA,KAAmB,IAAA;AAAA,MACnC,SAAA,EAAW,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,MAAA;AAAA,MACvD,WAAA,EAAa,OAAO,WAAA,KAAgB,QAAA,GAAW,WAAA,GAAc;AAAA,KAC/D;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,YAAA,EAAe,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAG;AAC9C;;;ACjYO,IAAM,4BAAA,GAA+B,KAAK,EAAA,GAAK;AA8C/C,IAAM,mBAAN,MAAuB;AAAA,EACX,KAAA,uBAAY,GAAA,EAA6B;AAAA;AAAA,EAEzC,UAAA,uBAAiB,GAAA,EAAoB;AAAA,EACrC,aAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,4BAAA;AAC9C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AAAA,EAC5C;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA,EAEA,GAAA,CAAI,cAAsB,MAAA,EAA6C;AACrE,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAC,CAAA;AACpE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAI,YAAA,EAAsB,MAAA,EAAgB,KAAA,EAAiC;AACzE,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,EAAI;AACnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,MAAM,IAAA,GAAwB;AAAA,MAC5B,YAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,UAAU,QAAA,IAAY,CAAA;AAAA,MAChC,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU;AAAA,KACpC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAY,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CAAO,cAAsB,MAAA,EAA6C;AACxE,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA;AACxC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,YAAY,YAAA,EAA0C;AACpD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAY,CAAA;AAAA,EACzC;AAAA,EAEA,QAAQ,YAAA,EAAmD;AACzD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAY,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,GAAA,GAAc,IAAA,CAAK,GAAA,EAAI,EAAa;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,aAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,IAAO,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,KAAK,YAAA,EAAiD;AACpD,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,EAAI;AACnB,IAAA,MAAM,MAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,YAAA,KAAiB,YAAA,EAAc;AACxD,MAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,IAAI,IAAA,CAAK,YAAY,MAAM,IAAA,CAAK,MAAA;AAChE,MAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,YAAA;AACxB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,CAAC,OAAA,IAAW,MAAA,IAAU,IAAA,CAAK;AAAA,OACvC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACT,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,aAAA,CAAc,CAAA,CAAE,YAAY,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,EAAE,MAAM;AAAA,KAC3F;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,KAAA,CAAM,QAAO,EAAG,IAAA,CAAK,YAAY,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AAAA,EAEQ,YAAY,IAAA,EAAsD;AACxE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,YAAA,EAAc,IAAA,CAAK,cAAc,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,KAAA,CAAM,KAAa,aAAA,EAAkC;AAC3D,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAsB;AACvC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IACvB,CAAA;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,GAAA,EAAK,KAAK,aAAa,CAAA;AACxD,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAC3C,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,SAAA,CAAU,kBAAA,CAAmB,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,QAAA,EAAU;AACtC,QAAA,MAAM,SAAS,IAAA,CAAK,cAAA;AAAA,UAAe,GAAA;AAAA;AAAA,UAA8B;AAAA,SAAK;AACtE,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,SAAA,CAAU,kBAAA,CAAmB,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,MAAA,uBAAa,GAAA,EAA+B;AAClD,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,QAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,YAAY,KAAK,EAAC;AAC5C,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,YAAA,EAAc,IAAI,CAAA;AAAA,MACjC;AACA,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,MAAA,EAAQ;AACnC,QAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AACpC,QAAA,MAAM,UAAA,GAAa,KAChB,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,MAAM,CAAA,KAAM,EAAE,MAAM,CAAA,CACtD,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AACzC,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,UAAA;AAChC,QAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,UAAA,IAAI,UAAU,CAAA,EAAG;AACjB,UAAA,SAAA,CAAU,kBAAA,CAAmB,CAAA,CAAE,YAAA,EAAc,CAAA,CAAE,MAAM,CAAC,CAAA;AACtD,UAAA,MAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,KAAa,SAAA,EAAsC;AACxE,IAAA,MAAM,MAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,KAAK,UAAA,CAAW,GAAA,CAAI,KAAK,YAAY,CAAA,KAAM,KAAK,MAAA,EAAQ;AAC5D,MAAA,IAAI,MAAM,IAAA,CAAK,YAAA,IAAgB,SAAA,EAAW,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,KAAa,kBAAA,EAAqD;AACvF,IAAA,IAAI,IAAA,GAA+B,IAAA;AACnC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,KAAK,UAAA,CAAW,GAAA,CAAI,KAAK,YAAY,CAAA,KAAM,KAAK,MAAA,EAAQ;AAC5D,MAAA,IAAI,kBAAA,IAAsB,GAAA,GAAM,IAAA,CAAK,YAAA,GAAe,KAAK,aAAA,EAAe;AACxE,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,UAAU,IAAA,GAAO,IAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACvOO,IAAM,oBAAN,MAAwB;AAAA,EACZ,IAAA,uBAAW,GAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD,YAAA;AAAA;AAAA,EAEC,MAAA,GAAS,IAAI,gBAAA,CAAiB;AAAA,IACrC,OAAA,EAAS,CAAC,IAAA,KAAS,IAAA,CAAK,cAAc,YAAA,CAAa,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAM;AAAA,GAClF,CAAA;AAAA;AAAA,EAGD,gBAAgB,QAAA,EAA+C;AAC7D,IAAA,IAAA,CAAK,YAAA,GAAe,QAAA;AAAA,EACtB;AAAA,EAEA,QAAA,CACE,MACA,GAAA,GAAkB,0BAAU,IAAA,EAAK,EACjC,IAAA,GAAyE,EAAC,EACzD;AACjB,IAAA,MAAM,QAAA,GAAgB,aAAQ,IAAI,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,qBAAqB,QAAQ,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAkB,GAAI,YAAA,CAAa,QAAQ,CAAA;AAC/F,IAAA,MAAM,SAAA,GACJ,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,GAAA,GAAM,qBAAA,CAAsB,QAAA,EAAU,GAAA,CAAI,GAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA;AACtG,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,EAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,SAAA;AAAA,MACA,YAAA,EAAc,GAAA,EAAI,CAAE,WAAA,EAAY;AAAA,MAChC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAA,EAAQ,IAAI,GAAA,IAAO;AAAA,KACrB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AACxB,IAAA,IAAI,IAAI,GAAA,EAAK,IAAA,CAAK,OAAO,MAAA,CAAO,EAAA,EAAI,IAAI,GAAG,CAAA;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CAAS,YAAA,EAAsB,MAAA,EAAgB,KAAA,EAAsB;AACnE,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,MAAM,CAAA;AAEvC,IAAA,IAAA,CAAK,YAAA,EAAc,UAAA,CAAW,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAA;AACzD,IAAA,IAAA,CAAK,YAAA,EAAc,aAAA,CAAc,YAAA,EAAc,MAAM,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,YAAA,CAAa,cAAsB,MAAA,EAAsB;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,EAAc,aAAA,CAAc,YAAA,EAAc,MAAM,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,mBACE,OAAA,EACA,GAAA,GAAkB,sBAAM,IAAI,MAAK,EACd;AACnB,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,EAAM,GAAA,EAAK,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,MAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,WAAW,IAAA,EAAuB;AAChC,IAAA,MAAM,EAAA,GAAK,oBAAA,CAA0B,IAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,IAAA,GAA0B;AACxB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,IAAI,IAAA,EAA2C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,qBAA0B,IAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,QAAQ,YAAA,EAAmD;AACzD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AAAA,EACnC;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CAAa,cAAsB,MAAA,EAA4D;AAC7F,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,cAAc,MAAM,CAAA;AACjD,MAAA,IAAI,IAAA,SAAa,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAC5D;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAChD,IAAA,IAAI,OAAA,SAAgB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAEnE,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CACd,IAAA,CAAK,YAAY,EACjB,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,QAAQ,EAAE,CAAC,CAAA;AAC5C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,IAAI,MAAM,CAAA;AACrD,MAAA,IAAI,IAAA,SAAa,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9FO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA,GAA0B,IAAA;AAAA,EACjB,MAAA,uBAAa,GAAA,EAAY;AAAA;AAAA,EAEzB,MAAA,uBAAa,GAAA,EAAyB;AAAA,EAEvD,WAAW,GAAA,EAA2B;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AAAA,EACjB;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OAAO,KAAK,OAAA,IAAW,IAAA;AAAA,EACzB;AAAA,EAEA,MAAA,GAA2B;AACzB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAACA,KAAAA,EAAM,OAAO,CAAA,IAAK,KAAK,MAAA,EAAQ;AACzC,MAAA,MAAA,CAAOA,KAAI,IAAI,OAAA,CAAQ,IAAA;AAAA,IACzB;AACA,IAAA,OAAO;AAAA,MACL,UAAU,mBAAA,EAAoB;AAAA,MAC9B,YAAA,EAAc,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MAC7B,YAAA,EAAc,KAAK,OAAA,IAAW,IAAA;AAAA,MAC9B,MAAA;AAAA,MACA,UAAU,gBAAA;AAAiB,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CACJ,SAAA,EACA,QAAA,EACyF;AACzF,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,mFAAA,EAA+E;AAAA,IAC5G;AACA,IAAA,IAAI;AACF,MAAA,MAAM,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAChD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,SAAS,CAAA;AACzB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AACnC,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,GAAA,uBAAU,GAAA,EAAI;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAAA,QAChC;AACA,QAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAAA,MAClB;AACA,MAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG,IAAA,IAAQ,CAAA,EAAE;AAAA,IAC9E,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,SAAA,EACA,QAAA,EACiE;AACjE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,mBAAA,EAAoB;AAC9B,MAAA,oBAAA,EAAqB;AACrB,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,iBAAiB,CAAA,EAAE;AAAA,IACpD;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AACrC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,OAAO,QAAQ,CAAA;AACnB,QAAA,IAAI,IAAI,IAAA,KAAS,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,GAAG,IAAA,IAAQ,CAAA;AACtD,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAMC,QAAAA,GAAU,eAAA,CAAgB,SAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AACjD,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,SAAS,CAAA;AAC5B,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAASA,QAAAA,EAAS,iBAAiB,CAAA,EAAE;AAAA,MAC1D;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,iBAAiB,SAAA,EAAU;AAAA,IAC5D;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,SAAS,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,SAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,SAAS,CAAA;AAC5B,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,iBAAiB,CAAA,EAAE;AAAA,EAC1D;AAAA;AAAA,EAGA,WAAW,SAAA,EAA2B;AACpC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,QAAA,CACJ,SAAA,EACA,QAAA,EACA,IAAA,EACkF;AAClF,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,6BAAA,EAA8B;AAAA,IAC3D;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,IAAA,CAAK,SAAS,SAAS,CAAA;AAChE,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,SAAS,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,OAAA,EAAS,QAAA,EAAU;AAAA,QACxD,SAAS,IAAA,EAAM,OAAA;AAAA,QACf,gBAAgB,IAAA,EAAM,cAAA;AAAA,QACtB,gBAAgB,IAAA,EAAM,cAAA;AAAA,QACtB,4BAA4B,IAAA,EAAM,0BAAA;AAAA,QAClC,iBAAiB,IAAA,EAAM,eAAA;AAAA,QACvB,WAAW,IAAA,EAAM,SAAA;AAAA,QACjB,aAAa,IAAA,EAAM,WAAA;AAAA,QACnB,gBAAgB,IAAA,EAAM;AAAA,OACvB,CAAA;AACD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,IACxE;AAAA,EACF;AACF,CAAA;AAGA,IAAI,aAAA,GAAsC,IAAA;AAEnC,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,CAAC,aAAA,EAAe,aAAA,GAAgB,IAAI,aAAA,EAAc;AACtD,EAAA,OAAO,aAAA;AACT;AClFA,SAAS,SAAS,IAAA,EAAyB;AACzC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,aAAA,IAAiB,KAAK,IAAA,EAAM,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,EAAM,KAAK,GAAG,CAAA,CAC3E,OAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACnE,EAAA,OAAO,MAAM,IAAA,CAAK,QAAK,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AACvC;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA,GAA6B,IAAA;AAAA,EAC7B,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,GAAS,KAAA;AAAA,EACT,OAAA,GAAU,CAAA;AAAA,EACV,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,EAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAqB;AAAA,EACnC,OAAA,uBAAc,GAAA,EAAuB;AAAA;AAAA,EAErC,QAAA,uBAAe,GAAA,EAAY;AAAA;AAAA,EAEpC,UAAA;AAAA,EACA,aAAA;AAAA,EAES,GAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,MAAY;AAAA,IAAC,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,kBAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AACxC,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,IAAA;AACpD,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,MAAc,KAAK,GAAA,EAAI,CAAA;AAAA,EACpD;AAAA,EAEA,MAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAK,MAAA,GAAS,aAAA,GAAgB,KAAK,KAAA,GAAQ,OAAA,GAAU,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,SAAA;AAAA,MAC1F,GAAA,EAAK,KAAK,KAAA,EAAO,GAAA;AAAA,MACjB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA,EAAO,KAAK,SAAA;AAAU,KACxB;AAAA,EACF;AAAA,EAEA,UAAU,YAAA,EAA2C;AACnD,IAAA,MAAM,MAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AACvC,MAAA,IAAI,YAAA,IAAgB,GAAA,CAAI,YAAA,KAAiB,YAAA,EAAc;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,OAAA,EAAS,IAAI,OAAA,CAAQ,IAAA;AAAA,QACrB,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,OAAO,GAAA,CAAI;AAAA,OACZ,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,YAAA,CAAa,aAAA,CAAc,CAAA,CAAE,YAAY,KAAK,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EAC5G;AAAA,EAEA,IAAA,CAAK,cAAsB,MAAA,EAAuC;AAChE,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,CAAW,YAAA,EAAsB,MAAA,EAAgB,KAAA,EAAsB;AACrE,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU,CAAA;AACzC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,KAAU,OAAA,EAAS;AAC1C,MAAA,IAAA,CAAK,GAAA,CAAI,aAAa,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,uCAAA,EAAqC,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAAA,IAC3H;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACpB,YAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,sBAAa,GAAA,EAAI;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,QAAA,EAA+E;AAC9F,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,CAAc,cAAsB,MAAA,EAAsB;AACxD,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,eAAe,GAAA,EAAK;AAC3B,MAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAClB,MAAA,MAAMC,IAAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,8BAAA,EAA4B,YAAY,CAAA,CAAA,EAAI,MAAM,eAAYA,IAAAA,GAAM,CAAA,EAAGA,IAAAA,CAAI,KAAK,CAAA,EAAA,EAAKA,IAAAA,CAAI,OAAA,CAAQ,IAAI,cAAc,QAAQ,CAAA;AAAA,OAC7H;AAAA,IACF;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,KAAK,KAAA,KAAU,OAAA,IAAW,KAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,GAAgB,YAAA,EAAc,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,KAAK,IAAA,CAAK,WAAA,CAAY,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,YAAA,CAAa,cAAsB,MAAA,EAAsB;AACvD,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,IAAA,IAAA,CAAK,GAAA,CAAI,aAAa,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,oCAAA,EAAuC,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,eAAA,CAAiB,CAAA;AAAA,EACtH;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CAAY,YAAA,EAAsB,MAAA,EAAgB,KAAA,EAAoC;AAC1F,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AACnD,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,EAAE,YAAA,EAAc,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,OAAA,kBAAS,IAAI,GAAA,EAAI,EAAG,SAAA,EAAW,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA,EAAE;AACtG,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,KAAU,OAAA,EAAS,OAAO,GAAA;AAClC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AACZ,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,MAAA,IAAU,8BAAA;AAC3B,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,GAAG,OAAO,GAAA;AAEnC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,GAAG,CAAA;AACrB,IAAA,GAAA,CAAI,KAAA,GAAQ,UAAA;AACZ,IAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,gCAAgC,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,aAAA,CAAU,CAAA;AAE1F,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,MAAA,EAAQ,CAAA,IAAK,KAAK,SAAA,EAAW;AACrD,QAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,KAAK,SAAS,CAAA;AAC/C,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC1D,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,UAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,UAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,QAC5B,CAAC,CAAA;AAGD,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACjC,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,GAAA,EAAK;AACzB,UAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,4CAAA,CAAyC,CAAA;AACrG,UAAA,OAAO,GAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,MAAA,GAAA,CAAI,YAAY,KAAA,CAAM,MAAA;AACtB,MAAA,GAAA,CAAI,KAAA,GAAQ,OAAA;AACZ,MAAA,GAAA,CAAI,OAAA,GAAU,KAAK,GAAA,EAAI;AACvB,MAAA,GAAA,CAAI,OAAA,GAAU,IAAI,OAAA,GAAU,OAAA;AAC5B,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA,CAAA;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,QAAA,EAAM,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,GAAA,CAAI,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,IAC9G,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AACZ,MAAA,GAAA,CAAI,QAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,IAAA,CAAK,GAAA,CAAI,oCAAoC,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,QAAA,EAAM,GAAA,CAAI,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACpH,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,WAAW,IAAA,EAAwC;AACvD,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAO,IAAA;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAK,KAAA,CAAM,CAAC,IAAI,CAAA,EAAG,IAAI,CAAA;AAC9C,MAAA,OAAO,MAAA,IAAU,IAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,2CAAsC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,eAAA,CAAiB,CAAA;AAChH,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,KAAK,OAAA,EAAS;AAChC,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,MAAA,CAAA,CAAE,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,IAAA,EAAK;AAAA,MACb,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,YAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,wCAAA,EAA2C,KAAA,CAAM,GAAA,IAAO,GAAG,CAAA,CAAA,CAAG,CAAA;AAEvE,IAAA,KAAA,CAAM,MAAA,EAAQ,YAAY,MAAM,CAAA;AAChC,IAAA,KAAA,CAAM,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAG9D,IAAA,KAAA,CAAM,MAAA,EAAQ,YAAY,MAAM,CAAA;AAChC,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AAC1C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK;AAChC,MAAA,IAAI,IAAA,OAAW,GAAA,CAAI,CAAA,iBAAA,EAAoB,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,QAAQ,CAAC,IAAA,EAAM,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAM,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AAChC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,kDAAA,EAAgD,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,OAAO,KAAA,EAAqB;AAClC,IAAA,IAAA,CAAK,MAAA,IAAU,KAAA;AACf,IAAA,IAAI,EAAA;AACJ,IAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,MAAM,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAC3C,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,QAAQ,GAAA,CAAI,KAAA;AACpD,MAAA,MAAM,KAAK,GAAA,CAAI,EAAA;AACf,MAAA,IAAI,OAAO,OAAO,QAAA,EAAU;AAC5B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAAA,aACxD,MAAA,CAAO,IAAI,MAAM,GAAA,CAAI,KAAA,IAAS,sCAAsC,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,MAAqB,MAAA,EAAqC;AACvE,IAAA,MAAM,UAAA,GAAa,CAAC,CAAC,IAAA,CAAK,KAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,IAAA,CAAK,OAAA,EAAA;AACL,IAAA,MAAM,MAAM,MAAA,GAAS,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,GAAK,CAAA,KAAA,EAAQ,QAAQ,MAAM,CAAA,CAAA;AAGhE,IAAA,KAAA,MAAW,GAAG,CAAC,CAAA,IAAK,KAAK,OAAA,EAAS;AAChC,MAAA,YAAA,CAAa,EAAE,KAAK,CAAA;AACpB,MAAA,CAAA,CAAE,OAAO,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,GAAG,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAEnB,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY;AACnC,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,MAAA,GACH,CAAA,6BAAA,EAAgC,GAAG,CAAA,EAAA,EAAK,KAAK,OAAO,CAAA,4MAAA,CAAA;AAGtD,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,sCAAsC,GAAG,CAAA,iCAAA,EAA+B,KAAK,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACrH;AAAA,EAEQ,KAAA,CAAM,KAAA,EAAiB,KAAA,GAAQ,KAAA,EAA4B;AACjE,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,8BAA8B,CAAC,CAAA;AAC/F,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,SAAe,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAC5C,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,KAAK,YAAA,EAAa;AAAA,IAC5B,SAAS,GAAA,EAAK;AAIZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,IAAA,CAAK,OAAA,EAAA;AACL,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY;AACnC,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,IAAA,CAAK,MAAA,GAAS,CAAA,sCAAA,EAAyC,KAAA,CAAM,OAAO,CAAA,+CAAA,CAAA;AACpE,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,kDAAA,EAAgD,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,KAAK,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,MAC/G;AACA,MAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,OAAO,IAAI,OAAA,CAAoB,CAACC,QAAAA,EAAS,MAAA,KAAW;AAClD,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAA,CAAK,gBAAgB,IAAI,CAAC,CAAA;AAAA,MAClF,CAAA,EAAG,KAAK,gBAAgB,CAAA;AAExB,MAAC,MAA4C,KAAA,IAAQ;AACrD,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAA,EAAI,EAAE,SAAAA,QAAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC/C,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,GAAI,IAAI,CAAA;AAAA,MAC7E,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,CAAO,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,EACjB;AACF,CAAA;AASA,SAAS,kBAAA,GAAmC;AAC1C,EAAA,MAAM,IAAA,GAAYC,IAAA,CAAA,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACxD,EAAA,MAAM,KAAA,GAAaA,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,sBAAsB,CAAA;AACpD,EAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,CAAA,+BAAA,CAA4B,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAK,CAAA,EAAG;AAAA,IACtC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA;AAAA;AAAA,IAG9B,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,cAAc,EAAA;AAAG,GACzC,CAAA;AACH;;;ACnaA,eAAsB,cAAA,CAAe,OAAA,GAA4B,EAAC,EAAuB;AACvF,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,aAAA,EAAc;AACvD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,UAAA,EAAW;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,IAAI,iBAAA,EAAkB;AAC3D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,gBAAA,EAAiB;AAC1D,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,MAAY;AAAA,EAAC,CAAA,CAAA;AAGzC,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA,IAAe,IAAI,WAAA,CAAY,EAAE,KAAK,CAAA;AAClE,EAAA,WAAA,CAAY,gBAAA,CAAiB,CAAC,YAAA,EAAc,MAAA,KAAW,QAAA,CAAS,OAAO,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA,EAAG,KAAK,CAAA;AACvG,EAAA,QAAA,CAAS,gBAAgB,WAAW,CAAA;AACpC,EAAA,MAAM,oBAAoB,OAAA,CAAQ,iBAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,0BAAU,IAAA,EAAK,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AACnC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,EAAG;AACzC,IAAG,cAAeC,IAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,IAAA,IAAI;AACF,MAAG,eAAW,UAAU,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,MAAO;AACL,IAAG,cAAeA,IAAA,CAAA,OAAA,CAAQ,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,MAAA,GAAa,GAAA,CAAA,YAAA,CAAa,CAAC,MAAA,KAAW;AAC1C,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACnC,MAAA,MAAA,IAAU,KAAA;AACV,MAAA,IAAI,EAAA;AACJ,MAAA,OAAA,CAAQ,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,MAAM,CAAA,EAAG;AACvC,QAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACtC,QAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,KAAK,OAAA,CAAQ,OAAA;AAAA,UACX,UAAA,CAAW,IAAA,EAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,GAAA,EAAK,GAAA,EAAK,SAAA,EAAW,UAAA,EAAY,iBAAA,EAAmB,GAAA,EAAK;AAAA,SACjH,CAAE,IAAA;AAAA,UACA,CAAC,QAAA,KAAa;AACZ,YAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAI,IAAI,CAAA;AAAA,UAC9C;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,IAAI,OAAA,CAAc,CAACH,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,YAAY,MAAM;AAC9B,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAC1B,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAG,cAAeG,IAAA,CAAA,OAAA,CAAQ,OAAO,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACvD,IAAG,GAAA,CAAA,aAAA,CAAc,OAAA,EAAS,CAAA,EAAG,GAAG;AAAA,CAAA,EAAM,MAAM,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAM,KAAA,GAAQ;AAEZ,MAAA,WAAA,CAAY,IAAA,EAAK;AACjB,MAAA,MAAM,IAAI,QAAc,CAACH,QAAAA,KAAY,OAAO,KAAA,CAAM,MAAMA,QAAAA,EAAS,CAAC,CAAA;AAClE,MAAA,IAAI;AACF,QAAG,eAAW,OAAO,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,EAAG;AACzC,QAAA,IAAI;AACF,UAAG,eAAW,UAAU,CAAA;AAAA,QAC1B,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,eAAe,UAAA,CACb,MACA,GAAA,EAWsB;AACtB,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,IAAI,OAAA,IAAW,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,aAAA,EAAc;AAE9E,EAAA,QAAQ,IAAI,EAAA;AAAI,IACd,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAS,oBAAA,EAAqB;AAAA,IAC/D,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,CAAI,SAAA;AAAA,QAC3B,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AAAA,QAC9B,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAAK;AAAA,QACrC,OAAA,EAAS,oBAAA;AAAA,QACT,YAAY,GAAA,CAAI;AAAA,OAClB;AAAA,IACF,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,CAAC,IAAI,iBAAA,EAAmB;AAC1B,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,KAAA;AAAA,UACJ,KAAA,EACE,8HAAA;AAAA,UACF,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,GAAA,CAAI,iBAAA;AACjB,MAAA,UAAA,CAAW,MAAM,IAAA,EAAK,EAAG,GAAG,CAAA;AAC5B,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,IACpC;AAAA,IACA,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAU,GAAA,CAAI,WAAA,CAAY,QAAO,EAAE;AAAA,IACxD,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,WAAA,CAAY,UAAA,CAAW,IAAI,IAAI,CAAA;AACxD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,KAAA;AAAA,UACJ,KAAA,EAAO,4CAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,OAAO,GAAA,CAAI,WAAA,CAAY,MAAA,EAAO,CAAE,KAAA,EAAM;AAAA,IACnE;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,GAAA,CAAI,SAAS,MAAA,CAAO,WAAA,CAAY,IAAI,YAAY,CAAA;AAC7E,MAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAyC,IAAA,EAAM,SAAA,EAAU;AACjG,MAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,OAAO,GAAA,CAAI,GAAA,CAAI,cAAc,MAAM,CAAA;AAC7D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqB,GAAA,CAAI,YAAY,CAAA,CAAA,EAAI,MAAM,CAAA,6BAAA,CAAA,EAA4B,IAAA,EAAM,SAAA,EAAU;AAAA,MACxH;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,WAAA,CAAY,YAAY,GAAA,CAAI,YAAA,EAAc,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAClF,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,OAAA,EAAS,IAAA;AAAA,QACT,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,MAAA;AAAA,QACA,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,OAAA,EAAS,IAAI,OAAA,CAAQ,IAAA;AAAA,QACrB,SAAS,GAAA,CAAI;AAAA,OACf;AAAA,IACF;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,GAAA,CAAI,UAAA,CAAW,QAAO,EAAE;AAAA,IACnD,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,IAAI,SAAS,CAAA;AACjD,MAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAa;AAClE,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,YAAY,IAAA,EAAM,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,IAC9D;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,IAAI,SAAS,CAAA;AACnD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,cAAc,IAAA,EAAM,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,IAC5D;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,UAAA,CAAW,QAAA;AAAA,QAC7B,GAAA,CAAI,SAAA;AAAA,QACJ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACvB,IAAA,EAAO,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,IAAA,KAAS,WAAA,GAAc,EAAE,IAAA,GAAO,MAAA;AAAA,UAChE,SAAS,CAAA,CAAE;AAAA,SACb,CAAE,CAAA;AAAA,QACF;AAAA,UACE,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,gBAAgB,GAAA,CAAI,cAAA;AAAA,UACpB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,aAAa,GAAA,CAAI;AAAA;AACnB,OACF;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAa;AAClE,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,aAAA,EAAe,IAAA;AAAA,QACf,IAAA,EAAM,EAAE,MAAA,CAAO,IAAA;AAAA,QACf,KAAA,EAAO,EAAE,MAAA,CAAO,KAAA;AAAA,QAChB,WAAA,EAAa,EAAE,MAAA,CAAO,WAAA;AAAA,QACtB,cAAA,EAAgB,EAAE,MAAA,CAAO,cAAA;AAAA,QACzB,kBAAA,EAAoB,EAAE,MAAA,CAAO,kBAAA;AAAA,QAC7B,SAAA,EAAW,EAAE,MAAA,CAAO,SAAA;AAAA,QACpB,kBAAA,EAAoB,EAAE,MAAA,CAAO;AAAA,OAC/B;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,YAAY,GAAA,CAAI,QAAA,CAAS,MAAK,EAAE;AAAA,IACrD,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AAChC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,IAAI,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,EAAE,OAAO,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAG/F,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,GAAI,KAAA,EAAO;AAC/B,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,wBAAA,EAA2B,SAAA,CAAU,EAAE,KAAK,SAAA,CAAU,IAAI,CAAA,EAAG,SAAA,CAAU,SAAS,CAAA,EAAA,EAAK,SAAA,CAAU,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MACzH;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAU;AAAA,IAC/B;AAAA,IACA,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,IAAI,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,IAChE,KAAK,qBAAA,EAAuB;AAC1B,MAAA,MAAM,aAAa,GAAA,CAAI,QAAA,CAAS,mBAAmB,GAAA,CAAI,OAAA,EAAS,IAAI,GAAG,CAAA;AACvE,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,UAAA,EAAY,YAAY,IAAA,EAAK;AAAA,IAClD;AAAA,IACA,KAAK,kBAAA,EAAoB;AACvB,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,SAAA,EAAU;AAC9B,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,EAAE;AAAA,IACvE;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,WAAA,CAAY,IAAI,YAAY,CAAA;AAC/D,MAAA,IAAI,MAAA,KAAW,IAAI,MAAA,EAAQ;AACzB,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,gBAAA,EAAmB,GAAA,CAAI,YAAY,CAAA,CAAA,EAAI,UAAU,QAAQ,CAAA,QAAA,EAAM,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MACrF;AACA,MAAA,GAAA,CAAI,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,IAAI,MAAM,CAAA;AACtD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAc,GAAA,CAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO;AAAA,IACxF;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,IAAI;AAIF,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,WAAA,EAAc,GAAA,CAAI,YAAY,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,MAAA,EAAM,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC1F,QAAA,GAAA,CAAI,SAAS,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,GAAA,CAAI,QAAQ,KAAK,CAAA;AACzD,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA;AAAA,UACJ,MAAA,EAAQ,IAAA;AAAA,UACR,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,SAAA,EAAW,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU;AAAA,SACpC;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,YAAa,QAAQ,CAAA,CAAE,OAAA,GAAU,eAAA,EAAiB,IAAA,EAAM,WAAA,EAAY;AAAA,MACjG;AAAA,IACF;AAAA,IACA,KAAK,YAAA,EAAc;AAKjB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,MAAA;AAC9C,MAAA,GAAA,CAAI,GAAA,CAAI,eAAe,MAAA,CAAO,EAAE,IAAI,MAAM,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,IAAI,SAAS,CAAA;AAC/C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,KAAA;AAAA,UACJ,KAAA,EAAO,CAAA,sBAAA,EAAyB,GAAA,CAAI,IAAI,CAAA,+CAAA,CAAA;AAAA,UACxC,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AACA,MAAA,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,QAAQ,KAAK,CAAA;AAC9C,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,MAAA,EAAQ,IAAA;AAAA,QACR,cAAc,MAAA,CAAO,EAAA;AAAA,QACrB,MAAA;AAAA,QACA,SAAA,EAAW,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU;AAAA,OACpC;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA,CAAS,aAAa,GAAA,CAAI,YAAA,EAAc,IAAI,MAAM,CAAA;AACvE,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,6DAAA,EAA0D,MAAM,UAAA,EAAW;AAAA,MACxG;AACA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,EAAA,EAAI,MAAA,EAAQ,KAAM,CAAA;AAC7F,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC5D,EAAA,EAAI,EAAE,IAAA,CAAK,EAAA;AAAA,UACX,aAAA,EAAe,EAAE,IAAA,CAAK,aAAA;AAAA,UACtB,IAAA,EAAM,EAAE,IAAA,CAAK,IAAA;AAAA,UACb,IAAA,EAAM,EAAE,IAAA,CAAK,IAAA;AAAA,UACb,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,UAC5B,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,KAAK,CAAA,CAAE;AAAA,SACT,CAAE,CAAA;AAAA,QACF,gBAAgB,MAAA,CAAO;AAAA,OACzB;AAAA,IACF;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA,CAAS,aAAa,GAAA,CAAI,YAAA,EAAc,IAAI,MAAM,CAAA;AACvE,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,6DAAA,EAA0D,MAAM,UAAA,EAAW;AAAA,MACxG;AACA,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,QAAA,CAAS,KAAA,EAAO,IAAI,MAAM,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAqB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAA,EAAM,WAAA,EAAY;AAAA,MAClF;AACA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,CAAA,EAAG,CAAA;AAC1E,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAA,EAAU,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACjD,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,YAAY,CAAA,CAAE;AAAA,SAChB,CAAE,CAAA;AAAA,QACF,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA,CAAS,aAAa,GAAA,CAAI,YAAA,EAAc,IAAI,MAAM,CAAA;AACvE,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,6DAAA,EAA0D,MAAM,UAAA,EAAW;AAAA,MACxG;AACA,MAAA,MAAM,IAAI,QAAA,CAAS,KAAA;AACnB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,OAAA,EAAS;AAAA,UACP,SAAA,EAAW,CAAA,CAAE,KAAA,EAAO,MAAA,IAAU,CAAA;AAAA,UAC9B,SAAA,EAAW,CAAA,CAAE,KAAA,EAAO,MAAA,IAAU,CAAA;AAAA,UAC9B,SAAA,EAAW,CAAA,CAAE,IAAA,EAAM,SAAA,IAAa,EAAC;AAAA,UACjC,UAAA,EAAY,CAAA,CAAE,UAAA,EAAY,UAAA,IAAc,IAAA;AAAA,UACxC,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,IAAQ;AAAA;AACxB,OACF;AAAA,IACF;AAAA;AAEJ;AAEA,SAAS,aAAA,CAAc,OAAgB,MAAA,EAAuC;AAE5E,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,MAAA,EAAO;AAClE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AACpC,EAAA,IAAI,GAAA,CAAI,MAAM,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,KAAK,EAAA,EAAG;AAC3C,EAAA,IAAI,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,WAAW,CAAC,CAAA,EAAG,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,UAAA,CAAW,CAAC,EAAE,EAAA,EAAG;AAC5F,EAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,EAAe,WAAA,OAAkB,CAAA,IAAK,CAAA,CAAE,IAAA,EAAM,WAAA,OAAkB,CAAC,CAAA;AACxG,EAAA,OAAO,IAAA,GAAO,EAAE,EAAA,EAAI,IAAA,CAAK,IAAG,GAAI,IAAA;AAClC;;;ACtXO,IAAM,qBAAN,MAAyB;AAAA,EACrB,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACQ,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACT,OAAA,GAAU,EAAA;AAAA,EAElB,YAAY,OAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,oBAAA,CAAqB,OAAA,CAAQ,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAI,gBAAA,EAAiB;AACnD,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,YAAA;AACtC,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,SAAA;AAC5B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAAuC;AACrC,IAAA,IAAA,CAAK,MAAM,SAAA,EAAU;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAC5F,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,IAAO,SAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,KAAY,EAAA,IAAM,KAAK,OAAA,KAAY,MAAA;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAGf,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAMI,SAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAK,SAAS,CAAA;AACjD,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,QAAQA,MAAK,CAAA;AAC/C,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,MAAM,CAAA;AAAA,MAC7C;AACA,MAAA,OAAO;AAAA,QACL,KAAA,EAAAA,MAAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,QAAA;AAAA,QACA,SAAA,EAAW,KAAA;AAAA,QACX,cAAc,IAAA,CAAK;AAAA,OACrB;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,cAAc,MAAM,CAAA;AACrD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,MAAM,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA;AAAA,QACA,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,QAAA;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,QACX,cAAc,IAAA,CAAK;AAAA,OACrB;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC/C,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,MAAM,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA;AAAA,MACA,SAAA,EAAW,KAAA;AAAA,MACX,cAAc,IAAA,CAAK;AAAA,KACrB;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAAA,EAC1C;AACF","file":"chunk-2W3GBKSV.js","sourcesContent":["/**\n * Wire protocol for the lightweight Vibgrate daemon (`vgd`) — Fusion Runtime Phase 2 prototype.\n *\n * Line-delimited JSON over a local Unix domain socket (named pipe on Windows).\n * No credentials leave this process; the socket is local-only.\n */\n\nexport const VGD_PROTOCOL_VERSION = 'vgd/0' as const;\n\nexport interface WorkspaceRecord {\n /** Stable repository id (same as global store key). */\n id: string;\n /** Absolute repository root. */\n root: string;\n /** Absolute path to the current graph snapshot (may not exist yet). */\n graphPath: string;\n /** ISO timestamp when this workspace was last registered / refreshed. */\n registeredAt: string;\n /** Optional federation label. */\n label?: string;\n /** Optional federation role. */\n role?: 'primary' | 'member';\n /** Git branch or detached SHA at registration (multi-branch ActiveGraph). */\n gitRef?: string;\n}\n\n/** Lightweight ActiveGraph slot summary (no full graph payload). */\nexport interface GraphSlotSummary {\n repositoryId: string;\n gitRef: string;\n loadedAt: number;\n lastAccessAt: number;\n nodeCount: number;\n current: boolean;\n idleMs: number;\n evictable: boolean;\n}\n\nexport type VgdRequest =\n | { op: 'ping' }\n | { op: 'status' }\n /** Ask the daemon to exit cleanly (honoured only by a standalone `vg daemon start`). */\n | { op: 'shutdown' }\n | { op: 'list' }\n | { op: 'register'; root: string; label?: string; role?: 'primary' | 'member' }\n | { op: 'unregister'; root: string }\n | {\n op: 'register-federation';\n primaryRoot: string;\n members: Array<{ root: string; label?: string; role?: 'primary' | 'member' }>;\n }\n | { op: 'list-graph-slots'; repositoryId?: string }\n | { op: 'select-git-ref'; repositoryId: string; gitRef: string }\n | { op: 'put-graph'; repositoryId: string; gitRef: string; graph: unknown }\n /**\n * Load the workspace's on-disk code map into ActiveGraph inside the daemon\n * (binary snapshot first, JSON fallback). The fast-path alternative to\n * shipping the whole graph over the socket with put-graph — use it whenever\n * the map already exists on disk.\n */\n | { op: 'load-graph'; root: string; gitRef?: string; graphPath?: string }\n /** Lexical/structural query against the ActiveGraph for a repository. */\n | { op: 'query-graph'; repositoryId: string; query: string; limit?: number; gitRef?: string }\n /** Blast-radius impact for a symbol id or qualified name. */\n | { op: 'impact-of'; repositoryId: string; symbol: string; depth?: number; gitRef?: string }\n /** Compact graph meta for the current (or named) slot — not the full graph. */\n | { op: 'graph-summary'; repositoryId: string; gitRef?: string }\n /** Semantic warm (docs/VGD-SEMANTIC-WARM-SPEC.md): worker + per-slot index state. */\n | { op: 'embed-status'; repositoryId?: string }\n /** Embed one string in the daemon's warm worker; the caller ranks locally. */\n | { op: 'embed-query'; text: string }\n /** Ensure the slot's vector index exists, building it if needed. */\n | { op: 'embed-index'; repositoryId: string; gitRef?: string }\n /** Approach B host broker: warm model status inside vgd. */\n | { op: 'host-status' }\n | { op: 'host-load'; modelPath: string }\n | { op: 'host-unload'; modelPath?: string }\n | {\n op: 'host-generate';\n modelPath: string;\n messages: Array<{ role: string; content: string }>;\n grammar?: string;\n requireGrammar?: boolean;\n maxTokens?: number;\n temperature?: number;\n };\n\n/** Semantic warm state: the worker, and one row per resident slot index. */\nexport interface EmbedStatusPayload {\n worker: 'stopped' | 'starting' | 'ready' | 'unavailable';\n pid?: number;\n model?: string;\n crashes: number;\n reason?: string;\n slots: Array<{\n repositoryId: string;\n gitRef: string;\n state: string;\n vectors: number;\n nodeCount: number;\n builtAt?: number;\n buildMs?: number;\n error?: string;\n }>;\n}\n\n/** Compact match row for query-graph (no full node payloads). */\nexport interface VgdQueryMatch {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n}\n\nexport interface VgdImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport type VgdResponse =\n | { ok: true; pong: true; version: typeof VGD_PROTOCOL_VERSION }\n | {\n ok: true;\n pid: number;\n uptimeMs: number;\n workspaces: number;\n /** Resident multi-branch ActiveGraph slots (Fusion §4.1.1). */\n graphSlots?: number;\n version: typeof VGD_PROTOCOL_VERSION;\n socketPath: string;\n }\n | { ok: true; workspaces: WorkspaceRecord[] }\n | { ok: true; workspace: WorkspaceRecord }\n | { ok: true; workspaces: WorkspaceRecord[]; federation: true }\n | { ok: true; removed: boolean }\n | { ok: true; stopping: true }\n | { ok: true; slots: GraphSlotSummary[] }\n | { ok: true; semantic: EmbedStatusPayload }\n | { ok: true; vector: number[]; model?: string }\n | {\n ok: true;\n indexed: true;\n repositoryId: string;\n gitRef: string;\n state: string;\n vectors: number;\n buildMs?: number;\n }\n | { ok: true; selected: true; repositoryId: string; gitRef: string }\n | { ok: true; stored: true; repositoryId: string; gitRef: string; nodeCount: number }\n | {\n ok: true;\n query: string;\n repositoryId: string;\n gitRef: string;\n matches: VgdQueryMatch[];\n tokensEstimate: number;\n }\n | {\n ok: true;\n repositoryId: string;\n gitRef: string;\n symbol: string;\n root: { id: string; name: string };\n depth: number;\n affected: VgdImpactItem[];\n direct: number;\n transitive: number;\n }\n | {\n ok: true;\n repositoryId: string;\n gitRef: string;\n summary: {\n nodeCount: number;\n edgeCount: number;\n languages: string[];\n corpusHash: string | null;\n root: string | null;\n };\n }\n | {\n ok: true;\n host: {\n poolSize: number;\n loadedModels: string[];\n bindingReady: boolean;\n };\n }\n | { ok: true; hostLoaded: true; modelPath: string }\n | { ok: true; hostUnloaded: true; cleared: number }\n | {\n ok: true;\n hostGenerated: true;\n text: string;\n model: string;\n constrained: boolean;\n grammarApplied?: boolean;\n draftAcceptedChars?: number;\n latencyMs?: number;\n unknownIdentifiers?: string[];\n }\n | { ok: false; error: string; code?: string };\n\nexport function parseRequest(line: string): VgdRequest | { error: string } {\n let raw: unknown;\n try {\n raw = JSON.parse(line);\n } catch {\n return { error: 'invalid JSON' };\n }\n if (!raw || typeof raw !== 'object') return { error: 'request must be an object' };\n const op = (raw as { op?: unknown }).op;\n if (op === 'ping' || op === 'status' || op === 'shutdown' || op === 'list') return { op };\n if (op === 'list-graph-slots') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n return {\n op: 'list-graph-slots',\n repositoryId: typeof repositoryId === 'string' && repositoryId.trim() ? repositoryId.trim() : undefined,\n };\n }\n if (op === 'select-git-ref') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'select-git-ref requires repositoryId' };\n if (typeof gitRef !== 'string' || !gitRef.trim()) return { error: 'select-git-ref requires gitRef' };\n return { op: 'select-git-ref', repositoryId: repositoryId.trim(), gitRef: gitRef.trim() };\n }\n if (op === 'put-graph') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n const graph = (raw as { graph?: unknown }).graph;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'put-graph requires repositoryId' };\n if (typeof gitRef !== 'string' || !gitRef.trim()) return { error: 'put-graph requires gitRef' };\n if (!graph || typeof graph !== 'object') return { error: 'put-graph requires graph object' };\n return { op: 'put-graph', repositoryId: repositoryId.trim(), gitRef: gitRef.trim(), graph };\n }\n if (op === 'load-graph') {\n const root = (raw as { root?: unknown }).root;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n const graphPath = (raw as { graphPath?: unknown }).graphPath;\n if (typeof root !== 'string' || !root.trim()) return { error: 'load-graph requires a non-empty root' };\n return {\n op: 'load-graph',\n root: root.trim(),\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n graphPath: typeof graphPath === 'string' && graphPath.trim() ? graphPath.trim() : undefined,\n };\n }\n if (op === 'embed-status') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n return {\n op: 'embed-status',\n repositoryId: typeof repositoryId === 'string' && repositoryId.trim() ? repositoryId.trim() : undefined,\n };\n }\n if (op === 'embed-query') {\n const text = (raw as { text?: unknown }).text;\n if (typeof text !== 'string' || !text.trim()) return { error: 'embed-query requires text' };\n // Socket input is untrusted like every other op's; bound it so one caller\n // cannot make the worker chew on an arbitrarily large string.\n return { op: 'embed-query', text: text.trim().slice(0, 8_000) };\n }\n if (op === 'embed-index') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'embed-index requires repositoryId' };\n return {\n op: 'embed-index',\n repositoryId: repositoryId.trim(),\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'query-graph') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const query = (raw as { query?: unknown }).query;\n const limit = (raw as { limit?: unknown }).limit;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'query-graph requires repositoryId' };\n if (typeof query !== 'string' || !query.trim()) return { error: 'query-graph requires query' };\n return {\n op: 'query-graph',\n repositoryId: repositoryId.trim(),\n query: query.trim(),\n limit: typeof limit === 'number' && limit > 0 ? Math.min(Math.floor(limit), 50) : undefined,\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'impact-of') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const symbol = (raw as { symbol?: unknown }).symbol;\n const depth = (raw as { depth?: unknown }).depth;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'impact-of requires repositoryId' };\n if (typeof symbol !== 'string' || !symbol.trim()) return { error: 'impact-of requires symbol' };\n return {\n op: 'impact-of',\n repositoryId: repositoryId.trim(),\n symbol: symbol.trim(),\n depth: typeof depth === 'number' && depth > 0 ? Math.min(Math.floor(depth), 12) : undefined,\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'graph-summary') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'graph-summary requires repositoryId' };\n return {\n op: 'graph-summary',\n repositoryId: repositoryId.trim(),\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'register' || op === 'unregister') {\n const root = (raw as { root?: unknown }).root;\n if (typeof root !== 'string' || !root.trim()) return { error: `${op} requires a non-empty root` };\n const label = (raw as { label?: unknown }).label;\n const role = (raw as { role?: unknown }).role;\n if (op === 'register') {\n return {\n op: 'register',\n root: root.trim(),\n label: typeof label === 'string' ? label : undefined,\n role: role === 'primary' || role === 'member' ? role : undefined,\n };\n }\n return { op: 'unregister', root: root.trim() };\n }\n if (op === 'register-federation') {\n const primaryRoot = (raw as { primaryRoot?: unknown }).primaryRoot;\n const members = (raw as { members?: unknown }).members;\n if (typeof primaryRoot !== 'string' || !primaryRoot.trim()) return { error: 'register-federation requires primaryRoot' };\n if (!Array.isArray(members) || members.length === 0) return { error: 'register-federation requires members[]' };\n const parsed: Array<{ root: string; label?: string; role?: 'primary' | 'member' }> = [];\n for (const m of members) {\n if (!m || typeof m !== 'object') continue;\n const root = (m as { root?: unknown }).root;\n if (typeof root !== 'string' || !root.trim()) continue;\n const label = (m as { label?: unknown }).label;\n const role = (m as { role?: unknown }).role;\n parsed.push({\n root: root.trim(),\n label: typeof label === 'string' ? label : undefined,\n role: role === 'primary' || role === 'member' ? role : undefined,\n });\n }\n if (!parsed.length) return { error: 'register-federation members must include at least one root' };\n return { op: 'register-federation', primaryRoot: primaryRoot.trim(), members: parsed };\n }\n if (op === 'host-status') return { op: 'host-status' };\n if (op === 'host-load') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n if (typeof modelPath !== 'string' || !modelPath.trim()) return { error: 'host-load requires modelPath' };\n return { op: 'host-load', modelPath: modelPath.trim() };\n }\n if (op === 'host-unload') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n return {\n op: 'host-unload',\n modelPath: typeof modelPath === 'string' && modelPath.trim() ? modelPath.trim() : undefined,\n };\n }\n if (op === 'host-generate') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n const messages = (raw as { messages?: unknown }).messages;\n if (typeof modelPath !== 'string' || !modelPath.trim()) return { error: 'host-generate requires modelPath' };\n if (!Array.isArray(messages) || messages.length === 0) return { error: 'host-generate requires messages[]' };\n const parsed: Array<{ role: string; content: string }> = [];\n for (const m of messages) {\n if (!m || typeof m !== 'object') continue;\n const role = (m as { role?: unknown }).role;\n const content = (m as { content?: unknown }).content;\n if (typeof role !== 'string' || typeof content !== 'string') continue;\n parsed.push({ role, content });\n }\n if (!parsed.length) return { error: 'host-generate messages must include role+content' };\n const grammar = (raw as { grammar?: unknown }).grammar;\n const requireGrammar = (raw as { requireGrammar?: unknown }).requireGrammar;\n const maxTokens = (raw as { maxTokens?: unknown }).maxTokens;\n const temperature = (raw as { temperature?: unknown }).temperature;\n return {\n op: 'host-generate',\n modelPath: modelPath.trim(),\n messages: parsed,\n grammar: typeof grammar === 'string' ? grammar : undefined,\n requireGrammar: requireGrammar === true,\n maxTokens: typeof maxTokens === 'number' ? maxTokens : undefined,\n temperature: typeof temperature === 'number' ? temperature : undefined,\n };\n }\n return { error: `unknown op: ${String(op)}` };\n}\n","/**\n * Multi-branch ActiveGraph cache (Fusion plan §4.1.1).\n *\n * Holds several in-memory graphs for the same repository — one per gitRef\n * (branch or detached SHA). Memory management: after an idle timeout, slots\n * become evictable; among idle slots, LILO (last-in, last-out ≡ FIFO by\n * load order) reclaims the oldest-loaded idle graph first. The currently\n * selected slot for a repository is never evicted.\n */\n\nimport type { VgGraph } from '../schema.js';\nimport { activeGraphSlotKey } from './git-ref.js';\n\n/** Default idle timeout: 20 minutes (within the 15–30 min plan band). */\nexport const DEFAULT_ACTIVE_GRAPH_IDLE_MS = 20 * 60 * 1000;\n\nexport interface ActiveGraphSlot {\n repositoryId: string;\n gitRef: string;\n graph: VgGraph;\n /** When this slot was first loaded into the cache. */\n loadedAt: number;\n /** Last access / select time. */\n lastAccessAt: number;\n /** Approximate size hint for diagnostics (node count). */\n nodeCount: number;\n}\n\nexport interface ActiveGraphCacheOptions {\n /** Idle duration before a non-selected slot is evictable (default 20 min). */\n idleTimeoutMs?: number;\n /** Max resident graphs per repositoryId (default 8). */\n maxPerRepo?: number;\n /** Max resident graphs process-wide (default 32). */\n maxTotal?: number;\n now?: () => number;\n /**\n * Called for every slot leaving the cache, whatever removed it (idle\n * timeout, overflow, clear). Anything keyed by the same slot — the semantic\n * index in vgd — hangs off this so it can never outlive the graph it\n * describes. Must not throw; a listener error is swallowed rather than\n * corrupting eviction.\n */\n onEvict?: (slot: { repositoryId: string; gitRef: string }) => void;\n}\n\nexport interface ActiveGraphSlotSummary {\n repositoryId: string;\n gitRef: string;\n loadedAt: number;\n lastAccessAt: number;\n nodeCount: number;\n current: boolean;\n idleMs: number;\n evictable: boolean;\n}\n\n/**\n * In-memory multi-branch graph cache. Pure structure — does not load/save disk.\n */\nexport class ActiveGraphCache {\n private readonly slots = new Map<string, ActiveGraphSlot>();\n /** repositoryId → currently selected gitRef */\n private readonly currentRef = new Map<string, string>();\n private readonly idleTimeoutMs: number;\n private readonly maxPerRepo: number;\n private readonly maxTotal: number;\n private readonly now: () => number;\n private readonly onEvict?: (slot: { repositoryId: string; gitRef: string }) => void;\n\n constructor(options: ActiveGraphCacheOptions = {}) {\n this.onEvict = options.onEvict;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_ACTIVE_GRAPH_IDLE_MS;\n this.maxPerRepo = options.maxPerRepo ?? 8;\n this.maxTotal = options.maxTotal ?? 32;\n this.now = options.now ?? (() => Date.now());\n }\n\n size(): number {\n return this.slots.size;\n }\n\n get(repositoryId: string, gitRef: string): ActiveGraphSlot | undefined {\n const slot = this.slots.get(activeGraphSlotKey(repositoryId, gitRef));\n if (slot) {\n slot.lastAccessAt = this.now();\n }\n return slot;\n }\n\n /**\n * Insert or replace a graph for (repositoryId, gitRef). Touches access time.\n * Runs eviction if over cap.\n */\n put(repositoryId: string, gitRef: string, graph: VgGraph): ActiveGraphSlot {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n const t = this.now();\n const existing = this.slots.get(key);\n const slot: ActiveGraphSlot = {\n repositoryId,\n gitRef,\n graph,\n loadedAt: existing?.loadedAt ?? t,\n lastAccessAt: t,\n nodeCount: graph.nodes?.length ?? 0,\n };\n this.slots.set(key, slot);\n if (!this.currentRef.has(repositoryId)) {\n this.currentRef.set(repositoryId, gitRef);\n }\n this.evictIfNeeded();\n return slot;\n }\n\n /**\n * Mark gitRef as the current branch for this repository and touch it.\n * Returns the slot if present.\n */\n select(repositoryId: string, gitRef: string): ActiveGraphSlot | undefined {\n this.currentRef.set(repositoryId, gitRef);\n return this.get(repositoryId, gitRef);\n }\n\n /** Currently selected gitRef for a repository, if any. */\n selectedRef(repositoryId: string): string | undefined {\n return this.currentRef.get(repositoryId);\n }\n\n current(repositoryId: string): ActiveGraphSlot | undefined {\n const ref = this.currentRef.get(repositoryId);\n if (!ref) return undefined;\n return this.get(repositoryId, ref);\n }\n\n /**\n * Drop idle slots past the timeout (LILO among idle).\n * Returns keys of removed slots.\n */\n evictIdle(now: number = this.now()): string[] {\n return this.evict(now, false);\n }\n\n /** Force eviction of idle slots when over caps (timeout may be ignored for overflow). */\n evictIfNeeded(): string[] {\n return this.evict(this.now(), true);\n }\n\n list(repositoryId?: string): ActiveGraphSlotSummary[] {\n const t = this.now();\n const out: ActiveGraphSlotSummary[] = [];\n for (const slot of this.slots.values()) {\n if (repositoryId && slot.repositoryId !== repositoryId) continue;\n const current = this.currentRef.get(slot.repositoryId) === slot.gitRef;\n const idleMs = t - slot.lastAccessAt;\n out.push({\n repositoryId: slot.repositoryId,\n gitRef: slot.gitRef,\n loadedAt: slot.loadedAt,\n lastAccessAt: slot.lastAccessAt,\n nodeCount: slot.nodeCount,\n current,\n idleMs,\n evictable: !current && idleMs >= this.idleTimeoutMs,\n });\n }\n return out.sort(\n (a, b) => a.repositoryId.localeCompare(b.repositoryId) || a.gitRef.localeCompare(b.gitRef),\n );\n }\n\n clear(): void {\n for (const slot of this.slots.values()) this.notifyEvict(slot);\n this.slots.clear();\n this.currentRef.clear();\n }\n\n private notifyEvict(slot: { repositoryId: string; gitRef: string }): void {\n if (!this.onEvict) return;\n try {\n this.onEvict({ repositoryId: slot.repositoryId, gitRef: slot.gitRef });\n } catch {\n // A listener problem must never break cache maintenance.\n }\n }\n\n private evict(now: number, forceOverflow: boolean): string[] {\n const removed: string[] = [];\n\n const removeKey = (key: string): void => {\n const slot = this.slots.get(key);\n if (!slot) return;\n this.slots.delete(key);\n removed.push(key);\n this.notifyEvict(slot);\n };\n\n // 1) Idle timeout: LILO among idle (earliest loadedAt first).\n const idle = this.idleCandidates(now, this.idleTimeoutMs);\n idle.sort((a, b) => a.loadedAt - b.loadedAt);\n for (const slot of idle) {\n removeKey(activeGraphSlotKey(slot.repositoryId, slot.gitRef));\n }\n\n // 2) Overflow: if still over maxPerRepo or maxTotal, LILO among any non-current idle-or-all-non-current.\n if (forceOverflow) {\n while (this.slots.size > this.maxTotal) {\n const victim = this.pickLiloVictim(now, /* requireIdleTimeout */ false);\n if (!victim) break;\n removeKey(activeGraphSlotKey(victim.repositoryId, victim.gitRef));\n }\n // Per-repo caps\n const byRepo = new Map<string, ActiveGraphSlot[]>();\n for (const s of this.slots.values()) {\n const list = byRepo.get(s.repositoryId) ?? [];\n list.push(s);\n byRepo.set(s.repositoryId, list);\n }\n for (const [repoId, list] of byRepo) {\n if (list.length <= this.maxPerRepo) continue;\n const nonCurrent = list\n .filter((s) => this.currentRef.get(repoId) !== s.gitRef)\n .sort((a, b) => a.loadedAt - b.loadedAt);\n let excess = list.length - this.maxPerRepo;\n for (const s of nonCurrent) {\n if (excess <= 0) break;\n removeKey(activeGraphSlotKey(s.repositoryId, s.gitRef));\n excess--;\n }\n }\n }\n\n return removed;\n }\n\n private idleCandidates(now: number, timeoutMs: number): ActiveGraphSlot[] {\n const out: ActiveGraphSlot[] = [];\n for (const slot of this.slots.values()) {\n if (this.currentRef.get(slot.repositoryId) === slot.gitRef) continue;\n if (now - slot.lastAccessAt >= timeoutMs) out.push(slot);\n }\n return out;\n }\n\n private pickLiloVictim(now: number, requireIdleTimeout: boolean): ActiveGraphSlot | null {\n let best: ActiveGraphSlot | null = null;\n for (const slot of this.slots.values()) {\n if (this.currentRef.get(slot.repositoryId) === slot.gitRef) continue;\n if (requireIdleTimeout && now - slot.lastAccessAt < this.idleTimeoutMs) continue;\n if (!best || slot.loadedAt < best.loadedAt) best = slot;\n }\n return best;\n }\n}\n","import * as path from 'node:path';\nimport { repositoryIdFromRoot, globalGraphPathForRef, globalGraphPath } from '../paths.js';\nimport { detectGitRef } from '../git-ref.js';\nimport { ActiveGraphCache } from '../active-graph-cache.js';\nimport type { WorkspaceRecord } from './protocol.js';\nimport type { VgGraph } from '../../schema.js';\n\n/** Slot-scoped resource that must track the graph cache exactly. */\nexport interface GraphSlotListener {\n onGraphPut(repositoryId: string, gitRef: string, graph: VgGraph): void;\n onGraphSelect(repositoryId: string, gitRef: string): void;\n onGraphEvict(repositoryId: string, gitRef: string): void;\n}\n\n/**\n * In-memory workspace registry for the vgd prototype.\n *\n * Tracks which repository roots the daemon knows about and where their\n * graphs live. Holds a multi-branch {@link ActiveGraphCache} so several\n * git refs of the same repo can stay warm (Fusion §4.1.1).\n */\nexport class WorkspaceRegistry {\n private readonly byId = new Map<string, WorkspaceRecord>();\n /**\n * Anything keyed by the same (repositoryId, gitRef) slot as the graph — the\n * semantic index — attaches here. Wiring it through the registry rather than\n * the cache directly means every put/select/evict passes one funnel, so an\n * index can never describe a ref its graph no longer holds.\n */\n private slotListener?: GraphSlotListener;\n /** Multi-branch in-memory graphs (shared across registered workspaces). */\n readonly graphs = new ActiveGraphCache({\n onEvict: (slot) => this.slotListener?.onGraphEvict(slot.repositoryId, slot.gitRef),\n });\n\n /** Attach the semantic index (or any slot-scoped resource) to graph lifecycle. */\n setSlotListener(listener: GraphSlotListener | undefined): void {\n this.slotListener = listener;\n }\n\n register(\n root: string,\n now: () => Date = () => new Date(),\n meta: { label?: string; role?: 'primary' | 'member'; gitRef?: string } = {},\n ): WorkspaceRecord {\n const resolved = path.resolve(root);\n const id = repositoryIdFromRoot(resolved);\n const git = meta.gitRef ? { ref: meta.gitRef, kind: 'branch' as const } : detectGitRef(resolved);\n const graphPath =\n git.kind !== 'none' && git.ref ? globalGraphPathForRef(resolved, git.ref) : globalGraphPath(resolved);\n const record: WorkspaceRecord = {\n id,\n root: resolved,\n graphPath,\n registeredAt: now().toISOString(),\n label: meta.label,\n role: meta.role,\n gitRef: git.ref || undefined,\n };\n this.byId.set(id, record);\n if (git.ref) this.graphs.select(id, git.ref);\n return record;\n }\n\n /**\n * Activate or insert an in-memory graph for a workspace branch.\n * Call after load/build; runs LILO idle eviction as needed.\n */\n putGraph(repositoryId: string, gitRef: string, graph: VgGraph): void {\n this.graphs.put(repositoryId, gitRef, graph);\n this.graphs.select(repositoryId, gitRef);\n // Invalidate before anyone can query: the old vectors describe the old graph.\n this.slotListener?.onGraphPut(repositoryId, gitRef, graph);\n this.slotListener?.onGraphSelect(repositoryId, gitRef);\n }\n\n /** Switch the current branch slot for a repository (no load). */\n selectGitRef(repositoryId: string, gitRef: string): void {\n this.graphs.select(repositoryId, gitRef);\n this.slotListener?.onGraphSelect(repositoryId, gitRef);\n }\n\n /** Register every member of a federation (primary + members). */\n registerFederation(\n members: Array<{ root: string; label?: string; role?: 'primary' | 'member' }>,\n now: () => Date = () => new Date(),\n ): WorkspaceRecord[] {\n return members.map((m) => this.register(m.root, now, { label: m.label, role: m.role }));\n }\n\n unregister(root: string): boolean {\n const id = repositoryIdFromRoot(path.resolve(root));\n return this.byId.delete(id);\n }\n\n list(): WorkspaceRecord[] {\n return [...this.byId.values()].sort((a, b) => a.root.localeCompare(b.root));\n }\n\n get(root: string): WorkspaceRecord | undefined {\n return this.byId.get(repositoryIdFromRoot(path.resolve(root)));\n }\n\n /** Lookup by stable repository id. */\n getById(repositoryId: string): WorkspaceRecord | undefined {\n return this.byId.get(repositoryId);\n }\n\n size(): number {\n return this.byId.size;\n }\n\n /**\n * Resolve an ActiveGraph for query/impact: prefer the named gitRef, else the\n * selected current slot, else any warm slot for the repository.\n */\n resolveGraph(repositoryId: string, gitRef?: string): { graph: VgGraph; gitRef: string } | null {\n if (gitRef) {\n const slot = this.graphs.get(repositoryId, gitRef);\n if (slot) return { graph: slot.graph, gitRef: slot.gitRef };\n }\n const current = this.graphs.current(repositoryId);\n if (current) return { graph: current.graph, gitRef: current.gitRef };\n // Fall back to any warm slot for this repo (deterministic: earliest loaded).\n const any = this.graphs\n .list(repositoryId)\n .slice()\n .sort((a, b) => a.loadedAt - b.loadedAt)[0];\n if (any) {\n const slot = this.graphs.get(repositoryId, any.gitRef);\n if (slot) return { graph: slot.graph, gitRef: slot.gitRef };\n }\n return null;\n }\n}\n","/**\n * Model host broker inside vgd (Approach B / B4 + P4 multi-client).\n *\n * Long-lived daemon process can keep warm llama.cpp sessions so CLI and IDE\n * clients share one loaded model. Management (which pack/mode) stays in the\n * client/orchestrator; vgd only loads paths the client requests and generates.\n *\n * P4: clients acquire/release leases per model path so unload is refcounted\n * (one IDE + CLI can share a warm model without the first exit killing it).\n *\n * Binding is injected (never static node-llama-cpp import).\n */\n\nimport {\n acquireHostSession,\n clearHostSessionPool,\n dropHostSession,\n evictIdleSessions,\n generateOnSession,\n hostSessionPoolSize,\n listHostSessions,\n type HostGenerateReport,\n type HostSessionInfo,\n} from '../llm-host/session.js';\nimport type { LlmChatMessage, LlmGenerateOptions } from '../llm-host/types.js';\n\nexport interface HostBrokerStatus {\n poolSize: number;\n loadedModels: string[];\n bindingReady: boolean;\n /** Per-path client lease counts (P4). */\n leases: Record<string, number>;\n sessions: HostSessionInfo[];\n}\n\nexport interface HostClientLease {\n clientId: string;\n modelPath: string;\n}\n\nexport class VgdHostBroker {\n private binding: unknown | null = null;\n private readonly loaded = new Set<string>();\n /** modelPath → set of client ids holding a lease. */\n private readonly leases = new Map<string, Set<string>>();\n\n setBinding(lib: unknown | null): void {\n this.binding = lib;\n }\n\n hasBinding(): boolean {\n return this.binding != null;\n }\n\n status(): HostBrokerStatus {\n const leases: Record<string, number> = {};\n for (const [path, clients] of this.leases) {\n leases[path] = clients.size;\n }\n return {\n poolSize: hostSessionPoolSize(),\n loadedModels: [...this.loaded],\n bindingReady: this.binding != null,\n leases,\n sessions: listHostSessions(),\n };\n }\n\n /**\n * Load weights and optionally register a client lease (P4 multi-client).\n * When clientId is omitted, behaves like a one-shot load (no lease bookkeeping).\n */\n async load(\n modelPath: string,\n clientId?: string,\n ): Promise<{ ok: true; modelPath: string; leases: number } | { ok: false; error: string }> {\n if (!this.binding) {\n return { ok: false, error: 'host binding not configured — start vgd with llama runtime or attach binding' };\n }\n try {\n await acquireHostSession(this.binding, modelPath);\n this.loaded.add(modelPath);\n if (clientId) {\n let set = this.leases.get(modelPath);\n if (!set) {\n set = new Set();\n this.leases.set(modelPath, set);\n }\n set.add(clientId);\n }\n evictIdleSessions(4);\n return { ok: true, modelPath, leases: this.leases.get(modelPath)?.size ?? 0 };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n\n /**\n * Release a client lease. When the last lease is released, drop the warm\n * session for that path. Without clientId, clears all leases for the path\n * (or entire pool if modelPath omitted).\n */\n async unload(\n modelPath?: string,\n clientId?: string,\n ): Promise<{ ok: true; cleared: number; remainingLeases: number }> {\n if (!modelPath) {\n const n = hostSessionPoolSize();\n clearHostSessionPool();\n this.loaded.clear();\n this.leases.clear();\n return { ok: true, cleared: n, remainingLeases: 0 };\n }\n\n if (clientId) {\n const set = this.leases.get(modelPath);\n if (set) {\n set.delete(clientId);\n if (set.size === 0) this.leases.delete(modelPath);\n }\n const remaining = this.leases.get(modelPath)?.size ?? 0;\n if (remaining === 0) {\n const dropped = dropHostSession(modelPath) ? 1 : 0;\n this.loaded.delete(modelPath);\n return { ok: true, cleared: dropped, remainingLeases: 0 };\n }\n return { ok: true, cleared: 0, remainingLeases: remaining };\n }\n\n // No clientId: force drop path (all leases).\n this.leases.delete(modelPath);\n const dropped = dropHostSession(modelPath) ? 1 : 0;\n this.loaded.delete(modelPath);\n return { ok: true, cleared: dropped, remainingLeases: 0 };\n }\n\n /** How many clients hold a lease on modelPath. */\n leaseCount(modelPath: string): number {\n return this.leases.get(modelPath)?.size ?? 0;\n }\n\n async generate(\n modelPath: string,\n messages: LlmChatMessage[],\n opts?: LlmGenerateOptions,\n ): Promise<{ ok: true; result: HostGenerateReport } | { ok: false; error: string }> {\n if (!this.binding) {\n return { ok: false, error: 'host binding not configured' };\n }\n try {\n const session = await acquireHostSession(this.binding, modelPath);\n this.loaded.add(modelPath);\n const result = await generateOnSession(session, messages, {\n grammar: opts?.grammar,\n requireGrammar: opts?.requireGrammar,\n identifierTrie: opts?.identifierTrie,\n annotateUnknownIdentifiers: opts?.annotateUnknownIdentifiers,\n draftCandidates: opts?.draftCandidates,\n maxTokens: opts?.maxTokens,\n temperature: opts?.temperature,\n promptSegments: opts?.promptSegments,\n });\n return { ok: true, result };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n}\n\n/** Process-wide broker for the running vgd (tests may replace). */\nlet defaultBroker: VgdHostBroker | null = null;\n\nexport function getVgdHostBroker(): VgdHostBroker {\n if (!defaultBroker) defaultBroker = new VgdHostBroker();\n return defaultBroker;\n}\n\nexport function resetVgdHostBroker(): void {\n defaultBroker = null;\n clearHostSessionPool();\n}\n","/**\n * Semantic warm inside vgd (docs/VGD-SEMANTIC-WARM-SPEC.md).\n *\n * vgd already keeps the code map warm per repo-and-ref and local LLM weights\n * warm per path. The embedding model and the vector index were the gap: every\n * consumer — `vg lsp`, `vg code`, the CLI — loaded its own copy, so\n * `vg daemon status` could report a warm graph slot while the editor announced\n * \"warming semantic search\" on a fresh process, again.\n *\n * Two invariants shape everything here.\n *\n * **The addon lives in a child.** {@link EmbedBroker} never imports the\n * embedding backend; it talks NDJSON to `embed-worker.ts`. The backend can\n * abort its process (see `engine/embed-health.ts`) and no try/catch survives a\n * signal — so the worst case must be a dead worker vgd can restart, not a dead\n * daemon. A worker that dies repeatedly is given up on, and every caller falls\n * back to lexical exactly as it does when vgd is absent.\n *\n * **The index follows the graph slot.** Vectors are keyed by the same\n * `(repositoryId, gitRef)` slot key the graph uses, and the cache's eviction\n * hook drops them together. A branch switch selects a different index the same\n * moment it selects a different graph; a re-published graph invalidates the\n * vectors for exactly that slot and nothing else. Ranking against vectors that\n * belong to another ref would be a silent correctness bug, so the two are\n * never allowed to drift apart.\n */\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport * as path from 'node:path';\nimport { activeGraphSlotKey } from '../git-ref.js';\nimport type { VgGraph, GraphNode } from '../../schema.js';\n\n/** How a slot's index is doing — surfaced by `embed-status` and the daemon log. */\nexport type SlotIndexState = 'absent' | 'building' | 'ready' | 'stale' | 'failed';\n\nexport interface SlotIndex {\n repositoryId: string;\n gitRef: string;\n state: SlotIndexState;\n /** nodeId → vector. Empty until the first build completes. */\n vectors: Map<string, number[]>;\n nodeCount: number;\n builtAt?: number;\n buildMs?: number;\n error?: string;\n}\n\nexport interface SlotIndexSummary {\n repositoryId: string;\n gitRef: string;\n state: SlotIndexState;\n vectors: number;\n nodeCount: number;\n builtAt?: number;\n buildMs?: number;\n error?: string;\n}\n\nexport interface EmbedBrokerStatus {\n /** Worker process state. */\n worker: 'stopped' | 'starting' | 'ready' | 'unavailable';\n pid?: number;\n model?: string;\n /** Consecutive worker deaths; at the cap the broker stops restarting. */\n crashes: number;\n reason?: string;\n slots: SlotIndexSummary[];\n}\n\nexport type EmbedBrokerLog = (message: string) => void;\n\nexport interface EmbedBrokerOptions {\n /** Diagnostic sink — the daemon's log. */\n log?: EmbedBrokerLog;\n /** Injected worker spawn (tests). */\n spawnWorker?: () => ChildProcess;\n /** Consecutive crashes tolerated before the broker gives up (default 3). */\n maxCrashes?: number;\n /** Per-request timeout in ms (default 120s — a cold model load is slow). */\n requestTimeoutMs?: number;\n /** Documents per embed request (default 256). */\n batchSize?: number;\n now?: () => number;\n}\n\ninterface Pending {\n resolve: (vectors: number[][]) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/** The text an embedding represents for a node — mirrors the in-process indexer. */\nfunction nodeText(node: GraphNode): string {\n const parts = [node.qualifiedName || node.name, node.kind, node.file, node.doc]\n .filter((p): p is string => typeof p === 'string' && p.length > 0);\n return parts.join(' · ').slice(0, 512);\n}\n\nexport class EmbedBroker {\n private child: ChildProcess | null = null;\n private starting = false;\n private gaveUp = false;\n private crashes = 0;\n private reason: string | undefined;\n private model: string | undefined;\n private nextId = 1;\n private buffer = '';\n private readonly pending = new Map<number, Pending>();\n private readonly indexes = new Map<string, SlotIndex>();\n /** Slot keys with a build in flight, so warms are not duplicated. */\n private readonly building = new Set<string>();\n /** The slot most recently made current — logged on change. */\n private currentKey: string | undefined;\n private graphProvider?: (repositoryId: string, gitRef: string) => VgGraph | undefined;\n\n private readonly log: EmbedBrokerLog;\n private readonly spawnWorker: () => ChildProcess;\n private readonly maxCrashes: number;\n private readonly requestTimeoutMs: number;\n private readonly batchSize: number;\n private readonly now: () => number;\n\n constructor(options: EmbedBrokerOptions = {}) {\n this.log = options.log ?? ((): void => {});\n this.spawnWorker = options.spawnWorker ?? defaultSpawnWorker;\n this.maxCrashes = options.maxCrashes ?? 3;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 120_000;\n this.batchSize = options.batchSize ?? 256;\n this.now = options.now ?? ((): number => Date.now());\n }\n\n status(): EmbedBrokerStatus {\n return {\n worker: this.gaveUp ? 'unavailable' : this.child ? 'ready' : this.starting ? 'starting' : 'stopped',\n pid: this.child?.pid,\n model: this.model,\n crashes: this.crashes,\n reason: this.reason,\n slots: this.listSlots(),\n };\n }\n\n listSlots(repositoryId?: string): SlotIndexSummary[] {\n const out: SlotIndexSummary[] = [];\n for (const idx of this.indexes.values()) {\n if (repositoryId && idx.repositoryId !== repositoryId) continue;\n out.push({\n repositoryId: idx.repositoryId,\n gitRef: idx.gitRef,\n state: idx.state,\n vectors: idx.vectors.size,\n nodeCount: idx.nodeCount,\n builtAt: idx.builtAt,\n buildMs: idx.buildMs,\n error: idx.error,\n });\n }\n return out.sort((a, b) => a.repositoryId.localeCompare(b.repositoryId) || a.gitRef.localeCompare(b.gitRef));\n }\n\n slot(repositoryId: string, gitRef: string): SlotIndex | undefined {\n return this.indexes.get(activeGraphSlotKey(repositoryId, gitRef));\n }\n\n /** True once the broker has stopped trying — callers should go lexical. */\n unavailable(): boolean {\n return this.gaveUp;\n }\n\n /**\n * A graph slot was published or replaced. The vectors for that slot no\n * longer describe its graph, so they are dropped and a rebuild is queued.\n * Called from the same funnel that stores the graph, so the two can never\n * disagree about which ref they belong to.\n */\n onGraphPut(repositoryId: string, gitRef: string, graph: VgGraph): void {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n const existing = this.indexes.get(key);\n const nodeCount = graph.nodes?.length ?? 0;\n if (existing && existing.state === 'ready') {\n this.log(`semantic: ${repositoryId}@${gitRef} graph republished — index stale (${existing.vectors.size} vectors dropped)`);\n }\n this.indexes.set(key, {\n repositoryId,\n gitRef,\n state: 'stale',\n vectors: new Map(),\n nodeCount,\n });\n }\n\n /**\n * Supplies the graph for a slot so a select can warm without the caller\n * threading it through. Set by the daemon to read its own cache.\n */\n setGraphProvider(provider: (repositoryId: string, gitRef: string) => VgGraph | undefined): void {\n this.graphProvider = provider;\n }\n\n /**\n * A slot became current — a branch switch, a new repo, a fresh publish.\n * The matching index is swapped in, and warmed in the background if it is\n * not ready, so the first Ask after a switch is not the one that pays.\n */\n onGraphSelect(repositoryId: string, gitRef: string): void {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n if (this.currentKey !== key) {\n this.currentKey = key;\n const idx = this.indexes.get(key);\n this.log(\n `semantic: current slot → ${repositoryId}@${gitRef} · index ${idx ? `${idx.state} (${idx.vectors.size} vectors)` : 'absent'}`,\n );\n }\n if (this.gaveUp) return;\n const idx = this.indexes.get(key);\n if (idx?.state === 'ready' || this.building.has(key)) return;\n const graph = this.graphProvider?.(repositoryId, gitRef);\n if (!graph) return;\n // Fire and forget: warming must never block the op that triggered it.\n void this.ensureIndex(repositoryId, gitRef, graph);\n }\n\n /** A graph slot was evicted — its index goes with it, never outliving it. */\n onGraphEvict(repositoryId: string, gitRef: string): void {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n const idx = this.indexes.get(key);\n if (!idx) return;\n this.indexes.delete(key);\n this.log(`semantic: ${repositoryId}@${gitRef} index evicted with its graph slot (${idx.vectors.size} vectors freed)`);\n }\n\n /** Drop everything (daemon shutdown / registry clear). */\n clear(): void {\n this.indexes.clear();\n this.building.clear();\n }\n\n /**\n * Ensure the slot has vectors, building them if needed. Resolves when the\n * index is ready or has definitively failed; never throws.\n */\n async ensureIndex(repositoryId: string, gitRef: string, graph: VgGraph): Promise<SlotIndex> {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n let idx = this.indexes.get(key);\n if (!idx) {\n idx = { repositoryId, gitRef, state: 'stale', vectors: new Map(), nodeCount: graph.nodes?.length ?? 0 };\n this.indexes.set(key, idx);\n }\n if (idx.state === 'ready') return idx;\n if (this.gaveUp) {\n idx.state = 'failed';\n idx.error = this.reason ?? 'embedding worker unavailable';\n return idx;\n }\n if (this.building.has(key)) return idx;\n\n this.building.add(key);\n idx.state = 'building';\n const nodes = (graph.nodes ?? []).filter((n) => !!n?.id);\n const started = this.now();\n this.log(`semantic: building index for ${repositoryId}@${gitRef} (${nodes.length} nodes)…`);\n\n try {\n const vectors = new Map<string, number[]>();\n for (let i = 0; i < nodes.length; i += this.batchSize) {\n const batch = nodes.slice(i, i + this.batchSize);\n const out = await this.embed(batch.map((n) => nodeText(n)));\n batch.forEach((n, j) => {\n const v = out[j];\n if (v) vectors.set(n.id, v);\n });\n // A slot evicted or republished mid-build must not be resurrected with\n // vectors describing the graph it no longer has.\n const live = this.indexes.get(key);\n if (!live || live !== idx) {\n this.log(`semantic: index build for ${repositoryId}@${gitRef} abandoned — slot changed underneath it`);\n return idx;\n }\n }\n idx.vectors = vectors;\n idx.nodeCount = nodes.length;\n idx.state = 'ready';\n idx.builtAt = this.now();\n idx.buildMs = idx.builtAt - started;\n idx.error = undefined;\n this.log(`semantic: index ready for ${repositoryId}@${gitRef} — ${vectors.size} vectors in ${idx.buildMs}ms`);\n } catch (err) {\n idx.state = 'failed';\n idx.error = err instanceof Error ? err.message : String(err);\n this.log(`semantic: index build failed for ${repositoryId}@${gitRef} — ${idx.error}; callers fall back to lexical`);\n } finally {\n this.building.delete(key);\n }\n return idx;\n }\n\n /** Embed one query string. Returns null when semantic is not available. */\n async embedQuery(text: string): Promise<number[] | null> {\n if (this.gaveUp) return null;\n try {\n const [vector] = await this.embed([text], true);\n return vector ?? null;\n } catch (err) {\n this.log(`semantic: query embedding failed — ${err instanceof Error ? err.message : String(err)}; using lexical`);\n return null;\n }\n }\n\n /** Stop the worker (daemon shutdown). Safe to call when already stopped. */\n stop(): void {\n const child = this.child;\n this.child = null;\n this.starting = false;\n for (const [, p] of this.pending) {\n clearTimeout(p.timer);\n p.reject(new Error('embedding worker stopped'));\n }\n this.pending.clear();\n if (child) {\n try {\n child.kill();\n } catch {\n /* already gone */\n }\n }\n }\n\n // ── worker plumbing ────────────────────────────────────────────────────\n\n private ensureWorker(): ChildProcess {\n if (this.child) return this.child;\n this.starting = true;\n const child = this.spawnWorker();\n this.child = child;\n this.starting = false;\n this.buffer = '';\n this.log(`semantic: embedding worker started (pid ${child.pid ?? '?'})`);\n\n child.stdout?.setEncoding('utf8');\n child.stdout?.on('data', (chunk: string) => this.onData(chunk));\n // The worker's stderr is diagnostic only; surface it so a failing backend\n // is visible in the daemon log rather than silently swallowed.\n child.stderr?.setEncoding('utf8');\n child.stderr?.on('data', (chunk: string) => {\n const text = String(chunk).trim();\n if (text) this.log(`semantic worker: ${text.slice(0, 500)}`);\n });\n child.on('exit', (code, signal) => this.onExit(code, signal));\n child.on('error', (err: Error) => {\n this.log(`semantic: embedding worker could not start — ${err.message}`);\n this.onExit(null, null);\n });\n return child;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf('\\n')) >= 0) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let res: { id?: number; ok?: boolean; vectors?: number[][]; error?: string; model?: string };\n try {\n res = JSON.parse(line) as typeof res;\n } catch {\n continue; // a corrupt frame is not fatal to the stream\n }\n if (typeof res.model === 'string') this.model = res.model;\n const id = res.id;\n if (typeof id !== 'number') continue;\n const p = this.pending.get(id);\n if (!p) continue;\n this.pending.delete(id);\n clearTimeout(p.timer);\n if (res.ok && Array.isArray(res.vectors)) p.resolve(res.vectors);\n else p.reject(new Error(res.error || 'embedding worker returned no vectors'));\n }\n }\n\n private onExit(code: number | null, signal: NodeJS.Signals | null): void {\n const wasRunning = !!this.child;\n this.child = null;\n if (!wasRunning) return;\n\n this.crashes++;\n const how = signal ? `signal ${signal}` : `code ${code ?? 'null'}`;\n // Fail every in-flight request rather than letting callers hang: each one\n // has a lexical fallback waiting.\n for (const [, p] of this.pending) {\n clearTimeout(p.timer);\n p.reject(new Error(`embedding worker exited (${how})`));\n }\n this.pending.clear();\n\n if (this.crashes >= this.maxCrashes) {\n this.gaveUp = true;\n this.reason =\n `the embedding worker exited (${how}) ${this.crashes} times — semantic search is off for this daemon; ` +\n `everything falls back to lexical. A native backend that aborts like this is usually a blocked ` +\n `onnxruntime-node postinstall (see \\`vg embed --where\\`).`;\n this.log(`semantic: ${this.reason}`);\n return;\n }\n this.log(`semantic: embedding worker exited (${how}) — restarting on next use (${this.crashes}/${this.maxCrashes})`);\n }\n\n private embed(texts: string[], query = false): Promise<number[][]> {\n if (this.gaveUp) return Promise.reject(new Error(this.reason ?? 'embedding worker unavailable'));\n if (!texts.length) return Promise.resolve([]);\n let child: ChildProcess;\n try {\n child = this.ensureWorker();\n } catch (err) {\n // A worker that cannot even be spawned counts against the crash budget,\n // so a permanently broken install settles into \"lexical\" instead of\n // retrying (and re-logging) on every request.\n const error = err instanceof Error ? err : new Error(String(err));\n this.crashes++;\n if (this.crashes >= this.maxCrashes) {\n this.gaveUp = true;\n this.reason = `the embedding worker could not start (${error.message}) — semantic search is off for this daemon`;\n this.log(`semantic: ${this.reason}`);\n } else {\n this.log(`semantic: embedding worker could not start — ${error.message} (${this.crashes}/${this.maxCrashes})`);\n }\n return Promise.reject(error);\n }\n const id = this.nextId++;\n return new Promise<number[][]>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`embedding request timed out after ${this.requestTimeoutMs}ms`));\n }, this.requestTimeoutMs);\n // Do not hold the daemon open on this timer.\n (timer as unknown as { unref?: () => void }).unref?.();\n this.pending.set(id, { resolve, reject, timer });\n try {\n child.stdin?.write(JSON.stringify({ id, op: 'embed', texts, query }) + '\\n');\n } catch (err) {\n this.pending.delete(id);\n clearTimeout(timer);\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n }\n\n /** A successful exchange clears the crash streak — used after a good build. */\n noteHealthy(): void {\n this.crashes = 0;\n }\n}\n\n/**\n * Spawn the real worker: the compiled sibling entry (a tsup entry point, like\n * `parse-worker`), run by the same Node binary. Under a TS-only runner the\n * compiled file does not exist — the same situation `engine/pool.ts` handles —\n * so this throws rather than spawning something that cannot start, and the\n * broker reports the failure like any other and callers go lexical.\n */\nfunction defaultSpawnWorker(): ChildProcess {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const entry = path.join(here, 'embed-worker-main.js');\n if (!fs.existsSync(entry)) {\n throw new Error(`embedding worker not found at ${entry} — semantic runs lexically`);\n }\n return spawn(process.execPath, [entry], {\n stdio: ['pipe', 'pipe', 'pipe'],\n // Never inherit loader flags or a debugger port: this child exists to be\n // expendable, and anything that changes how it loads defeats the point.\n env: { ...process.env, NODE_OPTIONS: '' },\n });\n}\n","import * as fs from 'node:fs';\nimport * as net from 'node:net';\nimport * as path from 'node:path';\nimport { VGD_PROTOCOL_VERSION, parseRequest, type VgdResponse } from './protocol.js';\nimport { WorkspaceRegistry } from './registry.js';\nimport { vgdPidPath, vgdSocketPath } from './paths.js';\nimport { queryGraph } from '../../engine/query.js';\nimport { loadGraph } from '../../engine/load.js';\nimport { impactOf } from '../../engine/impact.js';\nimport { resolveOne } from '../../engine/lookup.js';\nimport { getVgdHostBroker, type VgdHostBroker } from './host-broker.js';\nimport { EmbedBroker } from './embed-broker.js';\nimport type { VgGraph } from '../../schema.js';\n\nexport interface VgdServerOptions {\n /** Override socket path (tests). */\n socketPath?: string;\n /** Override PID path (tests). */\n pidPath?: string;\n registry?: WorkspaceRegistry;\n now?: () => Date;\n /** Process id recorded in status / pid file (tests). */\n pid?: number;\n /** Inject host broker (tests); default process-wide broker. */\n hostBroker?: VgdHostBroker;\n /** Inject the semantic broker (tests); default owns a worker child. */\n embedBroker?: EmbedBroker;\n /**\n * Diagnostic sink. `vg daemon start` points this at stdout so the daemon's\n * work — graph publishes, branch switches, index builds — is visible while\n * it happens instead of being inferred after the fact.\n */\n log?: (message: string) => void;\n /**\n * Invoked (shortly after the reply is written) when a client sends the\n * `shutdown` op. Only a standalone `vg daemon start` passes this — an\n * in-process vgd (e.g. inside `vg code`) leaves it unset, and the op is\n * refused so another process can never take down the owning session.\n */\n onShutdownRequest?: () => void;\n}\n\nexport interface VgdServer {\n readonly socketPath: string;\n readonly registry: WorkspaceRegistry;\n /** Wall time when the server started listening. */\n readonly startedAt: number;\n close(): Promise<void>;\n}\n\n/**\n * Start a line-delimited JSON daemon on the local vgd socket.\n * Creates the daemon directory; removes a stale Unix socket file if present.\n */\nexport async function startVgdServer(options: VgdServerOptions = {}): Promise<VgdServer> {\n const socketPath = options.socketPath ?? vgdSocketPath();\n const pidPath = options.pidPath ?? vgdPidPath();\n const registry = options.registry ?? new WorkspaceRegistry();\n const hostBroker = options.hostBroker ?? getVgdHostBroker();\n const log = options.log ?? ((): void => {});\n // Semantic warm: the index is slot-scoped like the graph, so it attaches to\n // the registry's lifecycle rather than being managed alongside it by hand.\n const embedBroker = options.embedBroker ?? new EmbedBroker({ log });\n embedBroker.setGraphProvider((repositoryId, gitRef) => registry.graphs.get(repositoryId, gitRef)?.graph);\n registry.setSlotListener(embedBroker);\n const onShutdownRequest = options.onShutdownRequest;\n const now = options.now ?? (() => new Date());\n const pid = options.pid ?? process.pid;\n const startedAt = Date.now();\n\n // Unix sockets need a free path; named pipes on Windows are cleaned by the OS.\n if (!socketPath.startsWith('\\\\\\\\.\\\\pipe')) {\n fs.mkdirSync(path.dirname(socketPath), { recursive: true });\n try {\n fs.unlinkSync(socketPath);\n } catch {\n /* nothing to remove */\n }\n } else {\n fs.mkdirSync(path.dirname(pidPath), { recursive: true });\n }\n\n const server = net.createServer((socket) => {\n let buffer = '';\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (!line) continue;\n void Promise.resolve(\n handleLine(line, { registry, hostBroker, embedBroker, now, pid, startedAt, socketPath, onShutdownRequest, log }),\n ).then(\n (response) => {\n socket.write(JSON.stringify(response) + '\\n');\n },\n );\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(socketPath, () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n try {\n fs.mkdirSync(path.dirname(pidPath), { recursive: true });\n fs.writeFileSync(pidPath, `${pid}\\n`, 'utf8');\n } catch {\n /* pid file is best-effort */\n }\n\n return {\n socketPath,\n registry,\n startedAt,\n async close() {\n // The worker is a child of this process — never leave it orphaned.\n embedBroker.stop();\n await new Promise<void>((resolve) => server.close(() => resolve()));\n try {\n fs.unlinkSync(pidPath);\n } catch {\n /* gone */\n }\n if (!socketPath.startsWith('\\\\\\\\.\\\\pipe')) {\n try {\n fs.unlinkSync(socketPath);\n } catch {\n /* gone */\n }\n }\n },\n };\n}\n\nasync function handleLine(\n line: string,\n ctx: {\n registry: WorkspaceRegistry;\n hostBroker: VgdHostBroker;\n embedBroker: EmbedBroker;\n log: (message: string) => void;\n now: () => Date;\n pid: number;\n startedAt: number;\n socketPath: string;\n onShutdownRequest?: () => void;\n },\n): Promise<VgdResponse> {\n const req = parseRequest(line);\n if ('error' in req) return { ok: false, error: req.error, code: 'bad_request' };\n\n switch (req.op) {\n case 'ping':\n return { ok: true, pong: true, version: VGD_PROTOCOL_VERSION };\n case 'status':\n return {\n ok: true,\n pid: ctx.pid,\n uptimeMs: Date.now() - ctx.startedAt,\n workspaces: ctx.registry.size(),\n graphSlots: ctx.registry.graphs.size(),\n version: VGD_PROTOCOL_VERSION,\n socketPath: ctx.socketPath,\n };\n case 'shutdown': {\n if (!ctx.onShutdownRequest) {\n return {\n ok: false,\n error:\n 'this vgd is embedded in another process (e.g. vg code) and cannot be stopped remotely — stop the owning process instead',\n code: 'shutdown_unsupported',\n };\n }\n // Let the reply flush to the client before the listener goes away.\n const hook = ctx.onShutdownRequest;\n setTimeout(() => hook(), 150);\n return { ok: true, stopping: true };\n }\n case 'embed-status':\n return { ok: true, semantic: ctx.embedBroker.status() };\n case 'embed-query': {\n const vector = await ctx.embedBroker.embedQuery(req.text);\n if (!vector) {\n return {\n ok: false,\n error: 'semantic unavailable — rank lexically',\n code: 'semantic_unavailable',\n };\n }\n return { ok: true, vector, model: ctx.embedBroker.status().model };\n }\n case 'embed-index': {\n const gitRef = req.gitRef ?? ctx.registry.graphs.selectedRef(req.repositoryId);\n if (!gitRef) return { ok: false, error: 'no current gitRef for this repository', code: 'no_slot' };\n const slot = ctx.registry.graphs.get(req.repositoryId, gitRef);\n if (!slot) {\n return { ok: false, error: `no graph slot for ${req.repositoryId}@${gitRef} — publish the map first`, code: 'no_slot' };\n }\n const idx = await ctx.embedBroker.ensureIndex(req.repositoryId, gitRef, slot.graph);\n return {\n ok: true,\n indexed: true,\n repositoryId: req.repositoryId,\n gitRef,\n state: idx.state,\n vectors: idx.vectors.size,\n buildMs: idx.buildMs,\n };\n }\n case 'host-status':\n return { ok: true, host: ctx.hostBroker.status() };\n case 'host-load': {\n const r = await ctx.hostBroker.load(req.modelPath);\n if (!r.ok) return { ok: false, error: r.error, code: 'host_error' };\n return { ok: true, hostLoaded: true, modelPath: r.modelPath };\n }\n case 'host-unload': {\n const r = await ctx.hostBroker.unload(req.modelPath);\n return { ok: true, hostUnloaded: true, cleared: r.cleared };\n }\n case 'host-generate': {\n const r = await ctx.hostBroker.generate(\n req.modelPath,\n req.messages.map((m) => ({\n role: (m.role === 'system' || m.role === 'assistant' ? m.role : 'user') as 'system' | 'user' | 'assistant',\n content: m.content,\n })),\n {\n grammar: req.grammar,\n requireGrammar: req.requireGrammar,\n maxTokens: req.maxTokens,\n temperature: req.temperature,\n },\n );\n if (!r.ok) return { ok: false, error: r.error, code: 'host_error' };\n return {\n ok: true,\n hostGenerated: true,\n text: r.result.text,\n model: r.result.model,\n constrained: r.result.constrained,\n grammarApplied: r.result.grammarApplied,\n draftAcceptedChars: r.result.draftAcceptedChars,\n latencyMs: r.result.latencyMs,\n unknownIdentifiers: r.result.unknownIdentifiers,\n };\n }\n case 'list':\n return { ok: true, workspaces: ctx.registry.list() };\n case 'register': {\n const known = ctx.registry.size();\n const workspace = ctx.registry.register(req.root, ctx.now, { label: req.label, role: req.role });\n // A repo the daemon has not seen before is the interesting case — that is\n // when a warm daemon still has cold work to do.\n if (ctx.registry.size() > known) {\n ctx.log(`register: new workspace ${workspace.id} (${workspace.root}${workspace.gitRef ? ` @${workspace.gitRef}` : ''})`);\n }\n return { ok: true, workspace };\n }\n case 'unregister':\n return { ok: true, removed: ctx.registry.unregister(req.root) };\n case 'register-federation': {\n const workspaces = ctx.registry.registerFederation(req.members, ctx.now);\n return { ok: true, workspaces, federation: true };\n }\n case 'list-graph-slots': {\n ctx.registry.graphs.evictIdle();\n return { ok: true, slots: ctx.registry.graphs.list(req.repositoryId) };\n }\n case 'select-git-ref': {\n const before = ctx.registry.graphs.selectedRef(req.repositoryId);\n if (before !== req.gitRef) {\n ctx.log(`select-git-ref: ${req.repositoryId} ${before ?? '(none)'} → ${req.gitRef}`);\n }\n ctx.registry.selectGitRef(req.repositoryId, req.gitRef);\n return { ok: true, selected: true, repositoryId: req.repositoryId, gitRef: req.gitRef };\n }\n case 'put-graph': {\n try {\n // The wire line was already JSON.parse'd by parseRequest — re-encoding a\n // large repo's graph (`parseGraph(JSON.stringify(...))`) blocked the\n // daemon's event loop for seconds, timing out every concurrent client.\n const graph = req.graph as VgGraph;\n ctx.log(`put-graph: ${req.repositoryId}@${req.gitRef} · ${graph.nodes?.length ?? 0} nodes`);\n ctx.registry.putGraph(req.repositoryId, req.gitRef, graph);\n return {\n ok: true,\n stored: true,\n repositoryId: req.repositoryId,\n gitRef: req.gitRef,\n nodeCount: graph.nodes?.length ?? 0,\n };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'invalid graph', code: 'bad_graph' };\n }\n }\n case 'load-graph': {\n // Load from disk inside the daemon: the snapshot-first loader decodes\n // the binary sidecar (msgpack) when fresh — no multi-MB JSON line ever\n // crosses the socket, which is what made put-graph publishes slow on\n // large repos.\n const record = ctx.registry.register(req.root, ctx.now, { gitRef: req.gitRef });\n const gitRef = req.gitRef ?? record.gitRef ?? 'HEAD';\n ctx.log(`load-graph: ${record.id}@${gitRef} from ${req.root}`);\n const graph = loadGraph(req.root, req.graphPath);\n if (!graph) {\n return {\n ok: false,\n error: `no code map found for ${req.root} — run \\`vg build\\` (or bare \\`vg\\`) first`,\n code: 'no_map',\n };\n }\n ctx.registry.putGraph(record.id, gitRef, graph);\n return {\n ok: true,\n stored: true,\n repositoryId: record.id,\n gitRef,\n nodeCount: graph.nodes?.length ?? 0,\n };\n }\n case 'query-graph': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const result = queryGraph(resolved.graph, req.query, { limit: req.limit ?? 12, budget: 2000 });\n return {\n ok: true,\n query: req.query,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n matches: result.matches.slice(0, req.limit ?? 12).map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n })),\n tokensEstimate: result.tokensEstimate,\n };\n }\n case 'impact-of': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const node = resolveSymbol(resolved.graph, req.symbol);\n if (!node) {\n return { ok: false, error: `symbol not found: ${req.symbol}`, code: 'not_found' };\n }\n const impact = impactOf(resolved.graph, node.id, { depth: req.depth ?? 4 });\n return {\n ok: true,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n symbol: req.symbol,\n root: impact.root,\n depth: impact.depth,\n affected: impact.affected.slice(0, 40).map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: impact.direct,\n transitive: impact.transitive,\n };\n }\n case 'graph-summary': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const g = resolved.graph;\n return {\n ok: true,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n summary: {\n nodeCount: g.nodes?.length ?? 0,\n edgeCount: g.edges?.length ?? 0,\n languages: g.meta?.languages ?? [],\n corpusHash: g.provenance?.corpusHash ?? null,\n root: g.meta?.root ?? null,\n },\n };\n }\n }\n}\n\nfunction resolveSymbol(graph: VgGraph, symbol: string): { id: string } | null {\n // Prefer exact id, then qualified-name / short-name lookup.\n if (graph.nodes.some((n) => n.id === symbol)) return { id: symbol };\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return { id: hit.node.id };\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return { id: hit.candidates[0].id };\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn ? { id: byQn.id } : null;\n}\n","/**\n * Branch-aware graph loading for a single repository worktree (Fusion §4.1.1).\n *\n * Combines {@link detectGitRef}, disk load via {@link loadGraph}, and an\n * {@link ActiveGraphCache} so checkout A → B → A reuses a warm in-memory map\n * when the branch is still resident (LILO idle eviction applies).\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { repositoryIdFromRoot } from './paths.js';\nimport { detectGitRef, type GitRunner } from './git-ref.js';\nimport { ActiveGraphCache } from './active-graph-cache.js';\nimport type { VgGraph } from '../schema.js';\n\nexport interface BranchGraphLoadResult {\n graph: VgGraph | null;\n gitRef: string;\n kind: 'branch' | 'detached' | 'none';\n /** True when the selected ActiveGraph slot changed since the previous ensure. */\n switched: boolean;\n /** True when the graph was served from the in-memory cache. */\n fromCache: boolean;\n repositoryId: string;\n}\n\nexport interface BranchGraphSessionOptions {\n root: string;\n cache?: ActiveGraphCache;\n /** Optional explicit graph path (CLI `--graph`); bypasses branch keying for disk. */\n graphPath?: string;\n detectGit?: typeof detectGitRef;\n load?: typeof loadGraph;\n gitRun?: GitRunner;\n}\n\n/**\n * Stateful helper: call {@link ensureCurrent} at session start and before each\n * agent turn so a mid-session `git checkout` picks up the correct map.\n */\nexport class BranchGraphSession {\n readonly root: string;\n readonly repositoryId: string;\n readonly cache: ActiveGraphCache;\n private readonly graphPath?: string;\n private readonly detectGit: typeof detectGitRef;\n private readonly load: typeof loadGraph;\n private readonly gitRun?: GitRunner;\n private lastRef = '';\n\n constructor(options: BranchGraphSessionOptions) {\n this.root = options.root;\n this.repositoryId = repositoryIdFromRoot(options.root);\n this.cache = options.cache ?? new ActiveGraphCache();\n this.graphPath = options.graphPath;\n this.detectGit = options.detectGit ?? detectGitRef;\n this.load = options.load ?? loadGraph;\n this.gitRun = options.gitRun;\n }\n\n /**\n * Resolve HEAD, activate the matching cache slot (or load from disk), and\n * run idle eviction. Returns null graph when no map exists for this ref.\n */\n ensureCurrent(): BranchGraphLoadResult {\n this.cache.evictIdle();\n const info = this.gitRun ? this.detectGit(this.root, this.gitRun) : this.detectGit(this.root);\n const gitRef = info.ref || 'unknown';\n const switched = this.lastRef !== '' && this.lastRef !== gitRef;\n this.lastRef = gitRef;\n\n // Explicit --graph path: still track ref for cache identity but load that file.\n if (this.graphPath) {\n const graph = this.load(this.root, this.graphPath);\n if (graph) {\n this.cache.put(this.repositoryId, gitRef, graph);\n this.cache.select(this.repositoryId, gitRef);\n }\n return {\n graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: false,\n repositoryId: this.repositoryId,\n };\n }\n\n const warm = this.cache.get(this.repositoryId, gitRef);\n if (warm) {\n this.cache.select(this.repositoryId, gitRef);\n return {\n graph: warm.graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: true,\n repositoryId: this.repositoryId,\n };\n }\n\n const graph = this.load(this.root);\n if (graph) {\n this.cache.put(this.repositoryId, gitRef, graph);\n this.cache.select(this.repositoryId, gitRef);\n }\n return {\n graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: false,\n repositoryId: this.repositoryId,\n };\n }\n\n /** Diagnostics for daemon status / tests. */\n listSlots() {\n return this.cache.list(this.repositoryId);\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/cli-invocation.ts"],"names":[],"mappings":";;;;AAkCO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,OAAA,CAAQ,QAAA,KAAa,UAAU,OAAA,GAAU,OAAA,EAAS,CAAC,GAAG,CAAA,EAAG;AAAA,MAChF,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,CAAA,CACE,IAAA,GACA,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AACnB,IAAA,OAAO,GAAA,IAAO,IAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASO,SAAS,YAAY,OAAA,EAA0B;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAU,gBAAa,OAAO,CAAA;AACpC,IAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACrD,IAAA,MAAM,IAAA,GAAU,EAAA,CAAA,YAAA,CAAa,IAAA,EAAM,EAAE,QAAA,EAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AACtE,IAAA,OAAO,KAAK,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAYO,SAAS,qBAAqB,OAAA,EAA0B;AAC7D,EAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,WAAA,CAAY,IAAA,CAAQ,EAAA,CAAA,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASO,SAAS,qBAAqB,OAAA,EAA0B;AAC7D,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,IAAK,CAAC,qBAAqB,OAAO,CAAA;AAC9D;AAUO,SAAS,qBAAqB,KAAA,EAAgD;AACnF,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,KAAW,MAAA,EAAW,OAAO,MAAA;AAC3C,EAAA,MAAM,SAAS,KAAA,IAAS,WAAA;AAExB,EAAA,MAAM,EAAA,GAAK,OAAO,IAAI,CAAA;AACtB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,EAAA,IAAM,oBAAA,CAAqB,EAAE,CAAA,EAAG;AAClC,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,IAAA,MAAA,GAAS,QAAA,IAAY,oBAAA,CAAqB,QAAQ,CAAA,GAAI,UAAA,GAAa,cAAA;AAAA,EACrE;AAEA,EAAA,IAAI,CAAC,OAAO,MAAA,GAAS,MAAA;AACrB,EAAA,OAAO,MAAA;AACT;AAxHA,IA4Ba,cAAA,CAAA,CAqET;AAjGJ,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AA4BO,IAAM,cAAA,GAAiB,mBAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-3LSG7Z4I.js","sourcesContent":["import * as fs from 'node:fs';\nimport { execFileSync } from 'node:child_process';\n\n/**\n * How the user should re-invoke this CLI in a \"next step\" hint.\n *\n * A user who ran `npx @vibgrate/cli scan` has no *persistent* `vg` (or\n * `vibgrate`) on PATH, so a hint like `vg install` or `vg login` would fail for\n * them once the run ends. We answer the practical question \"what will actually\n * run this CLI for this user again?\" by checking whether an *installed* copy of\n * our binary is reachable on PATH:\n *\n * installed `vg` → `vg` (the normal installed case)\n * installed `vibgrate` → `vibgrate` (alias present, `vg` shadowed)\n * neither → `npx @vibgrate/cli` (npx / not installed globally)\n *\n * \"Installed\" is the key qualifier: `npx` prepends its own throwaway\n * `_npx/<hash>/node_modules/.bin` to PATH for the run, so `which vg` finds a `vg`\n * that is genuinely ours yet gone the moment the process exits. That ephemeral\n * binary is excluded (see {@link isEphemeralNpxBinary}) so npx users get the npx\n * form, not a `vg` they can't call again.\n *\n * This is deliberately the same ladder `detectServeLaunch` uses for the MCP\n * launch command — the underlying question (\"is an installed `vg` ours?\") is\n * identical.\n */\n\n/** The npx form that always works without a global install. */\nexport const NPX_INVOCATION = 'npx @vibgrate/cli';\n\n/**\n * Locate `cmd` on PATH, returning its resolved path or null. Best-effort: a\n * missing command or an unavailable `which`/`where` both yield null.\n */\nexport function whichOnPath(cmd: string): string | null {\n try {\n const out = execFileSync(process.platform === 'win32' ? 'where' : 'which', [cmd], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .trim()\n .split(/\\r?\\n/)[0];\n return out || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Does this PATH entry launch *this* package? Symlink installs resolve into a\n * `…/@vibgrate/cli/…` directory; script shims (pnpm/bun/yarn, Windows .cmd)\n * reference the package path in their first bytes. Best-effort: unreadable or\n * unrecognisable entries count as foreign, which only makes callers pick a safer\n * fallback.\n */\nexport function isOwnBinary(binPath: string): boolean {\n try {\n const real = fs.realpathSync(binPath);\n if (/[\\\\/]@vibgrate[\\\\/]cli[\\\\/]/.test(real)) return true;\n const head = fs.readFileSync(real, { encoding: 'utf8' }).slice(0, 2048);\n return head.includes('@vibgrate/cli') || head.includes('vibgrate');\n } catch {\n return false;\n }\n}\n\n/**\n * Is this resolved binary an *ephemeral* npx-cache entry rather than a persistent\n * install? `npx @vibgrate/cli …` unpacks the package into an npm `_npx/<hash>/`\n * cache directory and prepends its `node_modules/.bin` to PATH for the duration\n * of the run — so `which vg` finds a `vg` that is *ours* yet vanishes the instant\n * the process exits. Treating that as an installed `vg` is exactly what made the\n * post-scan hints tell npx users to run `vg login`/`vg push`, commands they have\n * no `vg` on PATH for. npm's cache segment is `_npx` on every platform; we test\n * the raw PATH entry and its realpath (symlink shims resolve into the same tree).\n */\nexport function isEphemeralNpxBinary(binPath: string): boolean {\n const NPX_SEGMENT = /[\\\\/]_npx[\\\\/]/;\n if (NPX_SEGMENT.test(binPath)) return true;\n try {\n return NPX_SEGMENT.test(fs.realpathSync(binPath));\n } catch {\n return false;\n }\n}\n\n/**\n * Does this PATH entry launch *this* CLI in a way that will still work after the\n * current process exits? True only for a persistent install of our package — an\n * ephemeral npx-cache binary does not count, because the user cannot re-invoke it\n * by name. This is the predicate \"next step\" hints and the MCP launch command\n * must use, not {@link isOwnBinary} alone.\n */\nexport function isInstalledOwnBinary(binPath: string): boolean {\n return isOwnBinary(binPath) && !isEphemeralNpxBinary(binPath);\n}\n\nlet cached: string | undefined;\n\n/**\n * The command prefix a user should type to re-run this CLI (see module doc).\n * Memoized per-process: PATH does not change mid-run, and each call would\n * otherwise spawn `which`. Pass `which` to override lookup in tests, which also\n * bypasses the cache.\n */\nexport function resolveCliInvocation(which?: (cmd: string) => string | null): string {\n if (!which && cached !== undefined) return cached;\n const lookup = which ?? whichOnPath;\n\n const vg = lookup('vg');\n let result: string;\n if (vg && isInstalledOwnBinary(vg)) {\n result = 'vg';\n } else {\n const vibgrate = lookup('vibgrate');\n result = vibgrate && isInstalledOwnBinary(vibgrate) ? 'vibgrate' : NPX_INVOCATION;\n }\n\n if (!which) cached = result;\n return result;\n}\n\n/** Reset the memoized invocation. Test-only. */\nexport function resetCliInvocationCache(): void {\n cached = undefined;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/logo.ts","../src/engine/attest.ts","../src/commands/attest-actions.ts","../src/install/area-skills.ts","../src/util/progress.ts","../src/cli-options.ts","../src/commands/build.ts"],"names":["crypto2","resolve","out","fs2","path2","path3","rel","fs3"],"mappings":"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","file":"chunk-6OP5U55G.js","sourcesContent":["import { c } from './output.js';\nimport { VERSION } from '../version.js';\n\n/**\n * The `vg` brand banner — the same boxy robot mark and brand colours (teal/mint)\n * as the Vibgrate scanner (`vibgrate-cli/src/ui/progress.ts`), replicated here so\n * the open graph package stays standalone.\n *\n * The wordmark is stacked BELOW the mark rather than beside it: the robot's eye\n * (`◼`) and arrow (`➜`) glyphs are East-Asian \"ambiguous\"/wide, so terminals that\n * render them double-width make the rows unequal — text placed to their right\n * (the scanner's layout) then misaligns. Nothing sits beside the art here, so the\n * banner lines up in every terminal. Shown on `vg build` for a human at a TTY;\n * never on `--json`, `--quiet`, or under a pipe.\n */\n\nconst teal = (s: string): string => c.hex('#3FB0A4')(s);\nconst mint = (s: string): string => c.hex('#4FE3C1')(s);\n\n// ── Boxy robot mark — identical glyphs/colours to the scanner's ROBOT ──\nconst ROBOT = [\n ' ' + teal('╭──────╮') + mint('➜'),\n ' ' + c.dim('┤') + teal('│') + ' ' + mint('◼') + ' ' + mint('◼') + ' ' + teal('│') + c.dim('├'),\n ' ' + c.dim('┤') + teal('│') + ' ' + c.dim('▁▁') + ' ' + teal('│') + c.dim('├'),\n ' ' + teal('╰──────╯'),\n] as const;\n\n/**\n * The banner as lines (no I/O) so it is unit-testable. The robot mark is a\n * self-contained block; the wordmark/tagline sit on their OWN lines beneath it\n * (never beside the variable-width glyphs), so the banner aligns in any terminal.\n */\nexport function logoLines(root?: string, opts: { product?: string; tagline?: string } = {}): string[] {\n const product = opts.product ?? 'Graph';\n const tagline = opts.tagline ?? 'Code Intelligence Engine';\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('Vibgrate')} ${teal(product)} ${c.dim(`· ${tagline} · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the banner to stderr, only for an interactive human (TTY). */\nexport function printLogo(root?: string, opts: { product?: string; tagline?: string } = {}): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${logoLines(root, opts).join('\\n')}\\n`);\n}\n\n/**\n * The **VG Code** banner (the approved marketing name for the code-editing\n * capability; see docs/NAMING-AND-MARKETING-STRATEGY.md). Same robot mark, but\n * the wordmark reads \"VG Code\" rather than \"Vibgrate Graph\".\n */\nexport function codeLogoLines(root?: string): string[] {\n return [\n '',\n ` ${ROBOT[0]}`,\n ` ${ROBOT[1]}`,\n ` ${ROBOT[2]}`,\n ` ${ROBOT[3]}`,\n ` ${c.bold.white('VG')} ${teal('Code')} ${c.dim(`· graph-grounded coding · v${VERSION}`)}`,\n ...(root ? [` ${c.dim(root)}`] : []),\n '',\n ];\n}\n\n/** Print the VG Code banner to stderr, only for an interactive human (TTY). */\nexport function printCodeLogo(root?: string): void {\n if (!process.stderr.isTTY) return;\n process.stderr.write(`${codeLogoLines(root).join('\\n')}\\n`);\n}\n","import * as crypto from 'node:crypto';\nimport { canonicalize } from './hash.js';\nimport { VERSION } from '../version.js';\nimport type { Toolchain, VgGraph } from '../schema.js';\n\n/**\n * `vg attest` — a signed, reproducible attestation over the code graph.\n *\n * This is the moat made load-bearing: a consumer can cryptographically verify,\n * offline, that a graph was produced by a named toolchain over a named commit and\n * has not changed since. We sign an in-toto Statement wrapped in a DSSE envelope\n * with Ed25519 (`node:crypto`, zero dependencies) — interoperable with\n * `cosign verify-blob-attestation`. Ed25519 signatures are deterministic\n * (RFC 8032), so the same graph + key produce a byte-identical envelope.\n *\n * The subject digest excludes the graph's volatile `generatedAt`, so it is\n * reproducible across rebuilds of identical content — which is exactly what makes\n * the attestation verifiable rather than a timestamped snapshot.\n */\n\nexport const DSSE_PAYLOAD_TYPE = 'application/vnd.in-toto+json';\nexport const IN_TOTO_STATEMENT_TYPE = 'https://in-toto.io/Statement/v1';\nexport const VG_PREDICATE_TYPE = 'https://vibgrate.com/attestation/code-graph/v1';\n\nexport interface CommitInfo {\n sha?: string;\n shortSha?: string;\n branch?: string;\n dirty?: boolean; // uncommitted changes vs sha — never verified-clean when true\n}\n\nexport interface AttestPredicate {\n tool: { name: 'vg'; version: string };\n toolchain?: Toolchain;\n corpusHash: string;\n graphDigest: string; // sha256 of the canonical graph (generatedAt excluded)\n counts: VgGraph['meta']['counts'];\n commit?: CommitInfo;\n sbomDigest?: string; // sha256 of an accompanying SBOM, if attested together\n timestamp?: string; // optional, opt-in (omitted by default for determinism)\n}\n\nexport interface InTotoStatement {\n _type: string;\n subject: { name: string; digest: { sha256: string } }[];\n predicateType: string;\n predicate: AttestPredicate;\n}\n\nexport interface DsseSignature {\n keyid: string;\n sig: string; // base64\n publicKey?: string; // PEM, embedded so the envelope self-verifies for integrity\n}\n\nexport interface DsseEnvelope {\n payloadType: string;\n payload: string; // base64 of the Statement JSON\n signatures: DsseSignature[];\n}\n\nexport function sha256Hex(input: string | Uint8Array): string {\n return crypto.createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * sha256 over the canonical graph with the volatile `generatedAt` excluded, so\n * two builds of identical content attest to the same digest.\n */\nexport function graphSubjectDigest(graph: VgGraph): string {\n const { generatedAt: _omit, ...rest } = graph;\n return sha256Hex(canonicalize(rest));\n}\n\n/** The 16-hex key id: a truncated sha256 over the SPKI DER public key. */\nexport function keyId(publicKey: crypto.KeyObject): string {\n return sha256Hex(publicKey.export({ type: 'spki', format: 'der' })).slice(0, 16);\n}\n\nexport interface StatementInput {\n commit?: CommitInfo;\n sbomDigest?: string;\n timestamp?: string;\n}\n\nexport function buildStatement(graph: VgGraph, input: StatementInput = {}): InTotoStatement {\n const graphDigest = graphSubjectDigest(graph);\n const predicate: AttestPredicate = {\n tool: { name: 'vg', version: VERSION },\n toolchain: graph.provenance.toolchain,\n corpusHash: graph.provenance.corpusHash,\n graphDigest,\n counts: graph.meta.counts,\n };\n if (input.commit) predicate.commit = input.commit;\n if (input.sbomDigest) predicate.sbomDigest = input.sbomDigest;\n if (input.timestamp) predicate.timestamp = input.timestamp;\n return {\n _type: IN_TOTO_STATEMENT_TYPE,\n subject: [{ name: 'graph.json', digest: { sha256: graphDigest } }],\n predicateType: VG_PREDICATE_TYPE,\n predicate,\n };\n}\n\n/**\n * DSSE Pre-Authentication Encoding:\n * \"DSSEv1\" SP len(type) SP type SP len(body) SP body\n * with lengths as ASCII decimal byte counts. Signing the PAE (not the raw body)\n * is what binds the payloadType to the signature.\n */\nexport function dssePae(payloadType: string, body: Uint8Array): Buffer {\n const typeBytes = Buffer.from(payloadType, 'utf8');\n const header = Buffer.from(\n `DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `,\n 'utf8',\n );\n return Buffer.concat([header, Buffer.from(body)]);\n}\n\n/** Sign a statement, returning a self-contained DSSE envelope. */\nexport function signStatement(statement: InTotoStatement, privateKey: crypto.KeyObject): DsseEnvelope {\n const body = Buffer.from(JSON.stringify(statement), 'utf8');\n const pae = dssePae(DSSE_PAYLOAD_TYPE, body);\n const sig = crypto.sign(null, pae, privateKey);\n // Derive the public key from the private key (via its PEM, for @types/node compat).\n const publicKey = crypto.createPublicKey(privateKey.export({ type: 'pkcs8', format: 'pem' }).toString());\n return {\n payloadType: DSSE_PAYLOAD_TYPE,\n payload: body.toString('base64'),\n signatures: [\n {\n keyid: keyId(publicKey),\n sig: sig.toString('base64'),\n publicKey: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n },\n ],\n };\n}\n\nexport type AttestStatus = 'verified' | 'signature-valid' | 'failed';\n\nexport interface VerifyResult {\n status: AttestStatus;\n signatureValid: boolean;\n signerPinned: boolean; // signature verified against a caller-supplied trusted key\n digestMatches?: boolean; // recomputed graph digest matches the attested one\n dirty?: boolean; // the attested commit had uncommitted changes\n keyid: string;\n reason: string;\n statement: InTotoStatement;\n}\n\n/**\n * Verify an envelope. Honest states, never a fabricated pass:\n * failed — bad signature, or the on-disk graph no longer matches.\n * signature-valid — cryptographically intact, but signer not pinned (or dirty).\n * verified — pinned signer + matching digest + clean tree.\n */\n/** An empty statement for results where the envelope could not even be parsed. */\nfunction emptyStatement(): InTotoStatement {\n return {\n _type: '',\n subject: [],\n predicateType: '',\n predicate: {\n tool: { name: 'vg', version: '' },\n corpusHash: '',\n graphDigest: '',\n counts: { nodes: 0, edges: 0, areas: 0, tests: 0, untested: 0 },\n },\n };\n}\n\nfunction failedResult(reason: string): VerifyResult {\n return {\n status: 'failed',\n signatureValid: false,\n signerPinned: false,\n keyid: '',\n reason,\n statement: emptyStatement(),\n };\n}\n\nexport function verifyEnvelope(\n env: DsseEnvelope,\n opts: { publicKeyPem?: string; graph?: VgGraph } = {},\n): VerifyResult {\n // A `.intoto.jsonl` is attacker-supplied input: every decode/parse/key step\n // must degrade to an honest `failed`, never crash the command.\n let body: Buffer;\n let statement: InTotoStatement;\n try {\n body = Buffer.from(env?.payload ?? '', 'base64');\n const parsed = JSON.parse(body.toString('utf8')) as InTotoStatement;\n if (!parsed || typeof parsed !== 'object' || !parsed.predicate) {\n throw new Error('missing predicate');\n }\n statement = parsed;\n } catch {\n return failedResult('malformed attestation payload (not a valid in-toto statement)');\n }\n\n const pae = dssePae(env.payloadType, body);\n const sig0 = env.signatures?.[0];\n const keyid = sig0?.keyid ?? '';\n const sig = sig0?.sig ? Buffer.from(sig0.sig, 'base64') : Buffer.alloc(0);\n\n let signatureValid = false;\n let signerPinned = false;\n try {\n if (sig0 && sig.length) {\n if (opts.publicKeyPem) {\n const pinnedKey = crypto.createPublicKey(opts.publicKeyPem);\n signatureValid = crypto.verify(null, pae, pinnedKey, sig);\n signerPinned = signatureValid;\n } else if (sig0.publicKey) {\n const embeddedKey = crypto.createPublicKey(sig0.publicKey);\n signatureValid = crypto.verify(null, pae, embeddedKey, sig);\n }\n }\n } catch {\n // Malformed key or signature bytes → not a valid signature (not a crash).\n signatureValid = false;\n signerPinned = false;\n }\n\n const digestMatches = opts.graph\n ? graphSubjectDigest(opts.graph) === statement.predicate.graphDigest\n : undefined;\n const dirty = statement.predicate.commit?.dirty;\n\n let status: AttestStatus;\n let reason: string;\n if (!signatureValid) {\n status = 'failed';\n reason = sig0 ? 'signature verification failed' : 'no signature in envelope';\n } else if (digestMatches === false) {\n status = 'failed';\n reason = 'graph.json no longer matches the attested digest (content changed since signing)';\n } else if (signerPinned && !dirty) {\n status = 'verified';\n reason =\n digestMatches === true\n ? 'signature valid, signer trusted, graph digest matches'\n : 'signature valid, signer trusted';\n } else {\n status = 'signature-valid';\n reason = dirty\n ? 'signature valid but the attested tree was dirty (uncommitted changes)'\n : 'signature valid but signer not pinned — pass --pub to establish trust';\n }\n\n return { status, signatureValid, signerPinned, digestMatches, dirty, keyid, reason, statement };\n}\n\nexport interface GeneratedKeypair {\n privatePem: string;\n publicPem: string;\n keyid: string;\n}\n\n/** Mint a fresh Ed25519 keypair for signing attestations. */\nexport function generateKeypair(): GeneratedKeypair {\n const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');\n return {\n privatePem: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),\n publicPem: publicKey.export({ type: 'spki', format: 'pem' }).toString(),\n keyid: keyId(publicKey),\n };\n}\n\n/** Serialize an envelope as a single-line `.intoto.jsonl` record (deterministic). */\nexport function serializeEnvelope(env: DsseEnvelope): string {\n return `${JSON.stringify(env)}\\n`;\n}\n\nexport function parseEnvelope(text: string): DsseEnvelope {\n const line = text.trim().split('\\n')[0];\n return JSON.parse(line) as DsseEnvelope;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { execFile } from 'node:child_process';\nimport { loadGraph } from '../engine/load.js';\nimport { resolveHead, workingTreeDirty } from '../core-open/utils/git-history.js';\nimport {\n buildStatement,\n signStatement,\n verifyEnvelope,\n generateKeypair,\n serializeEnvelope,\n parseEnvelope,\n type CommitInfo,\n type VerifyResult,\n} from '../engine/attest.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * Attestation actions folded into the graph lifecycle: `vg build --attest` signs\n * the graph it just built; `vg build --verify` checks a committed attestation.\n * The crypto lives in engine/attest.ts; this is the file/key/git glue + output.\n */\n\nconst DEFAULT_ATTESTATION = 'attestation.intoto.jsonl';\nconst DEFAULT_KEY = 'attest-key.pem';\n\nexport interface SignOpts {\n /** Signing key PEM path; else $VG_ATTEST_KEY; else .vibgrate/attest-key.pem (auto-minted). */\n key?: string;\n /** Output path for the attestation (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n}\n\nexport interface SignSummary {\n keyid: string;\n graphDigest: string;\n fingerprint?: string;\n commit?: CommitInfo;\n out: string;\n keyGeneratedAt?: string;\n}\n\n/** Sign an already-built graph, writing a DSSE attestation. Returns a summary +\n * human notices (the caller decides how to render them alongside build output). */\nexport async function signGraphAttestation(\n root: string,\n graph: VgGraph,\n opts: SignOpts,\n): Promise<{ summary: SignSummary; notices: string[] }> {\n const notices: string[] = [];\n const explicitKey = opts.key ?? process.env.VG_ATTEST_KEY;\n const keyPath = explicitKey ? path.resolve(explicitKey) : path.join(root, '.vibgrate', DEFAULT_KEY);\n\n let keyGeneratedAt: string | undefined;\n if (!fs.existsSync(keyPath)) {\n if (explicitKey) {\n throw new CliError(`signing key not found: ${explicitKey}`, ExitCode.USAGE_ERROR);\n }\n // First use with no key: mint one at the default path (loud — it must be kept\n // and gitignored to re-sign reproducibly).\n const kp = generateKeypair();\n fs.mkdirSync(path.dirname(keyPath), { recursive: true });\n fs.writeFileSync(keyPath, kp.privatePem, { mode: 0o600 });\n fs.writeFileSync(`${keyPath}.pub`, kp.publicPem);\n keyGeneratedAt = keyPath;\n notices.push(\n `minted a new Ed25519 signing key at ${rel(root, keyPath)} (keyid ${kp.keyid}) — ` +\n `keep it, add it to .gitignore, and reuse it to re-sign reproducibly`,\n );\n }\n\n let privateKey: crypto.KeyObject;\n try {\n privateKey = crypto.createPrivateKey(fs.readFileSync(keyPath, 'utf8'));\n } catch {\n throw new CliError(`could not read an Ed25519 private key from ${rel(root, keyPath)}`, ExitCode.USAGE_ERROR);\n }\n if (privateKey.asymmetricKeyType !== 'ed25519') {\n throw new CliError(\n `attest requires an Ed25519 key, but ${rel(root, keyPath)} is ${privateKey.asymmetricKeyType ?? 'unknown'}`,\n ExitCode.USAGE_ERROR,\n );\n }\n\n const commit = await gitCommitInfo(root);\n const statement = buildStatement(graph, { commit });\n const envelope = signStatement(statement, privateKey);\n const outPath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, serializeEnvelope(envelope));\n\n return {\n summary: {\n keyid: envelope.signatures[0]?.keyid ?? '',\n graphDigest: statement.predicate.graphDigest,\n fingerprint: statement.predicate.toolchain?.fingerprint,\n commit,\n out: rel(root, outPath),\n keyGeneratedAt: keyGeneratedAt ? rel(root, keyGeneratedAt) : undefined,\n },\n notices,\n };\n}\n\nexport interface VerifyOpts {\n /** Attestation path (default .vibgrate/attestation.intoto.jsonl). */\n attestation?: string;\n /** Public key PEM to pin the signer (else integrity-only verification). */\n pub?: string;\n}\n\nexport interface AttestVerifyOutcome {\n bundlePath: string;\n /** True when no attestation exists at the default path (and none was required). */\n missing: boolean;\n result?: VerifyResult;\n}\n\n/** Verify a committed attestation against the on-disk graph. Returns the outcome\n * (the caller renders + decides the exit code). Throws only when an attestation\n * was explicitly requested but is absent. */\nexport function verifyGraphAttestation(root: string, opts: VerifyOpts): AttestVerifyOutcome {\n const bundlePath = opts.attestation\n ? path.resolve(opts.attestation)\n : path.join(root, '.vibgrate', DEFAULT_ATTESTATION);\n if (!fs.existsSync(bundlePath)) {\n if (opts.attestation || opts.pub) {\n throw new CliError(\n `no attestation at ${rel(root, bundlePath)} — sign one with \\`vg build --attest\\``,\n ExitCode.NOT_FOUND,\n );\n }\n return { bundlePath, missing: true };\n }\n const envelope = parseEnvelope(fs.readFileSync(bundlePath, 'utf8'));\n const publicKeyPem = opts.pub ? fs.readFileSync(path.resolve(opts.pub), 'utf8') : undefined;\n const graph = loadGraph(root) ?? undefined;\n return { bundlePath, missing: false, result: verifyEnvelope(envelope, { publicKeyPem, graph }) };\n}\n\nasync function gitCommitInfo(root: string): Promise<CommitInfo | undefined> {\n const sha = await resolveHead(root);\n if (!sha) return undefined;\n const dirty = await workingTreeDirty(root);\n const branch = await gitBranch(root);\n return { sha, shortSha: sha.slice(0, 7), branch, dirty: dirty === true ? true : dirty === false ? false : undefined };\n}\n\n/** Best-effort current branch name; undefined on detached HEAD or no git. */\nfunction gitBranch(root: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { cwd: root, timeout: 5000, windowsHide: true, encoding: 'utf8' },\n (err, stdout) => {\n if (err) return resolve(undefined);\n const name = String(stdout).trim();\n resolve(name && name !== 'HEAD' ? name : undefined);\n },\n );\n });\n}\n\nfunction rel(root: string, p: string): string {\n const r = path.relative(root, p);\n return r.startsWith('..') ? p : r;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Area, GraphNode, VgGraph } from '../schema.js';\nimport { versionMarker } from './content.js';\n\n/**\n * Per-area generated skills: one SKILL.md per top graph area, so the host\n * assistant can route \"working on X\" tasks straight to that area's entry\n * points without a discovery loop. Content is derived from the ranked graph —\n * entry points, hubs, key files, test posture — under two hard contracts:\n *\n * - DETERMINISTIC: the same graph produces byte-identical skills (no\n * timestamps, everything sorted with explicit tiebreaks), so regeneration\n * on every build causes zero churn.\n * - OWNED NAMESPACE: skills live under `vg-area-<slug>` directories and are\n * the only thing vg creates or deletes there. A file whose version marker\n * was removed is user-owned — never rewritten, never deleted (the same\n * opt-out contract as every other installed instruction file).\n *\n * Generation is gated on the assistant family being installed at all (its\n * `<skills>/vg/SKILL.md` exists): repos that never ran `vg install` get\n * nothing written.\n */\n\nexport const AREA_SKILL_PREFIX = 'vg-area-';\n/** Skill roots that receive per-area skills, per assistant family. */\nconst SKILL_BASES = ['.claude/skills', '.agents/skills'];\n\nconst MAX_AREAS = 8;\nconst MIN_AREA_SIZE = 4;\nconst MAX_ENTRY_POINTS = 6;\nconst MAX_KEY_FILES = 8;\n\nexport function areaSlug(area: Area): string {\n const s = area.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40)\n .replace(/-+$/g, '');\n return s || `area-${area.id}`;\n}\n\nfunction byImportanceDesc(a: GraphNode, b: GraphNode): number {\n return b.importance - a.importance || (a.qualifiedName < b.qualifiedName ? -1 : 1);\n}\n\n/** The areas worth a skill: largest first, deterministic tiebreak on label. */\nexport function topAreas(graph: VgGraph): Area[] {\n return [...graph.areas]\n .filter((a) => a.size >= MIN_AREA_SIZE)\n .sort((a, b) => b.size - a.size || (a.label < b.label ? -1 : 1))\n .slice(0, MAX_AREAS);\n}\n\nfunction renderAreaSkill(graph: VgGraph, area: Area, slug: string): string {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const members = area.members.map((id) => byId.get(id)).filter((n): n is GraphNode => Boolean(n));\n const code = members.filter((n) => n.kind !== 'file');\n\n const fileCounts = new Map<string, number>();\n for (const n of members) fileCounts.set(n.file, (fileCounts.get(n.file) ?? 0) + 1);\n const keyFiles = [...fileCounts.entries()]\n .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1))\n .slice(0, MAX_KEY_FILES);\n\n const entryPoints = [...code].sort(byImportanceDesc).slice(0, MAX_ENTRY_POINTS);\n const hubs = code.filter((n) => n.isHub).sort(byImportanceDesc).slice(0, 4);\n const testable = code.filter((n) => n.tested !== null);\n const tested = testable.filter((n) => n.tested === true);\n\n const lines: string[] = [];\n lines.push('---');\n lines.push(`name: ${AREA_SKILL_PREFIX}${slug}`);\n lines.push(\n `description: Navigate the \"${area.label}\" area of this repo (${area.size} symbols across ${fileCounts.size} files). ` +\n `Use when the task touches ${keyFiles.slice(0, 3).map(([f]) => f).join(', ')}.`,\n );\n lines.push('---');\n lines.push('');\n lines.push(versionMarker());\n lines.push('');\n lines.push(`# Area: ${area.label}`);\n lines.push('');\n lines.push(\n `${area.size} symbols · ${fileCounts.size} files · cohesion ${(area.cohesion * 100).toFixed(0)}% · ` +\n `${area.externalEdges} cross-area edge(s)` +\n (testable.length ? ` · ${tested.length}/${testable.length} analyzable symbols tested` : ''),\n );\n lines.push('');\n lines.push('## Entry points (start here)');\n lines.push('');\n for (const n of entryPoints) {\n lines.push(`- \\`${n.qualifiedName}\\` — ${n.file}:${n.span.start}${n.doc ? ` — ${n.doc.split('\\n')[0]}` : ''}`);\n }\n if (hubs.length) {\n lines.push('');\n lines.push('## Hubs (high blast radius — check impact before changing)');\n lines.push('');\n for (const n of hubs) lines.push(`- \\`${n.qualifiedName}\\` — ${n.file}:${n.span.start}`);\n }\n lines.push('');\n lines.push('## Key files');\n lines.push('');\n for (const [file, count] of keyFiles) lines.push(`- ${file} (${count} symbol${count === 1 ? '' : 's'})`);\n lines.push('');\n lines.push('## How to work here');\n lines.push('');\n lines.push(\n '- Confirm the target with one `search_symbols`/`orient` call against the names above, then edit — the map above usually removes the discovery loop entirely.',\n );\n lines.push('- Before changing a hub, run `impact_of` on it: cross-area edges mean the blast radius leaves this area.');\n lines.push('');\n return lines.join('\\n');\n}\n\n/** All per-area skill files for a graph: relative skill-dir name → content. */\nexport function areaSkillFiles(graph: VgGraph): Map<string, string> {\n const out = new Map<string, string>();\n const used = new Set<string>();\n for (const area of topAreas(graph)) {\n let slug = areaSlug(area);\n // Deterministic de-dup for label collisions (two areas named \"utils\").\n if (used.has(slug)) slug = `${slug}-${area.id}`;\n used.add(slug);\n out.set(`${AREA_SKILL_PREFIX}${slug}`, renderAreaSkill(graph, area, slug));\n }\n return out;\n}\n\nexport interface AreaSkillChanges {\n written: string[];\n removed: string[];\n}\n\n/**\n * Write per-area skills into every installed assistant skill root, and remove\n * stale `vg-area-*` directories from previous graphs. Only files carrying our\n * version marker are ever rewritten or removed — marker-less files are\n * user-owned and left untouched (including their directory).\n */\nexport function writeAreaSkills(root: string, graph: VgGraph): AreaSkillChanges {\n const changes: AreaSkillChanges = { written: [], removed: [] };\n const files = areaSkillFiles(graph);\n for (const base of SKILL_BASES) {\n // Gate: this assistant family is installed here at all.\n if (!fs.existsSync(path.join(root, base, 'vg', 'SKILL.md'))) continue;\n const baseDir = path.join(root, base);\n // Remove stale generated areas (ours only — marker required).\n let existing: string[] = [];\n try {\n existing = fs.readdirSync(baseDir).filter((d) => d.startsWith(AREA_SKILL_PREFIX));\n } catch {\n existing = [];\n }\n for (const dir of existing) {\n if (files.has(dir)) continue;\n const skillFile = path.join(baseDir, dir, 'SKILL.md');\n try {\n const text = fs.readFileSync(skillFile, 'utf8');\n if (!/<!--\\s*vg:v\\d+\\b/.test(text)) continue; // user took ownership\n fs.rmSync(path.join(baseDir, dir), { recursive: true, force: true });\n changes.removed.push(path.join(base, dir));\n } catch {\n /* unreadable/missing — leave the directory alone */\n }\n }\n // Write current areas (skip user-owned files; skip unchanged content).\n for (const [dir, content] of files) {\n const skillFile = path.join(baseDir, dir, 'SKILL.md');\n try {\n const current = fs.existsSync(skillFile) ? fs.readFileSync(skillFile, 'utf8') : null;\n if (current !== null && !/<!--\\s*vg:v\\d+\\b/.test(current)) continue; // user took ownership\n if (current === content) continue; // deterministic content — no churn\n fs.mkdirSync(path.dirname(skillFile), { recursive: true });\n fs.writeFileSync(skillFile, content);\n changes.written.push(path.join(base, dir, 'SKILL.md'));\n } catch {\n /* unwritable — skip, never fail the build over a skill file */\n }\n }\n }\n return changes;\n}\n","import { c } from './output.js';\nimport { brandProgressBar } from '../core-open/ui/bar.js';\n\n/**\n * A small progress bar matching the scanner's style\n * (`vibgrate-core-open/src/ui/progress.ts`): a smooth sub-cell gradient bar\n * (shared `brandProgressBar`), a braille spinner, percent, elapsed and ETA.\n * Renders to **stderr** in place, and only when stderr is a TTY — under a\n * pipe/CI it stays silent so logs aren't polluted.\n */\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst WIDTH = 30;\n\nfunction fmtDuration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n return `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;\n}\n\n/**\n * Pure render of one progress line (no I/O, no clock) so it is unit-testable.\n * `elapsedMs` and `frame` are passed in by the caller.\n */\nexport function formatProgressLine(\n label: string,\n done: number,\n total: number,\n elapsedMs: number,\n frame: number,\n): string {\n const ratio = total > 0 ? Math.min(done / total, 1) : 0;\n const bar = brandProgressBar(ratio, WIDTH);\n const pct = Math.round(ratio * 100);\n const spin = c.cyan(FRAMES[((frame % FRAMES.length) + FRAMES.length) % FRAMES.length]);\n const eta = ratio > 0.02 && ratio < 1 ? ` · eta ${fmtDuration((elapsedMs / ratio) * (1 - ratio))}` : '';\n return ` ${spin} ${label} ${bar} ${c.bold(`${pct}%`)} ${c.dim(`${done}/${total} · ${fmtDuration(elapsedMs)}${eta}`)}`;\n}\n\n/** Live, in-place progress bar on stderr (no-op when stderr isn't a TTY). */\nexport class ProgressBar {\n private readonly start = Date.now();\n private frame = 0;\n private readonly tty = Boolean(process.stderr.isTTY);\n\n constructor(private readonly label: string) {}\n\n update(done: number, total: number): void {\n if (!this.tty) return;\n const line = formatProgressLine(this.label, done, total, Date.now() - this.start, this.frame++);\n process.stderr.write(`\\r\\x1b[2K${line}`);\n }\n\n /** Clear the bar; optionally print a final summary line. */\n done(summary?: string): void {\n if (!this.tty) return;\n process.stderr.write('\\r\\x1b[2K');\n if (summary) process.stderr.write(`${summary}\\n`);\n }\n}\n","import type { Command } from 'commander';\n\n/** Global flags shared across all `vg` commands (VG-CLI-SPEC §1.1). */\nexport interface GlobalOpts {\n /** -C, --cwd <dir> */\n cwd?: string;\n /** --deep */\n deep?: boolean;\n /** --json */\n json?: boolean;\n /** --generated-at <iso> */\n generatedAt?: string;\n /** --graph <file> (override the map path) */\n graph?: string;\n /** --no-cache (commander exposes this as `cache: false`) */\n noCache?: boolean;\n /** --local (never touch the network) */\n local?: boolean;\n /** --quiet */\n quiet?: boolean;\n /**\n * --client <name> — the AI on the other end (e.g. `claude`, `cursor`). When an\n * AI host runs `vg`, passing this lets navigation calls be counted in the local\n * savings ledger with the command-vs-MCP split, so `vg savings` and the opt-in\n * share-stats upload can attribute usage. Counts only; a coarse label, not\n * identity (sanitized before it's recorded). Absent for human-run commands.\n */\n client?: string;\n}\n\n/**\n * Attach the global flags to a command. They live on every subcommand (rather\n * than only the program) so the \"simple as Google\" dispatch can put the command\n * token first and let flags appear in any order after it.\n */\nexport function applyGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-C, --cwd <dir>', 'run as if started in <dir>', '.')\n .option('--deep', 'do more: precise resolution, all edges, semantic links')\n .option('--json', 'machine-readable JSON on stdout')\n .option('--generated-at <iso>', 'pin the artifact timestamp for byte-deterministic output')\n .option('--graph <file>', 'override the map path')\n .option('--no-cache', 'full rebuild (ignore the incremental cache)')\n .option('--local', 'never touch the network (lexical-only semantic)')\n .option('--quiet', 'suppress progress output')\n .option('--client <name>', 'identify the AI client (e.g. claude) so navigation calls are counted in vg savings')\n .option('--no-color', 'disable colored output');\n}\n\n/** Read the global subset from a command's parsed options. */\nexport function readGlobal(cmd: Command): GlobalOpts {\n // `optsWithGlobals()`, not `opts()`: a global flag (e.g. `--json`) declared on\n // both a command and its parent binds to the parent in commander, so a nested\n // subcommand (`vg models uninstall … --json`) would otherwise never see it.\n const o = cmd.optsWithGlobals() as Record<string, unknown>;\n return {\n cwd: o.cwd as string | undefined,\n deep: o.deep as boolean | undefined,\n json: o.json as boolean | undefined,\n generatedAt: o.generatedAt as string | undefined,\n graph: o.graph as string | undefined,\n noCache: o.cache === false,\n local: o.local as boolean | undefined,\n quiet: o.quiet as boolean | undefined,\n client: o.client as string | undefined,\n };\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { buildGraph } from '../engine/build.js';\nimport { verifyDeterminism } from '../engine/verify.js';\nimport { epistemicBreakdown } from '../engine/epistemic.js';\nimport { signGraphAttestation, verifyGraphAttestation, type SignSummary } from './attest-actions.js';\nimport { isModelReady, countPending, resolveEmbedModel } from '../engine/embeddings.js';\nimport type { VgGraph } from '../schema.js';\nimport { writeArtifacts } from '../engine/artifacts.js';\nimport { writeSnapshot } from '../engine/freshness.js';\nimport { refreshInstalledInstructions, SMALL_REPO_FILES } from '../install/registry.js';\nimport { writeAreaSkills } from '../install/area-skills.js';\nimport { serializeGraph } from '../engine/serialize.js';\nimport { renderReport } from '../engine/report.js';\nimport { renderHtml } from '../engine/html.js';\nimport { UsageError } from '../engine/discover.js';\nimport { ResourceLimitError } from '../engine/limits.js';\nimport { CliError, ExitCode, usageError } from '../util/exit.js';\nimport { c, info, out, json } from '../util/output.js';\nimport { printLogo } from '../util/logo.js';\nimport { ProgressBar } from '../util/progress.js';\nimport { applyGlobalOptions, readGlobal, type GlobalOpts } from '../cli-options.js';\n\ninterface BuildCmdOpts {\n only?: string;\n exclude?: string[];\n html?: boolean;\n report?: boolean;\n ground?: boolean;\n jobs?: string;\n scip?: string | boolean;\n tsc?: boolean;\n export?: string;\n warm?: boolean;\n grammars?: string;\n fast?: boolean;\n index?: boolean;\n analysisTier?: string;\n attest?: boolean;\n verify?: boolean;\n attestKey?: string;\n attestation?: string;\n pub?: string;\n}\n\nexport function registerBuild(program: Command): void {\n const cmd = program\n .command('build')\n .description('build / update the code map (incremental, deterministic)')\n .argument('[paths...]', 'folders or files to map (default: current folder)')\n .option('--only <langs>', 'restrict to languages, e.g. ts,py,go')\n .option('--exclude <glob>', 'extra ignore glob (repeatable)', collect, [])\n .option('--no-html', 'do not write graph.html')\n .option('--no-report', 'do not write GRAPH_REPORT.md')\n .option('--no-ground', 'do not attach grounding (Phase 2)')\n .option('--jobs <n>', 'worker count (1 = single-threaded)')\n .option('--scip <file>', 'ingest a SCIP index for precise resolution (default: auto-detect index.scip)')\n .option('--no-scip', 'ignore any SCIP index')\n .option('--no-tsc', 'skip the in-process TypeScript resolver (heuristic floor only)')\n .option('--fast', 'skip precise tsc resolve (heuristic only — faster XL cold builds)')\n .option('--no-index', 'do not write the SQLite serve index under .vibgrate/cache/')\n .option('--analysis-tier <tier>', 'force analysis tier: full | large | xl (default: auto)')\n .option('--no-warm', 'do not warm the semantic index in the background after building')\n .option('--grammars <dir>', 'directory of grammar .wasm files (offline / air-gapped)')\n .option('-o, --export <file>', 'also write the map to a file (format inferred)')\n .option('--attest', 'sign the built graph → .vibgrate/attestation.intoto.jsonl')\n .option('--verify', 'verify a committed attestation against the graph (no rebuild)')\n .option('--attest-key <path>', 'signing key PEM (else $VG_ATTEST_KEY, else .vibgrate/attest-key.pem)')\n .option('--attestation <file>', 'attestation path (out for --attest, in for --verify)')\n .option('--pub <path>', 'public key PEM to pin the signer (with --verify)')\n .action(async function (this: Command, paths: string[], opts: BuildCmdOpts) {\n await runBuild(paths, opts, readGlobal(this));\n });\n applyGlobalOptions(cmd);\n}\n\nexport interface RunBuildHooks {\n /** Invoked during the parse phase (even under --quiet / non-TTY hosts). */\n onParseProgress?: (done: number, total: number) => void;\n}\n\nexport async function runBuild(\n paths: string[],\n opts: BuildCmdOpts,\n global: GlobalOpts,\n hooks?: RunBuildHooks,\n): Promise<void> {\n const root = path.resolve(global.cwd ?? '.');\n\n // `vg build --verify`: the single verification entry point — determinism\n // self-check plus (if present) attestation verification.\n if (opts.verify) {\n await verifyGraph(root, opts, global);\n return;\n }\n\n // Brand banner + live parse progress for an interactive human while the index\n // builds (TTY only; both are no-ops under --json/--quiet/pipe so machine output\n // stays clean). Hosts can still receive progress via hooks.onParseProgress.\n const interactive = !global.json && !global.quiet;\n if (interactive) printLogo(path.basename(root) || root);\n const bar = interactive ? new ProgressBar(c.dim('parsing')) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n if (jobs !== undefined && (!Number.isInteger(jobs) || jobs < 1)) {\n throw usageError(`--jobs must be a positive integer (got \"${opts.jobs}\")`);\n }\n\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const tierRaw = opts.analysisTier?.toLowerCase();\n const analysisTier =\n tierRaw === 'full' || tierRaw === 'large' || tierRaw === 'xl' ? tierRaw : undefined;\n if (opts.analysisTier && !analysisTier) {\n throw usageError(`--analysis-tier must be full, large, or xl (got \"${opts.analysisTier}\")`);\n }\n let result;\n try {\n result = await buildGraph({\n root,\n paths: paths.length ? paths : undefined,\n only,\n exclude: opts.exclude,\n jobs,\n noCache: global.noCache,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n fast: opts.fast === true,\n noIndex: opts.index === false,\n analysisTier,\n generatedAt: global.generatedAt,\n onParseProgress: (done, total) => {\n bar?.update(done, total);\n hooks?.onParseProgress?.(done, total);\n },\n grammarsDir: opts.grammars,\n });\n } catch (err) {\n bar?.done();\n if (err instanceof UsageError) throw usageError(err.message);\n // A resource safeguard fired (file-count cap, heap budget, worker OOM) —\n // the message already carries the remedy; surface it without a stack.\n if (err instanceof ResourceLimitError) throw new CliError(err.message, ExitCode.ERROR);\n throw err;\n }\n bar?.done();\n\n const written = writeArtifacts(result.graph, {\n root,\n html: opts.html,\n report: opts.report,\n graphPath: global.graph,\n });\n\n // Record the freshness snapshot (stat+hash per corpus file, plus this build's\n // scope) so `vg serve`/`vg ask` can auto-refresh the map when the tree drifts.\n // Skipped for a custom --graph target: that is an explicit artifact the\n // auto-refresh machinery must not manage.\n if (!global.graph) {\n writeSnapshot(root, result.graph.provenance.corpusHash, result.fileStats, {\n only,\n exclude: opts.exclude,\n paths: paths.length ? paths : undefined,\n deep: global.deep,\n noGround: opts.ground === false,\n scip: typeof opts.scip === 'string' ? opts.scip : undefined,\n noScip: opts.scip === false,\n noTsc: opts.tsc === false,\n grammarsDir: opts.grammars,\n });\n }\n\n if (opts.export) writeExport(result.graph, opts.export);\n\n // Bring previously-installed assistant instructions (skill/nudge files from\n // `vg install`) up to the current content version — so evolved instructions\n // reach this repo the first time a new CLI builds here. Only files carrying\n // vg's own version marker (or the exact legacy generated content) are\n // touched; a custom --graph build is an explicit artifact and skips this.\n if (!global.graph) {\n const fileCount = result.graph.nodes.filter((n) => n.kind === 'file').length;\n const refreshed = refreshInstalledInstructions(root, fileCount > 0 && fileCount < SMALL_REPO_FILES);\n if (interactive) {\n for (const r of refreshed) {\n info(c.dim(`vg · refreshed assistant instructions ${r.file} (v${r.from} → v${r.to})`));\n }\n }\n // Per-area skills, regenerated from the fresh graph on every build.\n // Deterministic content → zero churn when the graph didn't change; only\n // repos that ran `vg install` (skill root present) receive anything.\n const areaChanges = writeAreaSkills(root, result.graph);\n if (interactive && (areaChanges.written.length || areaChanges.removed.length)) {\n const parts = [\n areaChanges.written.length ? `${areaChanges.written.length} area skill(s) updated` : '',\n areaChanges.removed.length ? `${areaChanges.removed.length} stale removed` : '',\n ].filter(Boolean);\n info(c.dim(`vg · ${parts.join(', ')}`));\n }\n }\n\n // `--attest`: sign the freshly-built graph → .vibgrate/attestation.intoto.jsonl.\n let attestation: SignSummary | undefined;\n const attestNotices: string[] = [];\n if (opts.attest) {\n const signed = await signGraphAttestation(root, result.graph, {\n key: opts.attestKey,\n attestation: opts.attestation,\n });\n attestation = signed.summary;\n attestNotices.push(...signed.notices);\n }\n\n if (global.json) {\n json({\n ok: true,\n counts: result.graph.meta.counts,\n languages: result.graph.meta.languages,\n reparsed: result.reparsed,\n reused: result.reused,\n totalFiles: result.totalFiles,\n resolve: result.resolveStats,\n tsc: result.tsc,\n scip: result.scip,\n epistemic: epistemicBreakdown(result.graph.edges),\n artifacts: written,\n corpusHash: result.graph.provenance.corpusHash,\n toolchain: result.graph.provenance.toolchain,\n attestation,\n timingMs: result.timing.totalMs,\n warnings: result.warnings,\n });\n return;\n }\n\n const { counts } = result.graph.meta;\n const incremental =\n result.reused > 0\n ? `incremental: ${result.reparsed} of ${result.totalFiles} files re-parsed`\n : `${result.totalFiles} files parsed`;\n const seconds = (result.timing.totalMs / 1000).toFixed(2);\n info(`${c.cyan('vg')} · mapped ${rel(root)} in ${seconds}s (${incremental})`);\n info(\n ` nodes ${c.bold(String(counts.nodes))} edges ${c.bold(String(counts.edges))} ` +\n `areas ${counts.areas} langs ${result.graph.meta.languages.join(',') || '—'}`,\n );\n const callPct =\n result.resolveStats.callsResolved + result.resolveStats.callsUnresolved > 0\n ? Math.round(\n (100 * result.resolveStats.callsResolved) /\n (result.resolveStats.callsResolved + result.resolveStats.callsUnresolved),\n )\n : 100;\n // When a precise rung ran it is authoritative; callPct is only the heuristic\n // floor (label it so, to avoid understating the precise result below).\n const precise = result.tsc || result.scip;\n const callLabel = precise ? `heuristic floor ${callPct}%` : `calls resolved ${callPct}%`;\n info(c.dim(` ${callLabel} · resolver ${result.graph.provenance.resolver.join(',')}`));\n if (result.tsc) {\n const jsx = result.tsc.jsx > 0 ? `, ${result.tsc.jsx} JSX` : '';\n info(c.dim(` tsc: ${result.tsc.resolved} precise edges across ${result.tsc.files} TS/JS files (${result.tsc.calls} calls${jsx})`));\n }\n if (result.scip) {\n info(c.dim(` scip: ${result.scip.resolved} precise edges from ${result.scip.tool ?? 'index'} (${result.scip.documents} docs)`));\n }\n const ep = epistemicBreakdown(result.graph.edges);\n info(\n c.dim(\n ` edges by evidence · observed ${ep.observed} · name-matched ${ep['name-matched']} · declared ${ep.declared}`,\n ),\n );\n const artifactList = [written.graphPath, written.htmlPath, written.reportPath]\n .filter(Boolean)\n .map((p) => path.relative(root, p as string))\n .join(' ');\n info(` → ${artifactList}`);\n if (result.warnings.length) {\n info(c.yellow(` ${result.warnings.length} parse warning(s) — run with --json for detail`));\n }\n if (attestation) {\n for (const n of attestNotices) info(c.yellow(` ${n}`));\n info(\n c.dim(\n ` attested · keyid ${attestation.keyid} · digest ${attestation.graphDigest.slice(0, 16)}… → ${attestation.out}`,\n ),\n );\n }\n\n maybeWarmEmbeddings(root, result.graph, global, opts.warm !== false);\n}\n\n/**\n * `vg build --verify` — the single verification entry point. Runs the determinism\n * self-check (byte-identical rebuilds + toolchain fingerprint) and, when an\n * attestation is present, verifies it against the on-disk graph. Exit 4 on a\n * determinism failure, exit 2 on an attestation failure.\n */\nasync function verifyGraph(root: string, opts: BuildCmdOpts, global: GlobalOpts): Promise<void> {\n const only = opts.only ? opts.only.split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const jobs = opts.jobs ? Number(opts.jobs) : undefined;\n const det = await verifyDeterminism({ root, only, exclude: opts.exclude, jobs });\n const attest = verifyGraphAttestation(root, { attestation: opts.attestation, pub: opts.pub });\n const attestFailed = !attest.missing && attest.result?.status === 'failed';\n\n if (global.json) {\n json({\n ok: det.ok && !attestFailed,\n determinism: { ok: det.ok, checks: det.checks, digest: det.digest },\n attestation: attest.missing\n ? null\n : {\n status: attest.result?.status,\n signatureValid: attest.result?.signatureValid,\n signerPinned: attest.result?.signerPinned,\n digestMatches: attest.result?.digestMatches,\n dirty: attest.result?.dirty,\n keyid: attest.result?.keyid,\n reason: attest.result?.reason,\n },\n });\n } else {\n info(`${c.cyan('vg build --verify')} · ${path.relative(process.cwd(), root) || '.'}`);\n for (const check of det.checks) {\n const mark = check.ok ? c.green('✔') : c.red('✘');\n const detail = check.detail ? c.dim(` (${check.detail})`) : '';\n info(` ${mark} ${check.name}${detail}`);\n }\n info(det.ok ? c.green(` deterministic · digest ${det.digest.slice(0, 16)}…`) : c.red(' NON-DETERMINISTIC'));\n if (attest.missing) {\n info(c.dim(` attestation: none (sign one with \\`vg build --attest\\`)`));\n } else {\n const r = attest.result;\n const badge =\n r?.status === 'verified'\n ? c.green('✔ attestation verified')\n : r?.status === 'signature-valid'\n ? c.yellow('~ attestation signature valid')\n : c.red('✘ attestation failed');\n info(` ${badge}${r?.keyid ? c.dim(` · keyid ${r.keyid}`) : ''}`);\n info(c.dim(` ${r?.reason ?? ''}`));\n }\n }\n\n if (!det.ok) throw new CliError('determinism self-check failed', ExitCode.NON_DETERMINISTIC);\n if (attestFailed) throw new CliError('attestation verification failed', ExitCode.GATE_FAILED);\n}\n\n/**\n * After an interactive build we have just committed to a code graph, so the\n * user is likely to run `vg ask`/`vg serve` next — start warming the semantic\n * index in the background now so that first semantic call is instant instead of\n * paying a cold model load. If the model isn't downloaded yet, the background\n * warm fetches it (once, centrally) rather than deferring the whole cost to the\n * first `ask`. Disabled with `--no-warm`; skipped under --json/--quiet/--local\n * and when not at a TTY (so CI never auto-downloads). The detached child runs\n * `vg embed --bg [--download]`; a lock prevents it racing a foreground `ask`.\n */\nfunction maybeWarmEmbeddings(root: string, graph: VgGraph, global: GlobalOpts, warm: boolean): void {\n if (!warm || global.json || global.quiet || global.local) return;\n if (!process.stdout.isTTY && !process.stderr.isTTY) return;\n const cli = process.argv[1];\n if (!cli) return;\n const modelId = resolveEmbedModel();\n const ready = isModelReady(modelId);\n // Already fully warm: model present and every node embedded → nothing to do.\n if (ready && countPending(graph, root, modelId) === 0) return;\n // When the model isn't on this machine yet, start the one-time download now\n // (the graph is built; the next semantic call shouldn't wait for it).\n const args = ready\n ? [cli, 'embed', '-C', root, '--bg']\n : [cli, 'embed', '-C', root, '--bg', '--download'];\n try {\n const child = spawn(process.execPath, args, { detached: true, stdio: 'ignore' });\n child.unref();\n info(\n c.dim(\n ready\n ? ' warming the semantic index in the background — `vg ask` will be instant'\n : ' downloading the semantic model in the background (once) — `vg ask`/`vg serve` will be instant; disable with --no-warm',\n ),\n );\n } catch {\n /* warm-up is best-effort */\n }\n}\n\nfunction writeExport(graph: Parameters<typeof serializeGraph>[0], target: string): void {\n if (target === '-') {\n out(serializeGraph(graph).trimEnd());\n return;\n }\n const ext = path.extname(target).toLowerCase();\n let content: string;\n switch (ext) {\n case '.json':\n content = serializeGraph(graph);\n break;\n case '.md':\n content = renderReport(graph);\n break;\n case '.html':\n content = renderHtml(graph);\n break;\n default:\n throw new CliError(\n `cannot export to \"${ext || target}\" yet — supported in Phase 0: .json, .md, .html, \"-\" (stdout). ` +\n `More formats (graphml, dot, cypher) arrive with \\`vg export\\` in Phase 1.`,\n ExitCode.USAGE_ERROR,\n );\n }\n fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });\n fs.writeFileSync(target, content);\n}\n\nfunction collect(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nfunction rel(root: string): string {\n const r = path.relative(process.cwd(), root);\n return r === '' ? '.' : r;\n}\n"]}
|