pybao-cli 1.3.66 → 1.3.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/REPL-DJM734CM.js +42 -0
  2. package/dist/{acp-CRORIP4U.js → acp-IE4X7ZN6.js} +29 -28
  3. package/dist/{acp-CRORIP4U.js.map → acp-IE4X7ZN6.js.map} +1 -1
  4. package/dist/{agentsValidate-GQLIBCH7.js → agentsValidate-MKLGV6YH.js} +7 -7
  5. package/dist/{ask-ZIKOLPEL.js → ask-L4NL5YZB.js} +25 -25
  6. package/dist/{autoUpdater-52EOWK7Q.js → autoUpdater-HIZW6RW5.js} +3 -3
  7. package/dist/{chunk-YZO54FC4.js → chunk-34YFVONG.js} +3 -3
  8. package/dist/{chunk-6SONRPL2.js → chunk-66Q7F6VR.js} +2 -2
  9. package/dist/{chunk-6J75N6QM.js → chunk-6LV6USMO.js} +1 -1
  10. package/dist/{chunk-R6KHNARS.js → chunk-AQXTZQ53.js} +2 -2
  11. package/dist/{chunk-NGDPJF42.js → chunk-AXOACBAT.js} +2 -2
  12. package/dist/{chunk-65HWALEX.js → chunk-BA47OUH4.js} +1 -1
  13. package/dist/{chunk-OAJUVQHX.js → chunk-BNGSVF2J.js} +1 -1
  14. package/dist/{chunk-DJKUB73J.js → chunk-C55WIL3X.js} +2 -2
  15. package/dist/{chunk-EDYTH7ZW.js → chunk-D4YLMKUI.js} +139 -63
  16. package/dist/chunk-D4YLMKUI.js.map +7 -0
  17. package/dist/{chunk-SHQDB7TS.js → chunk-E5WBVYYC.js} +159 -12
  18. package/dist/chunk-E5WBVYYC.js.map +7 -0
  19. package/dist/{chunk-FJ75CMJG.js → chunk-GKJ2UVO6.js} +3 -3
  20. package/dist/{chunk-5XROCABG.js → chunk-HRLQBOES.js} +1 -1
  21. package/dist/{chunk-QONPUH55.js → chunk-IZ3M5OX4.js} +3 -19
  22. package/dist/chunk-IZ3M5OX4.js.map +7 -0
  23. package/dist/{chunk-FRHRNMUY.js → chunk-NDB7EZE7.js} +4 -4
  24. package/dist/{chunk-NXE74FU6.js → chunk-NLYDLJGG.js} +3 -3
  25. package/dist/{chunk-O4T52FXE.js → chunk-OA6P7HKK.js} +1 -1
  26. package/dist/{chunk-7RTNDJPS.js → chunk-OZIA3O6P.js} +3 -3
  27. package/dist/{chunk-FG46BKMB.js → chunk-PI4E5VRN.js} +1 -1
  28. package/dist/{chunk-PRYONWPS.js → chunk-R6VHHI3G.js} +3 -3
  29. package/dist/{chunk-MXHGLOPM.js → chunk-SMHYMUYQ.js} +4 -4
  30. package/dist/{chunk-NSAD43DT.js → chunk-SPR7JVVT.js} +2 -2
  31. package/dist/{chunk-GXIZY2EJ.js → chunk-SXOAID2G.js} +1 -1
  32. package/dist/{chunk-HLZHG45G.js → chunk-TY5HBCY6.js} +3 -3
  33. package/dist/{chunk-6HVXE4WV.js → chunk-UQCJUCOM.js} +3 -3
  34. package/dist/chunk-UZ34JEUK.js +24 -0
  35. package/dist/chunk-UZ34JEUK.js.map +7 -0
  36. package/dist/{chunk-DMPEMAK5.js → chunk-V2HYOQO2.js} +3 -2
  37. package/dist/chunk-V2HYOQO2.js.map +7 -0
  38. package/dist/{chunk-PCBYO2CX.js → chunk-VQEYFHCS.js} +2 -2
  39. package/dist/{chunk-2E7J2ODZ.js → chunk-YDJKO722.js} +1 -1
  40. package/dist/{chunk-SRUCSPWB.js → chunk-YGXPUU5Q.js} +1 -1
  41. package/dist/{chunk-AZM43EPP.js → chunk-YLQNROYF.js} +39 -39
  42. package/dist/chunk-YLQNROYF.js.map +7 -0
  43. package/dist/{cli-U7LD56IV.js → cli-PY7HG5EY.js} +80 -79
  44. package/dist/{cli-U7LD56IV.js.map → cli-PY7HG5EY.js.map} +1 -1
  45. package/dist/commands-5CSQ5GGO.js +46 -0
  46. package/dist/{config-XP23QHNW.js → config-RJW36RLQ.js} +4 -4
  47. package/dist/{context-AH5LN5Q7.js → context-UPJIGJGW.js} +5 -5
  48. package/dist/{customCommands-P65AJJZJ.js → customCommands-TK6JH5JK.js} +4 -4
  49. package/dist/{env-MM7NR5WN.js → env-EH3S4WPV.js} +2 -2
  50. package/dist/index.js +3 -3
  51. package/dist/{llm-MEJLEPVT.js → llm-A7VDD3EC.js} +26 -26
  52. package/dist/{llmLazy-QPHLH6WK.js → llmLazy-W4G3KUIV.js} +1 -1
  53. package/dist/{loader-JB6W76U3.js → loader-MY5XCCA3.js} +4 -4
  54. package/dist/{lspAnchor-Z2WXIBNC.js → lspAnchor-5DXSPII5.js} +5 -4
  55. package/dist/{lspAnchor-Z2WXIBNC.js.map → lspAnchor-5DXSPII5.js.map} +1 -1
  56. package/dist/{manager-NREJKNPL.js → manager-RWXJYR32.js} +5 -4
  57. package/dist/{mcp-O6PAUWM7.js → mcp-PCBS4AIR.js} +7 -7
  58. package/dist/{mentionProcessor-XICJQB3S.js → mentionProcessor-LX5CKCGW.js} +5 -5
  59. package/dist/{messages-YM2WQHN6.js → messages-24CDBMXV.js} +1 -1
  60. package/dist/{model-CS437TVG.js → model-KL3RMVGS.js} +5 -5
  61. package/dist/{openai-HFIEXBJV.js → openai-Y6XHWIWL.js} +5 -5
  62. package/dist/{outputStyles-BYDQ44MF.js → outputStyles-T2FTKT7O.js} +4 -4
  63. package/dist/{pluginRuntime-VGGZHDLN.js → pluginRuntime-MLFDH5XG.js} +6 -6
  64. package/dist/{pluginValidation-QODKVL2A.js → pluginValidation-QRH2JQDW.js} +6 -6
  65. package/dist/prompts-6VD6YOL4.js +48 -0
  66. package/dist/{pybAgentSessionLoad-7NXAVKNS.js → pybAgentSessionLoad-L2SJR5BF.js} +4 -4
  67. package/dist/{pybAgentSessionResume-C2GFWBQV.js → pybAgentSessionResume-K6OWM6RG.js} +4 -4
  68. package/dist/{pybAgentStreamJsonSession-3Q3DQAVE.js → pybAgentStreamJsonSession-Q63IJMAO.js} +1 -1
  69. package/dist/{pybHooks-FPKIHECY.js → pybHooks-65PPV2GW.js} +4 -4
  70. package/dist/query-5BQJ3TJV.js +50 -0
  71. package/dist/{ripgrep-3LBNI2B2.js → ripgrep-WQEATYUJ.js} +3 -3
  72. package/dist/{skillMarketplace-7WRNINVK.js → skillMarketplace-XZ72GXV7.js} +3 -3
  73. package/dist/{smart-edit-J5J4S2TS.js → smart-edit-677MCQMW.js} +4 -2
  74. package/dist/{smart-edit-J5J4S2TS.js.map → smart-edit-677MCQMW.js.map} +1 -1
  75. package/dist/{state-MUEKUZ6X.js → state-Q2QXC77S.js} +2 -2
  76. package/dist/{theme-FO4T4R6D.js → theme-4REKDOVH.js} +5 -5
  77. package/dist/{toolPermissionSettings-Y3LNPCXT.js → toolPermissionSettings-DWLDFC6L.js} +6 -6
  78. package/dist/tools-NEWQPNHL.js +50 -0
  79. package/dist/{userInput-EZPAFVPK.js → userInput-3RJRG3AE.js} +27 -27
  80. package/package.json +3 -2
  81. package/dist/REPL-KV6VMZMF.js +0 -42
  82. package/dist/chunk-AZM43EPP.js.map +0 -7
  83. package/dist/chunk-DMPEMAK5.js.map +0 -7
  84. package/dist/chunk-EDYTH7ZW.js.map +0 -7
  85. package/dist/chunk-QONPUH55.js.map +0 -7
  86. package/dist/chunk-SHQDB7TS.js.map +0 -7
  87. package/dist/commands-O4J2KJK4.js +0 -46
  88. package/dist/prompts-DFIU3557.js +0 -48
  89. package/dist/query-N744NNT6.js +0 -50
  90. package/dist/tools-Q3N57RD6.js +0 -49
  91. /package/dist/{REPL-KV6VMZMF.js.map → REPL-DJM734CM.js.map} +0 -0
  92. /package/dist/{agentsValidate-GQLIBCH7.js.map → agentsValidate-MKLGV6YH.js.map} +0 -0
  93. /package/dist/{ask-ZIKOLPEL.js.map → ask-L4NL5YZB.js.map} +0 -0
  94. /package/dist/{autoUpdater-52EOWK7Q.js.map → autoUpdater-HIZW6RW5.js.map} +0 -0
  95. /package/dist/{chunk-YZO54FC4.js.map → chunk-34YFVONG.js.map} +0 -0
  96. /package/dist/{chunk-6SONRPL2.js.map → chunk-66Q7F6VR.js.map} +0 -0
  97. /package/dist/{chunk-6J75N6QM.js.map → chunk-6LV6USMO.js.map} +0 -0
  98. /package/dist/{chunk-R6KHNARS.js.map → chunk-AQXTZQ53.js.map} +0 -0
  99. /package/dist/{chunk-NGDPJF42.js.map → chunk-AXOACBAT.js.map} +0 -0
  100. /package/dist/{chunk-65HWALEX.js.map → chunk-BA47OUH4.js.map} +0 -0
  101. /package/dist/{chunk-OAJUVQHX.js.map → chunk-BNGSVF2J.js.map} +0 -0
  102. /package/dist/{chunk-DJKUB73J.js.map → chunk-C55WIL3X.js.map} +0 -0
  103. /package/dist/{chunk-FJ75CMJG.js.map → chunk-GKJ2UVO6.js.map} +0 -0
  104. /package/dist/{chunk-5XROCABG.js.map → chunk-HRLQBOES.js.map} +0 -0
  105. /package/dist/{chunk-FRHRNMUY.js.map → chunk-NDB7EZE7.js.map} +0 -0
  106. /package/dist/{chunk-NXE74FU6.js.map → chunk-NLYDLJGG.js.map} +0 -0
  107. /package/dist/{chunk-O4T52FXE.js.map → chunk-OA6P7HKK.js.map} +0 -0
  108. /package/dist/{chunk-7RTNDJPS.js.map → chunk-OZIA3O6P.js.map} +0 -0
  109. /package/dist/{chunk-FG46BKMB.js.map → chunk-PI4E5VRN.js.map} +0 -0
  110. /package/dist/{chunk-PRYONWPS.js.map → chunk-R6VHHI3G.js.map} +0 -0
  111. /package/dist/{chunk-MXHGLOPM.js.map → chunk-SMHYMUYQ.js.map} +0 -0
  112. /package/dist/{chunk-NSAD43DT.js.map → chunk-SPR7JVVT.js.map} +0 -0
  113. /package/dist/{chunk-GXIZY2EJ.js.map → chunk-SXOAID2G.js.map} +0 -0
  114. /package/dist/{chunk-HLZHG45G.js.map → chunk-TY5HBCY6.js.map} +0 -0
  115. /package/dist/{chunk-6HVXE4WV.js.map → chunk-UQCJUCOM.js.map} +0 -0
  116. /package/dist/{chunk-PCBYO2CX.js.map → chunk-VQEYFHCS.js.map} +0 -0
  117. /package/dist/{chunk-2E7J2ODZ.js.map → chunk-YDJKO722.js.map} +0 -0
  118. /package/dist/{chunk-SRUCSPWB.js.map → chunk-YGXPUU5Q.js.map} +0 -0
  119. /package/dist/{commands-O4J2KJK4.js.map → commands-5CSQ5GGO.js.map} +0 -0
  120. /package/dist/{config-XP23QHNW.js.map → config-RJW36RLQ.js.map} +0 -0
  121. /package/dist/{context-AH5LN5Q7.js.map → context-UPJIGJGW.js.map} +0 -0
  122. /package/dist/{customCommands-P65AJJZJ.js.map → customCommands-TK6JH5JK.js.map} +0 -0
  123. /package/dist/{env-MM7NR5WN.js.map → env-EH3S4WPV.js.map} +0 -0
  124. /package/dist/{llm-MEJLEPVT.js.map → llm-A7VDD3EC.js.map} +0 -0
  125. /package/dist/{llmLazy-QPHLH6WK.js.map → llmLazy-W4G3KUIV.js.map} +0 -0
  126. /package/dist/{loader-JB6W76U3.js.map → loader-MY5XCCA3.js.map} +0 -0
  127. /package/dist/{manager-NREJKNPL.js.map → manager-RWXJYR32.js.map} +0 -0
  128. /package/dist/{mcp-O6PAUWM7.js.map → mcp-PCBS4AIR.js.map} +0 -0
  129. /package/dist/{mentionProcessor-XICJQB3S.js.map → mentionProcessor-LX5CKCGW.js.map} +0 -0
  130. /package/dist/{messages-YM2WQHN6.js.map → messages-24CDBMXV.js.map} +0 -0
  131. /package/dist/{model-CS437TVG.js.map → model-KL3RMVGS.js.map} +0 -0
  132. /package/dist/{openai-HFIEXBJV.js.map → openai-Y6XHWIWL.js.map} +0 -0
  133. /package/dist/{outputStyles-BYDQ44MF.js.map → outputStyles-T2FTKT7O.js.map} +0 -0
  134. /package/dist/{pluginRuntime-VGGZHDLN.js.map → pluginRuntime-MLFDH5XG.js.map} +0 -0
  135. /package/dist/{pluginValidation-QODKVL2A.js.map → pluginValidation-QRH2JQDW.js.map} +0 -0
  136. /package/dist/{prompts-DFIU3557.js.map → prompts-6VD6YOL4.js.map} +0 -0
  137. /package/dist/{pybAgentSessionLoad-7NXAVKNS.js.map → pybAgentSessionLoad-L2SJR5BF.js.map} +0 -0
  138. /package/dist/{pybAgentSessionResume-C2GFWBQV.js.map → pybAgentSessionResume-K6OWM6RG.js.map} +0 -0
  139. /package/dist/{pybAgentStreamJsonSession-3Q3DQAVE.js.map → pybAgentStreamJsonSession-Q63IJMAO.js.map} +0 -0
  140. /package/dist/{pybHooks-FPKIHECY.js.map → pybHooks-65PPV2GW.js.map} +0 -0
  141. /package/dist/{query-N744NNT6.js.map → query-5BQJ3TJV.js.map} +0 -0
  142. /package/dist/{ripgrep-3LBNI2B2.js.map → ripgrep-WQEATYUJ.js.map} +0 -0
  143. /package/dist/{skillMarketplace-7WRNINVK.js.map → skillMarketplace-XZ72GXV7.js.map} +0 -0
  144. /package/dist/{state-MUEKUZ6X.js.map → state-Q2QXC77S.js.map} +0 -0
  145. /package/dist/{theme-FO4T4R6D.js.map → theme-4REKDOVH.js.map} +0 -0
  146. /package/dist/{toolPermissionSettings-Y3LNPCXT.js.map → toolPermissionSettings-DWLDFC6L.js.map} +0 -0
  147. /package/dist/{tools-Q3N57RD6.js.map → tools-NEWQPNHL.js.map} +0 -0
  148. /package/dist/{userInput-EZPAFVPK.js.map → userInput-3RJRG3AE.js.map} +0 -0
