@wrongstack/plug-lsp 0.9.20 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { TOKENS, buildChildEnv, atomicWrite } from '@wrongstack/core';
|
|
|
5
5
|
import { pathToFileURL, fileURLToPath } from 'url';
|
|
6
6
|
import { EventEmitter } from 'events';
|
|
7
7
|
import * as fs3 from 'fs';
|
|
8
|
-
import { IndexStore, buildIndexableText, buildBm25Index, tokenise, internalKindToLspKind, lspKindToInternalKind } from '@wrongstack/tools/codebase-index/index';
|
|
8
|
+
import { codebaseIndexDirOverride, IndexStore, buildIndexableText, buildBm25Index, tokenise, internalKindToLspKind, lspKindToInternalKind } from '@wrongstack/tools/codebase-index/index';
|
|
9
9
|
|
|
10
10
|
// src/presets.ts
|
|
11
11
|
var PRESETS = {
|
|
@@ -1556,7 +1556,12 @@ function createCodebaseLspSearchTool(deps) {
|
|
|
1556
1556
|
let lspResults = [];
|
|
1557
1557
|
let totalLsp = 0;
|
|
1558
1558
|
if (!input.preferLsp) {
|
|
1559
|
-
const indexOutcome = await searchIndex(
|
|
1559
|
+
const indexOutcome = await searchIndex(
|
|
1560
|
+
ctx.projectRoot,
|
|
1561
|
+
query,
|
|
1562
|
+
limit,
|
|
1563
|
+
codebaseIndexDirOverride(ctx)
|
|
1564
|
+
);
|
|
1560
1565
|
indexResults = indexOutcome.results;
|
|
1561
1566
|
totalIndex = indexOutcome.total;
|
|
1562
1567
|
usedIndex = true;
|
|
@@ -1584,8 +1589,8 @@ function createCodebaseLspSearchTool(deps) {
|
|
|
1584
1589
|
}
|
|
1585
1590
|
};
|
|
1586
1591
|
}
|
|
1587
|
-
async function searchIndex(projectRoot, query, limit) {
|
|
1588
|
-
const store = new IndexStore(projectRoot);
|
|
1592
|
+
async function searchIndex(projectRoot, query, limit, indexDir) {
|
|
1593
|
+
const store = new IndexStore(projectRoot, { indexDir });
|
|
1589
1594
|
try {
|
|
1590
1595
|
const candidates = store.search(query);
|
|
1591
1596
|
if (candidates.length === 0) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets.ts","../src/utils/command-resolver.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/index.ts","../src/formatters/workspace-edit.ts","../src/position.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/workspace-edit.ts","../src/tools/code-actions.ts","../src/constants.ts","../src/formatters/symbols.ts","../src/tools/codebase-lsp-search.ts","../src/formatters/location.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/hover.ts","../src/tools/hover.ts","../src/tools/references.ts","../src/tools/rename.ts","../src/tools/symbols.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","path2","path3","path4","spawn","buildChildEnv","pathToFileURL","path5","path6","fs4","path7","fs5","fs6","path","c"],"mappings":";;;;;;;;;;AAEO,IAAM,OAAA,GAAwC;AAAA,EACnD,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,4BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,YAAA,EAAc,iBAAA,EAAmB,cAAc,iBAAiB,CAAA;AAAA,IAC5E,YAAA,EAAc,CAAC,eAAA,EAAiB,eAAA,EAAiB,cAAc,CAAA;AAAA,IAC/D,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,IAAI,CAAA;AAAA,IAChB,YAAA,EAAc,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,IAClC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,oBAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,IACpB,YAAA,EAAc,CAAC,gBAAA,EAAkB,oBAAA,EAAsB,YAAY,kBAAkB,CAAA;AAAA,IACrF,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,6BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,6BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,4BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,sBAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,IACrC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,sBAAA;AAAA,IACT,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,aAAa,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,IACrC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,SAAA,EAAW,eAAe,CAAA;AAAA,IACzC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA;AAEb,CAAA;AC5EA,eAAsB,oBAAA,CAAqB,SAAiB,GAAA,EAAqC;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAChD,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,OAAQ,MAAM,mBAAA,CAAoB,OAAO,CAAA,GAAK,OAAA,GAAU,IAAA;AAC1D;AAEA,eAAsB,eAAA,CAAgB,KAAa,OAAA,EAAyC;AAC1F,EAAA,IAAS,IAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG,OAAQ,MAAM,WAAW,OAAO,CAAA,GAAU,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAC7F,EAAA,IAAI,GAAA,GAAW,aAAQ,GAAG,CAAA;AAC1B,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAc,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAA,EAAgB,MAAM,CAAA;AACpD,IAAA,KAAA,MAAW,SAAA,IAAa,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAClD,MAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AACxC,MAAA,IAAI,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,IACrC;AACA,IAAA,MAAM,MAAA,GAAc,aAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACF;AAEA,eAAsB,oBAAoB,OAAA,EAAmC;AAC3E,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,WAAA,GAAc,IAAA;AAC3D,EAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,CAAC,KAAA,EAAO,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AACxF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,aAAA,EAAc,EAAG,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,CAAA;AAC7F,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,MAAMA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AACtC,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAASA,QAAAA,CAAQ,IAAA,KAAS,CAAC,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAA2B;AAEpD,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,CAAC,OAAO,CAAA;AACjD,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,WAAA,EAAY;AAC9C,EAAA,IAAI,GAAA,EAAK,OAAO,CAAC,OAAO,CAAA;AACxB,EAAA,OAAO,CAAC,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AACzF;AAEA,eAAe,WAAW,QAAA,EAAoC;AAC5D,EAAA,IAAI;AACF,IAAA,MAASC,WAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAAuB;AAEzC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;;;ACrDA,eAAsB,mBAAA,CACpB,WAAA,EACA,GAAA,GAAM,OAAA,CAAQ,KAAI,EACqB;AACvC,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,WAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjD,IAAA,IAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACf,IAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,GAAA,CAAI,SAAS,GAAG,CAAA;AAC3D,IAAA,IAAI,SAAS,GAAA,CAAI,IAAI,IAAI,EAAE,GAAG,KAAK,OAAA,EAAQ;AAAA,EAC7C;AACA,EAAA,OAAO,GAAA;AACT;ACXO,IAAM,WAAA,GAAc,sBAAA;AAEpB,IAAM,cAAA,GAAiD;AAAA,EAC5D,SAAA,EAAW,MAAA;AAAA,EACX,oBAAA,EAAsB,YAAA;AAAA,EACtB,iBAAA,EAAmB,IAAA;AAAA,EACnB,cAAA,EAAgB,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,EACnC,qBAAA,EAAuB,CAAA;AAAA,EACvB,mBAAA,EAAqB,EAAA;AAAA,EACrB,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEO,IAAM,mBAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,IAC9D,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,YAAA,EAAc,QAAQ,CAAA,EAAE;AAAA,IACvE,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACrC,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAE,KACtE;AAAA,IACA,qBAAA,EAAuB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACzC,mBAAA,EAAqB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACvC,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA;AAAU;AAEvC,CAAA;AAEO,SAAS,kBAAkB,GAAA,EAA+B;AAC/D,EAAA,MAAM,SAAA,GAAY,oBAAoB,GAAG,CAAA;AACzC,EAAA,MAAM,MAAM,SAAA,IAAa,GAAA,CAAI,OAAO,UAAA,GAAa,WAAW,KAAK,EAAC;AAClE,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEO,SAAS,YAAY,GAAA,EAAuD;AACjF,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,GAC7C,GAAA,CAAI,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA,GACxC,cAAA,CAAe,cAAA;AAEnB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,CAAC,QAAQ,OAAA,EAAS,OAAO,CAAA,EAAG,cAAA,CAAe,SAAS,CAAA;AAAA,IACpF,oBAAA,EAAsB,KAAA;AAAA,MACpB,GAAA,CAAI,oBAAA;AAAA,MACJ,CAAC,cAAc,QAAQ,CAAA;AAAA,MACvB,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,iBAAA,EAAmB,WAAA,CAAY,GAAA,CAAI,iBAAA,EAAmB,eAAe,iBAAiB,CAAA;AAAA,IACtF,cAAA,EAAgB,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,WAAW,cAAA,CAAe,cAAA;AAAA,IAChE,qBAAA,EAAuB,WAAA;AAAA,MACrB,GAAA,CAAI,qBAAA;AAAA,MACJ,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,mBAAA,EAAqB,WAAA,CAAY,GAAA,CAAI,mBAAA,EAAqB,eAAe,mBAAmB,CAAA;AAAA,IAC5F,cACE,OAAO,GAAA,CAAI,iBAAiB,SAAA,GAAY,GAAA,CAAI,eAAe,cAAA,CAAe,YAAA;AAAA,IAC5E,iBACE,OAAO,GAAA,CAAI,oBAAoB,SAAA,GAC3B,GAAA,CAAI,kBACJ,cAAA,CAAe;AAAA,GACvB;AACF;AAEA,SAAS,oBAAoB,GAAA,EAA+D;AAC1F,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,CAAU,IAAI,MAAA,CAAO,WAAW,GAAG,OAAO,MAAA;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,SAAA,CAAU,OAAA,CAAQ,OAAO,WAAW,CAAA,CAAE,aAAa,WAAW,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,KAAA,EAA8C;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,SAAU,EAAC;AAC9B,EAAA,MAAM,MAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AACpB,IAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACrC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACrF,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,MAC1B,GAAA,EAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAAA,MACzB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAA,EAAc,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA;AAAA,MAC1C,uBAAuB,GAAA,CAAI,qBAAA;AAAA,MAC3B,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,gBAAA,EAAkB,WAAA,CAAY,GAAA,CAAI,gBAAA,EAAkB,IAAM,CAAA;AAAA,MAC1D,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,SAAA,GAAY,IAAI,OAAA,GAAU;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAUA,SAAS,KAAA,CAAwB,KAAA,EAAgB,OAAA,EAAuB,QAAA,EAAgB;AACtF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,QAAQ,QAAA,CAAS,KAAU,IAAK,KAAA,GAAc,QAAA;AACpF;AAEA,SAAS,WAAA,CAAY,OAAgB,QAAA,EAA0B;AAC7D,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,UAAU,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,QAAA;AACrF;AAEA,SAAS,YAAY,KAAA,EAAsC;AACzD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,GAAI,KAAA,GAAQ,MAAA;AACrF;AAEA,SAAS,aAAa,KAAA,EAAoD;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OAAO,UAAU,OAAA,IAAW,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,UAAU,KAAA,KAAU,MAAA;AACnF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;ACzIO,IAAM,YAAA,GAAiD;AAAA,EAC5D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,OAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,aAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAAiD;AAAA,EACrD,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU,UAAA;AAAA,EACV,gBAAA,EAAkB,OAAA;AAAA,EAClB,eAAA,EAAiB,MAAA;AAAA,EACjB,cAAA,EAAgB;AAClB,CAAA;AAEO,SAAS,cAAc,QAAA,EAAiC;AAC7D,EAAA,MAAM,IAAA,GAAYC,cAAS,QAAQ,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAO,OAAO,KAAA;AAElB,EAAA,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,KAAK,QAAA,CAAS,UAAU,GAAG,OAAO,YAAA;AACnE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,WAAW,GAAG,OAAO,iBAAA;AACrE,EAAA,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,KAAK,QAAA,CAAS,UAAU,GAAG,OAAO,YAAA;AACnE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,WAAW,GAAG,OAAO,iBAAA;AAErE,EAAA,OAAO,YAAA,CAAkBA,IAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,IAAK,IAAA;AAC7C;ACrDO,SAAS,UAAU,QAAA,EAA0B;AAClD,EAAA,OAAO,aAAA,CAAmBC,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAA,EAAS;AACxD;AAEO,SAAS,UAAU,GAAA,EAAqB;AAC7C,EAAA,OAAO,cAAc,GAAG,CAAA;AAC1B;AAEO,SAAS,WAAA,CAAY,UAAkB,GAAA,EAAqB;AACjE,EAAA,MAAM,GAAA,GAAWA,IAAA,CAAA,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AACvC,EAAA,OAAO,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,CAAMA,IAAA,CAAA,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI,QAAA;AAC3F;;;ACJO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,WAAA,CACmB,QAAA,EACA,GAAA,EACjB,GAAA,EACiB,MAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EANmB,QAAA;AAAA,EACA,GAAA;AAAA,EAEA,MAAA;AAAA,EAPF,IAAA,uBAAW,GAAA,EAA6B;AAAA,EACjD,GAAA;AAAA,EAWR,OAAO,GAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAiD;AACxE,IAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACf,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AAC9E,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA,EAAQ,MAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,SAC7C,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,YAAY,QAAA,EAAiC;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAS,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,OAAO,IAAI,GAAG,CAAA;AACxE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,OAAA,EAAA;AACJ,IAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAE3C,MAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,CAAC,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/E,MAAA,MAAA,CAAO,eAAA,CAAgB,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ,EAAG,IAAI,CAAA;AACnE,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,QAAA,EAAkB,SAAA,EAAmC;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,IAAA,GAAO,SAAA,IAAc,MAAS,GAAA,CAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAC5D,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAE/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM;AAAA,QACJ,GAAA,EAAK,UAAU,OAAO,CAAA;AAAA,QACtB,IAAA,EAAM,OAAA;AAAA,QACN,UAAA;AAAA,QACA,OAAA,EAAS,CAAA;AAAA,QACT,IAAA;AAAA,QACA,WAAA,sBAAiB,GAAA;AAAI,OACvB;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,qBAAA,EAAuB,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,YAAY,CAAA;AAAA,IAClF;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAC3C,MAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,CAAC,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAE/E,MAAA,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,aAAA,CAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAkC;AAEtD,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC9B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AAEpC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,UAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,aAAA,CAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AACpC,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAE3C,QAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,GAAA,CAAI,YAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAChE,UAAA,MAAA,CAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAC7B,UAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EAClD;AAAA,EAEA,IAAA,GAAmC;AACjC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEQ,QAAQ,QAAA,EAA0B;AACxC,IAAA,OAAYC,IAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAASA,IAAA,CAAA,SAAA,CAAU,QAAQ,CAAA,GAASA,IAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAAA,EAC/F;AACF,CAAA;AAEA,SAAS,mBAAmB,GAAA,EAAwC;AAClE,EAAA,OAAO;AAAA,IACL,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,MAAM,GAAA,CAAI;AAAA,GACZ;AACF;;;ACtHO,SAAS,mBAAmB,OAAA,EAAyB;AAE1D,EAAA,OAAO,CAAC,GAAA,EAAM,GAAA,EAAM,IAAM,EAAE,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA,IAAK,IAAA;AACpE;;;ACmDO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACW,IAAA,EACT,OAAA,EACS,OAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AAAA,EANW,IAAA;AAAA,EAEA,OAAA;AAKb,CAAA;AC5EO,SAAS,SAAA,CAAU,KAAmB,GAAA,EAA6C;AAExF,EAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,KAAa,WAAW,eAAA,CAAgB,IAAA,CAAK,IAAI,OAAO,CAAA;AAC9E,EAAA,OAAOC,MAAM,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAG;AAAA,IACxC,GAAA;AAAA,IACA,KAAKC,aAAAA,CAAc,EAAE,KAAA,EAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACrC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC9B,KAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AACH;;;ACZA,eAAsB,kBAAA,CACpB,OAAA,EACA,EAAA,EACA,MAAA,EACY;AACZ,EAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,MAAM,IAAI,OAAA,CAAW,CAACN,UAAS,MAAA,KAAW;AAC/C,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,QAAA,CAAA,qBAAA,uBAAsC,CAAA,4BAAA,EAA+B,EAAE,IAAI,CAAC,CAAA;AAAA,IACzF,GAAG,EAAE,CAAA;AACL,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAC,KAAA,KAAU;AACT,QAAA,OAAA,EAAQ;AACR,QAAAA,SAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,GAAA,KAAQ;AACP,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,WAAW,MAAA,EAA6B;AAC/C,EAAA,OAAO,QAAQ,MAAA,YAAkB,KAAA,GAAQ,OAAO,MAAA,GAAS,IAAI,MAAM,SAAS,CAAA;AAC9E;;;ACnBO,IAAM,aAAN,MAAiB;AAAA,EAOtB,WAAA,CACmB,OACjB,MAAA,EACA;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGjB,IAAA,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAA,CAAO,GAAG,OAAA,EAAS,CAAC,QAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EAC/C;AAAA,EANmB,KAAA;AAAA,EAPX,MAAA,GAAS,CAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAqB;AAAA,EACnC,MAAA,GAAS,IAAI,YAAA,EAAa;AAAA,EACnC,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EAWjB,MAAM,WAAA,CACJ,MAAA,EACA,MAAA,EACA,WACA,MAAA,EACY;AACZ,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,MAAM,UAA0B,EAAE,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAQ,MAAA,EAAO;AACrE,IAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAW,CAACA,UAAS,MAAA,KAAW;AACnD,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAASA,QAAAA,EAAqC,QAAQ,CAAA;AAC7E,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,kBAAA,CAAmB,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAA,EAAmB,EAAE,EAAA,EAAI,CAAA;AAAA,QACjD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,eAAe,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,QAAgB,MAAA,EAAuB;AACtD,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,cAAA,CAAe,QAAgB,OAAA,EAAgD;AAC7E,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,QAAQ,OAAA,EAAiC;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAA,CAAA,oBAAA,sBAAqC,uBAAuB,CAAC,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA,EAEQ,OAAO,KAAA,EAAqB;AAGlC,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,GAAO,IAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,SAAS,UAAA,EAAY;AAClD,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA;AAChD,IAAA,WAAS;AACP,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC1C,MAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,CAAA,CAAE,SAAS,OAAO,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,0BAAA,CAA2B,IAAA,CAAK,MAAM,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAI9B,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,MAAM,KAAK,MAAA,GAAS,CAAA,IAAK,SAAS,UAAA,EAAY;AACjE,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,MAAA;AACxB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,KAAA,EAAO;AAChC,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA;AACjE,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAmB,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,GAAA,EAA2B;AAC/C,IAAA,IAAI,GAAA,CAAI,OAAO,MAAA,IAAa,GAAA,CAAI,OAAO,IAAA,IAAQ,CAAC,IAAI,MAAA,EAAQ;AAC1D,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,IAAI,GAAA,CAAI,KAAA;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAA,CAAA,oBAAA,sBAAqC,GAAA,CAAI,MAAM,OAAA,EAAS,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,WAClF,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,MAAM,CAAA;AAAA,EACzD;AAAA,EAEQ,MAAM,OAAA,EAA+B;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA;AAAA;AAAA,EAAW,IAAI,IAAI,MAAM,CAAA;AAAA,EACpE;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,mDAAqC,0BAA0B,CAAA;AAAA,EAC5F;AAAA,EAEQ,QAAQ,GAAA,EAAoB;AAClC,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,GAAG,CAAC,CAAA;AAC/E,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AAEA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,IAAI,GAAA,YAAe,OAAO,OAAO,GAAA;AAEjC,EAAA,OAAO,IAAI,QAAA,CAAA,oBAAA,sBAAqC,MAAA,CAAO,GAAG,CAAC,CAAA;AAC7D;ACpJO,IAAM,mBAAA,GAAwD;AAAA,EACnE,SAAA,EAAW;AAAA,IACT,gBAAA,EAAkB,IAAA;AAAA,IAClB,qBAAA,EAAuB,EAAE,mBAAA,EAAqB,KAAA,EAAM;AAAA,IACpD,QAAQ,EAAC;AAAA,IACT,cAAA,EAAgB,EAAE,mBAAA,EAAqB,KAAA;AAAM,GAC/C;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,KAAA;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,QAAA,EAAU,KAAA;AAAA,MACV,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,UAAA,EAAY,EAAE,mBAAA,EAAqB,KAAA,EAAM;AAAA,IACzC,UAAA,EAAY,EAAE,WAAA,EAAa,IAAA,EAAK;AAAA,IAChC,YAAY,EAAC;AAAA,IACb,OAAO,EAAE,aAAA,EAAe,CAAC,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,IAClD,cAAA,EAAgB,EAAE,iCAAA,EAAmC,IAAA,EAAK;AAAA,IAC1D,MAAA,EAAQ,EAAE,cAAA,EAAgB,IAAA,EAAK;AAAA,IAC/B,YAAY;AAAC,GACf;AAAA,EACA,OAAA,EAAS,EAAE,iBAAA,EAAmB,CAAC,QAAQ,CAAA;AACzC,CAAA;AAEA,eAAsB,gBAAA,CACpB,UAAA,EACA,SAAA,EACA,QAAA,EACA,WACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,OAAA,GAAUO,aAAAA,CAAc,QAAQ,CAAA,CAAE,QAAA,EAAS;AACjD,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,WAAW,OAAA,CAAQ,GAAA;AAAA,IACnB,QAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA,EAAc,mBAAA;AAAA,IACd,uBAAuB,SAAA,CAAU,qBAAA;AAAA,IACjC,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,GAAA,EAAK,OAAA;AAAA,QACL,MACE,QAAA,CACG,KAAA,CAAM,OAAO,CAAA,CACb,KAAI,IAA0B;AAAA;AACrC;AACF,GACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,WAAA;AAAA,IAC9B,YAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,UAAA,CAAW,gBAAA,CAAiB,aAAA,EAAe,EAAE,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,YAAA;AAChB;;;AC3BO,IAAM,YAAN,MAAgB;AAAA,EASrB,WAAA,CACW,IAAA,EACA,MAAA,EACQ,GAAA,EACjB;AAHS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEjB,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,UAAA;AAAA,EAC7C;AAAA,EALW,IAAA;AAAA,EACA,MAAA;AAAA,EACQ,GAAA;AAAA,EAXnB,KAAA,GAAqB,QAAA;AAAA,EACrB,YAAA,GAA0C,IAAA;AAAA,EACjC,WAAA,uBAAkB,GAAA,EAA0B;AAAA,EAC7C,KAAA,GAA+C,IAAA;AAAA,EAC/C,UAAA,GAAgC,IAAA;AAAA,EAChC,mBAAA,GAAsB,KAAA;AAAA,EACtB,aAAuB,EAAC;AAAA,EAUhC,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,GAAA,CAAI,QAAA;AAAA,EAClB;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAsB,IAAI,eAAA,GAAkB,MAAA,EAAuB;AAC7E,IAAA,IAAI,KAAK,KAAA,KAAU,OAAA,IAAW,KAAK,KAAA,KAAU,UAAA,IAAc,KAAK,KAAA,KAAU,cAAA;AACxE,MAAA;AACF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO;AACjC,MAAA,IAAA,CAAK,KAAA,GAAQ,UAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAA;AACb,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAC7F,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,QAAQ,CAAA;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,KAAA,CAAM,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACpE,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC9B,MAAA,MAAM,kBAAkB,IAAA,CAAK,mBAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,eAAA,IAAmB,IAAA,CAAK,UAAU,QAAA,EAAU;AAC7D,QAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB;AAAA,UACzC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,CAAA,oBAAA,EAAuB,IAAA,IAAQ,MAAM,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA;AAAA,SACrE,CAAA;AACD,QAAA,IAAI,eAAA,EAAiB,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,CAAA;AAChF,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAM,kBAAkB,IAAA,CAAK,mBAAA;AAC7B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,CAAA;AAClF,MAAA,IAAI,eAAA,EAAiB,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,MAAM,MAAM,CAAA;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,iCAAA,EAAmC,CAAC,MAAA,KAAW;AAC5E,MAAA,MAAM,CAAA,GAAI,MAAA;AACV,MAAA,IAAI,CAAC,EAAE,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,EAAE,WAAW,CAAA;AACzC,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,yBAAA,EAA2B;AAAA,QAC9C,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,UAAA,CAAW,OAAO,IAAI,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,GAAI,CAAA,CAAE,GAAA;AAAA,QACvD,KAAA,EAAO,EAAE,WAAA,CAAY;AAAA,OACtB,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,mBAAA,EAAqB,CAAC,MAAA,KAAW;AAC9D,MAAA,IAAI,KAAK,MAAA,CAAO,OAAA,KAAY,KAAA,IAAS,MAAA,IAAU,KAAK,MAAA,EAAQ;AAC1D,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,IAAA,CAAK,IAAI,QAAQ,MAAM,CAAA;AAAA,MACnD;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,MAAM;AAC5B,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,EAAS,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ,cAAA;AACb,IAAA,MAAM,OAAA,GAAU,eAAe,KAAK,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QACrC,gBAAA;AAAA,UACE,IAAA,CAAK,UAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,KAAK,GAAA,CAAI,QAAA;AAAA,UACT,IAAA,CAAK,OAAO,gBAAA,IAAoB,IAAA;AAAA,UAChC;AAAA,SACF;AAAA,QACA,OAAA,CAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB;AAAA,QACvC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,OACxB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,OAAO,IAAA,EAAK;AACjB,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,IAAY,IAAA,CAAK,UAAU,UAAA,EAAY;AAC1D,IAAA,IAAA,CAAK,KAAA,GAAQ,eAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,QAAA,MAAM,IAAA,CAAK,UAAA,CACR,WAAA,CAAY,UAAA,EAAY,IAAA,EAAM,GAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAC/C,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACxB,QAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAC,IAAA,CAAK,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAM,IAAA,EAAK;AACtD,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC6C;AAC7C,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,EAAqB,SAAA,EAAmB,MAAA,EAA4C;AAC9F,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACwD;AACxD,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAoB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,aAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAGA;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,4BAAA,EAA8B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,MAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC+B;AAC/B,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,IAAA,OAAQ,MAAM,KAAK,OAAA,CAAQ,yBAAA,EAA2B,QAAQ,SAAA,EAAW,MAAM,KAAM,EAAC;AAAA,EACxF;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACkB;AAClB,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,0BAAA,EAA4B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,eAAA,CACJ,GAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,yBAAA;AAAA,MACA,EAAE,YAAA,EAAc,EAAE,GAAA,EAAI,EAAE;AAAA,MACxB,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,KAAA,IAAS,EAAC;AAChC,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,eAAe,GAAA,EAA2B;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,KAAK,EAAC;AAAA,EACvC;AAAA,EAEA,cAAc,GAAA,EAA6B;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAA,EAAwB,EAAE,YAAA,EAAc,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,eAAA,CAAgB,KAAsC,IAAA,EAAoB;AACxE,IAAA,IAAA,CAAK,aAAa,wBAAA,EAA0B;AAAA,MAC1C,YAAA,EAAc,GAAA;AAAA,MACd,cAAA,EAAgB,CAAC,EAAE,IAAA,EAAM;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA,EAEA,eAAe,GAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,aAAa,uBAAA,EAAyB,EAAE,cAAc,EAAE,GAAA,IAAO,CAAA;AAAA,EACtE;AAAA,EAEA,uBAAuB,QAAA,EAAmC;AACxD,IAAA,OAAO,EAAE,GAAA,EAAK,SAAA,CAAU,QAAQ,CAAA,EAAE;AAAA,EACpC;AAAA,EAEA,MAAc,OAAA,CACZ,MAAA,EACA,MAAA,EACA,WACA,MAAA,EACY;AACZ,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,IAAW,CAAC,KAAK,UAAA,EAAY;AAC9C,MAAA,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,YAAe,MAAA,EAAQ,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC/E;AAAA,EAEQ,YAAA,CAAa,QAAgB,MAAA,EAAuB;AAC1D,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,IAAW,CAAC,KAAK,UAAA,EAAY;AAChD,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,MAAA,EAAQ,MAAM,CAAA;AAAA,EACjD;AAAA,EAEQ,cAAc,KAAA,EAAqB;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,MAAM,EAAE,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAClE,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAG,KAAK,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,GAAS,GAAA,OAAU,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAAA,EAChF;AACF,CAAA;AAOA,SAAS,eAAe,KAAA,EAGtB;AACA,EAAA,IAAI,UAAU,MAAM,MAAA;AACpB,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AAChD,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC9B,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA;AAAA,QACE,IAAI,QAAA,CAAA,mBAAA,qBAAoC,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO,IAAI,GAAG;AAAA,OAC3F;AAAA,IACF,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAqB,MAAA,KAAkC;AACrE,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA;AAAA,QACE,IAAI,QAAA;AAAA,UAAA,mBAAA;AAAA,UAEF,CAAA,sCAAA,EAAyC,IAAA,IAAQ,MAAM,CAAA,QAAA,EAAW,UAAU,MAAM,CAAA;AAAA;AACpF,OACF;AAAA,IACF,CAAA;AACA,IAAA,OAAA,GAAU,MAAM;AACd,MAAA,KAAA,CAAM,GAAA,CAAI,SAAS,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IAC1B,CAAA;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,OAAO,CAAA;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAQ;AACpC;AC/UO,SAAS,iBAAA,CACd,QAAA,EACA,YAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,EAAc,MAAA,GAAS,YAAA,GAAe,EAAC;AACxD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAYC,aAAQ,QAAQ,CAAA;AAEvD,EAAA,IAAI,GAAA,GAAWA,IAAA,CAAA,OAAA,CAAaA,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAYA,IAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC7B,EAAA,WAAS;AACP,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA,EAAG,OAAO,GAAA;AAAA,IACtC;AACA,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAYA,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC9C,IAAA,GAAA,GAAWA,aAAQ,GAAG,CAAA;AAAA,EACxB;AACF;AAEA,SAAS,SAAA,CAAU,KAAa,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,SAAa,GAAA,CAAA,UAAA,CAAgBA,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,oBAAA,EAAsB,MAAM,CAAC,CAAA,CACxD,KAAK,IAAI,CAAA;AACZ,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AACpC,EAAA,IAAI;AACF,IAAA,OAAU,GAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACjBO,IAAM,cAAN,MAAkB;AAAA,EAQvB,WAAA,CACmB,GAAA,EACA,OAAA,EACA,GAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEjB,IAAA,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA;AAEf,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AAAA,EACvB;AAAA,EAPmB,GAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EAVF,OAAA,uBAAc,GAAA,EAAuB;AAAA,EACrC,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EACxC,iBAAA,uBAAwB,GAAA,EAAoB;AAAA,EAC5C,eAAA,uBAAsB,GAAA,EAA4B;AAAA,EAC3D,GAAA;AAAA,EACA,SAAA;AAAA,EAYR,MAAM,IAAA,CAAK,GAAA,EAAa,SAAA,GAA2B,IAAA,CAAK,IAAI,SAAA,EAA0B;AACpF,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,MAAM,SAAA,GAAY,MAAM,sBAAA,CAAuB,GAAG,CAAA;AAClD,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,KAAK,IAAA,EAAK,CACP,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,IAAI,CAAC,CAAC,CAAA,CACpE,GAAA;AAAA,UAAI,CAAC,CAAA,KACJ,CAAA,CAAE,KAAA,EAAM,CAAE,MAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,gBAAA,CAAA,EAAoB,GAAG,CAAC;AAAA;AAClF,OACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,eAAgB,KAAK,CAAA;AACrE,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,IAAA,CAAK,MAAK,CAAE,GAAA;AAAA,QAAI,CAAC,CAAA,KACf,CAAA,CAAE,QAAA,EAAS,CAAE,MAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,gBAAA,CAAA,EAAoB,GAAG,CAAC;AAAA;AACrF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,QAAA,EAAkB,MAAA,EAAiD;AACnF,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,MAAM,QAAA,GAAW,cAAc,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,MAAA,CAAO,KAAA,KAAU,OAAA,IAAW,IAAA,CAAK,cAAc,MAAA,EAAQ;AACzD,MAAA,MAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAA,CAAO,KAAA,KAAU,OAAA,GAAU,MAAA,GAAS,IAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,IAAA,EAAgC;AAClC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACnC;AAAA,EAEA,IAAA,GAA6B;AAC3B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,IAAA,EAA6B;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,KAAK,IAAA,EAA6B;AAGtC,IAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AACzB,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACvC;AAAA,EAEA,MAAM,QAAQ,IAAA,EAA6B;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAGnC,IAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAClC,IAAA,MAAM,OAAO,QAAA,EAAS;AACtB,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEQ,gBAAgB,IAAA,EAAoB;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1D,MAAA,IAAI,GAAA,CAAI,YAAY,KAAA,EAAO;AAC3B,MAAA,MAAM,QAAA,GAAW,iBAAA;AAAA,QACVC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAAA,QAC/B,GAAA,CAAI,YAAA;AAAA,QACJ,IAAA,CAAK;AAAA,OACP;AACA,MAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK;AAAA,QACtC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA;AAAA,QACA,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,QACd,MAAA,EAAQ,KAAK,GAAA,CAAI,MAAA;AAAA,QACjB,OAAA,EAAS,CAAC,OAAA,KAAY,IAAA,CAAK,kBAAkB,OAAO;AAAA,OACrD,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC7B,MAAA,KAAA,MAAW,QAAA,IAAY,IAAI,SAAA,EAAW;AACpC,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA;AAAA,YACX,iBAAiB,QAAQ,CAAA,6CAAA;AAAA,WAC3B;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,IAAA,EAAyB;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AAC5F,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAA,EAAyB;AACjD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AAC3D,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,6BAAA,CAA+B,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,UAAU,CAAC,CAAA;AACnD,IAAA,MAAA,CAAO,KAAA,GAAQ,cAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvC,MAAA,KAAK,MAAA,CACF,KAAA,EAAM,CACN,IAAA,CAAK,MAAM;AACV,QAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,MAC5C,CAAC,CAAA,CAEA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,mBAAA,EAAsB,OAAA,GAAU,CAAC,CAAA,OAAA,CAAA,EAAW,GAAG,CAAA;AACnF,QAAA,MAAA,CAAO,KAAA,GAAQ,QAAA;AACf,QAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,IAEL,CAAA,EAAG,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAC9B,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC7C;AACF,CAAA;AAEA,eAAe,uBAAuB,IAAA,EAAoC;AACxE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,EAAa,KAAA,KAAiC;AACjE,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAASC,GAAA,CAAA,OAAA,CAAQ,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAEzD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,IAAkB,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,MAAA,EAAQ;AACrF,MAAA,MAAM,CAAA,GAASD,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,MAAM,WAAA,EAAY,QAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,WAC5C;AACH,QAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,QAAA,IAAI,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACnB,EAAA,OAAO,KAAA;AACT;;;AC1MA,IAAM,QAAA,GAAyC;AAAA,EAC7C,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG,SAAA;AAAA,EACH,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,KAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,iBAAA,CACd,QACA,IAAA,EAMQ;AACR,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AAC3C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,WAAW,CAAA,IAAK,MAAA,CAAO,SAAQ,EAAG;AAClD,IAAA,MAAM,QAAA,GAAW,YAEd,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,CAC/D,IAAA,CAAK,kBAAkB,CAAA,CACvB,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA;AAC3B,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,KAAA,EAAA;AACA,IAAA,KAAA,IAAS,QAAA,CAAS,MAAA;AAClB,IAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAC,CAAC,CAAA;AACrD,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,EAAG,YAAY,IAAA,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,SAAS,MAAM,CAAA;AAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAChG;AACA,IAAA,IAAI,KAAA,IAAS,KAAK,QAAA,EAAU;AAAA,EAC9B;AACA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,qBAAA;AAClC,EAAA,OAAO,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC;;AAAA,OAAA,EAAc,KAAK,mBAAmB,KAAK,CAAA,OAAA,CAAA;AAC5E;AAEA,SAAS,iBAAiB,CAAA,EAAuB;AAE/C,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA,IAAK,OAAA;AACzC,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA,GAAS,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,IAAA,KAAS,MAAA,GAAY,IAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA,GAAK,EAAA;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AACnD,EAAA,OAAO,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAA,GAAO,CAAC,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,SAAA,GAAY,CAAC,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,MAAM,KAAK,GAAG,CAAA,CAAA;AACjG;AAEA,SAAS,kBAAA,CAAmB,GAAe,CAAA,EAAuB;AAChE,EAAA,OAAA,CACG,CAAA,CAAE,YAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAA,IACnC,CAAA,CAAE,MAAM,KAAA,CAAM,IAAA,GAAO,EAAE,KAAA,CAAM,KAAA,CAAM,QACnC,CAAA,CAAE,KAAA,CAAM,MAAM,SAAA,GAAY,CAAA,CAAE,MAAM,KAAA,CAAM,SAAA;AAE5C;;;AC3DO,SAAS,mBAAmB,QAAA,EAAqC;AACtE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,MAAM,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK;AACpB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAmE;AACtF,MAAA,KAAA,MAAW,MAAA,IAAU,QAAA,CAAS,IAAA,EAAK,EAAG;AACpC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,WAAA,CAAY,SAAQ,EAAG;AAC7D,UAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,WAAW,CAAA;AAAA,QACxC;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,kBAAkB,MAAA,EAAQ;AAAA,UACjC,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,cAAA,EAAgB,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,UACnC,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AACF;;;ACvBO,SAAS,YAAY,QAAA,EAAqC;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,8BAAA;AAAA,IACb,MAAM,GAAA,GAAM;AACV,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACtC,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AACzC,QAAA,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,MAC1E,CAAC,CAAA;AACD,MAAA,OAAO,EAAE,SAAS,IAAA,CAAK,MAAA,GAAS,KAAK,IAAA,CAAK,IAAI,IAAI,4BAAA,EAA6B;AAAA,IACjF;AAAA,GACF;AACF;;;ACZO,SAAS,eAAe,QAAA,EAAqC;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,6CAAA,EAA8C;AAC3E,MAAA,MAAM,QAAA,CAAS,QAAQ,IAAI,CAAA;AAC3B,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACtD;AAAA,GACF;AACF;;;ACXO,SAAS,aAAa,QAAA,EAAqC;AAChE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,sBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,2CAAA,EAA4C;AACzE,MAAA,MAAM,QAAA,CAAS,MAAM,IAAI,CAAA;AACzB,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACpD;AAAA,GACF;AACF;;;ACXO,SAAS,YAAY,QAAA,EAAqC;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,0CAAA,EAA2C;AACxE,MAAA,MAAM,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACpD;AAAA,GACF;AACF;;;ACNO,SAAS,qBAAA,CAAsB,KAAgB,QAAA,EAAiC;AACrF,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,YAAY,QAAQ,CAAA;AAAA,IACpB,aAAa,QAAQ,CAAA;AAAA,IACrB,YAAY,QAAQ,CAAA;AAAA,IACpB,eAAe,QAAQ,CAAA;AAAA,IACvB,mBAAmB,QAAQ;AAAA,GAC7B;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,QAAA,EAAU,GAAA,CAAI,aAAA,CAAc,SAAS,OAAO,CAAA;AAClE,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,IAAI,CAAA;AACvC;;;ACfO,SAAS,sBAAA,CAAuB,MAAqB,GAAA,EAAqB;AAC/E,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,OAAO,uCAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,CAAC,iBAAiB,CAAA;AAChC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACnC,IAAA,KAAA,IAAS,KAAA,CAAM,MAAA;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,EAClE;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA,OAAA,CAAS,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,YAAY,IAAA,EAA8C;AACxE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAwB;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,EAAG;AAC7D,IAAA,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,eAAA,IAAmB,EAAC,EAAG;AAC/C,IAAA,IAAI,kBAAkB,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC3D,MAAA,GAAA,CAAI,IAAI,SAAA,CAAU,MAAA,CAAO,aAAa,GAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;ACPO,SAAS,UAAA,CAAW,SAAiB,GAAA,EAAiC;AAC3E,EAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAEpE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAO,CAAA,IAAK,EAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,GAAG,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,MAAM,CAAA;AACtC,IAAA,IAAI,KAAA,GAAQ,IAAI,OAAA,EAAS;AACzB,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,KAAA,IAAS,EAAA,CAAG,MAAA;AAAA,EACd;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,KAAA,EAAM;AAC3C;AA0BO,SAAS,WAAW,OAAA,EAA2B;AACpD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,EAAE,CAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,MAAM,YAAY,CAAA;AACnC;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,GAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;;;ACnEO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,aAAA;AACf;AAEO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;AAEO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;AAEO,SAAS,uBAAuB,GAAA,EAAkC;AACvE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,sBAAA;AACf;AAEO,SAAS,wBAAwB,GAAA,EAAkC;AACxE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,uBAAA;AACf;AAEO,SAAS,eAAe,GAAA,EAAkC;AAC/D,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,cAAA;AACf;AAOO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;AAEO,SAAS,wBAAwB,GAAA,EAAkC;AACxE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;ACpBO,SAAS,gBAAA,CAAiB,WAAmB,GAAA,EAAsB;AACxE,EAAA,OAAYE,IAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAASA,IAAA,CAAA,SAAA,CAAU,SAAS,CAAA,GAASA,IAAA,CAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AACjG;AAEA,eAAsB,aAAA,CACpB,QAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,MAAM,CAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,mBAAA,CACpB,UACA,OAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,OAAO,OAAA,EAAS,IAAA,IAAS,MAASC,GAAA,CAAA,QAAA,CAAS,UAAU,MAAM,CAAA;AAC7D;AASO,SAAS,mBAAmB,GAAA,EAAsB;AACvD,EAAA,IAAI,GAAA,YAAe,UAAU,OAAO,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAChE,EAAA,IAAI,eAAe,KAAA,EAAO,OAAO,CAAA,CAAA,EAAA,oBAAA,qBAA8B,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAC/E,EAAA,OAAO,CAAA,CAAA,EAAA,oBAAA,qBAA8B,EAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACvD;ACxCA,eAAsB,kBAAA,CACpB,MACA,OAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,MAAM,MAA8E,EAAC;AACrF,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,MAASC,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,CAAe,QAAA,EAAU,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,WAAA,CAAY,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,IAAI,CAAA;AAClC,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,SAAS,GAAA,EAAK;AAEZ,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,CAAY,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,QAAQ,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,IAAI,QAAA,CAAA,uBAAA,wBAAuC,gCAAA,EAAkC,GAAG,CAAA;AAAA,EAExF;AAEA,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK,MAAM,OAAA,CAAQ,WAAA,CAAY,GAAG,IAAI,CAAA;AACvD,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,IAAI,CAAC,EAAA,KAAO,GAAG,IAAI,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,GAAA,EAAK,EAAA,KAAO,MAAM,EAAA,CAAG,KAAA,EAAO,CAAC,CAAA,EAAE;AAC9F;AAEO,SAAS,cAAA,CAAe,UAAkB,KAAA,EAA2B;AAC1E,EAAA,MAAM,UAAA,GAAa,gBAAgB,QAAQ,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA;AAAA,IACxB,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,OAAO,UAAU;AAAA,GACpF;AACA,EAAA,IAAI,GAAA,GAAM,QAAA;AACV,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,UAAU,CAAA;AAC/C,IAAA,GAAA,GAAM,GAAA,CAAI,MAAM,CAAA,EAAG,KAAK,IAAI,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,IAAA,EAAwB;AAC/C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAA,CAAS,KAA0C,UAAA,EAA8B;AACxF,EAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA,CAAI,SAAA;AAChF;;;AC7CO,SAAS,sBAAsB,IAAA,EAAgD;AACpF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,SAAA,EACE,2GAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC7B,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC5B,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACjC,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACzB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA;AAAS,OAChC;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM;AAAA,KAC3B;AAAA,IACA,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,GAAA;AAAA,IACX,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,EAAG;AACnE,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,+BAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,CAAA,EAAG,CAAA;AACvF,QAAA,MAAM,GAAA,GAAM,WAAW,OAAA,EAAS;AAAA,UAC9B,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,IAAA;AAAA,UAC9B,SAAA,EAAW,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,SAAA,IAAa;AAAA,SACtD,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA;AAAA,UAC3B;AAAA,YACE,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,YACrC,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,YACpB,OAAA,EAAS;AAAA,cACP,WAAA,EAAa,MAAA,CAAO,cAAA,CAAe,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,cAClD,MAAM,KAAA,CAAM,WAAA,GAAc,CAAC,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA;AAAA;AAClD,WACF;AAAA,UACA,GAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AACA,QAAA,IAAI,KAAA,CAAM,KAAA,KAAU,KAAA,CAAA,EAAW,OAAO,cAAc,OAAO,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAClC,QAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,CAAA,wBAAA,EAA2B,MAAM,KAAK,CAAA,CAAA,CAAA;AAC1D,QAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AACpE,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,KAAA,CAAM,KAAK,sBAAA,CAAuB,MAAA,CAAO,IAAA,EAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AACvD,UAAA,MAAM,UAAU,MAAM,kBAAA,CAAmB,MAAA,CAAO,IAAA,EAAM,KAAK,OAAO,CAAA;AAClE,UAAA,KAAA,CAAM,IAAA,CAAK,YAAY,OAAA,CAAQ,KAAK,iBAAiB,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,QACpF;AACA,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAM,OAAO,cAAA,CAAe,MAAA,CAAO,OAAA,EAAS,GAAA,EAAQ,KAAK,MAAM,CAAA;AAC/D,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,QAC1D;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,cAAc,OAAA,EAA+B;AACpD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,4BAAA;AACjC,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAA,IAAQ,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACnF;;;ACjGO,IAAM,aAAA,GAAgB,OAAO,MAAA,CAAO;AAAA;AAAA,EAEzC,eAAA,EAAiB;AACnB,CAAU,CAAA;;;ACHH,SAAS,qBAAA,CACdC,KAAAA,EACA,OAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,mBAAA;AAC7C,EAAA,MAAM,QAAQ,CAAC,CAAA,EAAG,YAAYA,KAAAA,EAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3C,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS,YAAA,CAAa,KAAA,EAAO,GAAA,EAAK,GAAG,GAAG,CAAA;AAC1D,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,sBAAA,CACd,OAAA,EACA,KAAA,EACA,GAAA,EACA,QAAQ,GAAA,EACA;AACR,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,wBAAwB,KAAK,CAAA,EAAA,CAAA;AAC1E,EAAA,MAAM,QAAQ,CAAC,CAAA,EAAG,QAAQ,MAAM,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAA,CAAI,CAAA;AAC/D,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAA,EAAK,SAAS,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,WAAA,CAAY,SAAA,CAAU,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAAA,KAC3H;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,MAAA,GAAS,KAAK,CAAA,KAAA,CAAO,CAAA;AACvF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,YAAA,CACP,KAAA,EACA,GAAA,EACA,KAAA,EACA,GAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,IAAI,oBAAoB,GAAA,EAAK;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAG,MAAM,CAAA,EAAG,QAAA,CAAS,IAAI,IAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,GAAA,EAAM,GAAA,CAAI,cAAA,CAAe,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,KACnF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,GAAA,CAAI,QAAA,IAAY,EAAC,eAAgB,KAAA,EAAO,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA;AAAA,EACnF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAG,MAAM,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,WAAA,CAAY,UAAU,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAAA,KAClI;AAAA,EACF;AACF;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OACE;AAAA,IACE,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,CAAE,IAAA,GAAO,CAAC,CAAA,IAAK,QAAA;AAEnB;AA4BO,SAAS,wBAAA,CAAyB,QAAiC,GAAA,EAAqB;AAC7F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,UAAU,KAAA,EAAO,SAAA,EAAW,SAAQ,GAAI,MAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAG,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA,CAAG,CAAA;AAC5C,IAAA,OAAO,wBAAwB,KAAK,CAAA,aAAA,EAAgB,QAAQ,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,KAAA,EAAQ,QAAQ,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,SAAA,GAAY,EAAE,MAAA,KAAW,OAAA,GAAU,YAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,UAAU,GAAG,CAAA,CAAA,CAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,CAAA,OAAA,EAAU,EAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,GAAG,WAAA,CAAY,CAAA,CAAE,MAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AAEtD,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AACtE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AChFO,SAAS,4BAA4B,IAAA,EAAsD;AAChG,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,qBAAA;AAAA,IACN,WAAA,EACE,mHAAA;AAAA,IACF,SAAA,EACE,4JAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,QAC5D,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,2DAAA;AAAA,UACb,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EACE;AAAA;AACJ,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,cAAc,eAAA,GAAkB,CAAA;AAAA;AAAA,IAC3C,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,IAAI,GAAG,CAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAE7B,QAAA,IAAI,eAAoC,EAAC;AACzC,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,IAAI,aAAkC,EAAC;AACvC,QAAA,IAAI,QAAA,GAAW,CAAA;AAGf,QAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,UAAA,MAAM,eAAe,MAAM,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,OAAO,KAAK,CAAA;AACpE,UAAA,YAAA,GAAe,YAAA,CAAa,OAAA;AAC5B,UAAA,UAAA,GAAa,YAAA,CAAa,KAAA;AAC1B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAMA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,YAAA,CAAa,MAAA,KAAW,CAAA;AAE5D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,aAAa,MAAM,SAAA,CAAU,MAAM,KAAA,EAAO,KAAA,EAAO,KAAK,MAAM,CAAA;AAClE,UAAA,UAAA,GAAa,UAAA,CAAW,OAAA;AACxB,UAAA,QAAA,GAAW,UAAA,CAAW,KAAA;AACtB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAGA,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,EAAc,UAAA,EAAY,KAAK,CAAA;AAE3D,QAAA,MAAM,UAAA,GAAsC;AAAA,UAC1C,OAAA,EAAS,MAAA;AAAA,UACT,UAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,wBAAA,CAAyB,UAAA,EAAY,GAAA,CAAI,GAAG,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;AAIA,eAAe,WAAA,CACb,WAAA,EACA,KAAA,EACA,KAAA,EAC0D;AAC1D,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,WAAW,CAAA;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAErC,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,OAAO,CAAA,EAAE;AAAA,IACjC;AAGA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvC,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,kBAAA,CAAmB,CAAA,CAAE,MAAM,CAAA,CAAE,SAAA,EAAW,EAAE,UAAU;AAAA,KAC5D,CAAE,CAAA;AACF,IAAA,MAAM,IAAA,GAAO,eAAe,SAAS,CAAA;AAGrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,EAAA,KAAO,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAE9B,IAAA,MAAM,UAA+B,GAAA,CAAI,GAAA,CAAI,CAAC,EAAE,EAAA,EAAI,OAAM,KAAM;AAC9D,MAAA,MAAM,IAAI,UAAA,CAAW,IAAA,CAAK,CAACC,EAAAA,KAAMA,EAAAA,CAAE,OAAO,EAAE,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI,OAAO,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAA;AAAA,QACA,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,MAAA,EAAO;AAAA,EAC7C,CAAA,SAAE;AACA,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd;AACF;AAIA,eAAe,SAAA,CACb,IAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EAC0D;AAC1D,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AACnC,EAAA,MAAM,WAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC9B,IAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,uBAAA,CAAwB,MAAA,CAAO,YAAY,CAAA,EAAG;AAE1E,IAAA,QAAA,CAAS,IAAA;AAAA,MAAA,CACN,YAAY;AACX,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA;AAAA,YAC1B,EAAE,KAAA,EAAM;AAAA,YACR,aAAA,CAAc,eAAA;AAAA,YACd;AAAA,WACF;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,cAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,YACjB;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AAAG,KACL;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAe,gBAAA;AAAA,IACnB,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAA,EAAM,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA,IAAK,QAAA;AAAA,MACzC,SAAS,GAAA,CAAI,IAAA;AAAA,MACb,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,WAAW,SAAS,CAAA,GACvC,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GACxB,IAAI,QAAA,CAAS,GAAA;AAAA,MACjB,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,oBAAA,CAAqB,IAAA,EAAM,GAAG;AAAA,KACxC,CAAE;AAAA,GACJ;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IACpC,OAAO,YAAA,CAAa;AAAA,GACtB;AACF;AAEA,SAAS,oBAAA,CAAqB,MAAgB,GAAA,EAAgC;AAG5E,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,GAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,CAAG,WAAA,EAAY,GAAI,EAAA;AAExE,EAAA,MAAM,OAAA,GAAoC;AAAA,IACxC,EAAA,EAAI,CAAC,YAAA,EAAc,UAAU,CAAA;AAAA,IAC7B,GAAA,EAAK,CAAC,YAAA,EAAc,UAAU,CAAA;AAAA,IAC9B,EAAA,EAAI,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,IAC/B,GAAA,EAAK,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,IAChC,EAAA,EAAI,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,IACxB,EAAA,EAAI,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,IAClB,EAAA,EAAI,CAAC,MAAA,EAAQ,eAAe;AAAA,GAC9B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA,IAAK,CAAC,GAAG,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AAEnC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IACE,MAAA,CAAO,KAAA,KAAU,OAAA,IACjB,MAAA,CAAO,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAa,CAAA,EAC1E;AACA,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,OAAO,GAAG,IAAA,IAAQ,SAAA;AAC3D;AAIA,SAAS,YAAA,CACP,YAAA,EACA,UAAA,EACA,KAAA,EACqB;AACrB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA+B;AAGhD,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AACzC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACjB;AAGA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACvC,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,IAAA,IAAI,EAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,SAAS,OAAO,EAAA;AACzD,IAAA,IAAI,EAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,SAAS,OAAO,CAAA;AAEzD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,WAAW,OAAA,EAAS;AAChD,MAAA,OAAA,CAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC9B;AAEA,SAAS,iBACP,KAAA,EACK;AACL,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AAC1B,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;;;ACrUO,SAAS,eAAA,CACd,SAAA,EACA,GAAA,EACA,KAAA,GAAQ,GAAA,EACA;AACR,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,qBAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnD,IAAA,MAAM,GAAA,GAAM,KAAA,IAAS,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,CAAI,SAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,GAAA,GAAM,GAAA,CAAI,QAAQ,GAAA,CAAI,oBAAA;AAC/C,IAAA,OAAO,GAAG,WAAA,CAAY,SAAA,CAAU,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,YAAY,CAAC,CAAA,CAAA;AAAA,EACjG,CAAC,CAAA;AACD,EAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,SAAA,CAAU,MAAA,GAAS,KAAK,CAAA,KAAA,CAAO,CAAA;AACzF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACKO,SAAS,qBAAqB,IAAA,EAA6C;AAChF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,SAAA,EACE,+FAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA;AAAU,OAC/B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,EAAG;AACnE,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,6BAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA;AAAA,UACxB,EAAE,cAAc,EAAE,GAAA,EAAK,UAAU,IAAI,CAAA,IAAK,QAAA,EAAS;AAAA,UACnD,aAAA,CAAc,eAAA;AAAA,UACd,IAAA,CAAK;AAAA,SACP;AACA,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;AClDO,SAAS,sBAAsB,IAAA,EAAgD;AACpF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,mDAAA;AAAA,IACb,SAAA,EACE,sJAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAE,KACrE;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,cAAA,EAAgB,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,uBAAa,GAAA,EAAmE;AACtF,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,UAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,UAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,UAAA,MAAM,cACJ,MAAA,CAAO,YAAA,IAAgB,wBAAwB,MAAA,CAAO,YAAY,IAC9D,MAAM,MAAA,CAAO,eAAA,CAAgB,GAAA,EAAK,cAAc,eAAA,EAAiB,IAAA,CAAK,MAAM,CAAA,GAC5E,MAAA,CAAO,eAAe,GAAG,CAAA;AAC/B,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrC,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,GAAA,CAAI,IAAA,EAAM,KAAK,MAAM,CAAA;AACpE,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,MAAA,CAAO,GAAA,CAAI,UAAU,GAAA,CAAI,GAAG,GAAG,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,UAC/D;AAAA,QACF;AACA,QAAA,OAAO,kBAAkB,MAAA,EAAQ;AAAA,UAC/B,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,cAAA,EAAgB,KAAK,GAAA,CAAI,cAAA;AAAA,UACzB,UAAA,EAAY,KAAK,GAAA,CAAI,qBAAA;AAAA,UACrB,QAAA,EAAU,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI;AAAA,SACnC,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACtDO,SAAS,WAAA,CAAY,KAAA,EAAqB,QAAA,GAAW,IAAA,EAAc;AACxE,EAAA,IAAI,CAAC,OAAO,OAAO,uBAAA;AACnB,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,KAAA,CAAM,QAAQ,EAAE,IAAA,EAAK;AACxD,EAAA,IAAI,CAAC,MAAM,OAAO,uBAAA;AAClB,EAAA,OAAO,IAAA,CAAK,SAAS,QAAA,GAAW,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC;AAAA,cAAA,CAAA,GAAqB,IAAA;AACjF;AAEA,SAAS,sBAAsB,QAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AACzC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,SAAS,GAAA,CAAI,oBAAoB,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAClF,EAAA,IAAI,MAAA,IAAU,QAAA,IAAY,OAAA,IAAW,QAAA,SAAkB,QAAA,CAA2B,KAAA;AAClF,EAAA,OAAO,qBAAqB,QAAwB,CAAA;AACtD;AAEA,SAAS,qBAAqB,KAAA,EAA6B;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,CAAA,MAAA,EAAS,MAAM,QAAQ;AAAA,EAAK,MAAM,KAAK;AAAA,MAAA,CAAA;AAChD;;;ACEO,SAAS,gBAAgB,IAAA,EAA0C;AACxE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,sDAAA;AAAA,IACb,SAAA,EAAW,oEAAA;AAAA,IACX,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA;AAAU,OAC/B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,aAAA,CAAc,MAAA,CAAO,YAAY,CAAA,EAAG;AAC9D,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,wBAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,OAAO,WAAA;AAAA,UACL,MAAM,MAAA,CAAO,KAAA;AAAA,YACX,EAAE,cAAc,EAAE,GAAA,EAAK,UAAU,IAAI,CAAA,IAAK,QAAA,EAAS;AAAA,YACnD,aAAA,CAAc,eAAA;AAAA,YACd,IAAA,CAAK;AAAA;AACP,SACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACxCO,SAAS,qBAAqB,IAAA,EAA+C;AAClF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,8BAAA;AAAA,IACb,SAAA,EAAW,4EAAA;AAAA,IACX,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC7B,mBAAA,EAAqB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACvC,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AAAU,OAC3B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,GAAA;AAAA,IACX,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,EAAG;AACnE,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,6BAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA;AAAA,UACxB;AAAA,YACE,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,YACrC,QAAA;AAAA,YACA,OAAA,EAAS,EAAE,kBAAA,EAAoB,KAAA,CAAM,uBAAuB,IAAA;AAAK,WACnE;AAAA,UACA,GAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AACA,QAAA,OAAO,gBAAgB,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,MAC1D,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;AC9CO,SAAS,iBAAiB,IAAA,EAA2C;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,oDAAA;AAAA,IACb,SAAA,EACE,+HAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC7B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA;AAAS,OAC7B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,aAAa,UAAU;AAAA,KACpD;AAAA,IACA,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,cAAA,EAAgB,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,cAAA,CAAe,MAAA,CAAO,YAAY,CAAA,EAAG;AAC/D,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,yBAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA;AAAA,UACxB;AAAA,YACE,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,YACrC,QAAA;AAAA,YACA,SAAS,KAAA,CAAM;AAAA,WACjB;AAAA,UACA,IAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AACA,QAAA,IAAI,CAAC,MAAM,OAAO,2BAAA;AAClB,QAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACpD,QAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC3D,QAAA,OAAO,GAAG,OAAO;AAAA,SAAA,EAAc,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAM,MAAM,CAAA,OAAA,CAAA;AAAA,MACnF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACzDO,SAAS,kBAAkB,IAAA,EAA4C;AAC5E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,qDAAA;AAAA,IACb,SAAA,EAAW,yEAAA;AAAA,IACX,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AAAU;AAC3B,KACF;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,UAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,UAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,sBAAA,CAAuB,MAAA,CAAO,YAAY,CAAA,EAAG;AACvE,YAAA,MAAM,IAAI,QAAA;AAAA,cAAA,wBAAA;AAAA,cAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,mCAAA;AAAA,aACxB;AAAA,UACF;AACA,UAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,cAAA;AAAA,YAC3B,EAAE,YAAA,EAAc,EAAE,KAAK,SAAA,CAAU,IAAI,GAAE,EAAE;AAAA,YACzC,aAAA,CAAc,eAAA;AAAA,YACd,IAAA,CAAK;AAAA,WACP;AACA,UAAA,OAAO,qBAAA,CAAsB,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,GAAG,CAAA;AAAA,QACrD;AACA,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,QAAA,MAAM,SAA8B,EAAC;AACrC,QAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,EAAG;AACzC,UAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC9B,UAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,uBAAA,CAAwB,MAAA,CAAO,YAAY,CAAA,EAAG;AAC1E,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,OAAM,EAAG,aAAA,CAAc,eAAA,EAAiB,IAAA,CAAK,MAAM,CAAA;AACjG,UAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QACnC;AACA,QAAA,OAAO,uBAAuB,MAAA,EAAQ,KAAA,EAAO,IAAI,GAAA,EAAK,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,MAC1E,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACpDO,SAAS,aAAa,IAAA,EAAwB;AACnD,EAAA,OAAO;AAAA,IACL,sBAAsB,IAAI,CAAA;AAAA,IAC1B,qBAAqB,IAAI,CAAA;AAAA,IACzB,qBAAqB,IAAI,CAAA;AAAA,IACzB,gBAAgB,IAAI,CAAA;AAAA,IACpB,kBAAkB,IAAI,CAAA;AAAA,IACtB,4BAA4B,IAAI,CAAA;AAAA,IAChC,iBAAiB,IAAI,CAAA;AAAA,IACrB,sBAAsB,IAAI;AAAA,GAC5B;AACF;;;ACPA,IAAI,aAAA,GAMO,IAAA;AAEX,IAAM,MAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,gDAAA;AAAA,EACb,UAAA,EAAY,QAAA;AAAA,EACZ,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,WAAW;AAAC,GACd;AAAA,EACA,YAAA,EAAc,mBAAA;AAAA,EACd,MAAM,MAAM,GAAA,EAAK;AACf,IAAA,MAAM,GAAA,GAAM,kBAAkB,GAAG,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,IAAO,QAAQ,GAAA,EAAI;AAC1C,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,mBAAA,CAAoB,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,MAAM,MAAA,CAAO,UAAW,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA;AACpF,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,GAAA,EAAK,OAAA,EAAS,EAAE,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AACxF,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,IAAA,MAAM,QAAA,CAAS,IAAA,CAAK,GAAA,EAAK,GAAA,CAAI,SAAS,CAAA;AAEtC,IAAA,MAAM,KAAA,GAAQ,aAAa,EAAE,QAAA,EAAU,SAAS,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,CAAA;AACnE,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,SAAS,IAAI,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,GAAA,EAAK,QAAQ,CAAA;AAExD,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,MAAM;AACrC,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,GAAA,IAAO,QAAQ,GAAA,EAAI;AAC9C,QAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AACtB,QAAA,KAAK,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,MACD,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,MAAM;AACnC,QAAA,KAAK,QAAQ,aAAA,EAAc,CAAE,QAAQ,MAAM,QAAA,CAAS,UAAU,CAAA;AAAA,MAChE,CAAC,CAAA;AAAA,MACD,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,KAAA,KAAU;AACxC,QAAA,KAAK,OAAA,CAAQ,mBAAmB,KAAK,CAAA;AAAA,MACvC,CAAC;AAAA,KACH;AAEA,IAAA,aAAA,GAAgB;AAAA,MACd,IAAA;AAAA,MACA,WAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MAClC,YAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA,MAAM,SAAS,GAAA,EAAK;AAClB,IAAA,MAAM,KAAA,GAAQ,aAAA;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,EAAM,GAAA,EAAI;AAClC,IAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,WAAW,IAAI,CAAA;AAC7D,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,YAAA,EAAc,GAAA,CAAI,aAAA,CAAc,WAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC5F,IAAA,MAAM,KAAA,CAAM,QAAQ,aAAA,EAAc;AAClC,IAAA,MAAM,KAAA,CAAM,SAAS,QAAA,EAAS;AAAA,EAChC;AACF,CAAA;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n for (const [name, cfg] of Object.entries(PRESETS)) {\n if (out[name]) continue;\n const command = await resolveServerCommand(cfg.command, cwd);\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n const text = knownText ?? (await fs.readFile(absPath, 'utf8'));\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n languages: string[];\n rootPatterns?: string[];\n initializationOptions?: unknown;\n settings?: unknown;\n startupTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: (server: LSPServer) => void;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string; diagnostics?: Diagnostic[] };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n // Cancel any pending auto-reconnect so the server doesn't come back\n // up moments after a user-requested stop.\n this.cancelReconnect(name);\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n // Cancel pending auto-reconnect AND clear the strike counter — a\n // manual restart should not count against the 3-attempt limit.\n this.cancelReconnect(name);\n this.reconnectAttempts.delete(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private cancelReconnect(name: string): void {\n const timer = this.reconnectTimers.get(name);\n if (timer) {\n clearTimeout(timer);\n this.reconnectTimers.delete(name);\n }\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msg = d.message.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\n\nexport function registerSlashCommands(api: PluginAPI, registry: LSPRegistry): string[] {\n const commands = [\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits);\n }\n }\n return out;\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { CodeAction } from 'vscode-languageserver-protocol';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsCodeAction } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface CodeActionsInput {\n path: string;\n line: number;\n character?: number;\n end_line?: number;\n end_character?: number;\n apply?: number;\n kind_filter?: string;\n}\n\nexport function createCodeActionsTool(deps: ToolDeps): Tool<CodeActionsInput, string> {\n return {\n name: 'lsp_code_actions',\n description: 'List or apply LSP code actions.',\n usageHint:\n 'Use to inspect quick fixes and refactors. This tool is confirm-gated because apply mode can mutate files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n end_line: { type: 'integer' },\n end_character: { type: 'integer' },\n apply: { type: 'integer' },\n kind_filter: { type: 'string' },\n },\n required: ['path', 'line'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsCodeAction(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support code actions`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const start = humanToLSP(content, { line: input.line, character: input.character ?? 1 });\n const end = humanToLSP(content, {\n line: input.end_line ?? input.line,\n character: input.end_character ?? input.character ?? 1,\n });\n const actions = await server.codeAction(\n {\n textDocument: { uri: pathToUri(file) },\n range: { start, end },\n context: {\n diagnostics: server.getDiagnostics(pathToUri(file)),\n only: input.kind_filter ? [input.kind_filter] : undefined,\n },\n },\n 10_000,\n opts.signal,\n );\n if (input.apply === undefined) return formatActions(actions);\n const action = actions[input.apply];\n if (!action) return `No code action at index ${input.apply}.`;\n const parts: string[] = [`Applying [${input.apply}] ${action.title}`];\n if (action.edit) {\n parts.push(summarizeWorkspaceEdit(action.edit, ctx.cwd));\n const applied = await applyWorkspaceEdit(action.edit, deps.tracker);\n parts.push(`Applied: ${applied.edits} edits across ${applied.files.length} files.`);\n }\n if (action.command) {\n await server.executeCommand(action.command, 10_000, opts.signal);\n parts.push(`Executed command: ${action.command.command}`);\n }\n return parts.join('\\n');\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\nfunction formatActions(actions: CodeAction[]): string {\n if (actions.length === 0) return 'No code actions available.';\n return actions.map((a, i) => `[${i}] ${a.kind ?? 'action'} ${a.title}`).join('\\n');\n}\n","/**\n * Shared constants for the plug-lsp package.\n */\nexport const LSP_CONSTANTS = Object.freeze({\n /** Default timeout for LSP tool operations (5 seconds). */\n TOOL_TIMEOUT_MS: 5000,\n} as const);","import type { DocumentSymbol, SymbolInformation } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatDocumentSymbols(\n path: string,\n symbols: DocumentSymbol[] | SymbolInformation[] | null,\n cwd: string,\n): string {\n if (!symbols || symbols.length === 0) return 'No symbols found.';\n const lines = [`${displayPath(path, cwd)}:`];\n for (const sym of symbols) appendSymbol(lines, sym, 1, cwd);\n return lines.join('\\n');\n}\n\nexport function formatWorkspaceSymbols(\n symbols: SymbolInformation[] | null,\n query: string,\n cwd: string,\n limit = 100,\n): string {\n if (!symbols || symbols.length === 0) return `No symbols matching \"${query}\".`;\n const lines = [`${symbols.length} symbols matching \"${query}\":`];\n for (const sym of symbols.slice(0, limit)) {\n lines.push(\n ` ${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n if (symbols.length > limit) lines.push(` ... truncated ${symbols.length - limit} more`);\n return lines.join('\\n');\n}\n\nfunction appendSymbol(\n lines: string[],\n sym: DocumentSymbol | SymbolInformation,\n depth: number,\n cwd: string,\n): void {\n const indent = ' '.repeat(depth);\n if ('selectionRange' in sym) {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} (L${sym.selectionRange.start.line + 1})`,\n );\n for (const child of sym.children ?? []) appendSymbol(lines, child, depth + 1, cwd);\n } else {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n}\n\nfunction kindName(kind: number): string {\n return (\n [\n 'file',\n 'module',\n 'namespace',\n 'package',\n 'class',\n 'method',\n 'property',\n 'field',\n 'constructor',\n 'enum',\n 'interface',\n 'function',\n 'variable',\n 'constant',\n 'string',\n 'number',\n 'boolean',\n 'array',\n 'object',\n 'key',\n 'null',\n 'enumMember',\n 'struct',\n 'event',\n 'operator',\n 'typeParameter',\n ][kind - 1] ?? 'symbol'\n );\n}\n\n// ─── Codebase LSP Search formatter ─────────────────────────────────────────────\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n/**\n * Format `codebase-lsp-search` output for human-readable display.\n */\nexport function formatCodebaseLspResults(output: CodebaseLspSearchOutput, cwd: string): string {\n const { results, totalIndex, totalLsp, query, usedIndex, usedLsp } = output;\n\n if (results.length === 0) {\n const sources: string[] = [];\n if (usedIndex) sources.push(`index(${totalIndex})`);\n if (usedLsp) sources.push(`lsp(${totalLsp})`);\n return `No symbols matching \"${query}\". Searched: ${sources.join(', ') || 'none'}.`;\n }\n\n const lines: string[] = [];\n lines.push(`${results.length} results for \"${query}\" (index:${totalIndex} lsp:${totalLsp}):`);\n\n for (const r of results) {\n const sourceTag = r.source === 'index' ? '[index]' : `[lsp:${r.server ?? '?'}]`;\n const scoreTag = r.score !== undefined ? ` score=${r.score.toFixed(2)}` : '';\n const location = `${displayPath(r.file, cwd)}:${r.line}`;\n\n if (r.snippet) {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n lines.push(` ${r.snippet}`);\n } else {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * `codebase-lsp-search` — index-first, LSP-fallback symbol search.\n *\n * Architecture:\n * 1. Query the SQLite+BM25 codebase index (fast)\n * 2. If index has 0 results OR preferLsp=true, fall back to live LSP workspaceSymbol queries\n * 3. Deduplicate results present in both sources\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport {\n IndexStore,\n buildBm25Index,\n buildIndexableText,\n tokenise,\n internalKindToLspKind,\n lspKindToInternalKind,\n} from '@wrongstack/tools/codebase-index/index';\n\nimport { LSP_CONSTANTS } from '../constants.js';\nimport { formatCodebaseLspResults } from '../formatters/symbols.js';\nimport { supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { type ToolDeps, stringifyToolError } from './shared.js';\n\n// ─── Input / Output types ───────────────────────────────────────────────────────\n\ninterface CodebaseLspSearchInput {\n query: string;\n limit?: number;\n preferLsp?: boolean;\n}\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n// ─── Tool factory ──────────────────────────────────────────────────────────────\n\nexport function createCodebaseLspSearchTool(deps: ToolDeps): Tool<CodebaseLspSearchInput, string> {\n return {\n name: 'codebase-lsp-search',\n description:\n 'Search code symbols using a fast SQLite+BM25 index, falling back to live LSP workspaceSymbol queries when needed.',\n usageHint:\n 'Pass `query` to search. Use `limit` (default 20) to cap results. Set `preferLsp=true` to skip the index and query LSP servers directly for live precision.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query string' },\n limit: {\n type: 'integer',\n description: 'Maximum number of results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n preferLsp: {\n type: 'boolean',\n description:\n 'If true, skip the index and query LSP servers directly. Useful for live precision when the index may be stale.',\n },\n },\n required: ['query'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS * 2, // Allow extra time for LSP round-robins\n async execute(input, ctx, opts) {\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n const query = input.query ?? '';\n\n let indexResults: CodebaseLspResult[] = [];\n let totalIndex = 0;\n let usedIndex = false;\n let usedLsp = false;\n let lspResults: CodebaseLspResult[] = [];\n let totalLsp = 0;\n\n // ── Step 1: Query index (unless preferLsp is set) ──────────────────────\n if (!input.preferLsp) {\n const indexOutcome = await searchIndex(ctx.projectRoot, query, limit);\n indexResults = indexOutcome.results;\n totalIndex = indexOutcome.total;\n usedIndex = true;\n }\n\n // ── Step 2: LSP fallback ───────────────────────────────────────────────\n // Fall back to LSP when:\n // - preferLsp is true (user wants live data), OR\n // - index returned 0 results\n const needsLsp = input.preferLsp || indexResults.length === 0;\n\n if (needsLsp) {\n const lspOutcome = await searchLsp(deps, query, limit, opts.signal);\n lspResults = lspOutcome.results;\n totalLsp = lspOutcome.total;\n usedLsp = true;\n }\n\n // ── Step 3: Merge & deduplicate ────────────────────────────────────────\n const output = mergeResults(indexResults, lspResults, limit);\n\n const fullOutput: CodebaseLspSearchOutput = {\n results: output,\n totalIndex,\n totalLsp,\n query,\n usedIndex,\n usedLsp,\n };\n\n return formatCodebaseLspResults(fullOutput, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\n// ─── Index search ─────────────────────────────────────────────────────────────\n\nasync function searchIndex(\n projectRoot: string,\n query: string,\n limit: number,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const store = new IndexStore(projectRoot);\n try {\n const candidates = store.search(query);\n\n if (candidates.length === 0) {\n return { results: [], total: 0 };\n }\n\n // Build BM25 index over candidates\n const indexable = candidates.map((c) => ({\n id: c.id,\n text: buildIndexableText(c.name, c.signature, c.docComment),\n }));\n const bm25 = buildBm25Index(indexable);\n\n // Score and rank\n const scored = bm25.score(query, (id) => candidates.some((c) => c.id === id));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, limit);\n const qTokens = tokenise(query);\n\n const results: CodebaseLspResult[] = top.map(({ id, score }) => {\n const c = candidates.find((c) => c.id === id)!;\n const lspKind = internalKindToLspKind(c.kind) ?? 0;\n const snippet = bm25.extractSnippet(id, qTokens);\n return {\n name: c.name,\n kind: c.kind,\n lspKind,\n file: c.file,\n line: c.line,\n source: 'index' as const,\n score,\n snippet,\n };\n });\n\n return { results, total: candidates.length };\n } finally {\n store.close();\n }\n}\n\n// ─── LSP search ───────────────────────────────────────────────────────────────\n\nasync function searchLsp(\n deps: ToolDeps,\n query: string,\n limit: number,\n signal: AbortSignal,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const merged: SymbolInformation[] = [];\n\n const servers = deps.registry.list();\n const promises: Array<Promise<void>> = [];\n\n for (const server of servers) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n\n promises.push(\n (async () => {\n try {\n const result = await server.workspaceSymbol(\n { query },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n signal,\n );\n if (result) {\n for (const sym of result) {\n merged.push(sym);\n }\n }\n } catch {\n // Individual server errors are non-fatal; skip this server's results\n }\n })(),\n );\n }\n\n await Promise.all(promises);\n\n const deduplicated = deduplicateByKey(\n merged.map((sym) => ({\n name: sym.name,\n kind: lspKindToInternalKind(sym.kind) ?? 'symbol',\n lspKind: sym.kind,\n file: sym.location.uri.startsWith('file://')\n ? sym.location.uri.slice(7) // strip \"file://\"\n : sym.location.uri,\n line: sym.location.range.start.line + 1, // convert to 1-based\n source: 'lsp' as const,\n server: serverNameFromConfig(deps, sym),\n })),\n );\n\n return {\n results: deduplicated.slice(0, limit),\n total: deduplicated.length,\n };\n}\n\nfunction serverNameFromConfig(deps: ToolDeps, sym: SymbolInformation): string {\n // Try to find which server owns this file by its language\n // Heuristic: look at file extension\n const file = sym.location.uri;\n const ext = file.includes('.') ? file.split('.').pop()!.toLowerCase() : '';\n\n const langMap: Record<string, string[]> = {\n ts: ['typescript', 'tsserver'],\n tsx: ['typescript', 'tsserver'],\n js: ['javascript', 'typescript'],\n jsx: ['javascript', 'typescript'],\n py: ['python', 'pyright'],\n go: ['go', 'gopls'],\n rs: ['rust', 'rust-analyzer'],\n };\n\n const langs = langMap[ext] ?? [ext];\n const servers = deps.registry.list();\n\n for (const lang of langs) {\n for (const server of servers) {\n if (\n server.state === 'ready' &&\n server.config.languages.some((l) => l.toLowerCase() === lang.toLowerCase())\n ) {\n return server.name;\n }\n }\n }\n\n // Fallback: return first ready server\n return servers.find((s) => s.state === 'ready')?.name ?? 'unknown';\n}\n\n// ─── Merge & deduplication ────────────────────────────────────────────────────\n\nfunction mergeResults(\n indexResults: CodebaseLspResult[],\n lspResults: CodebaseLspResult[],\n limit: number,\n): CodebaseLspResult[] {\n const seen = new Map<string, CodebaseLspResult>();\n\n // Index results take priority (BM25-ranked)\n for (const r of indexResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n seen.set(key, r);\n }\n\n // LSP results fill in gaps (deduplicated)\n for (const r of lspResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n if (!seen.has(key)) {\n seen.set(key, r);\n }\n }\n\n // Sort: index results first (already ranked), then LSP results\n const merged = Array.from(seen.values());\n merged.sort((a, b) => {\n if (a.source === 'index' && b.source !== 'index') return -1;\n if (a.source !== 'index' && b.source === 'index') return 1;\n // Within same source, prefer higher score\n if (a.source === 'index' && b.source === 'index') {\n return (b.score ?? 0) - (a.score ?? 0);\n }\n return 0;\n });\n\n return merged.slice(0, limit);\n}\n\nfunction deduplicateByKey<T extends { name: string; file: string; line: number }>(\n items: T[],\n): T[] {\n const seen = new Set<string>();\n return items.filter((item) => {\n const key = `${item.file}:${item.line}:${item.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { LSP_CONSTANTS } from '../constants.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string;\n limit?: number;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Hover, MarkedString, MarkupContent } from 'vscode-languageserver-protocol';\n\nexport function formatHover(hover: Hover | null, maxChars = 4096): string {\n if (!hover) return 'No hover information.';\n const text = hoverContentsToString(hover.contents).trim();\n if (!text) return 'No hover information.';\n return text.length > maxChars ? `${text.slice(0, maxChars)}\\n...[truncated]` : text;\n}\n\nfunction hoverContentsToString(contents: Hover['contents']): string {\n if (typeof contents === 'string') return contents;\n if (Array.isArray(contents)) return contents.map(markedStringToString).join('\\n\\n');\n if ('kind' in contents && 'value' in contents) return (contents as MarkupContent).value;\n return markedStringToString(contents as MarkedString);\n}\n\nfunction markedStringToString(value: MarkedString): string {\n if (typeof value === 'string') return value;\n return `\\`\\`\\`${value.language}\\n${value.value}\\n\\`\\`\\``;\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatHover } from '../formatters/hover.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsHover } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface HoverInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createHoverTool(deps: ToolDeps): Tool<HoverInput, string> {\n return {\n name: 'lsp_hover',\n description: 'Get type information and documentation for a symbol.',\n usageHint: 'Use when you need a type/signature without opening the definition.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsHover(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support hover`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n return formatHover(\n await server.hover(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n ),\n );\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsReferences } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface ReferencesInput {\n path: string;\n line: number;\n character: number;\n include_declaration?: boolean;\n limit?: number;\n}\n\nexport function createReferencesTool(deps: ToolDeps): Tool<ReferencesInput, string> {\n return {\n name: 'lsp_references',\n description: 'Find references to a symbol.',\n usageHint: 'Use instead of grep when the symbol position is known; it is syntax-aware.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n include_declaration: { type: 'boolean' },\n limit: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsReferences(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support references`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.references(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n context: { includeDeclaration: input.include_declaration ?? true },\n },\n 10_000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport { formatDocumentSymbols, formatWorkspaceSymbols } from '../formatters/symbols.js';\nimport { supportsDocumentSymbol, supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface SymbolsInput {\n path?: string;\n query?: string;\n limit?: number;\n}\n\nexport function createSymbolsTool(deps: ToolDeps): Tool<SymbolsInput, string> {\n return {\n name: 'lsp_symbols',\n description: 'List symbols in a file or search workspace symbols.',\n usageHint: 'Pass `path` for a file outline, or `query` for workspace symbol search.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n query: { type: 'string' },\n limit: { type: 'integer' },\n },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDocumentSymbol(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support document symbols`,\n );\n }\n const symbols = await server.documentSymbol(\n { textDocument: { uri: pathToUri(file) } },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatDocumentSymbols(file, symbols, ctx.cwd);\n }\n const query = input.query ?? '';\n const merged: SymbolInformation[] = [];\n for (const server of deps.registry.list()) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n const result = await server.workspaceSymbol({ query }, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal);\n if (result) merged.push(...result);\n }\n return formatWorkspaceSymbols(merged, query, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodeActionsTool } from './code-actions.js';\nimport { createCodebaseLspSearchTool } from './codebase-lsp-search.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createHoverTool } from './hover.js';\nimport { createReferencesTool } from './references.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\nimport { createSymbolsTool } from './symbols.js';\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createReferencesTool(deps),\n createHoverTool(deps),\n createSymbolsTool(deps),\n createCodebaseLspSearchTool(deps),\n createRenameTool(deps),\n createCodeActionsTool(deps),\n ];\n}\n","import type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\n\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry } = {};\n const tracker = new DocumentTracker(() => holder.registry!, api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker.handleToolExecuted(event);\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/presets.ts","../src/utils/command-resolver.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/index.ts","../src/formatters/workspace-edit.ts","../src/position.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/workspace-edit.ts","../src/tools/code-actions.ts","../src/constants.ts","../src/formatters/symbols.ts","../src/tools/codebase-lsp-search.ts","../src/formatters/location.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/hover.ts","../src/tools/hover.ts","../src/tools/references.ts","../src/tools/rename.ts","../src/tools/symbols.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","path2","path3","path4","spawn","buildChildEnv","pathToFileURL","path5","path6","fs4","path7","fs5","fs6","path","c"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n for (const [name, cfg] of Object.entries(PRESETS)) {\n if (out[name]) continue;\n const command = await resolveServerCommand(cfg.command, cwd);\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n const text = knownText ?? (await fs.readFile(absPath, 'utf8'));\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n languages: string[];\n rootPatterns?: string[];\n initializationOptions?: unknown;\n settings?: unknown;\n startupTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: (server: LSPServer) => void;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string; diagnostics?: Diagnostic[] };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n // Cancel any pending auto-reconnect so the server doesn't come back\n // up moments after a user-requested stop.\n this.cancelReconnect(name);\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n // Cancel pending auto-reconnect AND clear the strike counter — a\n // manual restart should not count against the 3-attempt limit.\n this.cancelReconnect(name);\n this.reconnectAttempts.delete(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private cancelReconnect(name: string): void {\n const timer = this.reconnectTimers.get(name);\n if (timer) {\n clearTimeout(timer);\n this.reconnectTimers.delete(name);\n }\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msg = d.message.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\n\nexport function registerSlashCommands(api: PluginAPI, registry: LSPRegistry): string[] {\n const commands = [\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits);\n }\n }\n return out;\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { CodeAction } from 'vscode-languageserver-protocol';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsCodeAction } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface CodeActionsInput {\n path: string;\n line: number;\n character?: number;\n end_line?: number;\n end_character?: number;\n apply?: number;\n kind_filter?: string;\n}\n\nexport function createCodeActionsTool(deps: ToolDeps): Tool<CodeActionsInput, string> {\n return {\n name: 'lsp_code_actions',\n description: 'List or apply LSP code actions.',\n usageHint:\n 'Use to inspect quick fixes and refactors. This tool is confirm-gated because apply mode can mutate files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n end_line: { type: 'integer' },\n end_character: { type: 'integer' },\n apply: { type: 'integer' },\n kind_filter: { type: 'string' },\n },\n required: ['path', 'line'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsCodeAction(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support code actions`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const start = humanToLSP(content, { line: input.line, character: input.character ?? 1 });\n const end = humanToLSP(content, {\n line: input.end_line ?? input.line,\n character: input.end_character ?? input.character ?? 1,\n });\n const actions = await server.codeAction(\n {\n textDocument: { uri: pathToUri(file) },\n range: { start, end },\n context: {\n diagnostics: server.getDiagnostics(pathToUri(file)),\n only: input.kind_filter ? [input.kind_filter] : undefined,\n },\n },\n 10_000,\n opts.signal,\n );\n if (input.apply === undefined) return formatActions(actions);\n const action = actions[input.apply];\n if (!action) return `No code action at index ${input.apply}.`;\n const parts: string[] = [`Applying [${input.apply}] ${action.title}`];\n if (action.edit) {\n parts.push(summarizeWorkspaceEdit(action.edit, ctx.cwd));\n const applied = await applyWorkspaceEdit(action.edit, deps.tracker);\n parts.push(`Applied: ${applied.edits} edits across ${applied.files.length} files.`);\n }\n if (action.command) {\n await server.executeCommand(action.command, 10_000, opts.signal);\n parts.push(`Executed command: ${action.command.command}`);\n }\n return parts.join('\\n');\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\nfunction formatActions(actions: CodeAction[]): string {\n if (actions.length === 0) return 'No code actions available.';\n return actions.map((a, i) => `[${i}] ${a.kind ?? 'action'} ${a.title}`).join('\\n');\n}\n","/**\n * Shared constants for the plug-lsp package.\n */\nexport const LSP_CONSTANTS = Object.freeze({\n /** Default timeout for LSP tool operations (5 seconds). */\n TOOL_TIMEOUT_MS: 5000,\n} as const);","import type { DocumentSymbol, SymbolInformation } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatDocumentSymbols(\n path: string,\n symbols: DocumentSymbol[] | SymbolInformation[] | null,\n cwd: string,\n): string {\n if (!symbols || symbols.length === 0) return 'No symbols found.';\n const lines = [`${displayPath(path, cwd)}:`];\n for (const sym of symbols) appendSymbol(lines, sym, 1, cwd);\n return lines.join('\\n');\n}\n\nexport function formatWorkspaceSymbols(\n symbols: SymbolInformation[] | null,\n query: string,\n cwd: string,\n limit = 100,\n): string {\n if (!symbols || symbols.length === 0) return `No symbols matching \"${query}\".`;\n const lines = [`${symbols.length} symbols matching \"${query}\":`];\n for (const sym of symbols.slice(0, limit)) {\n lines.push(\n ` ${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n if (symbols.length > limit) lines.push(` ... truncated ${symbols.length - limit} more`);\n return lines.join('\\n');\n}\n\nfunction appendSymbol(\n lines: string[],\n sym: DocumentSymbol | SymbolInformation,\n depth: number,\n cwd: string,\n): void {\n const indent = ' '.repeat(depth);\n if ('selectionRange' in sym) {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} (L${sym.selectionRange.start.line + 1})`,\n );\n for (const child of sym.children ?? []) appendSymbol(lines, child, depth + 1, cwd);\n } else {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n}\n\nfunction kindName(kind: number): string {\n return (\n [\n 'file',\n 'module',\n 'namespace',\n 'package',\n 'class',\n 'method',\n 'property',\n 'field',\n 'constructor',\n 'enum',\n 'interface',\n 'function',\n 'variable',\n 'constant',\n 'string',\n 'number',\n 'boolean',\n 'array',\n 'object',\n 'key',\n 'null',\n 'enumMember',\n 'struct',\n 'event',\n 'operator',\n 'typeParameter',\n ][kind - 1] ?? 'symbol'\n );\n}\n\n// ─── Codebase LSP Search formatter ─────────────────────────────────────────────\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n/**\n * Format `codebase-lsp-search` output for human-readable display.\n */\nexport function formatCodebaseLspResults(output: CodebaseLspSearchOutput, cwd: string): string {\n const { results, totalIndex, totalLsp, query, usedIndex, usedLsp } = output;\n\n if (results.length === 0) {\n const sources: string[] = [];\n if (usedIndex) sources.push(`index(${totalIndex})`);\n if (usedLsp) sources.push(`lsp(${totalLsp})`);\n return `No symbols matching \"${query}\". Searched: ${sources.join(', ') || 'none'}.`;\n }\n\n const lines: string[] = [];\n lines.push(`${results.length} results for \"${query}\" (index:${totalIndex} lsp:${totalLsp}):`);\n\n for (const r of results) {\n const sourceTag = r.source === 'index' ? '[index]' : `[lsp:${r.server ?? '?'}]`;\n const scoreTag = r.score !== undefined ? ` score=${r.score.toFixed(2)}` : '';\n const location = `${displayPath(r.file, cwd)}:${r.line}`;\n\n if (r.snippet) {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n lines.push(` ${r.snippet}`);\n } else {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * `codebase-lsp-search` — index-first, LSP-fallback symbol search.\n *\n * Architecture:\n * 1. Query the SQLite+BM25 codebase index (fast)\n * 2. If index has 0 results OR preferLsp=true, fall back to live LSP workspaceSymbol queries\n * 3. Deduplicate results present in both sources\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport {\n IndexStore,\n buildBm25Index,\n buildIndexableText,\n tokenise,\n internalKindToLspKind,\n lspKindToInternalKind,\n codebaseIndexDirOverride,\n} from '@wrongstack/tools/codebase-index/index';\n\nimport { LSP_CONSTANTS } from '../constants.js';\nimport { formatCodebaseLspResults } from '../formatters/symbols.js';\nimport { supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { type ToolDeps, stringifyToolError } from './shared.js';\n\n// ─── Input / Output types ───────────────────────────────────────────────────────\n\ninterface CodebaseLspSearchInput {\n query: string;\n limit?: number;\n preferLsp?: boolean;\n}\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string;\n score?: number;\n snippet?: string;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n// ─── Tool factory ──────────────────────────────────────────────────────────────\n\nexport function createCodebaseLspSearchTool(deps: ToolDeps): Tool<CodebaseLspSearchInput, string> {\n return {\n name: 'codebase-lsp-search',\n description:\n 'Search code symbols using a fast SQLite+BM25 index, falling back to live LSP workspaceSymbol queries when needed.',\n usageHint:\n 'Pass `query` to search. Use `limit` (default 20) to cap results. Set `preferLsp=true` to skip the index and query LSP servers directly for live precision.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query string' },\n limit: {\n type: 'integer',\n description: 'Maximum number of results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n preferLsp: {\n type: 'boolean',\n description:\n 'If true, skip the index and query LSP servers directly. Useful for live precision when the index may be stale.',\n },\n },\n required: ['query'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS * 2, // Allow extra time for LSP round-robins\n async execute(input, ctx, opts) {\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n const query = input.query ?? '';\n\n let indexResults: CodebaseLspResult[] = [];\n let totalIndex = 0;\n let usedIndex = false;\n let usedLsp = false;\n let lspResults: CodebaseLspResult[] = [];\n let totalLsp = 0;\n\n // ── Step 1: Query index (unless preferLsp is set) ──────────────────────\n if (!input.preferLsp) {\n const indexOutcome = await searchIndex(\n ctx.projectRoot,\n query,\n limit,\n codebaseIndexDirOverride(ctx),\n );\n indexResults = indexOutcome.results;\n totalIndex = indexOutcome.total;\n usedIndex = true;\n }\n\n // ── Step 2: LSP fallback ───────────────────────────────────────────────\n // Fall back to LSP when:\n // - preferLsp is true (user wants live data), OR\n // - index returned 0 results\n const needsLsp = input.preferLsp || indexResults.length === 0;\n\n if (needsLsp) {\n const lspOutcome = await searchLsp(deps, query, limit, opts.signal);\n lspResults = lspOutcome.results;\n totalLsp = lspOutcome.total;\n usedLsp = true;\n }\n\n // ── Step 3: Merge & deduplicate ────────────────────────────────────────\n const output = mergeResults(indexResults, lspResults, limit);\n\n const fullOutput: CodebaseLspSearchOutput = {\n results: output,\n totalIndex,\n totalLsp,\n query,\n usedIndex,\n usedLsp,\n };\n\n return formatCodebaseLspResults(fullOutput, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\n// ─── Index search ─────────────────────────────────────────────────────────────\n\nasync function searchIndex(\n projectRoot: string,\n query: string,\n limit: number,\n indexDir?: string,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const store = new IndexStore(projectRoot, { indexDir });\n try {\n const candidates = store.search(query);\n\n if (candidates.length === 0) {\n return { results: [], total: 0 };\n }\n\n // Build BM25 index over candidates\n const indexable = candidates.map((c) => ({\n id: c.id,\n text: buildIndexableText(c.name, c.signature, c.docComment),\n }));\n const bm25 = buildBm25Index(indexable);\n\n // Score and rank\n const scored = bm25.score(query, (id) => candidates.some((c) => c.id === id));\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, limit);\n const qTokens = tokenise(query);\n\n const results: CodebaseLspResult[] = top.map(({ id, score }) => {\n const c = candidates.find((c) => c.id === id)!;\n const lspKind = internalKindToLspKind(c.kind) ?? 0;\n const snippet = bm25.extractSnippet(id, qTokens);\n return {\n name: c.name,\n kind: c.kind,\n lspKind,\n file: c.file,\n line: c.line,\n source: 'index' as const,\n score,\n snippet,\n };\n });\n\n return { results, total: candidates.length };\n } finally {\n store.close();\n }\n}\n\n// ─── LSP search ───────────────────────────────────────────────────────────────\n\nasync function searchLsp(\n deps: ToolDeps,\n query: string,\n limit: number,\n signal: AbortSignal,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const merged: SymbolInformation[] = [];\n\n const servers = deps.registry.list();\n const promises: Array<Promise<void>> = [];\n\n for (const server of servers) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n\n promises.push(\n (async () => {\n try {\n const result = await server.workspaceSymbol(\n { query },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n signal,\n );\n if (result) {\n for (const sym of result) {\n merged.push(sym);\n }\n }\n } catch {\n // Individual server errors are non-fatal; skip this server's results\n }\n })(),\n );\n }\n\n await Promise.all(promises);\n\n const deduplicated = deduplicateByKey(\n merged.map((sym) => ({\n name: sym.name,\n kind: lspKindToInternalKind(sym.kind) ?? 'symbol',\n lspKind: sym.kind,\n file: sym.location.uri.startsWith('file://')\n ? sym.location.uri.slice(7) // strip \"file://\"\n : sym.location.uri,\n line: sym.location.range.start.line + 1, // convert to 1-based\n source: 'lsp' as const,\n server: serverNameFromConfig(deps, sym),\n })),\n );\n\n return {\n results: deduplicated.slice(0, limit),\n total: deduplicated.length,\n };\n}\n\nfunction serverNameFromConfig(deps: ToolDeps, sym: SymbolInformation): string {\n // Try to find which server owns this file by its language\n // Heuristic: look at file extension\n const file = sym.location.uri;\n const ext = file.includes('.') ? file.split('.').pop()!.toLowerCase() : '';\n\n const langMap: Record<string, string[]> = {\n ts: ['typescript', 'tsserver'],\n tsx: ['typescript', 'tsserver'],\n js: ['javascript', 'typescript'],\n jsx: ['javascript', 'typescript'],\n py: ['python', 'pyright'],\n go: ['go', 'gopls'],\n rs: ['rust', 'rust-analyzer'],\n };\n\n const langs = langMap[ext] ?? [ext];\n const servers = deps.registry.list();\n\n for (const lang of langs) {\n for (const server of servers) {\n if (\n server.state === 'ready' &&\n server.config.languages.some((l) => l.toLowerCase() === lang.toLowerCase())\n ) {\n return server.name;\n }\n }\n }\n\n // Fallback: return first ready server\n return servers.find((s) => s.state === 'ready')?.name ?? 'unknown';\n}\n\n// ─── Merge & deduplication ────────────────────────────────────────────────────\n\nfunction mergeResults(\n indexResults: CodebaseLspResult[],\n lspResults: CodebaseLspResult[],\n limit: number,\n): CodebaseLspResult[] {\n const seen = new Map<string, CodebaseLspResult>();\n\n // Index results take priority (BM25-ranked)\n for (const r of indexResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n seen.set(key, r);\n }\n\n // LSP results fill in gaps (deduplicated)\n for (const r of lspResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n if (!seen.has(key)) {\n seen.set(key, r);\n }\n }\n\n // Sort: index results first (already ranked), then LSP results\n const merged = Array.from(seen.values());\n merged.sort((a, b) => {\n if (a.source === 'index' && b.source !== 'index') return -1;\n if (a.source !== 'index' && b.source === 'index') return 1;\n // Within same source, prefer higher score\n if (a.source === 'index' && b.source === 'index') {\n return (b.score ?? 0) - (a.score ?? 0);\n }\n return 0;\n });\n\n return merged.slice(0, limit);\n}\n\nfunction deduplicateByKey<T extends { name: string; file: string; line: number }>(\n items: T[],\n): T[] {\n const seen = new Set<string>();\n return items.filter((item) => {\n const key = `${item.file}:${item.line}:${item.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { LSP_CONSTANTS } from '../constants.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string;\n limit?: number;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Hover, MarkedString, MarkupContent } from 'vscode-languageserver-protocol';\n\nexport function formatHover(hover: Hover | null, maxChars = 4096): string {\n if (!hover) return 'No hover information.';\n const text = hoverContentsToString(hover.contents).trim();\n if (!text) return 'No hover information.';\n return text.length > maxChars ? `${text.slice(0, maxChars)}\\n...[truncated]` : text;\n}\n\nfunction hoverContentsToString(contents: Hover['contents']): string {\n if (typeof contents === 'string') return contents;\n if (Array.isArray(contents)) return contents.map(markedStringToString).join('\\n\\n');\n if ('kind' in contents && 'value' in contents) return (contents as MarkupContent).value;\n return markedStringToString(contents as MarkedString);\n}\n\nfunction markedStringToString(value: MarkedString): string {\n if (typeof value === 'string') return value;\n return `\\`\\`\\`${value.language}\\n${value.value}\\n\\`\\`\\``;\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatHover } from '../formatters/hover.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsHover } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface HoverInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createHoverTool(deps: ToolDeps): Tool<HoverInput, string> {\n return {\n name: 'lsp_hover',\n description: 'Get type information and documentation for a symbol.',\n usageHint: 'Use when you need a type/signature without opening the definition.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsHover(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support hover`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n return formatHover(\n await server.hover(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n ),\n );\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsReferences } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface ReferencesInput {\n path: string;\n line: number;\n character: number;\n include_declaration?: boolean;\n limit?: number;\n}\n\nexport function createReferencesTool(deps: ToolDeps): Tool<ReferencesInput, string> {\n return {\n name: 'lsp_references',\n description: 'Find references to a symbol.',\n usageHint: 'Use instead of grep when the symbol position is known; it is syntax-aware.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n include_declaration: { type: 'boolean' },\n limit: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsReferences(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support references`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.references(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n context: { includeDeclaration: input.include_declaration ?? true },\n },\n 10_000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport { formatDocumentSymbols, formatWorkspaceSymbols } from '../formatters/symbols.js';\nimport { supportsDocumentSymbol, supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface SymbolsInput {\n path?: string;\n query?: string;\n limit?: number;\n}\n\nexport function createSymbolsTool(deps: ToolDeps): Tool<SymbolsInput, string> {\n return {\n name: 'lsp_symbols',\n description: 'List symbols in a file or search workspace symbols.',\n usageHint: 'Pass `path` for a file outline, or `query` for workspace symbol search.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n query: { type: 'string' },\n limit: { type: 'integer' },\n },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDocumentSymbol(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support document symbols`,\n );\n }\n const symbols = await server.documentSymbol(\n { textDocument: { uri: pathToUri(file) } },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatDocumentSymbols(file, symbols, ctx.cwd);\n }\n const query = input.query ?? '';\n const merged: SymbolInformation[] = [];\n for (const server of deps.registry.list()) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n const result = await server.workspaceSymbol({ query }, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal);\n if (result) merged.push(...result);\n }\n return formatWorkspaceSymbols(merged, query, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodeActionsTool } from './code-actions.js';\nimport { createCodebaseLspSearchTool } from './codebase-lsp-search.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createHoverTool } from './hover.js';\nimport { createReferencesTool } from './references.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\nimport { createSymbolsTool } from './symbols.js';\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createReferencesTool(deps),\n createHoverTool(deps),\n createSymbolsTool(deps),\n createCodebaseLspSearchTool(deps),\n createRenameTool(deps),\n createCodeActionsTool(deps),\n ];\n}\n","import type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\n\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry } = {};\n const tracker = new DocumentTracker(() => holder.registry!, api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker.handleToolExecuted(event);\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/plug-lsp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack plugin that exposes Language Server Protocol tools.",
|
|
6
6
|
"repository": {
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"vscode-languageserver-protocol": "^3.17.5",
|
|
32
|
-
"@wrongstack/tools": "0.
|
|
32
|
+
"@wrongstack/tools": "0.10.0"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@wrongstack/core": "0.
|
|
35
|
+
"@wrongstack/core": "0.10.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^22.19.19",
|
|
39
39
|
"tsup": "^8.5.1",
|
|
40
40
|
"typescript": "^5.9.3",
|
|
41
|
-
"@wrongstack/core": "0.
|
|
41
|
+
"@wrongstack/core": "0.10.0"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public"
|