@ashx-j/lunr-dev 0.2.13-dev.7.1 → 0.2.16-dev.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/dist/builtin-extensions/ashxj-tui.d.ts +14 -0
  3. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  4. package/dist/builtin-extensions/ashxj-tui.js +37 -3
  5. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  6. package/dist/builtin-extensions/index.d.ts +1 -15
  7. package/dist/builtin-extensions/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +7 -21
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  11. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +6 -2
  12. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  13. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +4 -0
  14. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +163 -169
  16. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  17. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +46 -0
  18. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -0
  19. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +109 -0
  20. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -0
  21. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts +7 -0
  22. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -0
  23. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +211 -0
  24. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -0
  25. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +0 -5
  26. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
  27. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js +0 -202
  28. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
  29. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-mcp-adapter/index.js +251 -94
  31. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  32. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +4 -1
  33. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-mcp-adapter/init.js +10 -3
  35. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  36. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.d.ts.map +1 -1
  37. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js +6 -1
  38. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js.map +1 -1
  39. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  40. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +2 -1
  41. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  42. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
  43. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  44. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
  45. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +38 -14
  49. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
  53. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +2 -1
  60. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +2 -1
  64. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  65. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-web-access/extract.js +105 -54
  67. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  68. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-web-access/gemini-search.js +82 -65
  71. package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
  72. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-web-access/github-extract.js +2 -0
  74. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  75. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-web-access/index.js +167 -77
  77. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  78. package/dist/builtin-extensions/pi-web-access/lazy.d.ts +18 -0
  79. package/dist/builtin-extensions/pi-web-access/lazy.d.ts.map +1 -0
  80. package/dist/builtin-extensions/pi-web-access/lazy.js +19 -0
  81. package/dist/builtin-extensions/pi-web-access/lazy.js.map +1 -0
  82. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +6 -0
  83. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -0
  84. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +17 -0
  85. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -0
  86. package/dist/catalog/models.json +1 -1
  87. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  88. package/dist/catalog/providers/azure-openai-responses.json +1 -1
  89. package/dist/catalog/providers/fireworks.json +1 -1
  90. package/dist/catalog/providers/github-copilot.json +1 -1
  91. package/dist/catalog/providers/openai-codex.json +1 -1
  92. package/dist/catalog/providers/openai.json +1 -1
  93. package/dist/catalog/providers/opencode.json +1 -1
  94. package/dist/catalog/providers/openrouter.json +1 -1
  95. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  96. package/dist/catalog/publication.json +131 -3
  97. package/dist/cli/list-models.d.ts.map +1 -1
  98. package/dist/cli/list-models.js +1 -0
  99. package/dist/cli/list-models.js.map +1 -1
  100. package/dist/cli-runtime.d.ts +3 -0
  101. package/dist/cli-runtime.d.ts.map +1 -0
  102. package/dist/cli-runtime.js +73 -0
  103. package/dist/cli-runtime.js.map +1 -0
  104. package/dist/cli.d.ts.map +1 -1
  105. package/dist/cli.js +14 -53
  106. package/dist/cli.js.map +1 -1
  107. package/dist/config.d.ts +1 -0
  108. package/dist/config.d.ts.map +1 -1
  109. package/dist/config.js +1 -0
  110. package/dist/config.js.map +1 -1
  111. package/dist/core/agent-session.d.ts +3 -0
  112. package/dist/core/agent-session.d.ts.map +1 -1
  113. package/dist/core/agent-session.js +56 -12
  114. package/dist/core/agent-session.js.map +1 -1
  115. package/dist/core/catalog-cache-scope.d.ts +3 -0
  116. package/dist/core/catalog-cache-scope.d.ts.map +1 -0
  117. package/dist/core/catalog-cache-scope.js +12 -0
  118. package/dist/core/catalog-cache-scope.js.map +1 -0
  119. package/dist/core/catalog-merge.d.ts +2 -0
  120. package/dist/core/catalog-merge.d.ts.map +1 -1
  121. package/dist/core/catalog-merge.js +29 -2
  122. package/dist/core/catalog-merge.js.map +1 -1
  123. package/dist/core/catalog-refresh-polling.d.ts +8 -0
  124. package/dist/core/catalog-refresh-polling.d.ts.map +1 -0
  125. package/dist/core/catalog-refresh-polling.js +30 -0
  126. package/dist/core/catalog-refresh-polling.js.map +1 -0
  127. package/dist/core/codex-catalog.d.ts +3 -0
  128. package/dist/core/codex-catalog.d.ts.map +1 -0
  129. package/dist/core/codex-catalog.js +15 -0
  130. package/dist/core/codex-catalog.js.map +1 -0
  131. package/dist/core/compaction/compaction.d.ts.map +1 -1
  132. package/dist/core/compaction/compaction.js +10 -5
  133. package/dist/core/compaction/compaction.js.map +1 -1
  134. package/dist/core/extensions/host-static.d.ts.map +1 -1
  135. package/dist/core/extensions/host-static.js +34 -12
  136. package/dist/core/extensions/host-static.js.map +1 -1
  137. package/dist/core/extensions/loader.d.ts +1 -2
  138. package/dist/core/extensions/loader.d.ts.map +1 -1
  139. package/dist/core/extensions/loader.js +10 -64
  140. package/dist/core/extensions/loader.js.map +1 -1
  141. package/dist/core/extensions/types.d.ts +2 -2
  142. package/dist/core/extensions/types.d.ts.map +1 -1
  143. package/dist/core/extensions/types.js.map +1 -1
  144. package/dist/core/footer-data-provider.d.ts.map +1 -1
  145. package/dist/core/footer-data-provider.js +2 -0
  146. package/dist/core/footer-data-provider.js.map +1 -1
  147. package/dist/core/live-catalog.d.ts +5 -2
  148. package/dist/core/live-catalog.d.ts.map +1 -1
  149. package/dist/core/live-catalog.js +108 -27
  150. package/dist/core/live-catalog.js.map +1 -1
  151. package/dist/core/model-runtime.d.ts +8 -0
  152. package/dist/core/model-runtime.d.ts.map +1 -1
  153. package/dist/core/model-runtime.js +64 -12
  154. package/dist/core/model-runtime.js.map +1 -1
  155. package/dist/core/official-catalog.d.ts +4 -0
  156. package/dist/core/official-catalog.d.ts.map +1 -1
  157. package/dist/core/official-catalog.js +86 -21
  158. package/dist/core/official-catalog.js.map +1 -1
  159. package/dist/core/permissions.d.ts +0 -2
  160. package/dist/core/permissions.d.ts.map +1 -1
  161. package/dist/core/permissions.js +10 -18
  162. package/dist/core/permissions.js.map +1 -1
  163. package/dist/core/sdk.d.ts +1 -1
  164. package/dist/core/sdk.d.ts.map +1 -1
  165. package/dist/core/sdk.js +1 -1
  166. package/dist/core/sdk.js.map +1 -1
  167. package/dist/core/slash-commands.d.ts.map +1 -1
  168. package/dist/core/slash-commands.js +0 -1
  169. package/dist/core/slash-commands.js.map +1 -1
  170. package/dist/core/timings.d.ts +2 -1
  171. package/dist/core/timings.d.ts.map +1 -1
  172. package/dist/core/timings.js +17 -2
  173. package/dist/core/timings.js.map +1 -1
  174. package/dist/gateway/commands.d.ts +1 -1
  175. package/dist/gateway/commands.d.ts.map +1 -1
  176. package/dist/gateway/commands.js +1 -18
  177. package/dist/gateway/commands.js.map +1 -1
  178. package/dist/main.d.ts +2 -2
  179. package/dist/main.d.ts.map +1 -1
  180. package/dist/main.js +66 -48
  181. package/dist/main.js.map +1 -1
  182. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  183. package/dist/modes/interactive/components/model-selector.js +4 -1
  184. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  185. package/dist/modes/interactive/interactive-mode.d.ts +13 -22
  186. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  187. package/dist/modes/interactive/interactive-mode.js +141 -207
  188. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  189. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  190. package/dist/modes/interactive/theme/theme.js +95 -84
  191. package/dist/modes/interactive/theme/theme.js.map +1 -1
  192. package/dist/node-runtime/agent-session-services-IFJMSX7Z.js +36 -0
  193. package/dist/node-runtime/benchmark-request-UC7PD3V3.js +57 -0
  194. package/dist/node-runtime/brave-UWDA3I22.js +143 -0
  195. package/dist/node-runtime/builtin-extensions-LYZ3BFWQ.js +28 -0
  196. package/dist/node-runtime/chunk-2QKLKMKC.js +173 -0
  197. package/dist/node-runtime/chunk-3GHXVUAK.js +21 -0
  198. package/dist/node-runtime/chunk-3RCWXWAY.js +466 -0
  199. package/dist/node-runtime/chunk-3WFAEVKS.js +115 -0
  200. package/dist/node-runtime/chunk-3X3KZKMI.js +49 -0
  201. package/dist/node-runtime/chunk-4HXHDDCF.js +16 -0
  202. package/dist/node-runtime/chunk-4TLO4PO2.js +3427 -0
  203. package/dist/node-runtime/chunk-4ZWGEEAS.js +69 -0
  204. package/dist/node-runtime/chunk-53YJI7JU.js +137 -0
  205. package/dist/node-runtime/chunk-5P7PZMRU.js +610 -0
  206. package/dist/node-runtime/chunk-7N3YHTYF.js +26 -0
  207. package/dist/node-runtime/chunk-7NBZ5P7I.js +24 -0
  208. package/dist/node-runtime/chunk-A2KQXUJD.js +105 -0
  209. package/dist/node-runtime/chunk-AD6VXAO7.js +342 -0
  210. package/dist/node-runtime/chunk-AHSTJBIB.js +64 -0
  211. package/dist/node-runtime/chunk-AJX357CL.js +20211 -0
  212. package/dist/node-runtime/chunk-ARC4KOTI.js +11178 -0
  213. package/dist/node-runtime/chunk-AUXVGBO4.js +19 -0
  214. package/dist/node-runtime/chunk-AY6CAJSL.js +30 -0
  215. package/dist/node-runtime/chunk-BHO7O6E5.js +296 -0
  216. package/dist/node-runtime/chunk-BI3DHYCN.js +8845 -0
  217. package/dist/node-runtime/chunk-BR7YDUKA.js +109 -0
  218. package/dist/node-runtime/chunk-BRJX2PRC.js +53 -0
  219. package/dist/node-runtime/chunk-C4O2RSQQ.js +37 -0
  220. package/dist/node-runtime/chunk-CCZJ3PYY.js +17 -0
  221. package/dist/node-runtime/chunk-CDFZEWPU.js +8388 -0
  222. package/dist/node-runtime/chunk-CGBXPL3E.js +1171 -0
  223. package/dist/node-runtime/chunk-CJECDQKP.js +19 -0
  224. package/dist/node-runtime/chunk-DAPBPCBP.js +53 -0
  225. package/dist/node-runtime/chunk-DDGMHUOW.js +305 -0
  226. package/dist/node-runtime/chunk-DMMTJQMQ.js +43 -0
  227. package/dist/node-runtime/chunk-DVGWF6A2.js +1180 -0
  228. package/dist/node-runtime/chunk-ECD5L7YI.js +1369 -0
  229. package/dist/node-runtime/chunk-EDBJNRSM.js +46 -0
  230. package/dist/node-runtime/chunk-F4VQFJI2.js +1269 -0
  231. package/dist/node-runtime/chunk-FVDOXRUD.js +96 -0
  232. package/dist/node-runtime/chunk-GZQHMEWL.js +126 -0
  233. package/dist/node-runtime/chunk-H2EOZYMP.js +57 -0
  234. package/dist/node-runtime/chunk-HQCKFM2O.js +56 -0
  235. package/dist/node-runtime/chunk-HYHJIRDW.js +19 -0
  236. package/dist/node-runtime/chunk-I6R76AG7.js +22 -0
  237. package/dist/node-runtime/chunk-IPA627GP.js +296 -0
  238. package/dist/node-runtime/chunk-JHYKXIMM.js +378 -0
  239. package/dist/node-runtime/chunk-KKSIVROT.js +88 -0
  240. package/dist/node-runtime/chunk-LZAW4ZX3.js +633 -0
  241. package/dist/node-runtime/chunk-M3LZLQW2.js +98 -0
  242. package/dist/node-runtime/chunk-MGWCVY6Y.js +47 -0
  243. package/dist/node-runtime/chunk-MJQDX3BA.js +72 -0
  244. package/dist/node-runtime/chunk-MKKH27PH.js +8956 -0
  245. package/dist/node-runtime/chunk-MX3GJNXJ.js +986 -0
  246. package/dist/node-runtime/chunk-N77MY65L.js +966 -0
  247. package/dist/node-runtime/chunk-NUIFPZWX.js +209 -0
  248. package/dist/node-runtime/chunk-OBMWP3I5.js +68 -0
  249. package/dist/node-runtime/chunk-OR4L3IB2.js +42 -0
  250. package/dist/node-runtime/chunk-PBC2Y6GS.js +903 -0
  251. package/dist/node-runtime/chunk-PCGNAY2O.js +1324 -0
  252. package/dist/node-runtime/chunk-PCIGF2XK.js +250 -0
  253. package/dist/node-runtime/chunk-PGAJ5MO5.js +7558 -0
  254. package/dist/node-runtime/chunk-PL6JKXWI.js +3622 -0
  255. package/dist/node-runtime/chunk-PVCDKGR6.js +55 -0
  256. package/dist/node-runtime/chunk-Q4Q6D4IY.js +364 -0
  257. package/dist/node-runtime/chunk-Q5ZU2VRT.js +83 -0
  258. package/dist/node-runtime/chunk-QFWG2RVL.js +5477 -0
  259. package/dist/node-runtime/chunk-QH42CDX3.js +9451 -0
  260. package/dist/node-runtime/chunk-RQ2Q5IYR.js +72 -0
  261. package/dist/node-runtime/chunk-RQ5DNUNG.js +429 -0
  262. package/dist/node-runtime/chunk-RRIZE6QQ.js +17 -0
  263. package/dist/node-runtime/chunk-SN6G4OU6.js +4753 -0
  264. package/dist/node-runtime/chunk-SWSN6HAB.js +53 -0
  265. package/dist/node-runtime/chunk-TQNSPERU.js +949 -0
  266. package/dist/node-runtime/chunk-VRB2IYGG.js +53 -0
  267. package/dist/node-runtime/chunk-VSELYKWU.js +772 -0
  268. package/dist/node-runtime/chunk-W3CVH5RX.js +62 -0
  269. package/dist/node-runtime/chunk-WJVFOIB5.js +24921 -0
  270. package/dist/node-runtime/chunk-WOVTOV5P.js +5653 -0
  271. package/dist/node-runtime/chunk-XBWPBZBN.js +125 -0
  272. package/dist/node-runtime/chunk-XTHQ7XR7.js +509 -0
  273. package/dist/node-runtime/chunk-YF63P5ZT.js +864 -0
  274. package/dist/node-runtime/chunk-YSKSB3BJ.js +295 -0
  275. package/dist/node-runtime/chunk-ZCHMJ34K.js +130 -0
  276. package/dist/node-runtime/chunk-ZKMFUD3Q.js +2834 -0
  277. package/dist/node-runtime/cli-runtime.js +81 -0
  278. package/dist/node-runtime/clipboard-OZ63BBC6.js +12 -0
  279. package/dist/node-runtime/clipboard-image-7QR6GXVA.js +13 -0
  280. package/dist/node-runtime/command-L3LAHDIH.js +13 -0
  281. package/dist/node-runtime/commands-RL5YBW5I.js +291 -0
  282. package/dist/node-runtime/config-FMEOZSWE.js +77 -0
  283. package/dist/node-runtime/curator-server-XCM43VEF.js +3816 -0
  284. package/dist/node-runtime/customize-XEXL2DGQ.js +12 -0
  285. package/dist/node-runtime/direct-tool-executor-JVDXTO7A.js +188 -0
  286. package/dist/node-runtime/exa-LL64QZR2.js +329 -0
  287. package/dist/node-runtime/export-html-KR26FOUZ.js +150 -0
  288. package/dist/node-runtime/extension-input-RV5N6APL.js +14 -0
  289. package/dist/node-runtime/extension-selector-CPD5LWDD.js +14 -0
  290. package/dist/node-runtime/extract-XLQSJN4V.js +17 -0
  291. package/dist/node-runtime/file-sync-HCOP2QVF.js +117 -0
  292. package/dist/node-runtime/gateway-X2TI5X7F.js +2484 -0
  293. package/dist/node-runtime/gemini-api-QE7ANVDZ.js +29 -0
  294. package/dist/node-runtime/gemini-search-U7SUMPQA.js +330 -0
  295. package/dist/node-runtime/gemini-url-context-PXWCBQHK.js +103 -0
  296. package/dist/node-runtime/gemini-web-MM446SEH.js +14 -0
  297. package/dist/node-runtime/github-extract-F64RZOEA.js +619 -0
  298. package/dist/node-runtime/goal-CZQ7FFQJ.js +1831 -0
  299. package/dist/node-runtime/index.js +859 -0
  300. package/dist/node-runtime/init-NJV2T55N.js +28 -0
  301. package/dist/node-runtime/install-cli-TH7IJJQQ.js +308 -0
  302. package/dist/node-runtime/interactive-mode-KOM35YF2.js +56 -0
  303. package/dist/node-runtime/interactive-view-U6OILKF3.js +249 -0
  304. package/dist/node-runtime/lsp-manager-3ASUSO4T.js +1104 -0
  305. package/dist/node-runtime/lunr-cron-YJ5UHYRD.js +268 -0
  306. package/dist/node-runtime/main.js +54 -0
  307. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +32 -0
  308. package/dist/node-runtime/mcp-panel-IIGMXQGP.js +501 -0
  309. package/dist/node-runtime/mcp-setup-panel-FEK7663I.js +355 -0
  310. package/dist/node-runtime/memory-cap-3S4XRLNP.js +20 -0
  311. package/dist/node-runtime/model-tiers-NJLHUEGK.js +20 -0
  312. package/dist/node-runtime/openai-search-B3MSNCQA.js +288 -0
  313. package/dist/node-runtime/package-manager-cli-TZZHJCVI.js +749 -0
  314. package/dist/node-runtime/parallel-AI2MNSCU.js +265 -0
  315. package/dist/node-runtime/parser-manager-TQHWYDH7.js +152 -0
  316. package/dist/node-runtime/pdf-extract-IPE6H4HP.js +57 -0
  317. package/dist/node-runtime/perplexity-QVJW3I35.js +12 -0
  318. package/dist/node-runtime/pi-intercom-EEMBGQID.js +2215 -0
  319. package/dist/node-runtime/pi-mcp-adapter-QFB37AVN.js +422 -0
  320. package/dist/node-runtime/pi-ollama-cloud-4VZRMULP.js +1440 -0
  321. package/dist/node-runtime/pi-prompt-template-model-4QT4LLXF.js +3946 -0
  322. package/dist/node-runtime/pi-subagents-7XJ4H53P.js +6023 -0
  323. package/dist/node-runtime/pi-web-access-DPGAVKOA.js +1864 -0
  324. package/dist/node-runtime/print-mode-VWIRFDAC.js +12 -0
  325. package/dist/node-runtime/proxy-modes-HEEFK4KC.js +685 -0
  326. package/dist/node-runtime/rpc-entry.js +62 -0
  327. package/dist/node-runtime/rpc-mode-SJNSOA4G.js +13 -0
  328. package/dist/node-runtime/runtime-bridges-PPHNBFWL.js +14 -0
  329. package/dist/node-runtime/session-manager-MQNBYACL.js +35 -0
  330. package/dist/node-runtime/session-selector-5AZLJS6U.js +14 -0
  331. package/dist/node-runtime/settings-manager-5LF2VQWC.js +21 -0
  332. package/dist/node-runtime/src-Y7JSCK64.js +2407 -0
  333. package/dist/node-runtime/subagent-executor-5RNDEPIJ.js +8483 -0
  334. package/dist/node-runtime/summary-review-YSMXKITO.js +228 -0
  335. package/dist/node-runtime/tavily-WEZFVFP7.js +154 -0
  336. package/dist/node-runtime/timings-UAD5BEAS.js +16 -0
  337. package/dist/node-runtime/tool-renderer-MV5O452K.js +204 -0
  338. package/dist/node-runtime/update-cli-A253SZ7P.js +73 -0
  339. package/dist/node-runtime/v4-5MNC3H7G.js +424 -0
  340. package/dist/node-runtime/video-extract-OYT5WKS5.js +304 -0
  341. package/dist/node-runtime/workspace-index-6DBXSTJ6.js +163 -0
  342. package/dist/node-runtime/youtube-extract-TQYKGFGS.js +264 -0
  343. package/dist/startup/benchmark-request.d.ts +3 -0
  344. package/dist/startup/benchmark-request.d.ts.map +1 -0
  345. package/dist/startup/benchmark-request.js +65 -0
  346. package/dist/startup/benchmark-request.js.map +1 -0
  347. package/dist/startup/interactive-view.d.ts +55 -0
  348. package/dist/startup/interactive-view.d.ts.map +1 -0
  349. package/dist/startup/interactive-view.js +332 -0
  350. package/dist/startup/interactive-view.js.map +1 -0
  351. package/dist/startup/launch-routing.d.ts.map +1 -1
  352. package/dist/startup/launch-routing.js +9 -10
  353. package/dist/startup/launch-routing.js.map +1 -1
  354. package/dist/startup/startup-milestones.d.ts +1 -1
  355. package/dist/startup/startup-milestones.d.ts.map +1 -1
  356. package/dist/startup/startup-milestones.js +3 -2
  357. package/dist/startup/startup-milestones.js.map +1 -1
  358. package/dist/utils/await-with-abort.d.ts +2 -0
  359. package/dist/utils/await-with-abort.d.ts.map +1 -0
  360. package/dist/utils/await-with-abort.js +19 -0
  361. package/dist/utils/await-with-abort.js.map +1 -0
  362. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  363. package/dist/utils/syntax-highlight.js +10 -4
  364. package/dist/utils/syntax-highlight.js.map +1 -1
  365. package/docs/compaction.md +5 -3
  366. package/docs/development.md +5 -1
  367. package/docs/features.md +0 -1
  368. package/docs/interactive-startup.md +98 -0
  369. package/docs/model-catalog.md +29 -0
  370. package/docs/usage.md +0 -1
  371. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  372. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  373. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  374. package/examples/extensions/gondolin/package-lock.json +2 -2
  375. package/examples/extensions/gondolin/package.json +1 -1
  376. package/examples/extensions/sandbox/package-lock.json +2 -2
  377. package/examples/extensions/sandbox/package.json +1 -1
  378. package/examples/extensions/with-deps/package-lock.json +2 -2
  379. package/examples/extensions/with-deps/package.json +1 -1
  380. package/package.json +20 -20
  381. package/dist/core/swarm.d.ts +0 -23
  382. package/dist/core/swarm.d.ts.map +0 -1
  383. package/dist/core/swarm.js +0 -45
  384. package/dist/core/swarm.js.map +0 -1