@@ -1,8 +1,14 @@
1
1
  import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
+ import {
4
+ levenshtein
5
+ } from "./chunk-UZ34JEUK.js";
3
6
  import {
4
7
  debug
5
- } from "./chunk-GXIZY2EJ.js";
8
+ } from "./chunk-SXOAID2G.js";
9
+ import {
10
+ getCwd
11
+ } from "./chunk-HRLQBOES.js";
6
12
  import {
7
13
  __require
8
14
  } from "./chunk-I3J4JYES.js";
@@ -10,7 +16,8 @@ import {
10
16
  // src/tools/search/LspTool/client/generic.ts
11
17
  import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from "vscode-jsonrpc/node.js";
12
18
  import { spawn } from "child_process";
13
- import { pathToFileURL } from "url";
19
+ import { pathToFileURL, fileURLToPath } from "url";
20
+ import { EventEmitter } from "events";
14
21
  var GenericLspClient = class {
15
22
  constructor(serverCommand, serverArgs, cwd, rootPath) {
16
23
  this.rootPath = rootPath;
@@ -39,6 +46,20 @@ var GenericLspClient = class {
39
46
  if (method === "window/logMessage" || method === "$/progress") {
40
47
  console.log(`[LSP Notification] ${method}:`, JSON.stringify(params));
41
48
  }
49
+ if (method === "textDocument/publishDiagnostics") {
50
+ try {
51
+ const uri = params.uri;
52
+ let filePath = uri;
53
+ if (uri.startsWith("file://")) {
54
+ filePath = fileURLToPath(uri);
55
+ }
56
+ const normalizedUri = this.normalizeUri(filePath);
57
+ this.diagnosticsMap.set(normalizedUri, params.diagnostics);
58
+ this.diagnosticEvents.emit("diagnostics", { uri, filePath, diagnostics: params.diagnostics });
59
+ } catch (e) {
60
+ console.error("[LSP] Error processing diagnostics:", e);
61
+ }
62
+ }
42
63
  });
43
64
  this.connection.onRequest((method, params) => {
44
65
  if (method === "workspace/configuration") {
@@ -54,6 +75,8 @@ var GenericLspClient = class {
54
75
  connection;
55
76
  process;
56
77
  capabilities;
78
+ diagnosticEvents = new EventEmitter();
79
+ diagnosticsMap = /* @__PURE__ */ new Map();
57
80
  normalizeUri(filePath) {
58
81
  let uri = pathToFileURL(filePath).href;
59
82
  if (process.platform === "win32") {
@@ -173,13 +196,39 @@ var GenericLspClient = class {
173
196
  };
174
197
  await this.connection.sendNotification("textDocument/didChange", params);
175
198
  }
199
+ async waitForReadiness(filePath, timeoutMs = 3e3) {
200
+ const normalizedUri = this.normalizeUri(filePath);
201
+ return new Promise((resolve) => {
202
+ let debounceTimer;
203
+ let timeoutTimer;
204
+ const cleanup = () => {
205
+ if (debounceTimer) clearTimeout(debounceTimer);
206
+ clearTimeout(timeoutTimer);
207
+ this.diagnosticEvents.off("diagnostics", handler);
208
+ };
209
+ const handler = (event) => {
210
+ if (event.uri === normalizedUri) {
211
+ if (debounceTimer) clearTimeout(debounceTimer);
212
+ debounceTimer = setTimeout(() => {
213
+ cleanup();
214
+ resolve();
215
+ }, 150);
216
+ }
217
+ };
218
+ this.diagnosticEvents.on("diagnostics", handler);
219
+ timeoutTimer = setTimeout(() => {
220
+ cleanup();
221
+ resolve();
222
+ }, timeoutMs);
223
+ });
224
+ }
176
225
  getDiagnostics(filePath) {
177
- return this.diagnostics.get(this.normalizeUri(filePath)) || [];
226
+ return this.diagnosticsMap.get(this.normalizeUri(filePath)) || [];
178
227
  }
179
228
  };
180
229
 
181
230
  // src/tools/search/LspTool/client/manager.ts
182
- import { extname } from "path";
231
+ import { extname, join as join2 } from "path";
183
232
 
184
233
  // src/tools/search/LspTool/registry.ts
185
234
  import { join, dirname } from "path";
@@ -196,11 +245,13 @@ var BaseLspServer = class {
196
245
  }
197
246
  }
198
247
  getLocalBinPath(binName, npmPackageName) {
199
- const ext = process.platform === "win32" ? ".cmd" : "";
248
+ const exts = process.platform === "win32" ? [".cmd", ".exe", ".ps1", ""] : [""];
200
249
  const localNodeModulesBin = join(process.cwd(), "node_modules", ".bin");
201
- let localBinPath = join(localNodeModulesBin, `${binName}${ext}`);
202
- if (existsSync(localBinPath)) {
203
- return localBinPath;
250
+ for (const ext of exts) {
251
+ const localBinPath = join(localNodeModulesBin, `${binName}${ext}`);
252
+ if (existsSync(localBinPath)) {
253
+ return localBinPath;
254
+ }
204
255
  }
205
256
  try {
206
257
  const pkgName = npmPackageName || binName;
@@ -216,9 +267,11 @@ var BaseLspServer = class {
216
267
  }
217
268
  if (pkgRoot) {
218
269
  const nodeModulesRoot = join(pkgRoot, "..");
219
- const potentialBin = join(nodeModulesRoot, ".bin", `${binName}${ext}`);
220
- if (existsSync(potentialBin)) {
221
- return potentialBin;
270
+ for (const ext of exts) {
271
+ const potentialBin = join(nodeModulesRoot, ".bin", `${binName}${ext}`);
272
+ if (existsSync(potentialBin)) {
273
+ return potentialBin;
274
+ }
222
275
  }
223
276
  }
224
277
  } catch (e) {
@@ -415,6 +468,14 @@ var LspServerRegistry = class _LspServerRegistry {
415
468
  "bash-language-server",
416
469
  ["start"]
417
470
  ));
471
+ this.register(new GenericNpmServer(
472
+ "typescript-language-server",
473
+ [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"],
474
+ ["tsconfig.json", "package.json", "jsconfig.json"],
475
+ "typescript-language-server",
476
+ "typescript-language-server",
477
+ ["--stdio"]
478
+ ));
418
479
  this.register(new GenericNpmServer(
419
480
  "yaml-language-server",
420
481
  [".yaml", ".yml"],
@@ -659,6 +720,7 @@ var LspServerRegistry = class _LspServerRegistry {
659
720
  };
660
721
 
661
722
  // src/tools/search/LspTool/client/manager.ts
723
+ import { readdir, readFile } from "fs/promises";
662
724
  var LspClientManager = class _LspClientManager {
663
725
  static instance;
664
726
  clients = /* @__PURE__ */ new Map();
@@ -670,6 +732,49 @@ var LspClientManager = class _LspClientManager {
670
732
  }
671
733
  return _LspClientManager.instance;
672
734
  }
735
+ getLanguageId(ext) {
736
+ const map = {
737
+ ".ts": "typescript",
738
+ ".tsx": "typescriptreact",
739
+ ".js": "javascript",
740
+ ".jsx": "javascriptreact",
741
+ ".py": "python",
742
+ ".java": "java",
743
+ ".cs": "csharp",
744
+ ".cpp": "cpp",
745
+ ".c": "c",
746
+ ".rs": "rust",
747
+ ".go": "go"
748
+ };
749
+ return map[ext] || "plaintext";
750
+ }
751
+ async ensureWorkspaceClients(rootPath) {
752
+ try {
753
+ const files = await readdir(rootPath, { withFileTypes: true });
754
+ const extensionMap = /* @__PURE__ */ new Map();
755
+ for (const file of files) {
756
+ if (file.isFile()) {
757
+ const ext = extname(file.name);
758
+ if (ext && !extensionMap.has(ext)) {
759
+ extensionMap.set(ext, join2(rootPath, file.name));
760
+ }
761
+ }
762
+ }
763
+ for (const [ext, realPath] of extensionMap) {
764
+ const client = await this.getClient(realPath, rootPath);
765
+ if (client) {
766
+ try {
767
+ const content = await readFile(realPath, "utf-8");
768
+ await client.didOpen(realPath, content, this.getLanguageId(ext));
769
+ await client.waitForReadiness(realPath, 2e3);
770
+ } catch (e) {
771
+ }
772
+ } else {
773
+ }
774
+ }
775
+ } catch (e) {
776
+ }
777
+ }
673
778
  async getClient(filePath, rootPath) {
674
779
  const ext = extname(filePath);
675
780
  const serverInfo = LspServerRegistry.getInstance().getServerForExtension(ext);
@@ -707,7 +812,10 @@ var LspClientManager = class _LspClientManager {
707
812
  }
708
813
  this.clients.clear();
709
814
  }
710
- async workspaceSymbol(query) {
815
+ async workspaceSymbol(query, rootPath = getCwd()) {
816
+ if (this.clients.size === 0) {
817
+ await this.ensureWorkspaceClients(rootPath);
818
+ }
711
819
  const results = [];
712
820
  for (const client of this.clients.values()) {
713
821
  try {
@@ -718,8 +826,47 @@ var LspClientManager = class _LspClientManager {
718
826
  } catch (e) {
719
827
  }
720
828
  }
829
+ if (results.length === 0 && query.length > 0) {
830
+ for (const client of this.clients.values()) {
831
+ try {
832
+ const broadSymbols = await client.workspaceSymbol("");
833
+ if (broadSymbols && Array.isArray(broadSymbols)) {
834
+ for (const sym of broadSymbols) {
835
+ const dist = levenshtein(query, sym.name);
836
+ if (dist <= 2 || dist <= query.length * 0.3) {
837
+ results.push(sym);
838
+ }
839
+ }
840
+ }
841
+ } catch (e) {
842
+ }
843
+ }
844
+ }
721
845
  return results;
722
846
  }
847
+ async documentSymbol(filePath, rootPath = getCwd()) {
848
+ const client = await this.getClient(filePath, rootPath);
849
+ if (!client) {
850
+ return [];
851
+ }
852
+ try {
853
+ const content = await readFile(filePath, "utf-8");
854
+ const languageId = this.getLanguageId(extname(filePath));
855
+ await client.didOpen(filePath, content, languageId);
856
+ await client.waitForReadiness(filePath, 2e3);
857
+ const symbols = await client.documentSymbol(filePath);
858
+ return symbols || [];
859
+ } catch (e) {
860
+ return [];
861
+ }
862
+ }
863
+ async getDiagnostics(filePath, rootPath = getCwd()) {
864
+ const client = await this.getClient(filePath, rootPath);
865
+ if (!client) {
866
+ return [];
867
+ }
868
+ return client.getDiagnostics(filePath);
869
+ }
723
870
  };
724
871
 
725
872
  export {
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tools/search/LspTool/client/generic.ts", "../src/tools/search/LspTool/client/manager.ts", "../src/tools/search/LspTool/registry.ts"],
4
+ "sourcesContent": ["import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node.js'\nimport type { MessageConnection } from 'vscode-jsonrpc'\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from 'child_process'\nimport { spawn } from 'child_process'\nimport { pathToFileURL, fileURLToPath } from 'url'\nimport { EventEmitter } from 'events'\n\nexport class GenericLspClient {\n private connection: MessageConnection\n private process: ChildProcessWithoutNullStreams\n public capabilities: any\n private diagnosticEvents = new EventEmitter()\n private diagnosticsMap = new Map<string, any[]>()\n\n constructor(\n serverCommand: string,\n serverArgs: string[],\n cwd: string,\n private rootPath: string\n ) {\n // console.log('[GenericLspClient] Spawning:', serverCommand, serverArgs.join(' '))\n const env = {\n ...process.env,\n // Remove potentially conflicting variables\n NODE_OPTIONS: undefined,\n TS_NODE_PROJECT: undefined,\n ELECTRON_RUN_AS_NODE: undefined,\n }\n \n const options: SpawnOptions = {\n cwd,\n stdio: 'pipe',\n env,\n shell: false\n }\n\n this.process = spawn(serverCommand, serverArgs, options)\n\n this.process.stderr.on('data', (data) => {\n console.error(`[LSP Stderr] ${data}`)\n })\n\n this.connection = createMessageConnection(\n new StreamMessageReader(this.process.stdout),\n new StreamMessageWriter(this.process.stdin)\n )\n\n this.connection.onNotification((method, params) => {\n if (method === 'window/logMessage' || method === '$/progress') {\n console.log(`[LSP Notification] ${method}:`, JSON.stringify(params))\n }\n if (method === 'textDocument/publishDiagnostics') {\n try {\n const uri = params.uri;\n let filePath = uri;\n if (uri.startsWith('file://')) {\n filePath = fileURLToPath(uri);\n }\n // Store diagnostics\n const normalizedUri = this.normalizeUri(filePath);\n this.diagnosticsMap.set(normalizedUri, params.diagnostics);\n // console.log(`[LSP] Stored diagnostics for ${normalizedUri}: ${params.diagnostics.length} items`)\n \n this.diagnosticEvents.emit('diagnostics', { uri, filePath, diagnostics: params.diagnostics });\n } catch (e) {\n console.error('[LSP] Error processing diagnostics:', e);\n }\n }\n })\n\n this.connection.onRequest((method, params) => {\n // console.log(`[LSP Request] ${method}:`, JSON.stringify(params))\n if (method === 'workspace/configuration') {\n // Return empty config for each requested item\n return Array.isArray(params.items) ? params.items.map(() => ({})) : []\n }\n if (method === 'client/registerCapability') {\n return null\n }\n return null\n })\n\n this.connection.listen()\n }\n\n public normalizeUri(filePath: string): string {\n let uri = pathToFileURL(filePath).href\n if (process.platform === 'win32') {\n uri = uri.replace(/^file:\\/\\/\\/([a-zA-Z]):\\//, (match, drive) => {\n return `file:///${drive.toLowerCase()}%3A/`\n })\n }\n return uri\n }\n\n async initialize() {\n const rootUri = this.normalizeUri(this.rootPath)\n \n console.log('[GenericLspClient] Initializing with normalized rootUri:', rootUri)\n const params = {\n processId: process.pid,\n rootUri,\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n willSave: false,\n willSaveWaitUntil: false,\n didSave: true\n },\n hover: {\n contentFormat: ['markdown', 'plaintext']\n },\n definition: {},\n references: {}\n },\n workspace: {\n workspaceFolders: true\n }\n },\n workspaceFolders: [\n {\n name: 'workspace',\n uri: this.normalizeUri(this.rootPath)\n }\n ]\n }\n\n const result = await this.connection.sendRequest('initialize', params)\n await this.connection.sendNotification('initialized', {})\n \n // Notify configuration change (empty) to trigger analysis if needed\n await this.connection.sendNotification('workspace/didChangeConfiguration', { settings: {} })\n \n // Give server a moment to settle\n await new Promise(resolve => setTimeout(resolve, 100))\n\n this.capabilities = (result as any).capabilities\n return result\n }\n\n async shutdown() {\n try {\n await this.connection.sendRequest('shutdown')\n await this.connection.sendNotification('exit')\n } catch (error) {\n // Ignore errors during shutdown\n }\n this.connection.dispose()\n this.process.kill()\n }\n\n async goToDefinition(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/definition', params)\n }\n\n async findReferences(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 },\n context: { includeDeclaration: true }\n }\n return this.connection.sendRequest('textDocument/references', params)\n }\n\n async hover(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/hover', params)\n }\n\n async documentSymbol(filePath: string) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) }\n }\n return this.connection.sendRequest('textDocument/documentSymbol', params)\n }\n\n async workspaceSymbol(query: string) {\n const params = {\n query\n }\n return this.connection.sendRequest('workspace/symbol', params)\n }\n\n async goToImplementation(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/implementation', params)\n }\n\n async didOpen(filePath: string, content: string, languageId: string) {\n const params = {\n textDocument: {\n uri: this.normalizeUri(filePath),\n languageId,\n version: 1,\n text: content\n }\n }\n await this.connection.sendNotification('textDocument/didOpen', params)\n }\n\n async didChange(filePath: string, content: string, version: number) {\n const params = {\n textDocument: {\n uri: this.normalizeUri(filePath),\n version\n },\n contentChanges: [{ text: content }]\n }\n await this.connection.sendNotification('textDocument/didChange', params)\n }\n\n async waitForReadiness(filePath: string, timeoutMs: number = 3000): Promise<void> {\n const normalizedUri = this.normalizeUri(filePath);\n \n return new Promise<void>((resolve) => {\n let debounceTimer: NodeJS.Timeout | undefined;\n let timeoutTimer: NodeJS.Timeout;\n \n const cleanup = () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n clearTimeout(timeoutTimer);\n this.diagnosticEvents.off('diagnostics', handler);\n };\n\n const handler = (event: any) => {\n // Check if this diagnostic is for our file\n if (event.uri === normalizedUri) {\n // Reset debounce timer\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n cleanup();\n resolve();\n }, 150); // 150ms debounce\n }\n };\n\n // Setup listener\n this.diagnosticEvents.on('diagnostics', handler);\n\n // Setup timeout (Safety Net)\n timeoutTimer = setTimeout(() => {\n cleanup();\n resolve(); // Resolve anyway to avoid blocking forever\n }, timeoutMs);\n });\n }\n\n getDiagnostics(filePath: string): any[] {\n return this.diagnosticsMap.get(this.normalizeUri(filePath)) || []\n }\n}\n", "import { GenericLspClient } from './generic'\nimport { extname, join } from 'path'\nimport { LspServerRegistry } from '../registry'\nimport { readdir, readFile } from 'fs/promises'\nimport { getCwd } from '@utils/state'\nimport { levenshtein } from '@utils/text/smart-edit/levenshtein'\n\nexport class LspClientManager {\n private static instance: LspClientManager\n private clients: Map<string, GenericLspClient> = new Map()\n\n private constructor() {}\n\n static getInstance(): LspClientManager {\n if (!LspClientManager.instance) {\n LspClientManager.instance = new LspClientManager()\n }\n return LspClientManager.instance\n }\n\n private getLanguageId(ext: string): string {\n const map: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.py': 'python',\n '.java': 'java',\n '.cs': 'csharp',\n '.cpp': 'cpp',\n '.c': 'c',\n '.rs': 'rust',\n '.go': 'go'\n }\n return map[ext] || 'plaintext'\n }\n\n private async ensureWorkspaceClients(rootPath: string) {\n try {\n // Heuristic: Scan root directory for file extensions to auto-detect needed servers\n const files = await readdir(rootPath, { withFileTypes: true })\n const extensionMap = new Map<string, string>() // ext -> realFilePath\n\n for (const file of files) {\n if (file.isFile()) {\n const ext = extname(file.name)\n if (ext && !extensionMap.has(ext)) {\n extensionMap.set(ext, join(rootPath, file.name))\n }\n }\n }\n \n // Try to initialize server for each found extension\n for (const [ext, realPath] of extensionMap) {\n // getClient will trigger server initialization if not already running\n // console.log('[LspClientManager] Initializing client for', ext, realPath)\n const client = await this.getClient(realPath, rootPath)\n \n if (client) {\n // Phase 8: Warmup with Touch & Wait\n try {\n // console.log('[LspClientManager] Warming up', realPath)\n const content = await readFile(realPath, 'utf-8')\n await client.didOpen(realPath, content, this.getLanguageId(ext))\n await client.waitForReadiness(realPath, 2000)\n // console.log('[LspClientManager] Warmup complete for', realPath)\n } catch (e) {\n // console.error('[LspClientManager] Warmup failed', e)\n // Ignore warmup errors\n }\n } else {\n // console.log('[LspClientManager] Failed to get client for', ext)\n }\n }\n } catch (e) {\n // ignore scan errors\n }\n }\n\n async getClient(filePath: string, rootPath: string): Promise<GenericLspClient | null> {\n const ext = extname(filePath)\n const serverInfo = LspServerRegistry.getInstance().getServerForExtension(ext)\n \n if (!serverInfo) {\n return null\n }\n\n // Ensure installed\n try {\n const ready = await serverInfo.prepare()\n if (!ready) {\n return null\n }\n } catch (e) {\n return null\n }\n\n const cmd = await serverInfo.getCommand(rootPath)\n if (!cmd) {\n return null\n }\n\n const key = `${rootPath}:${serverInfo.id}`\n let client = this.clients.get(key)\n\n if (!client) {\n client = new GenericLspClient(cmd.command, cmd.args, rootPath, rootPath)\n try {\n await client.initialize()\n this.clients.set(key, client)\n } catch (error) {\n // console.error(`Failed to initialize LSP client for ${serverInfo.id}:`, error)\n return null\n }\n }\n\n return client\n }\n \n async shutdownAll() {\n for (const client of this.clients.values()) {\n await client.shutdown()\n }\n this.clients.clear()\n }\n\n async workspaceSymbol(query: string, rootPath: string = getCwd()): Promise<any[]> {\n // Remediation 1.1: Ensure clients initialized\n if (this.clients.size === 0) {\n await this.ensureWorkspaceClients(rootPath)\n }\n\n const results: any[] = []\n for (const client of this.clients.values()) {\n try {\n const symbols = await client.workspaceSymbol(query)\n if (symbols && Array.isArray(symbols)) {\n results.push(...symbols)\n }\n } catch (e) {\n // ignore\n }\n }\n\n // Remediation 1.2: Fuzzy Fallback (Client-side)\n if (results.length === 0 && query.length > 0) {\n for (const client of this.clients.values()) {\n try {\n // Try to get broad list (empty query)\n // Note: Some servers might return too many results or reject empty query.\n // Ideally we'd have a 'getAllSymbols' capability check.\n // For now, we try.\n const broadSymbols = await client.workspaceSymbol('') \n if (broadSymbols && Array.isArray(broadSymbols)) {\n for (const sym of broadSymbols) {\n const dist = levenshtein(query, sym.name)\n // Allow distance <= 2 or 30% of length\n if (dist <= 2 || dist <= query.length * 0.3) {\n results.push(sym)\n }\n }\n }\n } catch (e) {\n // ignore\n }\n }\n }\n\n return results\n }\n\n async documentSymbol(filePath: string, rootPath: string = getCwd()): Promise<any[]> {\n const client = await this.getClient(filePath, rootPath)\n if (!client) {\n return []\n }\n\n try {\n const content = await readFile(filePath, 'utf-8')\n const languageId = this.getLanguageId(extname(filePath))\n await client.didOpen(filePath, content, languageId)\n // Phase 8: Perception-Aware Wait\n await client.waitForReadiness(filePath, 2000)\n \n const symbols = await client.documentSymbol(filePath)\n return symbols || []\n } catch (e) {\n // console.error(`Failed to get document symbols for ${filePath}:`, e)\n return []\n }\n }\n\n async getDiagnostics(filePath: string, rootPath: string = getCwd()): Promise<any[]> {\n const client = await this.getClient(filePath, rootPath)\n if (!client) {\n return []\n }\n return client.getDiagnostics(filePath)\n }\n}\n", "import { join, dirname } from 'path'\nimport { existsSync, mkdirSync } from 'fs'\nimport { spawnSync, spawn } from 'child_process'\nimport { getToolsDir, findNearestRoot } from './utils'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\n\nexport interface LspServerInfo {\n id: string\n extensions: string[]\n rootMarkers: string[]\n \n /**\n * Check if the server is installed and ready.\n * If not, it may try to install it.\n */\n prepare(): Promise<boolean>\n \n /**\n * Get the command and args to start the server.\n */\n getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null>\n}\n\nabstract class BaseLspServer implements LspServerInfo {\n abstract id: string\n abstract extensions: string[]\n abstract rootMarkers: string[]\n\n abstract prepare(): Promise<boolean>\n abstract getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null>\n\n protected isInPath(cmd: string): boolean {\n try {\n const where = process.platform === 'win32' ? 'where' : 'which'\n const result = spawnSync(where, [cmd], { encoding: 'utf8' })\n return result.status === 0\n } catch {\n return false\n }\n }\n\n protected getLocalBinPath(binName: string, npmPackageName?: string): string {\n const exts = process.platform === 'win32' ? ['.cmd', '.exe', '.ps1', ''] : ['']\n\n // Strategy 1: Check node_modules/.bin in the current project (pre-installed)\n const localNodeModulesBin = join(process.cwd(), 'node_modules', '.bin')\n \n for (const ext of exts) {\n const localBinPath = join(localNodeModulesBin, `${binName}${ext}`)\n if (existsSync(localBinPath)) {\n return localBinPath\n }\n }\n\n // Try finding via require.resolve (more robust for finding pre-installed packages)\n try {\n const pkgName = npmPackageName || binName;\n \n const pkgEntry = require.resolve(pkgName, { paths: [process.cwd(), __dirname] })\n \n // Use the package root to find the .bin directory at the top level node_modules\n // Note: require.resolve returns the main file.\n // e.g. .../node_modules/pyright/dist/index.js\n // We need .../node_modules/.bin/pyright-langserver\n \n // Let's assume standard npm hoisting structure:\n // If pkg is at /path/to/node_modules/pkgName\n // Then bin is at /path/to/node_modules/.bin/binName\n \n let current = pkgEntry\n let pkgRoot = ''\n for (let i = 0; i < 5; i++) {\n current = join(current, '..')\n if (existsSync(join(current, 'package.json'))) {\n pkgRoot = current\n break\n }\n }\n \n if (pkgRoot) {\n const nodeModulesRoot = join(pkgRoot, '..')\n for (const ext of exts) {\n const potentialBin = join(nodeModulesRoot, '.bin', `${binName}${ext}`)\n if (existsSync(potentialBin)) {\n return potentialBin\n }\n }\n }\n } catch (e) {}\n\n\n // Strategy 2: Check global tools directory (GlobalToolManager)\n // Deprecated in favor of pre-installed node_modules\n \n return ''\n }\n}\n\nexport class GenericNpmServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n npmPackage: string\n binName: string\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], npmPackage: string, binName: string, args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.npmPackage = npmPackage\n this.binName = binName\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n if (this.isInPath(this.binName)) {\n return true\n }\n \n // Check local node_modules\n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return true\n }\n \n // No auto-install anymore\n return false\n }\n\n async getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null> {\n // Optimization for Windows: Always try to run node script directly to avoid cmd.exe issues\n // We do this BEFORE checking PATH because 'bun run' adds node_modules/.bin to PATH,\n // which points to the .cmd shim that we want to avoid.\n if (process.platform === 'win32') {\n try {\n // Try to resolve the package.json to find the bin script\n const pkgJsonPath = require.resolve(`${this.npmPackage}/package.json`, { paths: [process.cwd(), __dirname] })\n const pkgJson = require(pkgJsonPath)\n\n\n \n let binScript = ''\n if (typeof pkgJson.bin === 'string') {\n binScript = pkgJson.bin\n } else if (typeof pkgJson.bin === 'object' && pkgJson.bin[this.binName]) {\n binScript = pkgJson.bin[this.binName]\n }\n\n if (binScript) {\n // Special hack for Pyright on Windows:\n if (this.npmPackage === 'pyright' && binScript.endsWith('langserver.index.js')) {\n const distScript = join(dirname(pkgJsonPath), 'dist', 'pyright-langserver.js')\n if (existsSync(distScript)) {\n // debugLogger.info('LSP_PYRIGHT_OPT', { message: 'Running bundle directly', path: distScript })\n return { command: process.execPath, args: [distScript, ...this.args] }\n }\n }\n \n const scriptPath = join(dirname(pkgJsonPath), binScript)\n if (existsSync(scriptPath)) {\n return { command: process.execPath, args: [scriptPath, ...this.args] }\n }\n }\n } catch (e) {\n // Ignore and fall back to standard checks\n }\n }\n\n if (this.isInPath(this.binName)) {\n return { command: this.binName, args: this.args }\n }\n \n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return { command: localBin, args: this.args }\n }\n \n return null\n }\n}\n\nclass GenericBinaryServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n binNames: string[]\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], binNames: string | string[], args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.binNames = Array.isArray(binNames) ? binNames : [binNames]\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n return this.binNames.some(bin => this.isInPath(bin))\n }\n\n async getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null> {\n for (const bin of this.binNames) {\n if (this.isInPath(bin)) {\n return { command: bin, args: this.args }\n }\n }\n return null\n }\n}\n\nclass GoplsServer extends BaseLspServer {\n id = 'gopls'\n extensions = ['.go', '.mod']\n rootMarkers = ['go.mod', 'go.work', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('gopls')) {\n return true\n }\n\n // Check GOBIN or default go bin location if we installed it locally\n // For now, let's assume if it's not in PATH, we try to install it to GOBIN or PATH\n // But we prefer installing to our local tools dir if possible, OR just rely on 'go install' putting it in $(go env GOPATH)/bin\n // The issue is we don't easily know where that is without running 'go env GOPATH'.\n // Let's try to install it and assume it goes to PATH or we can find it.\n // Actually, we can check if `go` exists first.\n if (!this.isInPath('go')) {\n debugLogger.error('LSP_MISSING_DEP', { server: this.id, error: 'go command not found' })\n return false\n }\n\n return this.installGo()\n }\n\n async getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null> {\n if (this.isInPath('gopls')) {\n return { command: 'gopls', args: ['serve'] }\n }\n \n // Check if it's in GOPATH/bin (common fallback)\n // For simplicity, we only support it if it's in PATH or we can find it via `go env GOPATH`/bin\n // But since `prepare` runs `go install`, it usually puts it in a place that might NOT be in PATH if user hasn't configured it.\n // Let's try to find it in likely places?\n // Or just rely on PATH.\n return null\n }\n\n private async installGo(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n \n const result = spawnSync('go', ['install', 'golang.org/x/tools/gopls@latest'], { \n encoding: 'utf8'\n })\n\n if (result.status !== 0) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.stderr })\n return false\n }\n\n // After install, check if it's in PATH now (unlikely if it wasn't before, unless it was just missing binary)\n // If not in PATH, warn user?\n if (!this.isInPath('gopls')) {\n // Maybe it's in $HOME/go/bin or $GOPATH/bin\n // We could try to add that to our search path for this session?\n debugLogger.warn('LSP_INSTALL_WARNING', { server: this.id, message: 'gopls installed but not found in PATH. Make sure $(go env GOPATH)/bin is in your PATH.' })\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\nclass RustAnalyzerServer extends BaseLspServer {\n id = 'rust-analyzer'\n extensions = ['.rs']\n rootMarkers = ['Cargo.toml', 'rust-project.json', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('rust-analyzer')) {\n return true\n }\n\n // Try rustup\n if (this.isInPath('rustup')) {\n return this.installRustup()\n }\n\n debugLogger.warn('LSP_MISSING_DEP', { server: this.id, message: 'rust-analyzer not found and rustup not available. Please install rust-analyzer manually.' })\n return false\n }\n\n async getCommand(rootPath: string): Promise<{ command: string, args: string[] } | null> {\n if (this.isInPath('rust-analyzer')) {\n return { command: 'rust-analyzer', args: [] }\n }\n return null\n }\n\n private async installRustup(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n \n const result = spawnSync('rustup', ['component', 'add', 'rust-analyzer'], { \n encoding: 'utf8'\n })\n\n if (result.status !== 0) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.stderr })\n return false\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\n\nexport class LspServerRegistry {\n private static instance: LspServerRegistry\n private servers: LspServerInfo[] = []\n\n private constructor() {\n // Pyright (GenericNpmServer)\n this.register(new GenericNpmServer(\n 'pyright',\n ['.py', '.pyi'],\n ['pyrightconfig.json', 'pyproject.toml', 'setup.py', 'requirements.txt', 'Pipfile'],\n 'pyright',\n 'pyright-langserver',\n ['--stdio']\n ))\n \n this.register(new GoplsServer())\n this.register(new RustAnalyzerServer())\n this.register(new GenericNpmServer(\n 'bash-language-server',\n ['.sh', '.bash', '.zsh'],\n ['.git'],\n 'bash-language-server',\n 'bash-language-server',\n ['start']\n ))\n\n // TypeScript/JavaScript (typescript-language-server)\n this.register(new GenericNpmServer(\n 'typescript-language-server',\n ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],\n ['tsconfig.json', 'package.json', 'jsconfig.json'],\n 'typescript-language-server',\n 'typescript-language-server',\n ['--stdio']\n ))\n\n // Tier 1: Easy NPM-based Servers\n // YAML\n this.register(new GenericNpmServer(\n 'yaml-language-server',\n ['.yaml', '.yml'],\n [],\n 'yaml-language-server',\n 'yaml-language-server',\n ['--stdio']\n ))\n\n // Dockerfile\n this.register(new GenericNpmServer(\n 'dockerfile-language-server',\n ['Dockerfile', '.dockerfile'],\n [],\n 'dockerfile-language-server-nodejs',\n 'docker-langserver',\n ['--stdio']\n ))\n\n // Vue\n this.register(new GenericNpmServer(\n 'vue-language-server',\n ['.vue'],\n ['package.json'],\n '@vue/language-server',\n 'vue-language-server',\n ['--stdio']\n ))\n\n // HTML/CSS/JSON (vscode-langservers-extracted)\n // Note: The binary names might vary, usually `vscode-html-language-server`, `vscode-css-language-server`\n // Let's add them individually but sharing the same package install? \n // GenericNpmServer assumes 1 package = 1 binary. \n // vscode-langservers-extracted provides multiple bins.\n // We can just instantiate multiple GenericNpmServer with the same package name. It's fine, it will just try to install it again (npm handles it).\n \n this.register(new GenericNpmServer(\n 'html-language-server',\n ['.html', '.htm'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-html-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'css-language-server',\n ['.css', '.scss', '.less'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-css-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'json-language-server',\n ['.json', '.jsonc'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-json-language-server',\n ['--stdio']\n ))\n\n // Tier 2: Easy NPM-based Servers (More)\n // PHP (intelephense)\n this.register(new GenericNpmServer(\n 'intelephense',\n ['.php'],\n ['composer.json'],\n 'intelephense',\n 'intelephense',\n ['--stdio']\n ))\n\n // Svelte\n this.register(new GenericNpmServer(\n 'svelte-language-server',\n ['.svelte'],\n ['package.json'],\n 'svelte-language-server',\n 'svelte-language-server',\n ['--stdio']\n ))\n\n // Astro\n this.register(new GenericNpmServer(\n 'astro-ls',\n ['.astro'],\n ['package.json'],\n '@astrojs/language-server',\n 'astro-ls',\n ['--stdio']\n ))\n\n // Prisma\n this.register(new GenericNpmServer(\n 'prisma-language-server',\n ['.prisma'],\n ['schema.prisma'],\n '@prisma/language-server',\n 'prisma-language-server',\n ['--stdio']\n ))\n\n // GraphQL\n this.register(new GenericNpmServer(\n 'graphql-lsp',\n ['.graphql', '.gql'],\n ['.graphqlrc', 'graphql.config.js'],\n 'graphql-language-service-cli',\n 'graphql-lsp',\n ['server', '-m', 'stream']\n ))\n\n // Tier 3: Binary Path Detection (System Dependencies)\n // Java (jdtls)\n this.register(new GenericBinaryServer(\n 'jdtls',\n ['.java'],\n ['pom.xml', 'build.gradle'],\n 'jdtls',\n []\n ))\n\n // C/C++ (clangd)\n this.register(new GenericBinaryServer(\n 'clangd',\n ['.c', '.cpp', '.h', '.hpp', '.cc'],\n ['compile_commands.json', '.clang-format'],\n 'clangd',\n ['--stdio']\n ))\n\n // Ruby (ruby-lsp)\n this.register(new GenericBinaryServer(\n 'ruby-lsp',\n ['.rb', '.rake'],\n ['Gemfile', '.ruby-version'],\n 'ruby-lsp',\n ['--stdio']\n ))\n\n // Lua (lua-language-server)\n this.register(new GenericBinaryServer(\n 'lua-language-server',\n ['.lua'],\n ['.luarc.json'],\n ['lua-ls', 'lua-language-server'],\n []\n ))\n\n // Terraform (terraform-ls)\n this.register(new GenericBinaryServer(\n 'terraform-ls',\n ['.tf', '.tfvars'],\n [],\n 'terraform-ls',\n ['serve']\n ))\n\n // Kotlin (kotlin-language-server)\n this.register(new GenericBinaryServer(\n 'kotlin-language-server',\n ['.kt', '.kts'],\n ['build.gradle.kts'],\n ['kotlin-ls', 'kotlin-language-server'],\n []\n ))\n\n // Elixir (elixir-ls)\n this.register(new GenericBinaryServer(\n 'elixir-ls',\n ['.ex', '.exs'],\n ['mix.exs'],\n ['elixir-ls', 'language_server.sh'],\n []\n ))\n\n // Zig (zls)\n this.register(new GenericBinaryServer(\n 'zls',\n ['.zig'],\n ['build.zig'],\n 'zls',\n []\n ))\n\n // C# (csharp-ls)\n this.register(new GenericBinaryServer(\n 'csharp-ls',\n ['.cs'],\n ['.csproj', '.sln'],\n 'csharp-ls',\n []\n ))\n\n // F# (fsautocomplete)\n this.register(new GenericBinaryServer(\n 'fsautocomplete',\n ['.fs', '.fsi', '.fsx'],\n ['.fsproj', '.sln'],\n 'fsautocomplete',\n ['--background-service-enabled']\n ))\n\n // Swift (sourcekit-lsp)\n this.register(new GenericBinaryServer(\n 'sourcekit-lsp',\n ['.swift'],\n ['Package.swift'],\n 'sourcekit-lsp',\n []\n ))\n\n // Dart (dart language-server)\n this.register(new GenericBinaryServer(\n 'dart',\n ['.dart'],\n ['pubspec.yaml'],\n 'dart',\n ['language-server']\n ))\n\n // OCaml (ocamllsp)\n this.register(new GenericBinaryServer(\n 'ocamllsp',\n ['.ml', '.mli'],\n ['dune-project'],\n ['ocaml-lsp', 'ocamllsp'],\n []\n ))\n\n // Gleam (gleam lsp)\n this.register(new GenericBinaryServer(\n 'gleam',\n ['.gleam'],\n ['gleam.toml'],\n 'gleam',\n ['lsp']\n ))\n\n // Clojure (clojure-lsp)\n this.register(new GenericBinaryServer(\n 'clojure-lsp',\n ['.clj', '.cljs', '.cljc', '.edn'],\n ['deps.edn', 'project.clj'],\n 'clojure-lsp',\n []\n ))\n\n // Nix (nixd)\n this.register(new GenericBinaryServer(\n 'nixd',\n ['.nix'],\n ['flake.nix'],\n 'nixd',\n []\n ))\n\n // Typst (tinymist)\n this.register(new GenericBinaryServer(\n 'tinymist',\n ['.typ'],\n [],\n 'tinymist',\n []\n ))\n\n // Scala (metals)\n this.register(new GenericBinaryServer(\n 'metals',\n ['.scala', '.sbt', '.sc'],\n ['build.sbt'],\n 'metals',\n []\n ))\n\n // Haskell (haskell-language-server-wrapper)\n this.register(new GenericBinaryServer(\n 'haskell-language-server',\n ['.hs', '.lhs'],\n ['stack.yaml', 'cabal.project', '*.cabal'],\n 'haskell-language-server-wrapper',\n ['--lsp']\n ))\n\n // Tex/Latex (texlab)\n this.register(new GenericBinaryServer(\n 'texlab',\n ['.tex', '.bib'],\n [],\n 'texlab',\n []\n ))\n }\n\n static getInstance(): LspServerRegistry {\n if (!LspServerRegistry.instance) {\n LspServerRegistry.instance = new LspServerRegistry()\n }\n return LspServerRegistry.instance\n }\n\n register(server: LspServerInfo) {\n this.servers.push(server)\n }\n\n getServerForExtension(ext: string): LspServerInfo | null {\n return this.servers.find(s => s.extensions.includes(ext)) || null\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "join"]
7
+ }
@@ -4,18 +4,18 @@ import {
4
4
  getSettingsFileCandidates,
5
5
  loadSettingsWithLegacyFallback,
6
6
  saveSettingsToPrimaryAndSyncLegacy
7
- } from "./chunk-6J75N6QM.js";
7
+ } from "./chunk-6LV6USMO.js";
8
8
  import {
9
9
  createDefaultToolPermissionContext,
10
10
  isPersistableToolPermissionDestination
11
11
  } from "./chunk-UNNVICVU.js";
12
12
  import {
13
13
  getCurrentProjectConfig
14
- } from "./chunk-NXE74FU6.js";
14
+ } from "./chunk-NLYDLJGG.js";
15
15
  import {
16
16
  getCwd,
17
17
  logError
18
- } from "./chunk-5XROCABG.js";
18
+ } from "./chunk-HRLQBOES.js";
19
19
 
20
20
  // src/utils/permissions/toolPermissionSettings.ts
21
21
  function uniqueStrings(value) {
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  MACRO
5
- } from "./chunk-DMPEMAK5.js";
5
+ } from "./chunk-V2HYOQO2.js";
6
6
 
7
7
  // src/utils/state/index.ts
8
8
  import { cwd } from "process";
@@ -1,23 +1,8 @@
1
1
  import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
-
4
- // src/utils/text/smart-edit/levenshtein.ts
5
- function levenshtein(a, b) {
6
- if (a === "" || b === "") {
7
- return Math.max(a.length, b.length);
8
- }
9
- const matrix = Array.from(
10
- { length: a.length + 1 },
11
- (_, i) => Array.from({ length: b.length + 1 }, (_2, j) => i === 0 ? j : j === 0 ? i : 0)
12
- );
13
- for (let i = 1; i <= a.length; i++) {
14
- for (let j = 1; j <= b.length; j++) {
15
- const cost = a[i - 1] === b[j - 1] ? 0 : 1;
16
- matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
17
- }
18
- }
19
- return matrix[a.length][b.length];
20
- }
3
+ import {
4
+ levenshtein
5
+ } from "./chunk-UZ34JEUK.js";
21
6
 
22
7
  // src/utils/text/smart-edit/replacers.ts
23
8
  var SimpleReplacer = function* (_content, find) {
@@ -310,7 +295,6 @@ var ContextAwareReplacer = function* (content, find) {
310
295
  };
311
296
 
312
297
  export {
313
- levenshtein,
314
298
  SimpleReplacer,
315
299
  LineTrimmedReplacer,
316
300
  WhitespaceNormalizedReplacer,
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/text/smart-edit/replacers.ts"],
4
+ "sourcesContent": ["import { levenshtein } from './levenshtein'\n\nexport type Replacer = (content: string, find: string) => Generator<string, void, unknown>\n\nexport const SimpleReplacer: Replacer = function* (_content, find) {\n yield find\n}\n\nexport const LineTrimmedReplacer: Replacer = function* (content, find) {\n const originalLines = content.split(\"\\n\")\n const searchLines = find.split(\"\\n\")\n\n if (searchLines[searchLines.length - 1] === \"\") {\n searchLines.pop()\n }\n\n for (let i = 0; i <= originalLines.length - searchLines.length; i++) {\n let matches = true\n\n for (let j = 0; j < searchLines.length; j++) {\n const originalTrimmed = originalLines[i + j].trim()\n const searchTrimmed = searchLines[j].trim()\n\n if (originalTrimmed !== searchTrimmed) {\n matches = false\n break\n }\n }\n\n if (matches) {\n let matchStartIndex = 0\n for (let k = 0; k < i; k++) {\n matchStartIndex += originalLines[k].length + 1\n }\n\n let matchEndIndex = matchStartIndex\n for (let k = 0; k < searchLines.length; k++) {\n matchEndIndex += originalLines[i + k].length\n if (k < searchLines.length - 1) {\n matchEndIndex += 1 // Add newline character except for the last line\n }\n }\n\n yield content.substring(matchStartIndex, matchEndIndex)\n }\n }\n}\n\nconst SINGLE_CANDIDATE_SIMILARITY_THRESHOLD = 0.0\nconst MULTIPLE_CANDIDATES_SIMILARITY_THRESHOLD = 0.3\n\nexport const WhitespaceNormalizedReplacer: Replacer = function* (content, find) {\n // Split by whitespace to get tokens\n const tokens = find.split(/\\s+/).filter(t => t.length > 0)\n \n if (tokens.length === 0) return\n\n // Create a regex where tokens are separated by \\s+\n // We escape each token to treat it as literal\n const pattern = tokens\n .map(token => token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('\\\\s+')\n \n try {\n const regex = new RegExp(pattern, 'g')\n let match\n while ((match = regex.exec(content)) !== null) {\n yield match[0]\n }\n } catch (e) {\n // Ignore invalid regex\n }\n}\n\nexport const BlockAnchorReplacer: Replacer = function* (content, find) {\n const originalLines = content.split(\"\\n\")\n const searchLines = find.split(\"\\n\")\n\n if (searchLines.length < 3) {\n return\n }\n\n if (searchLines[searchLines.length - 1] === \"\") {\n searchLines.pop()\n }\n\n const firstLineSearch = searchLines[0].trim()\n const lastLineSearch = searchLines[searchLines.length - 1].trim()\n const searchBlockSize = searchLines.length\n\n // Collect all candidate positions where both anchors match\n const candidates: Array<{ startLine: number; endLine: number }> = []\n for (let i = 0; i < originalLines.length; i++) {\n if (originalLines[i].trim() !== firstLineSearch) {\n continue\n }\n\n // Look for the matching last line after this first line\n for (let j = i + 2; j < originalLines.length; j++) {\n if (originalLines[j].trim() === lastLineSearch) {\n candidates.push({ startLine: i, endLine: j })\n break // Only match the first occurrence of the last line\n }\n }\n }\n\n // Return immediately if no candidates\n if (candidates.length === 0) {\n return\n }\n\n // Handle single candidate scenario (using relaxed threshold)\n if (candidates.length === 1) {\n const { startLine, endLine } = candidates[0]\n const actualBlockSize = endLine - startLine + 1\n\n let similarity = 0\n let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2) // Middle lines only\n\n if (linesToCheck > 0) {\n for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {\n const originalLine = originalLines[startLine + j].trim()\n const searchLine = searchLines[j].trim()\n const maxLen = Math.max(originalLine.length, searchLine.length)\n if (maxLen === 0) {\n continue\n }\n const distance = levenshtein(originalLine, searchLine)\n similarity += (1 - distance / maxLen) / linesToCheck\n\n // Exit early when threshold is reached\n if (similarity >= SINGLE_CANDIDATE_SIMILARITY_THRESHOLD) {\n break\n }\n }\n } else {\n // No middle lines to compare, just accept based on anchors\n similarity = 1.0\n }\n\n if (similarity >= SINGLE_CANDIDATE_SIMILARITY_THRESHOLD) {\n let matchStartIndex = 0\n for (let k = 0; k < startLine; k++) {\n matchStartIndex += originalLines[k].length + 1\n }\n let matchEndIndex = matchStartIndex\n for (let k = startLine; k <= endLine; k++) {\n matchEndIndex += originalLines[k].length\n if (k < endLine) {\n matchEndIndex += 1 // Add newline character except for the last line\n }\n }\n yield content.substring(matchStartIndex, matchEndIndex)\n }\n return\n }\n\n // Calculate similarity for multiple candidates\n let bestMatch: { startLine: number; endLine: number } | null = null\n let maxSimilarity = -1\n\n for (const candidate of candidates) {\n const { startLine, endLine } = candidate\n const actualBlockSize = endLine - startLine + 1\n\n let similarity = 0\n let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2) // Middle lines only\n\n if (linesToCheck > 0) {\n for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {\n const originalLine = originalLines[startLine + j].trim()\n const searchLine = searchLines[j].trim()\n const maxLen = Math.max(originalLine.length, searchLine.length)\n if (maxLen === 0) {\n continue\n }\n const distance = levenshtein(originalLine, searchLine)\n similarity += 1 - distance / maxLen\n }\n similarity /= linesToCheck // Average similarity\n } else {\n // No middle lines to compare, just accept based on anchors\n similarity = 1.0\n }\n\n if (similarity > maxSimilarity) {\n maxSimilarity = similarity\n bestMatch = candidate\n }\n }\n\n // Threshold judgment\n if (maxSimilarity >= MULTIPLE_CANDIDATES_SIMILARITY_THRESHOLD && bestMatch) {\n const { startLine, endLine } = bestMatch\n let matchStartIndex = 0\n for (let k = 0; k < startLine; k++) {\n matchStartIndex += originalLines[k].length + 1\n }\n let matchEndIndex = matchStartIndex\n for (let k = startLine; k <= endLine; k++) {\n matchEndIndex += originalLines[k].length\n if (k < endLine) {\n matchEndIndex += 1\n }\n }\n yield content.substring(matchStartIndex, matchEndIndex)\n }\n}\n\nexport const IndentationFlexibleReplacer: Replacer = function* (content, find) {\n const removeIndentation = (text: string) => {\n const lines = text.split(\"\\n\")\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0)\n if (nonEmptyLines.length === 0) return text\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(/^(\\s*)/)\n return match ? match[1].length : 0\n }),\n )\n\n return lines.map((line) => (line.trim().length === 0 ? line : line.slice(minIndent))).join(\"\\n\")\n }\n\n const normalizedFind = removeIndentation(find)\n const contentLines = content.split(\"\\n\")\n const findLines = find.split(\"\\n\")\n\n for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n const block = contentLines.slice(i, i + findLines.length).join(\"\\n\")\n if (removeIndentation(block) === normalizedFind) {\n yield block\n }\n }\n}\n\nexport const EscapeNormalizedReplacer: Replacer = function* (content, find) {\n const unescapeString = (str: string): string => {\n return str.replace(/\\\\(n|t|r|'|\"|`|\\\\|\\n|\\$)/g, (match, capturedChar) => {\n switch (capturedChar) {\n case \"n\":\n return \"\\n\"\n case \"t\":\n return \"\\t\"\n case \"r\":\n return \"\\r\"\n case \"'\":\n return \"'\"\n case '\"':\n return '\"'\n case \"`\":\n return \"`\"\n case \"\\\\\":\n return \"\\\\\"\n case \"\\n\":\n return \"\\n\"\n case \"$\":\n return \"$\"\n default:\n return match\n }\n })\n }\n\n const unescapedFind = unescapeString(find)\n\n // Try direct match with unescaped find string\n if (content.includes(unescapedFind)) {\n yield unescapedFind\n }\n\n // Also try finding escaped versions in content that match unescaped find\n const lines = content.split(\"\\n\")\n const findLines = unescapedFind.split(\"\\n\")\n\n for (let i = 0; i <= lines.length - findLines.length; i++) {\n const block = lines.slice(i, i + findLines.length).join(\"\\n\")\n const unescapedBlock = unescapeString(block)\n\n if (unescapedBlock === unescapedFind) {\n yield block\n }\n }\n}\n\nexport const MultiOccurrenceReplacer: Replacer = function* (content, find) {\n // This replacer yields all exact matches, allowing the replace function\n // to handle multiple occurrences based on replaceAll parameter\n let startIndex = 0\n\n while (true) {\n const index = content.indexOf(find, startIndex)\n if (index === -1) break\n\n yield find\n startIndex = index + find.length\n }\n}\n\nexport const TrimmedBoundaryReplacer: Replacer = function* (content, find) {\n const trimmedFind = find.trim()\n\n if (trimmedFind === find) {\n // Already trimmed, no point in trying\n return\n }\n\n // Try to find the trimmed version\n if (content.includes(trimmedFind)) {\n yield trimmedFind\n }\n\n // Also try finding blocks where trimmed content matches\n const lines = content.split(\"\\n\")\n const findLines = find.split(\"\\n\")\n\n for (let i = 0; i <= lines.length - findLines.length; i++) {\n const block = lines.slice(i, i + findLines.length).join(\"\\n\")\n\n if (block.trim() === trimmedFind) {\n yield block\n }\n }\n}\n\nexport const ContextAwareReplacer: Replacer = function* (content, find) {\n const findLines = find.split(\"\\n\")\n if (findLines.length < 3) {\n // Need at least 3 lines to have meaningful context\n return\n }\n\n // Remove trailing empty line if present\n if (findLines[findLines.length - 1] === \"\") {\n findLines.pop()\n }\n\n const contentLines = content.split(\"\\n\")\n\n // Extract first and last lines as context anchors\n const firstLine = findLines[0].trim()\n const lastLine = findLines[findLines.length - 1].trim()\n\n // Find blocks that start and end with the context anchors\n for (let i = 0; i < contentLines.length; i++) {\n if (contentLines[i].trim() !== firstLine) continue\n\n // Look for the matching last line\n for (let j = i + 2; j < contentLines.length; j++) {\n if (contentLines[j].trim() === lastLine) {\n // Found a potential context block\n const blockLines = contentLines.slice(i, j + 1)\n const block = blockLines.join(\"\\n\")\n\n // Check if the middle content has reasonable similarity\n // (simple heuristic: at least 50% of non-empty lines should match when trimmed)\n if (blockLines.length === findLines.length) {\n let matchingLines = 0\n let totalNonEmptyLines = 0\n\n for (let k = 1; k < blockLines.length - 1; k++) {\n const blockLine = blockLines[k].trim()\n const findLine = findLines[k].trim()\n\n if (blockLine.length > 0 || findLine.length > 0) {\n totalNonEmptyLines++\n if (blockLine === findLine) {\n matchingLines++\n }\n }\n }\n\n if (totalNonEmptyLines === 0 || matchingLines / totalNonEmptyLines >= 0.5) {\n yield block\n break // Only match the first occurrence\n }\n }\n break\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -6,10 +6,10 @@ import {
6
6
  import {
7
7
  getSettingsFileCandidates,
8
8
  loadSettingsWithLegacyFallback
9
- } from "./chunk-6J75N6QM.js";
9
+ } from "./chunk-6LV6USMO.js";
10
10
  import {
11
11
  getTheme
12
- } from "./chunk-2E7J2ODZ.js";
12
+ } from "./chunk-YDJKO722.js";
13
13
  import {
14
14
  addMcprcServerForTesting,
15
15
  getCurrentProjectConfig,
@@ -19,13 +19,13 @@ import {
19
19
  safeParseJSON,
20
20
  saveCurrentProjectConfig,
21
21
  saveGlobalConfig
22
- } from "./chunk-NXE74FU6.js";
22
+ } from "./chunk-NLYDLJGG.js";
23
23
  import {
24
24
  PRODUCT_COMMAND,
25
25
  PRODUCT_NAME,
26
26
  getCwd,
27
27
  logMCPError
28
- } from "./chunk-5XROCABG.js";
28
+ } from "./chunk-HRLQBOES.js";
29
29
 
30
30
  // src/services/mcp/client.ts
31
31
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
@@ -5,12 +5,12 @@ import {
5
5
  } from "./chunk-RQVLBMP7.js";
6
6
  import {
7
7
  debug
8
- } from "./chunk-GXIZY2EJ.js";
8
+ } from "./chunk-SXOAID2G.js";
9
9
  import {
10
10
  getCwd,
11
11
  getGlobalConfigFilePath,
12
12
  logError
13
- } from "./chunk-5XROCABG.js";
13
+ } from "./chunk-HRLQBOES.js";
14
14
 
15
15
  // src/core/config/schema.ts
16
16
  function isAutoUpdaterStatus(value) {
@@ -660,7 +660,7 @@ function setModelPointer(pointer, modelName) {
660
660
  }
661
661
  };
662
662
  saveGlobalConfig(updatedConfig);
663
- import("./model-CS437TVG.js").then(({ reloadModelManager }) => {
663
+ import("./model-KL3RMVGS.js").then(({ reloadModelManager }) => {
664
664
  reloadModelManager();
665
665
  });
666
666
  }
@@ -448,7 +448,7 @@ function getLastAssistantMessageId(messages) {
448
448
 
449
449
  // src/utils/messages/index.ts
450
450
  async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
451
- const impl = await import("./userInput-EZPAFVPK.js");
451
+ const impl = await import("./userInput-3RJRG3AE.js");
452
452
  return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
453
453
  }
454
454
 
@@ -2,13 +2,13 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  MarketplaceManifestSchema
5
- } from "./chunk-OAJUVQHX.js";
5
+ } from "./chunk-BNGSVF2J.js";
6
6
  import {
7
7
  parseFrontmatter
8
- } from "./chunk-PCBYO2CX.js";
8
+ } from "./chunk-VQEYFHCS.js";
9
9
  import {
10
10
  getCwd
11
- } from "./chunk-5XROCABG.js";
11
+ } from "./chunk-HRLQBOES.js";
12
12
 
13
13
  // src/services/plugins/pluginValidation.ts
14
14
  import { existsSync, lstatSync, readFileSync } from "node:fs";
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getSessionProjectDir
5
- } from "./chunk-NGDPJF42.js";
5
+ } from "./chunk-AXOACBAT.js";
6
6
  import {
7
7
  isUuid
8
8
  } from "./chunk-5P7HBXTD.js";
@@ -8,11 +8,11 @@ import {
8
8
  } from "./chunk-BJSWTHRM.js";
9
9
  import {
10
10
  loadSettingsWithLegacyFallback
11
- } from "./chunk-6J75N6QM.js";
11
+ } from "./chunk-6LV6USMO.js";
12
12
  import {
13
13
  getCwd,
14
14
  logError
15
- } from "./chunk-5XROCABG.js";
15
+ } from "./chunk-HRLQBOES.js";
16
16
 
17
17
  // src/utils/session/pybHooks.ts
18
18
  import { spawn } from "child_process";
@@ -496,7 +496,7 @@ async function runPromptHook(args) {
496
496
  fallbackTimeoutMs: args.fallbackTimeoutMs
497
497
  });
498
498
  try {
499
- const { queryQuick } = await import("./llmLazy-QPHLH6WK.js");
499
+ const { queryQuick } = await import("./llmLazy-W4G3KUIV.js");
500
500
  const systemPrompt = [
501
501
  "You are executing a Pyb prompt hook.",
502
502
  "Return a single JSON object only (no markdown, no prose).",