@@ -0,0 +1,1104 @@
1
+ import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
2
+ import {
3
+ require_api,
4
+ require_api2
5
+ } from "./chunk-SN6G4OU6.js";
6
+ import {
7
+ getLanguageIdFromPath
8
+ } from "./chunk-3X3KZKMI.js";
9
+ import {
10
+ __commonJS,
11
+ __require,
12
+ __toESM
13
+ } from "./chunk-BRJX2PRC.js";
14
+
15
+ // node_modules/vscode-jsonrpc/lib/node/ril.js
16
+ var require_ril = __commonJS({
17
+ "node_modules/vscode-jsonrpc/lib/node/ril.js"(exports) {
18
+ "use strict";
19
+ Object.defineProperty(exports, "__esModule", { value: !0 });
20
+ var util_1 = __require("util"), api_1 = require_api(), MessageBuffer = class _MessageBuffer extends api_1.AbstractMessageBuffer {
21
+ static emptyBuffer = Buffer.allocUnsafe(0);
22
+ constructor(encoding = "utf-8") {
23
+ super(encoding);
24
+ }
25
+ emptyBuffer() {
26
+ return _MessageBuffer.emptyBuffer;
27
+ }
28
+ fromString(value, encoding) {
29
+ return Buffer.from(value, encoding);
30
+ }
31
+ toString(value, encoding) {
32
+ return value instanceof Buffer ? value.toString(encoding) : new util_1.TextDecoder(encoding).decode(value);
33
+ }
34
+ asNative(buffer, length) {
35
+ return length === void 0 ? buffer instanceof Buffer ? buffer : Buffer.from(buffer) : buffer instanceof Buffer ? buffer.slice(0, length) : Buffer.from(buffer, 0, length);
36
+ }
37
+ allocNative(length) {
38
+ return Buffer.allocUnsafe(length);
39
+ }
40
+ }, ReadableStreamWrapper = class {
41
+ stream;
42
+ constructor(stream) {
43
+ this.stream = stream;
44
+ }
45
+ onClose(listener) {
46
+ return this.stream.on("close", listener), api_1.Disposable.create(() => this.stream.off("close", listener));
47
+ }
48
+ onError(listener) {
49
+ return this.stream.on("error", listener), api_1.Disposable.create(() => this.stream.off("error", listener));
50
+ }
51
+ onEnd(listener) {
52
+ return this.stream.on("end", listener), api_1.Disposable.create(() => this.stream.off("end", listener));
53
+ }
54
+ onData(listener) {
55
+ return this.stream.on("data", listener), api_1.Disposable.create(() => this.stream.off("data", listener));
56
+ }
57
+ }, WritableStreamWrapper = class {
58
+ stream;
59
+ constructor(stream) {
60
+ this.stream = stream;
61
+ }
62
+ onClose(listener) {
63
+ return this.stream.on("close", listener), api_1.Disposable.create(() => this.stream.off("close", listener));
64
+ }
65
+ onError(listener) {
66
+ return this.stream.on("error", listener), api_1.Disposable.create(() => this.stream.off("error", listener));
67
+ }
68
+ onEnd(listener) {
69
+ return this.stream.on("end", listener), api_1.Disposable.create(() => this.stream.off("end", listener));
70
+ }
71
+ write(data, encoding) {
72
+ return new Promise((resolve2, reject) => {
73
+ let callback = (error) => {
74
+ error == null ? resolve2() : reject(error);
75
+ };
76
+ typeof data == "string" ? this.stream.write(data, encoding, callback) : this.stream.write(data, callback);
77
+ });
78
+ }
79
+ end() {
80
+ this.stream.end();
81
+ }
82
+ }, _ril = Object.freeze({
83
+ messageBuffer: Object.freeze({
84
+ create: (encoding) => new MessageBuffer(encoding)
85
+ }),
86
+ applicationJson: Object.freeze({
87
+ encoder: Object.freeze({
88
+ name: "application/json",
89
+ encode: (msg, options) => {
90
+ try {
91
+ return Promise.resolve(Buffer.from(JSON.stringify(msg, void 0, 0), options.charset));
92
+ } catch (err) {
93
+ return Promise.reject(err);
94
+ }
95
+ }
96
+ }),
97
+ decoder: Object.freeze({
98
+ name: "application/json",
99
+ decode: (buffer, options) => {
100
+ try {
101
+ return buffer instanceof Buffer ? Promise.resolve(JSON.parse(buffer.toString(options.charset))) : Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));
102
+ } catch (err) {
103
+ return Promise.reject(err);
104
+ }
105
+ }
106
+ })
107
+ }),
108
+ stream: Object.freeze({
109
+ asReadableStream: (stream) => new ReadableStreamWrapper(stream),
110
+ asWritableStream: (stream) => new WritableStreamWrapper(stream)
111
+ }),
112
+ console,
113
+ timer: Object.freeze({
114
+ setTimeout(callback, ms, ...args) {
115
+ let handle = setTimeout(callback, ms, ...args);
116
+ return { dispose: () => clearTimeout(handle) };
117
+ },
118
+ setImmediate(callback, ...args) {
119
+ let handle = setImmediate(callback, ...args);
120
+ return { dispose: () => clearImmediate(handle) };
121
+ },
122
+ setInterval(callback, ms, ...args) {
123
+ let handle = setInterval(callback, ms, ...args);
124
+ return { dispose: () => clearInterval(handle) };
125
+ }
126
+ })
127
+ });
128
+ function RIL() {
129
+ return _ril;
130
+ }
131
+ (function(RIL2) {
132
+ function install() {
133
+ api_1.RAL.install(_ril);
134
+ }
135
+ RIL2.install = install;
136
+ })(RIL || (RIL = {}));
137
+ exports.default = RIL;
138
+ }
139
+ });
140
+
141
+ // node_modules/vscode-jsonrpc/lib/node/main.js
142
+ var require_main = __commonJS({
143
+ "node_modules/vscode-jsonrpc/lib/node/main.js"(exports) {
144
+ "use strict";
145
+ var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
146
+ k2 === void 0 && (k2 = k);
147
+ var desc = Object.getOwnPropertyDescriptor(m, k);
148
+ (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) && (desc = { enumerable: !0, get: function() {
149
+ return m[k];
150
+ } }), Object.defineProperty(o, k2, desc);
151
+ }) : (function(o, m, k, k2) {
152
+ k2 === void 0 && (k2 = k), o[k2] = m[k];
153
+ })), __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
154
+ Object.defineProperty(o, "default", { enumerable: !0, value: v });
155
+ }) : function(o, v) {
156
+ o.default = v;
157
+ }), __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() {
158
+ var ownKeys = function(o) {
159
+ return ownKeys = Object.getOwnPropertyNames || function(o2) {
160
+ var ar = [];
161
+ for (var k in o2) Object.prototype.hasOwnProperty.call(o2, k) && (ar[ar.length] = k);
162
+ return ar;
163
+ }, ownKeys(o);
164
+ };
165
+ return function(mod) {
166
+ if (mod && mod.__esModule) return mod;
167
+ var result = {};
168
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) k[i] !== "default" && __createBinding(result, mod, k[i]);
169
+ return __setModuleDefault(result, mod), result;
170
+ };
171
+ })(), __exportStar = exports && exports.__exportStar || function(m, exports2) {
172
+ for (var p in m) p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p) && __createBinding(exports2, m, p);
173
+ }, __importDefault = exports && exports.__importDefault || function(mod) {
174
+ return mod && mod.__esModule ? mod : { default: mod };
175
+ };
176
+ Object.defineProperty(exports, "__esModule", { value: !0 });
177
+ exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.PortMessageWriter = exports.PortMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = void 0;
178
+ exports.generateRandomPipeName = generateRandomPipeName;
179
+ exports.createClientPipeTransport = createClientPipeTransport;
180
+ exports.createServerPipeTransport = createServerPipeTransport;
181
+ exports.createClientSocketTransport = createClientSocketTransport;
182
+ exports.createServerSocketTransport = createServerSocketTransport;
183
+ exports.createMessageConnection = createMessageConnection2;
184
+ var ril_1 = __importDefault(require_ril());
185
+ ril_1.default.install();
186
+ var path = __importStar(__require("path")), os = __importStar(__require("os")), fs = __importStar(__require("fs")), crypto_1 = __require("crypto"), net_1 = __require("net"), api_1 = require_api();
187
+ __exportStar(require_api(), exports);
188
+ var IPCMessageReader = class extends api_1.AbstractMessageReader {
189
+ process;
190
+ constructor(process2) {
191
+ super(), this.process = process2;
192
+ let eventEmitter = this.process;
193
+ eventEmitter.on("error", (error) => this.fireError(error)), eventEmitter.on("close", () => this.fireClose());
194
+ }
195
+ listen(callback) {
196
+ return this.process.on("message", callback), api_1.Disposable.create(() => this.process.off("message", callback));
197
+ }
198
+ };
199
+ exports.IPCMessageReader = IPCMessageReader;
200
+ var IPCMessageWriter = class extends api_1.AbstractMessageWriter {
201
+ process;
202
+ errorCount;
203
+ constructor(process2) {
204
+ super(), this.process = process2, this.errorCount = 0;
205
+ let eventEmitter = this.process;
206
+ eventEmitter.on("error", (error) => this.fireError(error)), eventEmitter.on("close", () => this.fireClose);
207
+ }
208
+ write(msg) {
209
+ try {
210
+ return typeof this.process.send == "function" && this.process.send(msg, void 0, void 0, (error) => {
211
+ error ? (this.errorCount++, this.handleError(error, msg)) : this.errorCount = 0;
212
+ }), Promise.resolve();
213
+ } catch (error) {
214
+ return this.handleError(error, msg), Promise.reject(error);
215
+ }
216
+ }
217
+ handleError(error, msg) {
218
+ this.errorCount++, this.fireError(error, msg, this.errorCount);
219
+ }
220
+ end() {
221
+ }
222
+ };
223
+ exports.IPCMessageWriter = IPCMessageWriter;
224
+ var PortMessageReader = class extends api_1.AbstractMessageReader {
225
+ onData;
226
+ constructor(port) {
227
+ super(), this.onData = new api_1.Emitter(), port.on("close", () => this.fireClose), port.on("error", (error) => this.fireError(error)), port.on("message", (message) => {
228
+ this.onData.fire(message);
229
+ });
230
+ }
231
+ listen(callback) {
232
+ return this.onData.event(callback);
233
+ }
234
+ };
235
+ exports.PortMessageReader = PortMessageReader;
236
+ var PortMessageWriter = class extends api_1.AbstractMessageWriter {
237
+ port;
238
+ errorCount;
239
+ constructor(port) {
240
+ super(), this.port = port, this.errorCount = 0, port.on("close", () => this.fireClose()), port.on("error", (error) => this.fireError(error));
241
+ }
242
+ write(msg) {
243
+ try {
244
+ return this.port.postMessage(msg), Promise.resolve();
245
+ } catch (error) {
246
+ return this.handleError(error, msg), Promise.reject(error);
247
+ }
248
+ }
249
+ handleError(error, msg) {
250
+ this.errorCount++, this.fireError(error, msg, this.errorCount);
251
+ }
252
+ end() {
253
+ }
254
+ };
255
+ exports.PortMessageWriter = PortMessageWriter;
256
+ var SocketMessageReader2 = class extends api_1.ReadableStreamMessageReader {
257
+ constructor(socket, encoding = "utf-8") {
258
+ super((0, ril_1.default)().stream.asReadableStream(socket), encoding);
259
+ }
260
+ };
261
+ exports.SocketMessageReader = SocketMessageReader2;
262
+ var SocketMessageWriter2 = class extends api_1.WriteableStreamMessageWriter {
263
+ socket;
264
+ constructor(socket, options) {
265
+ super((0, ril_1.default)().stream.asWritableStream(socket), options), this.socket = socket;
266
+ }
267
+ dispose() {
268
+ super.dispose(), this.socket.destroy();
269
+ }
270
+ };
271
+ exports.SocketMessageWriter = SocketMessageWriter2;
272
+ var StreamMessageReader2 = class extends api_1.ReadableStreamMessageReader {
273
+ constructor(readable, encoding) {
274
+ super((0, ril_1.default)().stream.asReadableStream(readable), encoding);
275
+ }
276
+ };
277
+ exports.StreamMessageReader = StreamMessageReader2;
278
+ var StreamMessageWriter2 = class extends api_1.WriteableStreamMessageWriter {
279
+ constructor(writable, options) {
280
+ super((0, ril_1.default)().stream.asWritableStream(writable), options);
281
+ }
282
+ };
283
+ exports.StreamMessageWriter = StreamMessageWriter2;
284
+ var XDG_RUNTIME_DIR = process.env.XDG_RUNTIME_DIR, safeIpcPathLengths = /* @__PURE__ */ new Map([
285
+ ["linux", 107],
286
+ ["darwin", 102]
287
+ ]);
288
+ function generateRandomPipeName() {
289
+ if (process.platform === "win32")
290
+ return `\\\\.\\pipe\\lsp-${(0, crypto_1.randomBytes)(16).toString("hex")}-sock`;
291
+ let randomLength = 32, fixedLength = 10, tmpDir = fs.realpathSync(XDG_RUNTIME_DIR ?? os.tmpdir()), limit = safeIpcPathLengths.get(process.platform);
292
+ if (limit !== void 0 && (randomLength = Math.min(limit - tmpDir.length - fixedLength, randomLength)), randomLength < 16)
293
+ throw new Error(`Unable to generate a random pipe name with ${randomLength} characters.`);
294
+ let randomSuffix = (0, crypto_1.randomBytes)(Math.floor(randomLength / 2)).toString("hex");
295
+ return path.join(tmpDir, `lsp-${randomSuffix}.sock`);
296
+ }
297
+ function createClientPipeTransport(pipeName, encoding = "utf-8") {
298
+ let connectResolve, connected = new Promise((resolve2, _reject) => {
299
+ connectResolve = resolve2;
300
+ });
301
+ return new Promise((resolve2, reject) => {
302
+ let server = (0, net_1.createServer)((socket) => {
303
+ server.close(), connectResolve([
304
+ new SocketMessageReader2(socket, encoding),
305
+ new SocketMessageWriter2(socket, encoding)
306
+ ]);
307
+ });
308
+ server.on("error", reject), server.listen(pipeName, () => {
309
+ server.removeListener("error", reject), resolve2({
310
+ onConnected: () => connected
311
+ });
312
+ });
313
+ });
314
+ }
315
+ function createServerPipeTransport(pipeName, encoding = "utf-8") {
316
+ let socket = (0, net_1.createConnection)(pipeName);
317
+ return [
318
+ new SocketMessageReader2(socket, encoding),
319
+ new SocketMessageWriter2(socket, encoding)
320
+ ];
321
+ }
322
+ function createClientSocketTransport(port, encoding = "utf-8") {
323
+ let connectResolve, connected = new Promise((resolve2, _reject) => {
324
+ connectResolve = resolve2;
325
+ });
326
+ return new Promise((resolve2, reject) => {
327
+ let server = (0, net_1.createServer)((socket) => {
328
+ server.close(), connectResolve([
329
+ new SocketMessageReader2(socket, encoding),
330
+ new SocketMessageWriter2(socket, encoding)
331
+ ]);
332
+ });
333
+ server.on("error", reject), server.listen(port, "127.0.0.1", () => {
334
+ server.removeListener("error", reject), resolve2({
335
+ onConnected: () => connected
336
+ });
337
+ });
338
+ });
339
+ }
340
+ function createServerSocketTransport(port, encoding = "utf-8") {
341
+ let socket = (0, net_1.createConnection)(port, "127.0.0.1");
342
+ return [
343
+ new SocketMessageReader2(socket, encoding),
344
+ new SocketMessageWriter2(socket, encoding)
345
+ ];
346
+ }
347
+ function isReadableStream(value) {
348
+ let candidate = value;
349
+ return candidate.read !== void 0 && candidate.addListener !== void 0;
350
+ }
351
+ function isWritableStream(value) {
352
+ let candidate = value;
353
+ return candidate.write !== void 0 && candidate.addListener !== void 0;
354
+ }
355
+ function createMessageConnection2(input, output, logger, options) {
356
+ logger || (logger = api_1.NullLogger);
357
+ let reader = isReadableStream(input) ? new StreamMessageReader2(input) : input, writer = isWritableStream(output) ? new StreamMessageWriter2(output) : output;
358
+ return api_1.ConnectionStrategy.is(options) && (options = { connectionStrategy: options }), (0, api_1.createMessageConnection)(reader, writer, logger, options);
359
+ }
360
+ }
361
+ });
362
+
363
+ // node_modules/vscode-languageserver-protocol/lib/node/main.js
364
+ var require_main2 = __commonJS({
365
+ "node_modules/vscode-languageserver-protocol/lib/node/main.js"(exports) {
366
+ "use strict";
367
+ var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
368
+ k2 === void 0 && (k2 = k);
369
+ var desc = Object.getOwnPropertyDescriptor(m, k);
370
+ (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) && (desc = { enumerable: !0, get: function() {
371
+ return m[k];
372
+ } }), Object.defineProperty(o, k2, desc);
373
+ }) : (function(o, m, k, k2) {
374
+ k2 === void 0 && (k2 = k), o[k2] = m[k];
375
+ })), __exportStar = exports && exports.__exportStar || function(m, exports2) {
376
+ for (var p in m) p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p) && __createBinding(exports2, m, p);
377
+ };
378
+ Object.defineProperty(exports, "__esModule", { value: !0 });
379
+ exports.createProtocolConnection = createProtocolConnection;
380
+ var node_1 = require_main();
381
+ __exportStar(require_main(), exports);
382
+ __exportStar(require_api2(), exports);
383
+ function createProtocolConnection(input, output, logger, options) {
384
+ return (0, node_1.createMessageConnection)(input, output, logger, options);
385
+ }
386
+ }
387
+ });
388
+
389
+ // packages/coding-agent/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js
390
+ import { resolve, join } from "node:path";
391
+ import { pathToFileURL as pathToFileURL2 } from "node:url";
392
+ import { existsSync, readFileSync, readdirSync, unlinkSync } from "node:fs";
393
+ import { spawn as spawnChild } from "node:child_process";
394
+
395
+ // packages/coding-agent/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js
396
+ var import_node = __toESM(require_main2(), 1);
397
+ import { spawn } from "node:child_process";
398
+ import { connect as netConnect } from "node:net";
399
+ import { pathToFileURL } from "node:url";
400
+ var LspClient = class {
401
+ options;
402
+ process = null;
403
+ socket = null;
404
+ connection = null;
405
+ _serverCapabilities = null;
406
+ _diagnostics = /* @__PURE__ */ new Map();
407
+ _initialized = !1;
408
+ _disposed = !1;
409
+ /** True if connected to a daemon socket (server init handled by daemon) */
410
+ _isDaemonClient = !1;
411
+ languageId;
412
+ command;
413
+ rootDir;
414
+ constructor(options) {
415
+ this.options = options, this.languageId = options.languageId, this.command = options.command, this.rootDir = options.rootDir;
416
+ }
417
+ get initialized() {
418
+ return this._initialized;
419
+ }
420
+ get disposed() {
421
+ return this._disposed;
422
+ }
423
+ get serverCapabilities() {
424
+ return this._serverCapabilities;
425
+ }
426
+ /** Get cached diagnostics for a URI */
427
+ getDiagnostics(uri) {
428
+ return this._diagnostics.get(uri) ?? [];
429
+ }
430
+ /** Get all cached diagnostics */
431
+ getAllDiagnostics() {
432
+ return new Map(this._diagnostics);
433
+ }
434
+ /** Start the LSP server and perform the initialize handshake */
435
+ async start() {
436
+ this._initialized || this._disposed || (this.options.socketPath ? await this.connectToSocket(this.options.socketPath) : await this.spawnDirect());
437
+ }
438
+ /** Register shared connection handlers (diagnostics, workspace/configuration, errors) */
439
+ registerConnectionHandlers() {
440
+ this.connection && (this.connection.onNotification("textDocument/publishDiagnostics", (params) => {
441
+ this._diagnostics.set(params.uri, params.diagnostics);
442
+ }), this.connection.onRequest("workspace/configuration", (params) => {
443
+ let settings = this.options.settings;
444
+ return params.items.map((item) => item.section && settings && item.section in settings ? settings[item.section] : {});
445
+ }), this.connection.onError(([err]) => {
446
+ console.error(`[LSP ${this.languageId}] Connection error: ${err.message}`);
447
+ }), this.connection.onClose(() => {
448
+ this._disposed || (this._initialized = !1);
449
+ }));
450
+ }
451
+ /** Connect to an existing LSP daemon via Unix socket (no init handshake needed) */
452
+ async connectToSocket(socketPath) {
453
+ return this._isDaemonClient = !0, new Promise((resolve2, reject) => {
454
+ let settled = !1, settle = (fn) => {
455
+ settled || (settled = !0, fn());
456
+ }, socket = netConnect(socketPath, () => {
457
+ this.socket = socket;
458
+ let reader = new import_node.SocketMessageReader(socket), writer = new import_node.SocketMessageWriter(socket);
459
+ this.connection = (0, import_node.createMessageConnection)(reader, writer), this.registerConnectionHandlers(), this.connection.listen(), this._initialized = !0, settle(() => resolve2());
460
+ });
461
+ socket.on("error", (err) => {
462
+ this._initialized ? this._initialized = !1 : settle(() => reject(new Error(`Failed to connect to LSP daemon: ${err.message}`)));
463
+ }), socket.on("close", () => {
464
+ this._disposed || (this._initialized = !1, this.options.onUnexpectedExit?.(null));
465
+ }), setTimeout(() => {
466
+ settled || (socket.destroy(), settle(() => reject(new Error("Timeout connecting to LSP daemon socket"))));
467
+ }, 1e4);
468
+ });
469
+ }
470
+ /** Spawn LSP server directly as child process with stdio */
471
+ async spawnDirect() {
472
+ let env = { ...process.env, ...this.options.env };
473
+ if (this.process = spawn(this.options.command, this.options.args, {
474
+ stdio: ["pipe", "pipe", "pipe"],
475
+ env,
476
+ cwd: this.rootDir
477
+ }), !this.process.stdout || !this.process.stdin)
478
+ throw new Error(`Failed to spawn LSP server: ${this.options.command}`);
479
+ await new Promise((resolve2, reject) => {
480
+ let onSpawn = () => {
481
+ cleanup(), resolve2();
482
+ }, onError = (err) => {
483
+ cleanup(), reject(new Error(`Failed to spawn LSP server "${this.options.command}": ${err.message}`));
484
+ }, cleanup = () => {
485
+ this.process?.removeListener("spawn", onSpawn), this.process?.removeListener("error", onError);
486
+ };
487
+ this.process.on("spawn", onSpawn), this.process.on("error", onError);
488
+ }), this.process.stderr?.resume();
489
+ let stdin = this.process.stdin, originalWrite = stdin.write;
490
+ stdin.write = function(...args) {
491
+ if (this.destroyed || this.writableEnded || this.writableFinished) {
492
+ let cb = args[args.length - 1];
493
+ return typeof cb == "function" && process.nextTick(cb), !1;
494
+ }
495
+ try {
496
+ return originalWrite.apply(this, args);
497
+ } catch (err) {
498
+ if (err?.code === "EPIPE" || err?.code === "ERR_STREAM_DESTROYED") {
499
+ let cb = args[args.length - 1];
500
+ return typeof cb == "function" && process.nextTick(cb), !1;
501
+ }
502
+ throw err;
503
+ }
504
+ }, stdin.on("error", (err) => {
505
+ err?.code !== "EPIPE" && console.error(`[LSP ${this.languageId}] stdin error: ${err.message}`);
506
+ }), this.process.on("error", (err) => {
507
+ console.error(`[LSP ${this.languageId}] Process error: ${err.message}`), this._initialized = !1, this.disposeConnection();
508
+ }), this.process.on("exit", (code) => {
509
+ this._disposed || (console.error(`[LSP ${this.languageId}] Server exited with code ${code}`), this._initialized = !1, this.disposeConnection(), this.options.onUnexpectedExit?.(code));
510
+ });
511
+ let reader = new import_node.StreamMessageReader(this.process.stdout), writer = new import_node.StreamMessageWriter(this.process.stdin);
512
+ this.connection = (0, import_node.createMessageConnection)(reader, writer), this.registerConnectionHandlers(), this.connection.listen();
513
+ let rootUri = pathToFileURL(this.rootDir).toString(), defaultFolder = { uri: rootUri, name: this.rootDir.split("/").pop() ?? "workspace" }, workspaceFolders = this.options.workspaceFolders && this.options.workspaceFolders.length > 0 ? this.options.workspaceFolders : [defaultFolder], initParams = {
514
+ processId: process.pid,
515
+ capabilities: {
516
+ textDocument: {
517
+ synchronization: {
518
+ didSave: !0,
519
+ dynamicRegistration: !1
520
+ },
521
+ hover: {
522
+ contentFormat: ["plaintext", "markdown"]
523
+ },
524
+ definition: {},
525
+ references: {},
526
+ documentSymbol: {
527
+ hierarchicalDocumentSymbolSupport: !0
528
+ },
529
+ rename: {
530
+ prepareSupport: !1
531
+ },
532
+ publishDiagnostics: {
533
+ relatedInformation: !0
534
+ },
535
+ completion: {
536
+ completionItem: {
537
+ snippetSupport: !1
538
+ }
539
+ }
540
+ },
541
+ workspace: {
542
+ workspaceFolders: !0,
543
+ symbol: {},
544
+ configuration: !0
545
+ }
546
+ },
547
+ rootUri,
548
+ workspaceFolders,
549
+ ...this.options.initializationOptions ? { initializationOptions: this.options.initializationOptions } : {}
550
+ }, result = await this.connection.sendRequest("initialize", initParams);
551
+ this._serverCapabilities = result.capabilities, this.connection.sendNotification("initialized", {}), this._initialized = !0;
552
+ }
553
+ /** Safely dispose the connection without throwing */
554
+ disposeConnection() {
555
+ try {
556
+ this.connection && this.connection.dispose();
557
+ } catch {
558
+ }
559
+ this.connection = null;
560
+ }
561
+ /** Send a request to the LSP server */
562
+ async sendRequest(method, params) {
563
+ if (!this.connection || !this._initialized)
564
+ throw new Error(`LSP ${this.languageId} not initialized`);
565
+ return this.connection.sendRequest(method, params);
566
+ }
567
+ /** Send a notification to the LSP server */
568
+ sendNotification(method, params) {
569
+ !this.connection || !this._initialized || this.connection.sendNotification(method, params);
570
+ }
571
+ /** Notify server of a newly opened document */
572
+ didOpen(uri, languageId, version, text) {
573
+ this.sendNotification("textDocument/didOpen", {
574
+ textDocument: { uri, languageId, version, text }
575
+ });
576
+ }
577
+ /** Notify server of a document change (full content sync) */
578
+ didChange(uri, version, text) {
579
+ this.sendNotification("textDocument/didChange", {
580
+ textDocument: { uri, version },
581
+ contentChanges: [{ text }]
582
+ });
583
+ }
584
+ /** Notify server of a closed document */
585
+ didClose(uri) {
586
+ this.sendNotification("textDocument/didClose", {
587
+ textDocument: { uri }
588
+ });
589
+ }
590
+ /** Gracefully shut down or disconnect from the server */
591
+ async shutdown() {
592
+ if (!this._disposed) {
593
+ if (this._disposed = !0, this._initialized = !1, this._isDaemonClient) {
594
+ this.disposeConnection(), this.socket && this.socket.destroy(), this.socket = null;
595
+ return;
596
+ }
597
+ try {
598
+ if (this.connection) {
599
+ let shutdownReq = this.connection.sendRequest("shutdown").catch(() => {
600
+ });
601
+ await Promise.race([
602
+ shutdownReq,
603
+ new Promise((resolve2) => setTimeout(resolve2, 3e3))
604
+ ]);
605
+ try {
606
+ this.connection.sendNotification("exit");
607
+ } catch {
608
+ }
609
+ }
610
+ } catch {
611
+ }
612
+ this.disposeConnection(), this.process && (this.process.kill("SIGTERM"), setTimeout(() => {
613
+ this.process && !this.process.killed && this.process.kill("SIGKILL");
614
+ }, 2e3)), this.process = null;
615
+ }
616
+ }
617
+ };
618
+
619
+ // packages/coding-agent/dist/builtin-extensions/pi-lsp-extension/src/workspace-provider.js
620
+ var DefaultWorkspaceProvider = class {
621
+ type = "default";
622
+ workspaceRoot = null;
623
+ stateDir = null;
624
+ getWorkspaceFolders() {
625
+ return [];
626
+ }
627
+ async ensureReady() {
628
+ return !0;
629
+ }
630
+ getStatusText() {
631
+ return "";
632
+ }
633
+ shutdown() {
634
+ }
635
+ };
636
+
637
+ // packages/coding-agent/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js
638
+ var DEFAULT_SERVERS = {
639
+ typescript: { command: "typescript-language-server", args: ["--stdio"] },
640
+ javascript: { command: "typescript-language-server", args: ["--stdio"] },
641
+ typescriptreact: { command: "typescript-language-server", args: ["--stdio"] },
642
+ javascriptreact: { command: "typescript-language-server", args: ["--stdio"] },
643
+ rust: { command: "rust-analyzer", args: [] },
644
+ python: { command: "pyright-langserver", args: ["--stdio"] },
645
+ go: { command: "gopls", args: ["serve"] },
646
+ java: { command: "jdtls", args: [] }
647
+ }, LspManager = class _LspManager {
648
+ clients = /* @__PURE__ */ new Map();
649
+ serverConfigs;
650
+ rootDir;
651
+ startingServers = /* @__PURE__ */ new Map();
652
+ _workspace;
653
+ _workspaceReady = !1;
654
+ _workspaceReadying = null;
655
+ _callbacks;
656
+ _sessionId;
657
+ _lombokJarPath = null;
658
+ _shuttingDown = !1;
659
+ _restartAttempts = /* @__PURE__ */ new Map();
660
+ _restartBackoff = /* @__PURE__ */ new Map();
661
+ static MAX_RESTART_ATTEMPTS = 3;
662
+ static INITIAL_BACKOFF_MS = 1e3;
663
+ static MAX_BACKOFF_MS = 3e4;
664
+ constructor(rootDir, customConfigs, callbacks, sessionId, workspace) {
665
+ this.rootDir = resolve(rootDir), this.serverConfigs = new Map(Object.entries({
666
+ ...DEFAULT_SERVERS,
667
+ ...customConfigs
668
+ })), this._workspace = workspace ?? new DefaultWorkspaceProvider(), this._callbacks = callbacks ?? {}, this._sessionId = sessionId ?? `${process.pid}-${Date.now()}`;
669
+ }
670
+ /** Get the workspace provider */
671
+ get workspace() {
672
+ return this._workspace;
673
+ }
674
+ /** Replace the workspace provider (e.g. when an external extension registers one) */
675
+ setWorkspaceProvider(provider) {
676
+ this._workspace = provider, this._workspaceReady = !1, this._workspaceReadying = null;
677
+ }
678
+ /** Update or add a server configuration */
679
+ setServerConfig(languageId, config) {
680
+ this.serverConfigs.set(languageId, config);
681
+ }
682
+ /** Set an explicit path to a Lombok jar for Java/jdtls support */
683
+ setLombokJar(jarPath) {
684
+ this._lombokJarPath = resolve(this.rootDir, jarPath);
685
+ }
686
+ /** Get the currently configured Lombok jar path (if any) */
687
+ getLombokJar() {
688
+ return this.findLombokJar();
689
+ }
690
+ /**
691
+ * Auto-detect Lombok jar.
692
+ * Searches: explicit path, LOMBOK_JAR env var, workspace root env/ directories.
693
+ */
694
+ findLombokJar() {
695
+ if (this._lombokJarPath && existsSync(this._lombokJarPath))
696
+ return this._lombokJarPath;
697
+ let envJar = process.env.LOMBOK_JAR;
698
+ if (envJar) {
699
+ let resolved = resolve(this.rootDir, envJar);
700
+ if (existsSync(resolved))
701
+ return resolved;
702
+ }
703
+ let searchRoots = [this.rootDir], wsRoot = this._workspace.workspaceRoot;
704
+ wsRoot && wsRoot !== this.rootDir && searchRoots.unshift(wsRoot);
705
+ for (let root of searchRoots) {
706
+ let envDir = join(root, "env");
707
+ if (!existsSync(envDir))
708
+ continue;
709
+ try {
710
+ let lombokDirs = readdirSync(envDir).filter((d) => d.startsWith("Lombok-"));
711
+ for (let dir of lombokDirs) {
712
+ let libDir = join(envDir, dir, "runtime", "lib");
713
+ if (existsSync(libDir)) {
714
+ let jars = readdirSync(libDir).filter((f) => f.startsWith("lombok-") && f.endsWith(".jar"));
715
+ if (jars.length > 0)
716
+ return join(libDir, jars[0]);
717
+ }
718
+ }
719
+ } catch {
720
+ }
721
+ let gradleLombok = join(envDir, "gradle-cache-2", "org", "projectlombok", "lombok");
722
+ if (existsSync(gradleLombok))
723
+ try {
724
+ let versions = readdirSync(gradleLombok);
725
+ for (let ver of versions) {
726
+ let jarPath = join(gradleLombok, ver, `lombok-${ver}.jar`);
727
+ if (existsSync(jarPath))
728
+ return jarPath;
729
+ }
730
+ } catch {
731
+ }
732
+ }
733
+ return null;
734
+ }
735
+ /** Build initializationOptions for Java (jdtls) with Lombok support */
736
+ getJavaInitializationOptions() {
737
+ let lombokJar = this.findLombokJar();
738
+ if (lombokJar)
739
+ return {
740
+ settings: {
741
+ "java.jdt.ls.vmargs": `-javaagent:${lombokJar}`
742
+ }
743
+ };
744
+ }
745
+ /** Get all configured languages */
746
+ getConfiguredLanguages() {
747
+ return [...this.serverConfigs.keys()];
748
+ }
749
+ /** Resolve a file path to a language ID */
750
+ getLanguageId(filePath) {
751
+ return getLanguageIdFromPath(filePath);
752
+ }
753
+ /** Get a file URI from a path */
754
+ getFileUri(filePath) {
755
+ let abs = resolve(this.rootDir, filePath);
756
+ return pathToFileURL2(abs).toString();
757
+ }
758
+ /** Resolve an absolute path from potentially relative input */
759
+ resolvePath(filePath) {
760
+ return resolve(this.rootDir, filePath);
761
+ }
762
+ /**
763
+ * Get the LSP client for a language ONLY if it's already running.
764
+ * Does not start a new server. Returns null if no client is active.
765
+ */
766
+ getRunningClient(languageId) {
767
+ let existing = this.clients.get(languageId);
768
+ return existing && existing.initialized && !existing.disposed ? existing : null;
769
+ }
770
+ /**
771
+ * Get the LSP client for a file, starting the server if needed.
772
+ * Returns null if no server is configured for this file type.
773
+ */
774
+ async getClientForFile(filePath) {
775
+ let languageId = this.getLanguageId(filePath);
776
+ return languageId ? this.getClientForLanguage(languageId) : null;
777
+ }
778
+ /**
779
+ * Get a user-friendly message about why no client is available for a file.
780
+ */
781
+ getUnavailableReason(filePath) {
782
+ let languageId = this.getLanguageId(filePath);
783
+ if (!languageId)
784
+ return `No LSP server configured for file type: ${filePath}`;
785
+ let waitHint = this.getExpectedStartTime(languageId);
786
+ if (this.startingServers.has(languageId))
787
+ return `LSP server for ${languageId} is starting. ${waitHint} Retry shortly.`;
788
+ let existing = this.clients.get(languageId);
789
+ return existing && !existing.initialized && !existing.disposed ? `LSP server for ${languageId} is initializing. ${waitHint} Retry shortly.` : `No LSP server available for: ${filePath}. If you just opened this project, call any LSP tool on a file to trigger server startup.`;
790
+ }
791
+ /** Estimated startup time hint for a language server */
792
+ getExpectedStartTime(languageId) {
793
+ switch (languageId) {
794
+ case "java":
795
+ return "This typically takes 1-5 minutes for Java (project indexing).";
796
+ case "rust":
797
+ return "This typically takes 30s-2min for Rust (cargo metadata + indexing).";
798
+ case "typescript":
799
+ case "javascript":
800
+ case "typescriptreact":
801
+ case "javascriptreact":
802
+ return "This typically takes 10-30s for TypeScript/JavaScript.";
803
+ case "python":
804
+ return "This typically takes 10-30s for Python.";
805
+ case "go":
806
+ return "This typically takes 10-30s for Go.";
807
+ default:
808
+ return "This may take a few seconds to a minute.";
809
+ }
810
+ }
811
+ /**
812
+ * Get the LSP client for a language, starting the server if needed.
813
+ * In Brazil workspaces, connects to a shared daemon (or spawns one).
814
+ * Returns null if no server is configured for this language.
815
+ */
816
+ async getClientForLanguage(languageId) {
817
+ let existing = this.clients.get(languageId);
818
+ if (existing && existing.initialized && !existing.disposed)
819
+ return existing;
820
+ if (this.startingServers.get(languageId))
821
+ return null;
822
+ let config = this.serverConfigs.get(languageId);
823
+ if (!config)
824
+ return null;
825
+ let startPromise = this.startServer(languageId, config);
826
+ return this.startingServers.set(languageId, startPromise), startPromise.catch((err) => {
827
+ this.startingServers.delete(languageId);
828
+ let message = `Failed to start LSP server for ${languageId}: ${err.message}`;
829
+ this._callbacks.onServerError?.(languageId, message);
830
+ }), null;
831
+ }
832
+ /**
833
+ * Check if a server is currently starting up for a language.
834
+ */
835
+ isServerStarting(languageId) {
836
+ return this.startingServers.has(languageId);
837
+ }
838
+ /**
839
+ * Eagerly start LSP servers for the given languages in the background.
840
+ * Unlike getClientForLanguage (which returns null immediately), this method
841
+ * is fire-and-forget — intended for session_start auto-start.
842
+ */
843
+ startEagerly(languageIds) {
844
+ for (let languageId of languageIds) {
845
+ let existing = this.clients.get(languageId);
846
+ if (existing && existing.initialized && !existing.disposed || this.startingServers.has(languageId))
847
+ continue;
848
+ let config = this.serverConfigs.get(languageId);
849
+ if (!config)
850
+ continue;
851
+ let startPromise = this.startServer(languageId, config);
852
+ this.startingServers.set(languageId, startPromise), startPromise.catch((err) => {
853
+ this.startingServers.delete(languageId), this._callbacks.onServerError?.(languageId, `Auto-start failed: ${err.message}`);
854
+ });
855
+ }
856
+ }
857
+ /**
858
+ * Ensure workspace provider is ready (one-time per session).
859
+ * Deduplicates concurrent calls.
860
+ */
861
+ async ensureWorkspace() {
862
+ if (this._workspaceReady)
863
+ return;
864
+ if (this._workspaceReadying) {
865
+ await this._workspaceReadying;
866
+ return;
867
+ }
868
+ this._callbacks.onWorkspaceSetupStart?.();
869
+ let start = Date.now();
870
+ this._workspaceReadying = this._workspace.ensureReady(this._sessionId);
871
+ try {
872
+ let success = await this._workspaceReadying;
873
+ this._callbacks.onWorkspaceSetupEnd?.(success, Date.now() - start);
874
+ } finally {
875
+ this._workspaceReady = !0, this._workspaceReadying = null;
876
+ }
877
+ }
878
+ async startServer(languageId, config) {
879
+ await this.ensureWorkspace();
880
+ let stateDir = this._workspace.stateDir, folders = this._workspace.getWorkspaceFolders(), workspaceFolders = folders.length > 0 ? folders : void 0, initializationOptions = config.initializationOptions ?? (languageId === "java" ? this.getJavaInitializationOptions() : void 0), effectiveArgs = config.args;
881
+ if (languageId === "java") {
882
+ let lombokJar = this.findLombokJar();
883
+ lombokJar && (effectiveArgs = [`--jvm-arg=-javaagent:${lombokJar}`, ...config.args]);
884
+ }
885
+ let onUnexpectedExit = (code) => this.handleUnexpectedExit(languageId, code), socketPath = this.getSocketPath(languageId);
886
+ if (socketPath && this.isDaemonAlive(languageId)) {
887
+ this._callbacks.onServerStart?.(languageId, `${config.command} (shared)`);
888
+ try {
889
+ let client2 = new LspClient({
890
+ command: config.command,
891
+ args: effectiveArgs,
892
+ rootDir: this.rootDir,
893
+ languageId,
894
+ socketPath,
895
+ initializationOptions,
896
+ settings: config.settings,
897
+ onUnexpectedExit
898
+ });
899
+ return await client2.start(), this.clients.set(languageId, client2), this.startingServers.delete(languageId), this._callbacks.onServerReady?.(languageId), this._restartAttempts.delete(languageId), this._restartBackoff.delete(languageId), this.triggerPostInit(languageId, client2), client2;
900
+ } catch {
901
+ }
902
+ }
903
+ if (this._callbacks.onServerStart?.(languageId, config.command), stateDir)
904
+ try {
905
+ await this.spawnDaemon(languageId, config, effectiveArgs, workspaceFolders, initializationOptions), await new Promise((r) => setTimeout(r, 500));
906
+ let daemonSocket = this.getSocketPath(languageId), lastErr = null;
907
+ for (let attempt = 0; attempt < 60; attempt++)
908
+ try {
909
+ let client2 = new LspClient({
910
+ command: config.command,
911
+ args: effectiveArgs,
912
+ rootDir: this.rootDir,
913
+ languageId,
914
+ socketPath: daemonSocket,
915
+ initializationOptions,
916
+ settings: config.settings,
917
+ onUnexpectedExit
918
+ });
919
+ return await client2.start(), this.clients.set(languageId, client2), this.startingServers.delete(languageId), this._callbacks.onServerReady?.(languageId), this._restartAttempts.delete(languageId), this._restartBackoff.delete(languageId), this.triggerPostInit(languageId, client2), client2;
920
+ } catch (err) {
921
+ if (lastErr = err, !this.isDaemonAlive(languageId))
922
+ throw new Error(`Daemon for ${languageId} died during startup: ${err.message}`);
923
+ await new Promise((r) => setTimeout(r, 5e3));
924
+ }
925
+ throw lastErr ?? new Error("Failed to connect to daemon");
926
+ } catch (err) {
927
+ this._callbacks.onServerError?.(languageId, `Daemon mode failed, falling back to direct: ${err.message}`), this.startingServers.delete(languageId);
928
+ }
929
+ let client = new LspClient({
930
+ command: config.command,
931
+ args: effectiveArgs,
932
+ rootDir: this.rootDir,
933
+ languageId,
934
+ env: config.env,
935
+ workspaceFolders,
936
+ initializationOptions,
937
+ settings: config.settings,
938
+ onUnexpectedExit
939
+ });
940
+ try {
941
+ return await client.start(), this.clients.set(languageId, client), this.startingServers.delete(languageId), this._callbacks.onServerReady?.(languageId), this._restartAttempts.delete(languageId), this._restartBackoff.delete(languageId), this.triggerPostInit(languageId, client), client;
942
+ } catch (err) {
943
+ this.startingServers.delete(languageId);
944
+ let message = `Failed to start LSP server for ${languageId} (${config.command}): ${err.message}`;
945
+ throw this._callbacks.onServerError?.(languageId, message), new Error(message);
946
+ }
947
+ }
948
+ /**
949
+ * Post-initialization hook for language-specific setup.
950
+ * For Java/jdtls: triggers a workspace build so diagnostics refresh
951
+ * after Lombok annotation processing completes.
952
+ */
953
+ triggerPostInit(languageId, client) {
954
+ languageId === "java" && client.sendRequest("java/buildWorkspace", !0).catch(() => {
955
+ });
956
+ }
957
+ /** Get the socket path for a language's daemon */
958
+ getSocketPath(languageId) {
959
+ let stateDir = this._workspace.stateDir;
960
+ return stateDir ? join(stateDir, "sockets", `lsp-${languageId}.sock`) : null;
961
+ }
962
+ /** Check if a daemon is alive for this language */
963
+ isDaemonAlive(languageId) {
964
+ let stateDir = this._workspace.stateDir;
965
+ if (!stateDir)
966
+ return !1;
967
+ let pidPath = join(stateDir, "sockets", `lsp-${languageId}.pid`);
968
+ try {
969
+ if (!existsSync(pidPath))
970
+ return !1;
971
+ let pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
972
+ return isNaN(pid) ? !1 : (process.kill(pid, 0), !0);
973
+ } catch {
974
+ return !1;
975
+ }
976
+ }
977
+ /** Spawn an LSP daemon as a detached background process */
978
+ async spawnDaemon(languageId, config, effectiveArgs, workspaceFolders, initializationOptions) {
979
+ let socketPath = this.getSocketPath(languageId), daemonScript = new URL("./lsp-daemon.ts", new URL("../builtin-extensions/pi-lsp-extension/src/lsp-manager.js", import.meta.url).href).pathname, launcherScript = new URL("./lsp-daemon-launcher.cjs", new URL("../builtin-extensions/pi-lsp-extension/src/lsp-manager.js", import.meta.url).href).pathname, jitiPath;
980
+ try {
981
+ jitiPath = __require.resolve("jiti");
982
+ } catch {
983
+ try {
984
+ jitiPath = __require.resolve("@mariozechner/jiti");
985
+ } catch {
986
+ throw new Error("Cannot resolve jiti for daemon spawn \u2014 jiti not found in module path");
987
+ }
988
+ }
989
+ let env = {
990
+ ...process.env,
991
+ ...config.env ?? {},
992
+ LSP_ROOT_DIR: this.rootDir,
993
+ LSP_LANGUAGE_ID: languageId
994
+ };
995
+ workspaceFolders && workspaceFolders.length > 0 && (env.LSP_WORKSPACE_FOLDERS = JSON.stringify(workspaceFolders)), initializationOptions && (env.LSP_INITIALIZATION_OPTIONS = JSON.stringify(initializationOptions)), config.settings && (env.LSP_SETTINGS = JSON.stringify(config.settings)), spawnChild(
996
+ process.execPath,
997
+ // node
998
+ [launcherScript, jitiPath, daemonScript, socketPath, config.command, ...effectiveArgs],
999
+ {
1000
+ cwd: this.rootDir,
1001
+ env,
1002
+ detached: !0,
1003
+ stdio: "ignore"
1004
+ }
1005
+ ).unref();
1006
+ }
1007
+ /** Get status of all configured/running servers */
1008
+ getStatus() {
1009
+ let statuses = [];
1010
+ for (let [languageId, config] of this.serverConfigs) {
1011
+ let client = this.clients.get(languageId), diagnosticsCount = 0;
1012
+ if (client)
1013
+ for (let diags of client.getAllDiagnostics().values())
1014
+ diagnosticsCount += diags.length;
1015
+ let daemonAlive = this.isDaemonAlive(languageId);
1016
+ statuses.push({
1017
+ languageId,
1018
+ command: config.command,
1019
+ running: client?.initialized === !0 && !client.disposed,
1020
+ diagnosticsCount,
1021
+ shared: daemonAlive
1022
+ });
1023
+ }
1024
+ return statuses;
1025
+ }
1026
+ /**
1027
+ * Handle an unexpected server exit. Attempts auto-restart with exponential backoff.
1028
+ * Gives up after MAX_RESTART_ATTEMPTS failures per language per session.
1029
+ */
1030
+ handleUnexpectedExit(languageId, code) {
1031
+ if (this._shuttingDown)
1032
+ return;
1033
+ this.clients.delete(languageId), this.startingServers.delete(languageId);
1034
+ let attempts = this._restartAttempts.get(languageId) ?? 0;
1035
+ if (attempts >= _LspManager.MAX_RESTART_ATTEMPTS) {
1036
+ this._callbacks.onServerError?.(languageId, `LSP server for ${languageId} crashed ${attempts} times \u2014 giving up auto-restart`), this._callbacks.onServerCrash?.(languageId, !1, attempts);
1037
+ return;
1038
+ }
1039
+ let backoff = this._restartBackoff.get(languageId) ?? _LspManager.INITIAL_BACKOFF_MS;
1040
+ this._restartAttempts.set(languageId, attempts + 1), this._restartBackoff.set(languageId, Math.min(backoff * 2, _LspManager.MAX_BACKOFF_MS)), this._callbacks.onServerCrash?.(languageId, !0, attempts + 1), setTimeout(() => {
1041
+ if (this._shuttingDown)
1042
+ return;
1043
+ let config = this.serverConfigs.get(languageId);
1044
+ if (!config)
1045
+ return;
1046
+ let startPromise = this.startServer(languageId, config);
1047
+ this.startingServers.set(languageId, startPromise), startPromise.catch((err) => {
1048
+ this.startingServers.delete(languageId), this._callbacks.onServerError?.(languageId, `Auto-restart failed for ${languageId}: ${err.message}`), this.handleUnexpectedExit(languageId, null);
1049
+ });
1050
+ }, backoff);
1051
+ }
1052
+ /** Shut down all clients (disconnect from daemons, kill direct servers) */
1053
+ async shutdownAll() {
1054
+ this._workspace.shutdown(), this._shuttingDown = !0;
1055
+ let shutdowns = [...this.clients.values()].map((client) => client.shutdown().catch(() => {
1056
+ }));
1057
+ await Promise.all(shutdowns), this.clients.clear(), this.startingServers.clear();
1058
+ }
1059
+ /**
1060
+ * Restart a specific language server. Shuts down the existing client
1061
+ * (and kills the daemon if shared), then starts a fresh server.
1062
+ * Returns once the new server is initialized, or throws on failure.
1063
+ */
1064
+ async restartServer(languageId) {
1065
+ let existing = this.clients.get(languageId);
1066
+ existing && (await existing.shutdown().catch(() => {
1067
+ }), this.clients.delete(languageId)), this.killDaemon(languageId);
1068
+ let pending = this.startingServers.get(languageId);
1069
+ pending && (await pending.catch(() => {
1070
+ }), this.startingServers.delete(languageId));
1071
+ let config = this.serverConfigs.get(languageId);
1072
+ if (!config)
1073
+ throw new Error(`No server configured for ${languageId}`);
1074
+ await this.startServer(languageId, config);
1075
+ }
1076
+ /** Kill a running daemon for a language (if any) */
1077
+ killDaemon(languageId) {
1078
+ let stateDir = this._workspace.stateDir;
1079
+ if (!stateDir)
1080
+ return;
1081
+ let pidPath = join(stateDir, "sockets", `lsp-${languageId}.pid`);
1082
+ try {
1083
+ if (!existsSync(pidPath))
1084
+ return;
1085
+ let pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
1086
+ if (isNaN(pid))
1087
+ return;
1088
+ process.kill(pid, "SIGTERM");
1089
+ let socketPath = join(stateDir, "sockets", `lsp-${languageId}.sock`);
1090
+ try {
1091
+ unlinkSync(socketPath);
1092
+ } catch {
1093
+ }
1094
+ try {
1095
+ unlinkSync(pidPath);
1096
+ } catch {
1097
+ }
1098
+ } catch {
1099
+ }
1100
+ }
1101
+ };
1102
+ export {
1103
+ LspManager
1104
+ };