@ashx-j/lunr 0.2.26 → 0.2.28

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 (697) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  30. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  32. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  36. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  39. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  63. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  67. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  70. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  76. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  94. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  97. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  98. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  99. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  106. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  108. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  111. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  115. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  118. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  121. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +17 -31
  129. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  132. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +78 -42
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  141. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +134 -28
  143. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +26 -5
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  149. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  152. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  156. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  158. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  160. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  165. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  166. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  168. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  171. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  172. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +18 -9
  175. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  178. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  179. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-tps.js +28 -17
  181. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  183. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  185. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  186. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  187. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  188. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  189. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  190. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  191. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  192. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  193. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  194. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  195. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  196. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  197. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  198. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  199. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  200. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  201. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  203. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  205. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  207. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  209. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  210. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  211. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  212. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  213. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  214. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  215. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  216. package/dist/catalog/models.json +1 -1
  217. package/dist/catalog/providers/google-vertex.json +1 -1
  218. package/dist/catalog/providers/google.json +1 -1
  219. package/dist/catalog/publication.json +3 -3
  220. package/dist/cli/install-cli.d.ts.map +1 -1
  221. package/dist/cli/install-cli.js +38 -30
  222. package/dist/cli/install-cli.js.map +1 -1
  223. package/dist/core/agent-session-runtime.d.ts +13 -0
  224. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  225. package/dist/core/agent-session-runtime.js +75 -11
  226. package/dist/core/agent-session-runtime.js.map +1 -1
  227. package/dist/core/agent-session-services.d.ts +1 -0
  228. package/dist/core/agent-session-services.d.ts.map +1 -1
  229. package/dist/core/agent-session-services.js +1 -0
  230. package/dist/core/agent-session-services.js.map +1 -1
  231. package/dist/core/agent-session.d.ts +46 -21
  232. package/dist/core/agent-session.d.ts.map +1 -1
  233. package/dist/core/agent-session.js +344 -126
  234. package/dist/core/agent-session.js.map +1 -1
  235. package/dist/core/browser/runtime.d.ts +2 -0
  236. package/dist/core/browser/runtime.d.ts.map +1 -1
  237. package/dist/core/browser/runtime.js +80 -45
  238. package/dist/core/browser/runtime.js.map +1 -1
  239. package/dist/core/browser/setup.d.ts.map +1 -1
  240. package/dist/core/browser/setup.js +12 -1
  241. package/dist/core/browser/setup.js.map +1 -1
  242. package/dist/core/cache-stats.d.ts +1 -1
  243. package/dist/core/cache-stats.d.ts.map +1 -1
  244. package/dist/core/cache-stats.js +1 -1
  245. package/dist/core/cache-stats.js.map +1 -1
  246. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  247. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  248. package/dist/core/compaction/branch-summarization.js +1 -0
  249. package/dist/core/compaction/branch-summarization.js.map +1 -1
  250. package/dist/core/compaction/compaction.d.ts +5 -11
  251. package/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/dist/core/compaction/compaction.js +38 -92
  253. package/dist/core/compaction/compaction.js.map +1 -1
  254. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  255. package/dist/core/computer-use/adapter.js +7 -2
  256. package/dist/core/computer-use/adapter.js.map +1 -1
  257. package/dist/core/computer-use/image.d.ts.map +1 -1
  258. package/dist/core/computer-use/image.js +17 -5
  259. package/dist/core/computer-use/image.js.map +1 -1
  260. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  261. package/dist/core/computer-use/schemas.js +23 -6
  262. package/dist/core/computer-use/schemas.js.map +1 -1
  263. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  264. package/dist/core/computer-use/workflow.js +459 -119
  265. package/dist/core/computer-use/workflow.js.map +1 -1
  266. package/dist/core/context-breakdown.d.ts +2 -2
  267. package/dist/core/context-breakdown.d.ts.map +1 -1
  268. package/dist/core/context-breakdown.js +22 -20
  269. package/dist/core/context-breakdown.js.map +1 -1
  270. package/dist/core/cron/jobs.d.ts +26 -8
  271. package/dist/core/cron/jobs.d.ts.map +1 -1
  272. package/dist/core/cron/jobs.js +357 -232
  273. package/dist/core/cron/jobs.js.map +1 -1
  274. package/dist/core/cron/origin-context.d.ts +1 -0
  275. package/dist/core/cron/origin-context.d.ts.map +1 -1
  276. package/dist/core/cron/origin-context.js.map +1 -1
  277. package/dist/core/cron/scheduler.d.ts +22 -17
  278. package/dist/core/cron/scheduler.d.ts.map +1 -1
  279. package/dist/core/cron/scheduler.js +153 -73
  280. package/dist/core/cron/scheduler.js.map +1 -1
  281. package/dist/core/extensions/index.d.ts +1 -1
  282. package/dist/core/extensions/index.d.ts.map +1 -1
  283. package/dist/core/extensions/index.js.map +1 -1
  284. package/dist/core/extensions/runner.d.ts +1 -0
  285. package/dist/core/extensions/runner.d.ts.map +1 -1
  286. package/dist/core/extensions/runner.js +8 -0
  287. package/dist/core/extensions/runner.js.map +1 -1
  288. package/dist/core/extensions/types.d.ts +11 -1
  289. package/dist/core/extensions/types.d.ts.map +1 -1
  290. package/dist/core/extensions/types.js.map +1 -1
  291. package/dist/core/footer-data-provider.d.ts +4 -0
  292. package/dist/core/footer-data-provider.d.ts.map +1 -1
  293. package/dist/core/footer-data-provider.js +22 -1
  294. package/dist/core/footer-data-provider.js.map +1 -1
  295. package/dist/core/large-subagent-launch.d.ts +1 -1
  296. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  297. package/dist/core/large-subagent-launch.js +7 -7
  298. package/dist/core/large-subagent-launch.js.map +1 -1
  299. package/dist/core/model-registry.d.ts +2 -0
  300. package/dist/core/model-registry.d.ts.map +1 -1
  301. package/dist/core/model-registry.js +5 -0
  302. package/dist/core/model-registry.js.map +1 -1
  303. package/dist/core/model-runtime.d.ts +4 -1
  304. package/dist/core/model-runtime.d.ts.map +1 -1
  305. package/dist/core/model-runtime.js +40 -4
  306. package/dist/core/model-runtime.js.map +1 -1
  307. package/dist/core/package-manager.d.ts.map +1 -1
  308. package/dist/core/package-manager.js.map +1 -1
  309. package/dist/core/permissions.d.ts +3 -3
  310. package/dist/core/permissions.d.ts.map +1 -1
  311. package/dist/core/permissions.js +11 -35
  312. package/dist/core/permissions.js.map +1 -1
  313. package/dist/core/plan-mode.d.ts +5 -13
  314. package/dist/core/plan-mode.d.ts.map +1 -1
  315. package/dist/core/plan-mode.js +126 -116
  316. package/dist/core/plan-mode.js.map +1 -1
  317. package/dist/core/project-trust.d.ts.map +1 -1
  318. package/dist/core/project-trust.js +1 -1
  319. package/dist/core/project-trust.js.map +1 -1
  320. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  321. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  322. package/dist/core/prompt-resource-bridge.js +9 -0
  323. package/dist/core/prompt-resource-bridge.js.map +1 -0
  324. package/dist/core/protected-targets.d.ts +6 -0
  325. package/dist/core/protected-targets.d.ts.map +1 -0
  326. package/dist/core/protected-targets.js +45 -0
  327. package/dist/core/protected-targets.js.map +1 -0
  328. package/dist/core/resource-loader.d.ts.map +1 -1
  329. package/dist/core/resource-loader.js +7 -0
  330. package/dist/core/resource-loader.js.map +1 -1
  331. package/dist/core/rollback.d.ts +19 -3
  332. package/dist/core/rollback.d.ts.map +1 -1
  333. package/dist/core/rollback.js +172 -56
  334. package/dist/core/rollback.js.map +1 -1
  335. package/dist/core/runtime-credentials.d.ts +3 -0
  336. package/dist/core/runtime-credentials.d.ts.map +1 -1
  337. package/dist/core/runtime-credentials.js +14 -1
  338. package/dist/core/runtime-credentials.js.map +1 -1
  339. package/dist/core/sdk.d.ts +3 -0
  340. package/dist/core/sdk.d.ts.map +1 -1
  341. package/dist/core/sdk.js +1 -0
  342. package/dist/core/sdk.js.map +1 -1
  343. package/dist/core/session-manager.d.ts +11 -1
  344. package/dist/core/session-manager.d.ts.map +1 -1
  345. package/dist/core/session-manager.js +111 -33
  346. package/dist/core/session-manager.js.map +1 -1
  347. package/dist/core/session-ownership.d.ts.map +1 -1
  348. package/dist/core/session-ownership.js +8 -3
  349. package/dist/core/session-ownership.js.map +1 -1
  350. package/dist/core/session-retention.d.ts.map +1 -1
  351. package/dist/core/session-retention.js +18 -7
  352. package/dist/core/session-retention.js.map +1 -1
  353. package/dist/core/session-startup-settings.d.ts +10 -0
  354. package/dist/core/session-startup-settings.d.ts.map +1 -0
  355. package/dist/core/session-startup-settings.js +70 -0
  356. package/dist/core/session-startup-settings.js.map +1 -0
  357. package/dist/core/subscriptions.d.ts +16 -7
  358. package/dist/core/subscriptions.d.ts.map +1 -1
  359. package/dist/core/subscriptions.js +96 -55
  360. package/dist/core/subscriptions.js.map +1 -1
  361. package/dist/core/trust-manager.d.ts +2 -1
  362. package/dist/core/trust-manager.d.ts.map +1 -1
  363. package/dist/core/trust-manager.js +6 -1
  364. package/dist/core/trust-manager.js.map +1 -1
  365. package/dist/core/update-check.d.ts.map +1 -1
  366. package/dist/core/update-check.js.map +1 -1
  367. package/dist/core/usage-accounting.d.ts +47 -0
  368. package/dist/core/usage-accounting.d.ts.map +1 -0
  369. package/dist/core/usage-accounting.js +205 -0
  370. package/dist/core/usage-accounting.js.map +1 -0
  371. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  372. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  373. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  374. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  375. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  376. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  377. package/dist/core/usage-adapters/openai-codex.js +3 -3
  378. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  379. package/dist/core/usage-adapters/xai.d.ts +2 -2
  380. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  381. package/dist/core/usage-adapters/xai.js +3 -3
  382. package/dist/core/usage-adapters/xai.js.map +1 -1
  383. package/dist/core/usage-adapters/zai.d.ts +2 -2
  384. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  385. package/dist/core/usage-adapters/zai.js +2 -2
  386. package/dist/core/usage-adapters/zai.js.map +1 -1
  387. package/dist/core/usage-history.d.ts +1 -18
  388. package/dist/core/usage-history.d.ts.map +1 -1
  389. package/dist/core/usage-history.js +46 -114
  390. package/dist/core/usage-history.js.map +1 -1
  391. package/dist/core/usage-service.d.ts +9 -2
  392. package/dist/core/usage-service.d.ts.map +1 -1
  393. package/dist/core/usage-service.js +95 -50
  394. package/dist/core/usage-service.js.map +1 -1
  395. package/dist/gateway/agent-bridge.d.ts +9 -1
  396. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  397. package/dist/gateway/agent-bridge.js +91 -37
  398. package/dist/gateway/agent-bridge.js.map +1 -1
  399. package/dist/gateway/buttons.d.ts +8 -1
  400. package/dist/gateway/buttons.d.ts.map +1 -1
  401. package/dist/gateway/buttons.js +76 -18
  402. package/dist/gateway/buttons.js.map +1 -1
  403. package/dist/gateway/commands.d.ts +1 -0
  404. package/dist/gateway/commands.d.ts.map +1 -1
  405. package/dist/gateway/commands.js +10 -4
  406. package/dist/gateway/commands.js.map +1 -1
  407. package/dist/gateway/cron.d.ts +12 -11
  408. package/dist/gateway/cron.d.ts.map +1 -1
  409. package/dist/gateway/cron.js +65 -56
  410. package/dist/gateway/cron.js.map +1 -1
  411. package/dist/gateway/index.d.ts.map +1 -1
  412. package/dist/gateway/index.js +2 -1
  413. package/dist/gateway/index.js.map +1 -1
  414. package/dist/gateway/mobile-commands.d.ts +1 -0
  415. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  416. package/dist/gateway/mobile-commands.js +69 -15
  417. package/dist/gateway/mobile-commands.js.map +1 -1
  418. package/dist/gateway/presenter.d.ts +12 -2
  419. package/dist/gateway/presenter.d.ts.map +1 -1
  420. package/dist/gateway/presenter.js +73 -38
  421. package/dist/gateway/presenter.js.map +1 -1
  422. package/dist/gateway/router.d.ts +2 -2
  423. package/dist/gateway/router.d.ts.map +1 -1
  424. package/dist/gateway/router.js +17 -2
  425. package/dist/gateway/router.js.map +1 -1
  426. package/dist/gateway/service.d.ts +2 -0
  427. package/dist/gateway/service.d.ts.map +1 -1
  428. package/dist/gateway/service.js +153 -0
  429. package/dist/gateway/service.js.map +1 -1
  430. package/dist/main.d.ts.map +1 -1
  431. package/dist/main.js +86 -33
  432. package/dist/main.js.map +1 -1
  433. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/assistant-message.js +6 -4
  435. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  436. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/context-view.js +2 -2
  438. package/dist/modes/interactive/components/context-view.js.map +1 -1
  439. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/copyable-text.js +3 -2
  441. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  442. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/extension-editor.js +1 -1
  444. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  445. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/footer.js +8 -12
  447. package/dist/modes/interactive/components/footer.js.map +1 -1
  448. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  449. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/usage-view.js +21 -6
  451. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  452. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  453. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  454. package/dist/modes/interactive/interactive-mode.js +151 -131
  455. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  456. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  457. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +2 -1
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  462. package/dist/node-runtime/agent-session-services-RTUGP3XR.js +54 -0
  463. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  464. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.js} +8 -7
  465. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  466. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  467. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  468. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  469. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  470. package/dist/node-runtime/chunk-4QRUZ64T.js +1203 -0
  471. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  472. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  473. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  474. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  475. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  476. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  477. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
  478. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  479. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
  480. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  481. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
  482. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  483. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  484. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  485. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  486. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  487. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  488. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  489. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  490. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  491. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  492. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  493. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  494. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  495. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  496. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
  497. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  498. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  499. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  500. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
  501. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  502. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  503. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  504. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  505. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  506. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
  507. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  508. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
  509. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  510. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  511. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  512. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  513. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
  514. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  515. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
  516. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  517. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  518. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
  519. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  520. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  521. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  522. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  523. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  524. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  525. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  526. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  527. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  528. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  529. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  530. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  531. package/dist/node-runtime/cli-runtime.js +4 -4
  532. package/dist/node-runtime/{command-FSBU2EVZ.js → command-YRT7I2BW.js} +5 -5
  533. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
  534. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  535. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  536. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  537. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  538. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  539. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-DBQRRMAY.js} +4 -4
  540. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  541. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  542. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  543. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-V6K2CDWN.js} +51 -42
  544. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  545. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  546. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  547. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-J7TYMOBK.js} +14 -8
  548. package/dist/node-runtime/index.js +51 -48
  549. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  550. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  551. package/dist/node-runtime/interactive-mode-ASZ7APYP.js +75 -0
  552. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  553. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  554. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  555. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  556. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-WD3YH4CR.js} +93 -80
  557. package/dist/node-runtime/main.js +43 -41
  558. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.js} +12 -12
  559. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  560. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  561. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  562. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  563. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  564. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  565. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  566. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  567. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  568. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-QPU3OXE4.js} +114 -167
  569. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  570. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  571. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  572. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  573. package/dist/node-runtime/rpc-entry.js +43 -41
  574. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  575. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  576. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  577. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  578. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  579. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LYH53ESV.js} +4 -4
  580. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.js} +3 -3
  581. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  582. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  583. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  584. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  585. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  586. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-UI6SHG3X.js} +412 -288
  587. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  588. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  589. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  590. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  591. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  592. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  593. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  594. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  595. package/dist/utils/clipboard-image.d.ts.map +1 -1
  596. package/dist/utils/clipboard-image.js.map +1 -1
  597. package/dist/utils/exif-orientation.d.ts.map +1 -1
  598. package/dist/utils/exif-orientation.js +25 -10
  599. package/dist/utils/exif-orientation.js.map +1 -1
  600. package/dist/utils/image-resize-core.d.ts.map +1 -1
  601. package/dist/utils/image-resize-core.js +2 -0
  602. package/dist/utils/image-resize-core.js.map +1 -1
  603. package/dist/utils/paths.d.ts +4 -0
  604. package/dist/utils/paths.d.ts.map +1 -1
  605. package/dist/utils/paths.js +33 -2
  606. package/dist/utils/paths.js.map +1 -1
  607. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  608. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  609. package/dist/utils/sanitize-terminal-text.js +67 -0
  610. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  611. package/docs/browser.md +1 -1
  612. package/docs/custom-provider.md +3 -3
  613. package/docs/extensions.md +8 -4
  614. package/docs/features.md +25 -7
  615. package/docs/keybindings.md +1 -1
  616. package/docs/models.md +5 -5
  617. package/docs/packages.md +1 -1
  618. package/docs/providers.md +2 -2
  619. package/docs/rpc.md +7 -7
  620. package/docs/security.md +10 -5
  621. package/docs/sessions.md +2 -2
  622. package/docs/skills.md +1 -1
  623. package/docs/terminal-setup.md +7 -7
  624. package/docs/themes.md +1 -1
  625. package/docs/usage.md +1 -1
  626. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  627. package/examples/extensions/bash-spawn-hook.ts +1 -1
  628. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  629. package/examples/extensions/claude-rules.ts +1 -1
  630. package/examples/extensions/commands.ts +1 -1
  631. package/examples/extensions/custom-compaction.ts +1 -1
  632. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  633. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  634. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  635. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  636. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  637. package/examples/extensions/doom-overlay/index.ts +1 -1
  638. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  639. package/examples/extensions/gondolin/index.ts +1 -1
  640. package/examples/extensions/gondolin/package-lock.json +2 -2
  641. package/examples/extensions/gondolin/package.json +1 -1
  642. package/examples/extensions/hidden-thinking-label.ts +1 -1
  643. package/examples/extensions/inline-bash.ts +2 -2
  644. package/examples/extensions/input-transform-streaming.ts +2 -2
  645. package/examples/extensions/input-transform.ts +2 -2
  646. package/examples/extensions/interactive-shell.ts +1 -1
  647. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  648. package/examples/extensions/mac-system-theme.ts +1 -1
  649. package/examples/extensions/minimal-mode.ts +1 -1
  650. package/examples/extensions/modal-editor.ts +1 -1
  651. package/examples/extensions/model-status.ts +1 -1
  652. package/examples/extensions/notify.ts +3 -3
  653. package/examples/extensions/overlay-qa-tests.ts +1 -1
  654. package/examples/extensions/overlay-test.ts +1 -1
  655. package/examples/extensions/pirate.ts +1 -1
  656. package/examples/extensions/preset.ts +3 -3
  657. package/examples/extensions/project-trust.ts +4 -4
  658. package/examples/extensions/prompt-customizer.ts +1 -1
  659. package/examples/extensions/rainbow-editor.ts +1 -1
  660. package/examples/extensions/rpc-demo.ts +1 -1
  661. package/examples/extensions/sandbox/index.ts +7 -7
  662. package/examples/extensions/sandbox/package-lock.json +2 -2
  663. package/examples/extensions/sandbox/package.json +1 -1
  664. package/examples/extensions/shutdown-command.ts +5 -5
  665. package/examples/extensions/ssh.ts +2 -2
  666. package/examples/extensions/subagent/README.md +3 -3
  667. package/examples/extensions/subagent/index.ts +2 -2
  668. package/examples/extensions/titlebar-spinner.ts +1 -1
  669. package/examples/extensions/tool-override.ts +1 -1
  670. package/examples/extensions/tools.ts +1 -1
  671. package/examples/extensions/with-deps/package-lock.json +2 -2
  672. package/examples/extensions/with-deps/package.json +1 -1
  673. package/examples/extensions/working-indicator.ts +1 -1
  674. package/examples/extensions/working-message-test.ts +1 -1
  675. package/examples/sdk/01-minimal.ts +1 -1
  676. package/examples/sdk/03-custom-prompt.ts +1 -1
  677. package/examples/sdk/04-skills.ts +1 -1
  678. package/examples/sdk/06-extensions.ts +2 -2
  679. package/examples/sdk/08-prompt-templates.ts +1 -1
  680. package/install-lock/package-lock.json +24 -24
  681. package/install-lock/package.json +2 -2
  682. package/npm-shrinkwrap.json +60 -24
  683. package/package.json +9 -9
  684. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  685. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  686. package/dist/modes/interactive/components/exit-card.js +0 -69
  687. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  688. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  689. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  690. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  691. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  692. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  693. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  694. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  695. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  696. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  697. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-manager.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/lsp-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * LSP Manager — manages multiple LSP server instances, one per language.\n *\n * Lazily starts servers on first use. Auto-detects language from file extension.\n * Uses a WorkspaceProvider for workspace detection, multi-root folders, and daemon state.\n */\n\nimport { resolve, join, dirname } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { existsSync, readFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { spawn as spawnChild } from \"node:child_process\";\nimport { LspClient } from \"./lsp-client.js\";\nimport { type WorkspaceProvider, DefaultWorkspaceProvider } from \"./workspace-provider.js\";\nimport { getLanguageIdFromPath } from \"./shared/language-map.js\";\nimport { DAEMON_SOCKET_READY_DELAY_MS, DAEMON_RETRY_INTERVAL_MS, DAEMON_MAX_RETRIES } from \"./shared/timing.js\";\n\nexport interface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n /** LSP initializationOptions passed during the initialize handshake */\n initializationOptions?: Record<string, unknown>;\n /** Settings returned by workspace/configuration handler (keyed by section) */\n settings?: Record<string, unknown>;\n}\n\n/** Lifecycle callbacks for UI notifications */\nexport interface LspManagerCallbacks {\n onWorkspaceSetupStart?: () => void;\n onWorkspaceSetupEnd?: (success: boolean, duration: number) => void;\n onServerStart?: (languageId: string, command: string) => void;\n onServerReady?: (languageId: string) => void;\n onServerError?: (languageId: string, error: string) => void;\n onServerCrash?: (languageId: string, restarting: boolean, attempt: number) => void;\n}\n\n/** Default server configurations for common languages */\nconst DEFAULT_SERVERS: Record<string, ServerConfig> = {\n typescript: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n javascript: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n typescriptreact: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n javascriptreact: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n rust: { command: \"rust-analyzer\", args: [] },\n python: { command: \"pyright-langserver\", args: [\"--stdio\"] },\n go: { command: \"gopls\", args: [\"serve\"] },\n java: { command: \"jdtls\", args: [] },\n};\n\n// File extension → language ID mapping is in shared/language-map.ts\n\nexport interface ServerStatus {\n languageId: string;\n command: string;\n running: boolean;\n diagnosticsCount: number;\n /** True if using a shared daemon (vs direct spawn) */\n shared: boolean;\n}\n\nexport class LspManager {\n private clients: Map<string, LspClient> = new Map();\n private serverConfigs: Map<string, ServerConfig>;\n private rootDir: string;\n private startingServers: Map<string, Promise<LspClient>> = new Map();\n private _workspace: WorkspaceProvider;\n private _workspaceReady = false;\n private _workspaceReadying: Promise<boolean> | null = null;\n private _callbacks: LspManagerCallbacks;\n private _sessionId: string;\n private _lombokJarPath: string | null = null;\n private _shuttingDown = false;\n private _restartAttempts: Map<string, number> = new Map();\n private _restartBackoff: Map<string, number> = new Map();\n\n private static readonly MAX_RESTART_ATTEMPTS = 3;\n private static readonly INITIAL_BACKOFF_MS = 1000;\n private static readonly MAX_BACKOFF_MS = 30000;\n\n constructor(rootDir: string, customConfigs?: Record<string, ServerConfig>, callbacks?: LspManagerCallbacks, sessionId?: string, workspace?: WorkspaceProvider) {\n this.rootDir = resolve(rootDir);\n this.serverConfigs = new Map(Object.entries({\n ...DEFAULT_SERVERS,\n ...customConfigs,\n }));\n this._workspace = workspace ?? new DefaultWorkspaceProvider();\n this._callbacks = callbacks ?? {};\n this._sessionId = sessionId ?? `${process.pid}-${Date.now()}`;\n }\n\n /** Get the workspace provider */\n get workspace(): WorkspaceProvider {\n return this._workspace;\n }\n\n /** Replace the workspace provider (e.g. when an external extension registers one) */\n setWorkspaceProvider(provider: WorkspaceProvider): void {\n this._workspace = provider;\n this._workspaceReady = false;\n this._workspaceReadying = null;\n }\n\n /** Update or add a server configuration */\n setServerConfig(languageId: string, config: ServerConfig): void {\n this.serverConfigs.set(languageId, config);\n }\n\n /** Set an explicit path to a Lombok jar for Java/jdtls support */\n setLombokJar(jarPath: string): void {\n this._lombokJarPath = resolve(this.rootDir, jarPath);\n }\n\n /** Get the currently configured Lombok jar path (if any) */\n getLombokJar(): string | null {\n return this.findLombokJar();\n }\n\n /**\n * Auto-detect Lombok jar.\n * Searches: explicit path, LOMBOK_JAR env var, workspace root env/ directories.\n */\n private findLombokJar(): string | null {\n // 1. Explicit path set via setLombokJar()\n if (this._lombokJarPath) {\n if (existsSync(this._lombokJarPath)) return this._lombokJarPath;\n }\n\n // 2. LOMBOK_JAR environment variable\n const envJar = process.env.LOMBOK_JAR;\n if (envJar) {\n const resolved = resolve(this.rootDir, envJar);\n if (existsSync(resolved)) return resolved;\n }\n\n // 3. Auto-detect from workspace root (e.g. Brazil workspace env/ directory)\n // Search both workspace root and cwd in case they differ\n const searchRoots = [this.rootDir];\n const wsRoot = this._workspace.workspaceRoot;\n if (wsRoot && wsRoot !== this.rootDir) {\n searchRoots.unshift(wsRoot);\n }\n\n for (const root of searchRoots) {\n const envDir = join(root, \"env\");\n if (!existsSync(envDir)) continue;\n\n // env/Lombok-{version}/runtime/lib/lombok-*.jar\n try {\n const lombokDirs = readdirSync(envDir).filter(d => d.startsWith(\"Lombok-\"));\n for (const dir of lombokDirs) {\n const libDir = join(envDir, dir, \"runtime\", \"lib\");\n if (existsSync(libDir)) {\n const jars = readdirSync(libDir).filter(f => f.startsWith(\"lombok-\") && f.endsWith(\".jar\"));\n if (jars.length > 0) return join(libDir, jars[0]);\n }\n }\n } catch { /* ignore */ }\n\n // env/gradle-cache-2/org/projectlombok/lombok/{version}/lombok-{version}.jar\n const gradleLombok = join(envDir, \"gradle-cache-2\", \"org\", \"projectlombok\", \"lombok\");\n if (existsSync(gradleLombok)) {\n try {\n const versions = readdirSync(gradleLombok);\n for (const ver of versions) {\n const jarPath = join(gradleLombok, ver, `lombok-${ver}.jar`);\n if (existsSync(jarPath)) return jarPath;\n }\n } catch { /* ignore */ }\n }\n }\n\n return null;\n }\n\n /** Build initializationOptions for Java (jdtls) with Lombok support */\n private getJavaInitializationOptions(): Record<string, unknown> | undefined {\n const lombokJar = this.findLombokJar();\n if (!lombokJar) return undefined;\n\n // jdtls expects flat dotted keys in settings, not nested objects\n return {\n settings: {\n \"java.jdt.ls.vmargs\": `-javaagent:${lombokJar}`,\n },\n };\n }\n\n /** Get all configured languages */\n getConfiguredLanguages(): string[] {\n return [...this.serverConfigs.keys()];\n }\n\n /** Resolve a file path to a language ID */\n getLanguageId(filePath: string): string | undefined {\n return getLanguageIdFromPath(filePath);\n }\n\n /** Get a file URI from a path */\n getFileUri(filePath: string): string {\n const abs = resolve(this.rootDir, filePath);\n return pathToFileURL(abs).toString();\n }\n\n /** Resolve an absolute path from potentially relative input */\n resolvePath(filePath: string): string {\n return resolve(this.rootDir, filePath);\n }\n\n /**\n * Get the LSP client for a language ONLY if it's already running.\n * Does not start a new server. Returns null if no client is active.\n */\n getRunningClient(languageId: string): LspClient | null {\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) {\n return existing;\n }\n return null;\n }\n\n /**\n * Get the LSP client for a file, starting the server if needed.\n * Returns null if no server is configured for this file type.\n */\n async getClientForFile(filePath: string): Promise<LspClient | null> {\n const languageId = this.getLanguageId(filePath);\n if (!languageId) return null;\n return this.getClientForLanguage(languageId);\n }\n\n /**\n * Get a user-friendly message about why no client is available for a file.\n */\n getUnavailableReason(filePath: string): string {\n const languageId = this.getLanguageId(filePath);\n if (!languageId) return `No LSP server configured for file type: ${filePath}`;\n const waitHint = this.getExpectedStartTime(languageId);\n if (this.startingServers.has(languageId)) {\n return `LSP server for ${languageId} is starting. ${waitHint} Retry shortly.`;\n }\n const existing = this.clients.get(languageId);\n if (existing && !existing.initialized && !existing.disposed) {\n return `LSP server for ${languageId} is initializing. ${waitHint} Retry shortly.`;\n }\n return `No LSP server available for: ${filePath}. If you just opened this project, call any LSP tool on a file to trigger server startup.`;\n }\n\n /** Estimated startup time hint for a language server */\n private getExpectedStartTime(languageId: string): string {\n switch (languageId) {\n case \"java\":\n return \"This typically takes 1-5 minutes for Java (project indexing).\";\n case \"rust\":\n return \"This typically takes 30s-2min for Rust (cargo metadata + indexing).\";\n case \"typescript\":\n case \"javascript\":\n case \"typescriptreact\":\n case \"javascriptreact\":\n return \"This typically takes 10-30s for TypeScript/JavaScript.\";\n case \"python\":\n return \"This typically takes 10-30s for Python.\";\n case \"go\":\n return \"This typically takes 10-30s for Go.\";\n default:\n return \"This may take a few seconds to a minute.\";\n }\n }\n\n /**\n * Get the LSP client for a language, starting the server if needed.\n * In Brazil workspaces, connects to a shared daemon (or spawns one).\n * Returns null if no server is configured for this language.\n */\n async getClientForLanguage(languageId: string): Promise<LspClient | null> {\n // Already running?\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) {\n return existing;\n }\n\n // Already starting? Don't block — return null so tools can show \"starting\" message\n const starting = this.startingServers.get(languageId);\n if (starting) return null;\n\n const config = this.serverConfigs.get(languageId);\n if (!config) return null;\n\n // Kick off server start in the background — don't await\n const startPromise = this.startServer(languageId, config);\n this.startingServers.set(languageId, startPromise);\n\n // Fire-and-forget: clean up on completion or failure\n startPromise.catch((err) => {\n this.startingServers.delete(languageId);\n const message = `Failed to start LSP server for ${languageId}: ${err.message}`;\n this._callbacks.onServerError?.(languageId, message);\n });\n\n return null; // Server not ready yet\n }\n\n /**\n * Check if a server is currently starting up for a language.\n */\n isServerStarting(languageId: string): boolean {\n return this.startingServers.has(languageId);\n }\n\n /**\n * Eagerly start LSP servers for the given languages in the background.\n * Unlike getClientForLanguage (which returns null immediately), this method\n * is fire-and-forget — intended for session_start auto-start.\n */\n startEagerly(languageIds: string[]): void {\n for (const languageId of languageIds) {\n // Skip if already running or starting\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) continue;\n if (this.startingServers.has(languageId)) continue;\n\n const config = this.serverConfigs.get(languageId);\n if (!config) continue;\n\n const startPromise = this.startServer(languageId, config);\n this.startingServers.set(languageId, startPromise);\n\n startPromise.catch((err) => {\n this.startingServers.delete(languageId);\n this._callbacks.onServerError?.(languageId, `Auto-start failed: ${err.message}`);\n });\n }\n }\n\n /**\n * Ensure workspace provider is ready (one-time per session).\n * Deduplicates concurrent calls.\n */\n private async ensureWorkspace(): Promise<void> {\n if (this._workspaceReady) return;\n if (this._workspaceReadying) {\n await this._workspaceReadying;\n return;\n }\n this._callbacks.onWorkspaceSetupStart?.();\n const start = Date.now();\n this._workspaceReadying = this._workspace.ensureReady(this._sessionId);\n try {\n const success = await this._workspaceReadying;\n this._callbacks.onWorkspaceSetupEnd?.(success, Date.now() - start);\n } finally {\n this._workspaceReady = true;\n this._workspaceReadying = null;\n }\n }\n\n private async startServer(languageId: string, config: ServerConfig): Promise<LspClient> {\n // Ensure workspace provider is ready (one-time setup)\n await this.ensureWorkspace();\n\n const stateDir = this._workspace.stateDir;\n const folders = this._workspace.getWorkspaceFolders();\n const workspaceFolders = folders.length > 0 ? folders : undefined;\n\n // Build language-specific initializationOptions (e.g. Lombok for Java)\n // Use config-level initializationOptions if provided, otherwise fall back to language-specific defaults\n const initializationOptions = config.initializationOptions\n ?? (languageId === \"java\" ? this.getJavaInitializationOptions() : undefined);\n\n // For Java with Lombok, inject --jvm-arg so jdtls launches with -javaagent\n let effectiveArgs = config.args;\n if (languageId === \"java\") {\n const lombokJar = this.findLombokJar();\n if (lombokJar) {\n effectiveArgs = [`--jvm-arg=-javaagent:${lombokJar}`, ...config.args];\n }\n }\n\n // Callback for auto-restart on unexpected exit\n const onUnexpectedExit = (code: number | null) => this.handleUnexpectedExit(languageId, code);\n // Try connecting to an existing daemon socket first\n const socketPath = this.getSocketPath(languageId);\n if (socketPath && this.isDaemonAlive(languageId)) {\n this._callbacks.onServerStart?.(languageId, `${config.command} (shared)`);\n try {\n const client = new LspClient({\n command: config.command,\n args: effectiveArgs,\n rootDir: this.rootDir,\n languageId,\n socketPath,\n initializationOptions,\n settings: config.settings,\n onUnexpectedExit,\n });\n await client.start();\n this.clients.set(languageId, client);\n this.startingServers.delete(languageId);\n this._callbacks.onServerReady?.(languageId);\n this._restartAttempts.delete(languageId);\n this._restartBackoff.delete(languageId);\n this.triggerPostInit(languageId, client);\n return client;\n } catch {\n // Daemon may be stale — fall through to spawn new one\n }\n }\n\n // No existing daemon — spawn one (or start direct if no state directory)\n this._callbacks.onServerStart?.(languageId, config.command);\n\n if (stateDir) {\n // Spawn daemon and connect via socket\n try {\n await this.spawnDaemon(languageId, config, effectiveArgs, workspaceFolders, initializationOptions);\n // Small delay to let daemon start listening\n await new Promise((r) => setTimeout(r, DAEMON_SOCKET_READY_DELAY_MS));\n\n const daemonSocket = this.getSocketPath(languageId)!;\n\n // Retry connection (daemon may still be initializing jdtls which can take minutes)\n let lastErr: Error | null = null;\n for (let attempt = 0; attempt < DAEMON_MAX_RETRIES; attempt++) {\n try {\n const client = new LspClient({\n command: config.command,\n args: effectiveArgs,\n rootDir: this.rootDir,\n languageId,\n socketPath: daemonSocket,\n initializationOptions,\n settings: config.settings,\n onUnexpectedExit,\n });\n await client.start();\n this.clients.set(languageId, client);\n this.startingServers.delete(languageId);\n this._callbacks.onServerReady?.(languageId);\n this._restartAttempts.delete(languageId);\n this._restartBackoff.delete(languageId);\n this.triggerPostInit(languageId, client);\n return client;\n } catch (err: any) {\n lastErr = err;\n // Check if daemon is still alive before retrying\n if (!this.isDaemonAlive(languageId)) {\n throw new Error(`Daemon for ${languageId} died during startup: ${err.message}`);\n }\n await new Promise((r) => setTimeout(r, DAEMON_RETRY_INTERVAL_MS));\n }\n }\n throw lastErr ?? new Error(\"Failed to connect to daemon\");\n } catch (err: any) {\n // Fall back to direct mode — log the daemon failure\n this._callbacks.onServerError?.(languageId, `Daemon mode failed, falling back to direct: ${err.message}`);\n this.startingServers.delete(languageId);\n // Don't throw — try direct mode below\n }\n }\n\n // Direct mode (no state directory for daemon, or daemon failed)\n const client = new LspClient({\n command: config.command,\n args: effectiveArgs,\n rootDir: this.rootDir,\n languageId,\n env: config.env,\n workspaceFolders,\n initializationOptions,\n settings: config.settings,\n onUnexpectedExit,\n });\n\n try {\n await client.start();\n this.clients.set(languageId, client);\n this.startingServers.delete(languageId);\n this._callbacks.onServerReady?.(languageId);\n this._restartAttempts.delete(languageId);\n this._restartBackoff.delete(languageId);\n this.triggerPostInit(languageId, client);\n return client;\n } catch (err: any) {\n this.startingServers.delete(languageId);\n const message = `Failed to start LSP server for ${languageId} (${config.command}): ${err.message}`;\n this._callbacks.onServerError?.(languageId, message);\n throw new Error(message);\n }\n }\n\n /**\n * Post-initialization hook for language-specific setup.\n * For Java/jdtls: triggers a workspace build so diagnostics refresh\n * after Lombok annotation processing completes.\n */\n private triggerPostInit(languageId: string, client: LspClient): void {\n if (languageId === \"java\") {\n // java/buildWorkspace forces jdtls to rebuild and re-publish diagnostics.\n // The boolean parameter means \"full build\" (true) vs incremental (false).\n client.sendRequest(\"java/buildWorkspace\", true).catch(() => {\n // Not critical — diagnostics will just be stale until a file changes\n });\n }\n }\n\n /** Get the socket path for a language's daemon */\n private getSocketPath(languageId: string): string | null {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return null;\n return join(stateDir, \"sockets\", `lsp-${languageId}.sock`);\n }\n\n /** Check if a daemon is alive for this language */\n private isDaemonAlive(languageId: string): boolean {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return false;\n const pidPath = join(stateDir, \"sockets\", `lsp-${languageId}.pid`);\n try {\n if (!existsSync(pidPath)) return false;\n const pid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return false;\n process.kill(pid, 0); // throws if not alive\n return true;\n } catch {\n return false;\n }\n }\n\n /** Spawn an LSP daemon as a detached background process */\n private async spawnDaemon(\n languageId: string,\n config: ServerConfig,\n effectiveArgs: string[],\n workspaceFolders?: { uri: string; name: string }[],\n initializationOptions?: Record<string, unknown>,\n ): Promise<void> {\n const socketPath = this.getSocketPath(languageId)!;\n const daemonScript = new URL(\"./lsp-daemon.ts\", import.meta.url).pathname;\n const launcherScript = new URL(\"./lsp-daemon-launcher.cjs\", import.meta.url).pathname;\n\n // Resolve jiti from the running process's module context\n let jitiPath: string;\n try {\n jitiPath = require.resolve(\"jiti\");\n } catch {\n try {\n jitiPath = require.resolve(\"@mariozechner/jiti\");\n } catch {\n throw new Error(\"Cannot resolve jiti for daemon spawn — jiti not found in module path\");\n }\n }\n\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n ...(config.env ?? {}),\n LSP_ROOT_DIR: this.rootDir,\n LSP_LANGUAGE_ID: languageId,\n };\n\n if (workspaceFolders && workspaceFolders.length > 0) {\n env.LSP_WORKSPACE_FOLDERS = JSON.stringify(workspaceFolders);\n }\n\n if (initializationOptions) {\n env.LSP_INITIALIZATION_OPTIONS = JSON.stringify(initializationOptions);\n }\n\n if (config.settings) {\n env.LSP_SETTINGS = JSON.stringify(config.settings);\n }\n\n const child = spawnChild(\n process.execPath, // node\n [launcherScript, jitiPath, daemonScript, socketPath, config.command, ...effectiveArgs],\n {\n cwd: this.rootDir,\n env,\n detached: true,\n stdio: \"ignore\",\n },\n );\n\n child.unref(); // let daemon outlive this process\n }\n\n /** Get status of all configured/running servers */\n getStatus(): ServerStatus[] {\n const statuses: ServerStatus[] = [];\n for (const [languageId, config] of this.serverConfigs) {\n const client = this.clients.get(languageId);\n let diagnosticsCount = 0;\n if (client) {\n for (const diags of client.getAllDiagnostics().values()) {\n diagnosticsCount += diags.length;\n }\n }\n const daemonAlive = this.isDaemonAlive(languageId);\n statuses.push({\n languageId,\n command: config.command,\n running: client?.initialized === true && !client.disposed,\n diagnosticsCount,\n shared: daemonAlive,\n });\n }\n return statuses;\n }\n\n /**\n * Handle an unexpected server exit. Attempts auto-restart with exponential backoff.\n * Gives up after MAX_RESTART_ATTEMPTS failures per language per session.\n */\n private handleUnexpectedExit(languageId: string, code: number | null): void {\n if (this._shuttingDown) return;\n\n // Clean up the dead client\n this.clients.delete(languageId);\n this.startingServers.delete(languageId);\n\n const attempts = this._restartAttempts.get(languageId) ?? 0;\n if (attempts >= LspManager.MAX_RESTART_ATTEMPTS) {\n this._callbacks.onServerError?.(languageId, `LSP server for ${languageId} crashed ${attempts} times — giving up auto-restart`);\n this._callbacks.onServerCrash?.(languageId, false, attempts);\n return;\n }\n\n const backoff = this._restartBackoff.get(languageId) ?? LspManager.INITIAL_BACKOFF_MS;\n this._restartAttempts.set(languageId, attempts + 1);\n this._restartBackoff.set(languageId, Math.min(backoff * 2, LspManager.MAX_BACKOFF_MS));\n\n this._callbacks.onServerCrash?.(languageId, true, attempts + 1);\n\n setTimeout(() => {\n if (this._shuttingDown) return;\n const config = this.serverConfigs.get(languageId);\n if (!config) return;\n\n const startPromise = this.startServer(languageId, config);\n this.startingServers.set(languageId, startPromise);\n startPromise.catch((err) => {\n this.startingServers.delete(languageId);\n this._callbacks.onServerError?.(languageId, `Auto-restart failed for ${languageId}: ${err.message}`);\n // Trigger another restart attempt (recursive backoff)\n this.handleUnexpectedExit(languageId, null);\n });\n }, backoff);\n }\n\n /** Shut down all clients (disconnect from daemons, kill direct servers) */\n async shutdownAll(): Promise<void> {\n this._workspace.shutdown();\n this._shuttingDown = true;\n const shutdowns = [...this.clients.values()].map((client) =>\n client.shutdown().catch(() => {})\n );\n await Promise.all(shutdowns);\n this.clients.clear();\n this.startingServers.clear();\n }\n\n /**\n * Restart a specific language server. Shuts down the existing client\n * (and kills the daemon if shared), then starts a fresh server.\n * Returns once the new server is initialized, or throws on failure.\n */\n async restartServer(languageId: string): Promise<void> {\n // Shut down existing client\n const existing = this.clients.get(languageId);\n if (existing) {\n await existing.shutdown().catch(() => {});\n this.clients.delete(languageId);\n }\n\n // Kill the daemon if one is running (so we get a fresh server with new config)\n this.killDaemon(languageId);\n\n // Wait for pending starts to clear\n const pending = this.startingServers.get(languageId);\n if (pending) {\n await pending.catch(() => {});\n this.startingServers.delete(languageId);\n }\n\n // Start fresh\n const config = this.serverConfigs.get(languageId);\n if (!config) throw new Error(`No server configured for ${languageId}`);\n\n await this.startServer(languageId, config);\n }\n\n /** Kill a running daemon for a language (if any) */\n private killDaemon(languageId: string): void {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return;\n const pidPath = join(stateDir, \"sockets\", `lsp-${languageId}.pid`);\n try {\n if (!existsSync(pidPath)) return;\n const pid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return;\n process.kill(pid, \"SIGTERM\");\n // Clean up socket and pid files\n const socketPath = join(stateDir, \"sockets\", `lsp-${languageId}.sock`);\n try { unlinkSync(socketPath); } catch {}\n try { unlinkSync(pidPath); } catch {}\n } catch {\n // Process may already be dead\n }\n }\n}\n"]}
1
+ {"version":3,"file":"lsp-manager.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/lsp-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * LSP Manager — manages multiple LSP server instances, one per language.\n *\n * Lazily starts servers on first use. Auto-detects language from file extension.\n * Uses a WorkspaceProvider for workspace detection, multi-root folders, and daemon state.\n */\n\nimport { resolve, join, dirname } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { existsSync, readFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { spawn as spawnChild } from \"node:child_process\";\nimport { LspClient } from \"./lsp-client.js\";\nimport { type WorkspaceProvider, DefaultWorkspaceProvider } from \"./workspace-provider.js\";\nimport { getLanguageIdFromPath } from \"./shared/language-map.js\";\nimport { DAEMON_SOCKET_READY_DELAY_MS, DAEMON_RETRY_INTERVAL_MS, DAEMON_MAX_RETRIES } from \"./shared/timing.js\";\n\nexport interface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n /** LSP initializationOptions passed during the initialize handshake */\n initializationOptions?: Record<string, unknown>;\n /** Settings returned by workspace/configuration handler (keyed by section) */\n settings?: Record<string, unknown>;\n}\n\n/** Lifecycle callbacks for UI notifications */\nexport interface LspManagerCallbacks {\n onWorkspaceSetupStart?: () => void;\n onWorkspaceSetupEnd?: (success: boolean, duration: number) => void;\n onServerStart?: (languageId: string, command: string) => void;\n onServerReady?: (languageId: string) => void;\n onServerError?: (languageId: string, error: string) => void;\n onServerCrash?: (languageId: string, restarting: boolean, attempt: number) => void;\n}\n\n/** Default server configurations for common languages */\nconst DEFAULT_SERVERS: Record<string, ServerConfig> = {\n typescript: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n javascript: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n typescriptreact: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n javascriptreact: { command: \"typescript-language-server\", args: [\"--stdio\"] },\n rust: { command: \"rust-analyzer\", args: [] },\n python: { command: \"pyright-langserver\", args: [\"--stdio\"] },\n go: { command: \"gopls\", args: [\"serve\"] },\n java: { command: \"jdtls\", args: [] },\n};\n\n// File extension → language ID mapping is in shared/language-map.ts\n\nexport interface ServerStatus {\n languageId: string;\n command: string;\n running: boolean;\n diagnosticsCount: number;\n /** True if using a shared daemon (vs direct spawn) */\n shared: boolean;\n}\n\nexport class LspManager {\n private clients: Map<string, LspClient> = new Map();\n private serverConfigs: Map<string, ServerConfig>;\n private rootDir: string;\n private startingServers: Map<string, Promise<LspClient>> = new Map();\n private _workspace: WorkspaceProvider;\n private _workspaceReady = false;\n private _workspaceReadying: Promise<boolean> | null = null;\n private _callbacks: LspManagerCallbacks;\n private _sessionId: string;\n private _lombokJarPath: string | null = null;\n private _shuttingDown = false;\n private readonly stop = new AbortController();\n private readonly pendingClients = new Set<LspClient>();\n private readonly restartTimers = new Set<ReturnType<typeof setTimeout>>();\n private shutdownPromise: Promise<void> | null = null;\n private _restartAttempts: Map<string, number> = new Map();\n private _restartBackoff: Map<string, number> = new Map();\n\n private static readonly MAX_RESTART_ATTEMPTS = 3;\n private static readonly INITIAL_BACKOFF_MS = 1000;\n private static readonly MAX_BACKOFF_MS = 30000;\n\n constructor(rootDir: string, customConfigs?: Record<string, ServerConfig>, callbacks?: LspManagerCallbacks, sessionId?: string, workspace?: WorkspaceProvider) {\n this.rootDir = resolve(rootDir);\n this.serverConfigs = new Map(Object.entries({\n ...DEFAULT_SERVERS,\n ...customConfigs,\n }));\n this._workspace = workspace ?? new DefaultWorkspaceProvider();\n this._callbacks = callbacks ?? {};\n this._sessionId = sessionId ?? `${process.pid}-${Date.now()}`;\n }\n\n /** Get the workspace provider */\n get workspace(): WorkspaceProvider {\n return this._workspace;\n }\n\n /** Replace the workspace provider (e.g. when an external extension registers one) */\n setWorkspaceProvider(provider: WorkspaceProvider): void {\n this._workspace = provider;\n this._workspaceReady = false;\n this._workspaceReadying = null;\n }\n\n /** Update or add a server configuration */\n setServerConfig(languageId: string, config: ServerConfig): void {\n this.serverConfigs.set(languageId, config);\n }\n\n /** Set an explicit path to a Lombok jar for Java/jdtls support */\n setLombokJar(jarPath: string): void {\n this._lombokJarPath = resolve(this.rootDir, jarPath);\n }\n\n /** Get the currently configured Lombok jar path (if any) */\n getLombokJar(): string | null {\n return this.findLombokJar();\n }\n\n /**\n * Auto-detect Lombok jar.\n * Searches: explicit path, LOMBOK_JAR env var, workspace root env/ directories.\n */\n private findLombokJar(): string | null {\n // 1. Explicit path set via setLombokJar()\n if (this._lombokJarPath) {\n if (existsSync(this._lombokJarPath)) return this._lombokJarPath;\n }\n\n // 2. LOMBOK_JAR environment variable\n const envJar = process.env.LOMBOK_JAR;\n if (envJar) {\n const resolved = resolve(this.rootDir, envJar);\n if (existsSync(resolved)) return resolved;\n }\n\n // 3. Auto-detect from workspace root (e.g. Brazil workspace env/ directory)\n // Search both workspace root and cwd in case they differ\n const searchRoots = [this.rootDir];\n const wsRoot = this._workspace.workspaceRoot;\n if (wsRoot && wsRoot !== this.rootDir) {\n searchRoots.unshift(wsRoot);\n }\n\n for (const root of searchRoots) {\n const envDir = join(root, \"env\");\n if (!existsSync(envDir)) continue;\n\n // env/Lombok-{version}/runtime/lib/lombok-*.jar\n try {\n const lombokDirs = readdirSync(envDir).filter(d => d.startsWith(\"Lombok-\"));\n for (const dir of lombokDirs) {\n const libDir = join(envDir, dir, \"runtime\", \"lib\");\n if (existsSync(libDir)) {\n const jars = readdirSync(libDir).filter(f => f.startsWith(\"lombok-\") && f.endsWith(\".jar\"));\n if (jars.length > 0) return join(libDir, jars[0]);\n }\n }\n } catch { /* ignore */ }\n\n // env/gradle-cache-2/org/projectlombok/lombok/{version}/lombok-{version}.jar\n const gradleLombok = join(envDir, \"gradle-cache-2\", \"org\", \"projectlombok\", \"lombok\");\n if (existsSync(gradleLombok)) {\n try {\n const versions = readdirSync(gradleLombok);\n for (const ver of versions) {\n const jarPath = join(gradleLombok, ver, `lombok-${ver}.jar`);\n if (existsSync(jarPath)) return jarPath;\n }\n } catch { /* ignore */ }\n }\n }\n\n return null;\n }\n\n /** Build initializationOptions for Java (jdtls) with Lombok support */\n private getJavaInitializationOptions(): Record<string, unknown> | undefined {\n const lombokJar = this.findLombokJar();\n if (!lombokJar) return undefined;\n\n // jdtls expects flat dotted keys in settings, not nested objects\n return {\n settings: {\n \"java.jdt.ls.vmargs\": `-javaagent:${lombokJar}`,\n },\n };\n }\n\n /** Get all configured languages */\n getConfiguredLanguages(): string[] {\n return [...this.serverConfigs.keys()];\n }\n\n /** Resolve a file path to a language ID */\n getLanguageId(filePath: string): string | undefined {\n return getLanguageIdFromPath(filePath);\n }\n\n /** Get a file URI from a path */\n getFileUri(filePath: string): string {\n const abs = resolve(this.rootDir, filePath);\n return pathToFileURL(abs).toString();\n }\n\n /** Resolve an absolute path from potentially relative input */\n resolvePath(filePath: string): string {\n return resolve(this.rootDir, filePath);\n }\n\n /**\n * Get the LSP client for a language ONLY if it's already running.\n * Does not start a new server. Returns null if no client is active.\n */\n getRunningClient(languageId: string): LspClient | null {\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) {\n return existing;\n }\n return null;\n }\n\n /**\n * Get the LSP client for a file, starting the server if needed.\n * Returns null if no server is configured for this file type.\n */\n async getClientForFile(filePath: string): Promise<LspClient | null> {\n const languageId = this.getLanguageId(filePath);\n if (!languageId) return null;\n return this.getClientForLanguage(languageId);\n }\n\n /**\n * Get a user-friendly message about why no client is available for a file.\n */\n getUnavailableReason(filePath: string): string {\n const languageId = this.getLanguageId(filePath);\n if (!languageId) return `No LSP server configured for file type: ${filePath}`;\n const waitHint = this.getExpectedStartTime(languageId);\n if (this.startingServers.has(languageId)) {\n return `LSP server for ${languageId} is starting. ${waitHint} Retry shortly.`;\n }\n const existing = this.clients.get(languageId);\n if (existing && !existing.initialized && !existing.disposed) {\n return `LSP server for ${languageId} is initializing. ${waitHint} Retry shortly.`;\n }\n return `No LSP server available for: ${filePath}. If you just opened this project, call any LSP tool on a file to trigger server startup.`;\n }\n\n /** Estimated startup time hint for a language server */\n private getExpectedStartTime(languageId: string): string {\n switch (languageId) {\n case \"java\":\n return \"This typically takes 1-5 minutes for Java (project indexing).\";\n case \"rust\":\n return \"This typically takes 30s-2min for Rust (cargo metadata + indexing).\";\n case \"typescript\":\n case \"javascript\":\n case \"typescriptreact\":\n case \"javascriptreact\":\n return \"This typically takes 10-30s for TypeScript/JavaScript.\";\n case \"python\":\n return \"This typically takes 10-30s for Python.\";\n case \"go\":\n return \"This typically takes 10-30s for Go.\";\n default:\n return \"This may take a few seconds to a minute.\";\n }\n }\n\n /**\n * Get the LSP client for a language, starting the server if needed.\n * In Brazil workspaces, connects to a shared daemon (or spawns one).\n * Returns null if no server is configured for this language.\n */\n async getClientForLanguage(languageId: string): Promise<LspClient | null> {\n if (this._shuttingDown) return null;\n // Already running?\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) {\n return existing;\n }\n\n // Already starting? Don't block — return null so tools can show \"starting\" message\n const starting = this.startingServers.get(languageId);\n if (starting) return null;\n\n const config = this.serverConfigs.get(languageId);\n if (!config) return null;\n\n // Kick off server start in the background — don't await\n const startPromise = this.trackStart(languageId, config);\n\n // Fire-and-forget: clean up on completion or failure\n startPromise.catch((err) => {\n if (this._shuttingDown) return;\n const message = `Failed to start LSP server for ${languageId}: ${err.message}`;\n this._callbacks.onServerError?.(languageId, message);\n });\n\n return null; // Server not ready yet\n }\n\n /**\n * Check if a server is currently starting up for a language.\n */\n isServerStarting(languageId: string): boolean {\n return this.startingServers.has(languageId);\n }\n\n /**\n * Eagerly start LSP servers for the given languages in the background.\n * Unlike getClientForLanguage (which returns null immediately), this method\n * is fire-and-forget — intended for session_start auto-start.\n */\n startEagerly(languageIds: string[]): void {\n if (this._shuttingDown) return;\n for (const languageId of languageIds) {\n // Skip if already running or starting\n const existing = this.clients.get(languageId);\n if (existing && existing.initialized && !existing.disposed) continue;\n if (this.startingServers.has(languageId)) continue;\n\n const config = this.serverConfigs.get(languageId);\n if (!config) continue;\n\n const startPromise = this.trackStart(languageId, config);\n\n startPromise.catch((err) => {\n if (this._shuttingDown) return;\n this._callbacks.onServerError?.(languageId, `Auto-start failed: ${err.message}`);\n });\n }\n }\n\n /**\n * Ensure workspace provider is ready (one-time per session).\n * Deduplicates concurrent calls.\n */\n private async ensureWorkspace(): Promise<void> {\n if (this._workspaceReady) return;\n if (this._workspaceReadying) {\n await this.waitForStart(this._workspaceReadying);\n return;\n }\n this._callbacks.onWorkspaceSetupStart?.();\n this.stop.signal.throwIfAborted();\n const start = Date.now();\n this._workspaceReadying = this._workspace.ensureReady(this._sessionId);\n try {\n const success = await this.waitForStart(this._workspaceReadying);\n this._callbacks.onWorkspaceSetupEnd?.(success, Date.now() - start);\n } finally {\n this._workspaceReady = true;\n this._workspaceReadying = null;\n }\n }\n\n /** Keep starts registered until their owned clients have either attached or closed. */\n private trackStart(languageId: string, config: ServerConfig): Promise<LspClient> {\n this.stop.signal.throwIfAborted();\n const existing = this.startingServers.get(languageId);\n if (existing) return existing;\n const pending = Promise.resolve().then(() => this.startServer(languageId, config)).finally(() => {\n if (this.startingServers.get(languageId) === pending) this.startingServers.delete(languageId);\n });\n this.startingServers.set(languageId, pending);\n return pending;\n }\n\n private waitForStart<T>(pending: Promise<T>): Promise<T> {\n const signal = this.stop.signal;\n signal.throwIfAborted();\n return new Promise<T>((resolve, reject) => {\n const aborted = () => reject(signal.reason);\n signal.addEventListener(\"abort\", aborted, { once: true });\n pending.then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", aborted));\n });\n }\n\n private async startServer(languageId: string, config: ServerConfig): Promise<LspClient> {\n this.stop.signal.throwIfAborted();\n await this.ensureWorkspace();\n this.stop.signal.throwIfAborted();\n\n const stateDir = this._workspace.stateDir;\n const folders = this._workspace.getWorkspaceFolders();\n const workspaceFolders = folders.length > 0 ? folders : undefined;\n\n // Build language-specific initializationOptions (e.g. Lombok for Java)\n // Use config-level initializationOptions if provided, otherwise fall back to language-specific defaults\n const initializationOptions = config.initializationOptions\n ?? (languageId === \"java\" ? this.getJavaInitializationOptions() : undefined);\n\n // For Java with Lombok, inject --jvm-arg so jdtls launches with -javaagent\n let effectiveArgs = config.args;\n if (languageId === \"java\") {\n const lombokJar = this.findLombokJar();\n if (lombokJar) {\n effectiveArgs = [`--jvm-arg=-javaagent:${lombokJar}`, ...config.args];\n }\n }\n\n const onUnexpectedExit = (code: number | null) => this.handleUnexpectedExit(languageId, code);\n const connectClient = async (socketPath?: string): Promise<LspClient> => {\n this.stop.signal.throwIfAborted();\n const client = new LspClient({\n command: config.command,\n args: effectiveArgs,\n rootDir: this.rootDir,\n languageId,\n socketPath,\n env: config.env,\n workspaceFolders,\n initializationOptions,\n settings: config.settings,\n onUnexpectedExit,\n });\n this.pendingClients.add(client);\n try {\n await this.waitForStart(client.start());\n this.stop.signal.throwIfAborted();\n if (!client.initialized || client.disposed) throw new Error(\"LSP client closed during startup\");\n this.clients.set(languageId, client);\n this._callbacks.onServerReady?.(languageId);\n this._restartAttempts.delete(languageId);\n this._restartBackoff.delete(languageId);\n this.triggerPostInit(languageId, client);\n return client;\n } catch (error) {\n await client.shutdown();\n throw error;\n } finally {\n this.pendingClients.delete(client);\n }\n };\n\n const socketPath = this.getSocketPath(languageId);\n if (socketPath && this.isDaemonAlive(languageId)) {\n this._callbacks.onServerStart?.(languageId, `${config.command} (shared)`);\n try {\n return await connectClient(socketPath);\n } catch {\n // A stale daemon can fall back, but session cancellation cannot.\n this.stop.signal.throwIfAborted();\n }\n }\n\n this.stop.signal.throwIfAborted();\n this._callbacks.onServerStart?.(languageId, config.command);\n if (stateDir) {\n try {\n await this.spawnDaemon(languageId, config, effectiveArgs, workspaceFolders, initializationOptions);\n await delay(DAEMON_SOCKET_READY_DELAY_MS, undefined, { signal: this.stop.signal });\n const daemonSocket = this.getSocketPath(languageId)!;\n let lastErr: unknown;\n for (let attempt = 0; attempt < DAEMON_MAX_RETRIES; attempt++) {\n this.stop.signal.throwIfAborted();\n try {\n return await connectClient(daemonSocket);\n } catch (error) {\n this.stop.signal.throwIfAborted();\n lastErr = error;\n if (!this.isDaemonAlive(languageId)) throw error;\n await delay(DAEMON_RETRY_INTERVAL_MS, undefined, { signal: this.stop.signal });\n }\n }\n throw lastErr ?? new Error(\"Failed to connect to daemon\");\n } catch (error) {\n this.stop.signal.throwIfAborted();\n const message = error instanceof Error ? error.message : String(error);\n this._callbacks.onServerError?.(languageId, `Daemon mode failed, falling back to direct: ${message}`);\n }\n }\n return connectClient();\n }\n\n /**\n * Post-initialization hook for language-specific setup.\n * For Java/jdtls: triggers a workspace build so diagnostics refresh\n * after Lombok annotation processing completes.\n */\n private triggerPostInit(languageId: string, client: LspClient): void {\n if (languageId === \"java\") {\n // java/buildWorkspace forces jdtls to rebuild and re-publish diagnostics.\n // The boolean parameter means \"full build\" (true) vs incremental (false).\n client.sendRequest(\"java/buildWorkspace\", true).catch(() => {\n // Not critical — diagnostics will just be stale until a file changes\n });\n }\n }\n\n /** Get the socket path for a language's daemon */\n private getSocketPath(languageId: string): string | null {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return null;\n return join(stateDir, \"sockets\", `lsp-${languageId}.sock`);\n }\n\n /** Check if a daemon is alive for this language */\n private isDaemonAlive(languageId: string): boolean {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return false;\n const pidPath = join(stateDir, \"sockets\", `lsp-${languageId}.pid`);\n try {\n if (!existsSync(pidPath)) return false;\n const pid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return false;\n process.kill(pid, 0); // throws if not alive\n return true;\n } catch {\n return false;\n }\n }\n\n /** Spawn an LSP daemon as a detached background process */\n private async spawnDaemon(\n languageId: string,\n config: ServerConfig,\n effectiveArgs: string[],\n workspaceFolders?: { uri: string; name: string }[],\n initializationOptions?: Record<string, unknown>,\n ): Promise<void> {\n this.stop.signal.throwIfAborted();\n const socketPath = this.getSocketPath(languageId)!;\n const daemonScript = new URL(\"./lsp-daemon.ts\", import.meta.url).pathname;\n const launcherScript = new URL(\"./lsp-daemon-launcher.cjs\", import.meta.url).pathname;\n\n // Resolve jiti from the running process's module context\n let jitiPath: string;\n try {\n jitiPath = require.resolve(\"jiti\");\n } catch {\n try {\n jitiPath = require.resolve(\"@mariozechner/jiti\");\n } catch {\n throw new Error(\"Cannot resolve jiti for daemon spawn — jiti not found in module path\");\n }\n }\n\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n ...(config.env ?? {}),\n LSP_ROOT_DIR: this.rootDir,\n LSP_LANGUAGE_ID: languageId,\n };\n\n if (workspaceFolders && workspaceFolders.length > 0) {\n env.LSP_WORKSPACE_FOLDERS = JSON.stringify(workspaceFolders);\n }\n\n if (initializationOptions) {\n env.LSP_INITIALIZATION_OPTIONS = JSON.stringify(initializationOptions);\n }\n\n if (config.settings) {\n env.LSP_SETTINGS = JSON.stringify(config.settings);\n }\n\n const child = spawnChild(\n process.execPath, // node\n [launcherScript, jitiPath, daemonScript, socketPath, config.command, ...effectiveArgs],\n {\n cwd: this.rootDir,\n env,\n detached: true,\n stdio: \"ignore\",\n },\n );\n\n // The launcher becomes shared infrastructure after spawn. Own its startup\n // error event, but do not kill a daemon when this session disconnects.\n child.unref(); // let daemon outlive this process\n await this.waitForStart(new Promise<void>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n if (!this._shuttingDown) this._callbacks.onServerError?.(languageId, error.message);\n });\n child.once(\"spawn\", resolve);\n }));\n }\n\n /** Get status of all configured/running servers */\n getStatus(): ServerStatus[] {\n const statuses: ServerStatus[] = [];\n for (const [languageId, config] of this.serverConfigs) {\n const client = this.clients.get(languageId);\n let diagnosticsCount = 0;\n if (client) {\n for (const diags of client.getAllDiagnostics().values()) {\n diagnosticsCount += diags.length;\n }\n }\n const daemonAlive = this.isDaemonAlive(languageId);\n statuses.push({\n languageId,\n command: config.command,\n running: client?.initialized === true && !client.disposed,\n diagnosticsCount,\n shared: daemonAlive,\n });\n }\n return statuses;\n }\n\n /**\n * Handle an unexpected server exit. Attempts auto-restart with exponential backoff.\n * Gives up after MAX_RESTART_ATTEMPTS failures per language per session.\n */\n private handleUnexpectedExit(languageId: string, code: number | null): void {\n if (this._shuttingDown) return;\n\n // Clean up the dead client\n this.clients.delete(languageId);\n\n const attempts = this._restartAttempts.get(languageId) ?? 0;\n if (attempts >= LspManager.MAX_RESTART_ATTEMPTS) {\n this._callbacks.onServerError?.(languageId, `LSP server for ${languageId} crashed ${attempts} times — giving up auto-restart`);\n this._callbacks.onServerCrash?.(languageId, false, attempts);\n return;\n }\n\n const backoff = this._restartBackoff.get(languageId) ?? LspManager.INITIAL_BACKOFF_MS;\n this._restartAttempts.set(languageId, attempts + 1);\n this._restartBackoff.set(languageId, Math.min(backoff * 2, LspManager.MAX_BACKOFF_MS));\n\n this._callbacks.onServerCrash?.(languageId, true, attempts + 1);\n\n const timer = setTimeout(() => {\n this.restartTimers.delete(timer);\n if (this._shuttingDown) return;\n const config = this.serverConfigs.get(languageId);\n if (!config) return;\n\n const startPromise = this.trackStart(languageId, config);\n startPromise.catch((err) => {\n if (this._shuttingDown) return;\n this._callbacks.onServerError?.(languageId, `Auto-restart failed for ${languageId}: ${err.message}`);\n // Trigger another restart attempt (recursive backoff)\n this.handleUnexpectedExit(languageId, null);\n });\n }, backoff);\n this.restartTimers.add(timer);\n }\n\n /** Shut down all clients (disconnect from daemons, kill direct servers) */\n shutdownAll(): Promise<void> {\n if (this.shutdownPromise) return this.shutdownPromise;\n this._shuttingDown = true;\n this.stop.abort(new Error(\"LSP manager shut down\"));\n for (const timer of this.restartTimers) clearTimeout(timer);\n this.restartTimers.clear();\n this.shutdownPromise = this.shutdownClients();\n return this.shutdownPromise;\n }\n\n private async shutdownClients(): Promise<void> {\n try {\n this._workspace.shutdown();\n } finally {\n const clients = new Set([...this.clients.values(), ...this.pendingClients]);\n await Promise.allSettled([...clients].map((client) => client.shutdown()));\n await Promise.allSettled([...this.startingServers.values()]);\n this.clients.clear();\n this.startingServers.clear();\n }\n }\n\n /**\n * Restart a specific language server. Shuts down the existing client\n * (and kills the daemon if shared), then starts a fresh server.\n * Returns once the new server is initialized, or throws on failure.\n */\n async restartServer(languageId: string): Promise<void> {\n this.stop.signal.throwIfAborted();\n // A pending start can attach while we wait. Close that client before replacement.\n const pending = this.startingServers.get(languageId);\n if (pending) await pending.catch(() => {});\n this.stop.signal.throwIfAborted();\n\n const existing = this.clients.get(languageId);\n if (existing) {\n await existing.shutdown().catch(() => {});\n if (this.clients.get(languageId) === existing) this.clients.delete(languageId);\n }\n this.stop.signal.throwIfAborted();\n\n // Explicit restart retains its existing daemon replacement behavior.\n this.killDaemon(languageId);\n\n // Start fresh\n const config = this.serverConfigs.get(languageId);\n if (!config) throw new Error(`No server configured for ${languageId}`);\n\n await this.trackStart(languageId, config);\n }\n\n /** Kill a running daemon for a language (if any) */\n private killDaemon(languageId: string): void {\n const stateDir = this._workspace.stateDir;\n if (!stateDir) return;\n const pidPath = join(stateDir, \"sockets\", `lsp-${languageId}.pid`);\n try {\n if (!existsSync(pidPath)) return;\n const pid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return;\n process.kill(pid, \"SIGTERM\");\n // Clean up socket and pid files\n const socketPath = join(stateDir, \"sockets\", `lsp-${languageId}.sock`);\n try { unlinkSync(socketPath); } catch {}\n try { unlinkSync(pidPath); } catch {}\n } catch {\n // Process may already be dead\n }\n }\n}\n"]}
@@ -18,6 +18,17 @@ declare const RewriteParams: Type.TObject<{
18
18
  path: Type.TOptional<Type.TString>;
19
19
  dry_run: Type.TOptional<Type.TBoolean>;
20
20
  }>;
21
- export declare function createCodeRewriteTool(rootDirOrGetter: string | (() => string), treeSitter: TreeSitterManager, fileChangeCallback?: RewriteFileChangeCallback): ToolDefinition<typeof RewriteParams>;
21
+ interface RewriteDetails {
22
+ matchCount: number;
23
+ filesModified: number;
24
+ dryRun: boolean;
25
+ failures?: {
26
+ file: string;
27
+ reason: string;
28
+ writeAttempted?: boolean;
29
+ }[];
30
+ skippedFiles?: string[];
31
+ }
32
+ export declare function createCodeRewriteTool(rootDirOrGetter: string | (() => string), treeSitter: TreeSitterManager, fileChangeCallback?: RewriteFileChangeCallback): ToolDefinition<typeof RewriteParams, RewriteDetails>;
22
33
  export {};
23
34
  //# sourceMappingURL=code-rewrite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-rewrite.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,aAAa;;;;;;EAMjB,CAAC;AAQH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,kBAAkB,CAAC,EAAE,yBAAyB,GAC7C,cAAc,CAAC,OAAO,aAAa,CAAC,CAgItC","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n const modifiedFiles = new Set(result.changes.map((c) => c.file));\n for (const file of modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },\n };\n },\n };\n}\n"]}
1
+ {"version":3,"file":"code-rewrite.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAItE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,aAAa;;;;;;EAMjB,CAAC;AAEH,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IACxE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,kBAAkB,CAAC,EAAE,yBAAyB,GAC7C,cAAc,CAAC,OAAO,aAAa,EAAE,cAAc,CAAC,CAqItD","sourcesContent":["/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { resolveToCwd } from \"../../../../core/tools/path-utils.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n failures?: { file: string; reason: string; writeAttempted?: boolean }[];\n skippedFiles?: string[];\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams, RewriteDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"Apply rejects protected targets and stale source snapshots. Files apply sequentially; a later failure leaves earlier changes in place and reports skipped files. Search again after a stale-source failure. Inspect failed writes before retrying. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e) {\n return {\n content: [{ type: \"text\", text: `Error: ${e instanceof Error ? e.message : String(e)}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path: path ? resolveToCwd(path, rootDir) : undefined,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement, rootDir);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n for (const file of result.modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n if (result.failures.length) {\n lines.push(`Rewrite stopped. ${result.filesModified} file(s) changed before failure; earlier changes remain. ${result.skippedFiles.length} file(s) skipped.`);\n if (result.failures.some((failure) => failure.writeAttempted)) lines.push(\"A failed write may have partially changed its target. Inspect that file before retrying.\");\n for (const failure of result.failures) lines.push(`${relative(rootDir, failure.file)}: ${failure.reason}`);\n }\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false, failures: result.failures, skippedFiles: result.skippedFiles },\n };\n },\n };\n}\n"]}
@@ -1,4 +1,3 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * code_rewrite — Transform code matching a structural pattern into a replacement.
4
3
  *
@@ -7,6 +6,7 @@
7
6
  */
8
7
  import { Type } from "@sinclair/typebox";
9
8
  import { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from "../../../../core/tools/truncate.js";
9
+ import { resolveToCwd } from "../../../../core/tools/path-utils.js";
10
10
  import { relative } from "node:path";
11
11
  import { compilePattern } from "../tree-sitter/pattern-compiler.js";
12
12
  import { searchFiles } from "../tree-sitter/search-engine.js";
@@ -26,6 +26,7 @@ export function createCodeRewriteTool(rootDirOrGetter, treeSitter, fileChangeCal
26
26
  description: "Transform code matching a structural pattern into a replacement. " +
27
27
  "Use $NAME to capture and reuse single nodes, $$$NAME for sequences. " +
28
28
  "Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. " +
29
+ "Apply rejects protected targets and stale source snapshots. Files apply sequentially; a later failure leaves earlier changes in place and reports skipped files. Search again after a stale-source failure. Inspect failed writes before retrying. " +
29
30
  "For symbol renames, prefer lsp_rename instead (semantically correct).",
30
31
  parameters: RewriteParams,
31
32
  async execute(_toolCallId, params) {
@@ -39,7 +40,7 @@ export function createCodeRewriteTool(rootDirOrGetter, treeSitter, fileChangeCal
39
40
  }
40
41
  catch (e) {
41
42
  return {
42
- content: [{ type: "text", text: `Error: ${e.message}` }],
43
+ content: [{ type: "text", text: `Error: ${e instanceof Error ? e.message : String(e)}` }],
43
44
  details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },
44
45
  };
45
46
  }
@@ -58,7 +59,7 @@ export function createCodeRewriteTool(rootDirOrGetter, treeSitter, fileChangeCal
58
59
  }
59
60
  // Find matches
60
61
  const matches = await searchFiles(compiled, rootDir, treeSitter, {
61
- path,
62
+ path: path ? resolveToCwd(path, rootDir) : undefined,
62
63
  maxResults: 500,
63
64
  });
64
65
  if (matches.length === 0) {
@@ -99,15 +100,21 @@ export function createCodeRewriteTool(rootDirOrGetter, treeSitter, fileChangeCal
99
100
  };
100
101
  }
101
102
  // Apply mode
102
- const result = await applyRewrites(matches, replacement);
103
+ const result = await applyRewrites(matches, replacement, rootDir);
103
104
  // Notify FileSync about modified files so LSP servers get updated
104
105
  if (fileChangeCallback && result.filesModified > 0) {
105
- const modifiedFiles = new Set(result.changes.map((c) => c.file));
106
- for (const file of modifiedFiles) {
106
+ for (const file of result.modifiedFiles) {
107
107
  fileChangeCallback.onFileModified(file);
108
108
  }
109
109
  }
110
110
  const lines = [];
111
+ if (result.failures.length) {
112
+ lines.push(`Rewrite stopped. ${result.filesModified} file(s) changed before failure; earlier changes remain. ${result.skippedFiles.length} file(s) skipped.`);
113
+ if (result.failures.some((failure) => failure.writeAttempted))
114
+ lines.push("A failed write may have partially changed its target. Inspect that file before retrying.");
115
+ for (const failure of result.failures)
116
+ lines.push(`${relative(rootDir, failure.file)}: ${failure.reason}`);
117
+ }
111
118
  lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? "s" : ""} across ${result.filesModified} file${result.filesModified !== 1 ? "s" : ""}:\n`);
112
119
  for (const c of result.changes) {
113
120
  const relPath = relative(rootDir, c.file);
@@ -123,7 +130,7 @@ export function createCodeRewriteTool(rootDirOrGetter, treeSitter, fileChangeCal
123
130
  }
124
131
  return {
125
132
  content: [{ type: "text", text: output }],
126
- details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },
133
+ details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false, failures: result.failures, skippedFiles: result.skippedFiles },
127
134
  };
128
135
  },
129
136
  };
@@ -1 +1 @@
1
- {"version":3,"file":"code-rewrite.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n const modifiedFiles = new Set(result.changes.map((c) => c.file));\n for (const file of modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },\n };\n },\n };\n}\n"]}
1
+ {"version":3,"file":"code-rewrite.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { resolveToCwd } from \"../../../../core/tools/path-utils.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n failures?: { file: string; reason: string; writeAttempted?: boolean }[];\n skippedFiles?: string[];\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams, RewriteDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"Apply rejects protected targets and stale source snapshots. Files apply sequentially; a later failure leaves earlier changes in place and reports skipped files. Search again after a stale-source failure. Inspect failed writes before retrying. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e) {\n return {\n content: [{ type: \"text\", text: `Error: ${e instanceof Error ? e.message : String(e)}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path: path ? resolveToCwd(path, rootDir) : undefined,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement, rootDir);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n for (const file of result.modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n if (result.failures.length) {\n lines.push(`Rewrite stopped. ${result.filesModified} file(s) changed before failure; earlier changes remain. ${result.skippedFiles.length} file(s) skipped.`);\n if (result.failures.some((failure) => failure.writeAttempted)) lines.push(\"A failed write may have partially changed its target. Inspect that file before retrying.\");\n for (const failure of result.failures) lines.push(`${relative(rootDir, failure.file)}: ${failure.reason}`);\n }\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false, failures: result.failures, skippedFiles: result.skippedFiles },\n };\n },\n };\n}\n"]}
@@ -15,6 +15,13 @@ export interface RewriteChange {
15
15
  export interface RewriteResult {
16
16
  changes: RewriteChange[];
17
17
  filesModified: number;
18
+ modifiedFiles: string[];
19
+ failures: {
20
+ file: string;
21
+ reason: string;
22
+ writeAttempted?: boolean;
23
+ }[];
24
+ skippedFiles: string[];
18
25
  }
19
26
  /**
20
27
  * Substitute metavariable references in a replacement template with captured values.
@@ -26,8 +33,9 @@ export declare function substituteCaptures(template: string, captures: Record<st
26
33
  */
27
34
  export declare function computeRewrites(matches: SearchMatch[], replacementTemplate: string): RewriteChange[];
28
35
  /**
29
- * Apply rewrite changes to files. Modifies files in-place.
30
- * Applies changes bottom-up (last offset first) within each file to preserve byte offsets.
36
+ * Preflight every protected destination, then queue each file's read/validate/write.
37
+ * Stop on the first failure and retain an accurate partial result. This is not a
38
+ * multi-file transaction; earlier successful files remain changed.
31
39
  */
32
- export declare function applyRewrites(matches: SearchMatch[], replacementTemplate: string): Promise<RewriteResult>;
40
+ export declare function applyRewrites(matches: SearchMatch[], replacementTemplate: string, cwd?: string): Promise<RewriteResult>;
33
41
  //# sourceMappingURL=rewrite-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rewrite-engine.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAMR;AAiBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,mBAAmB,EAAE,MAAM,GAC1B,aAAa,EAAE,CAYjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EAAE,EACtB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,aAAa,CAAC,CAmDxB","sourcesContent":["// @ts-nocheck\n/**\n * Rewrite Engine — apply structural replacements using matched patterns.\n *\n * Takes search matches and a replacement template with metavariable references,\n * substitutes captured values, and applies the text changes.\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport type { SearchMatch } from \"./search-engine.js\";\n\n// ── Result types ────────────────────────────────────────────────────────────\n\nexport interface RewriteChange {\n file: string;\n line: number;\n column: number;\n before: string;\n after: string;\n}\n\nexport interface RewriteResult {\n changes: RewriteChange[];\n filesModified: number;\n}\n\n// ── Replacement template substitution ───────────────────────────────────────\n\nconst METAVAR_REF_RE = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n\n/**\n * Substitute metavariable references in a replacement template with captured values.\n */\nexport function substituteCaptures(\n template: string,\n captures: Record<string, string>,\n): string {\n return template.replace(METAVAR_REF_RE, (match, variadicName, singleName) => {\n const name = variadicName ?? singleName;\n if (name in captures) return captures[name];\n return match; // Leave unmatched references as-is\n });\n}\n\n/**\n * If the original matched text ends with a semicolon (possibly preceded by whitespace)\n * and the replacement doesn't, append the semicolon. This preserves statement terminators\n * that are part of the AST node but not part of the pattern/replacement.\n */\nfunction preserveTrailingSemicolon(original: string, replacement: string): string {\n const trailingMatch = original.match(/(\\s*;)\\s*$/);\n if (trailingMatch && !replacement.trimEnd().endsWith(\";\")) {\n return replacement + trailingMatch[1];\n }\n return replacement;\n}\n\n// ── Rewrite application ─────────────────────────────────────────────────────\n\n/**\n * Compute rewrite changes from matches and a replacement template.\n * Returns the list of changes without applying them.\n */\nexport function computeRewrites(\n matches: SearchMatch[],\n replacementTemplate: string,\n): RewriteChange[] {\n return matches.map((m) => {\n const raw = substituteCaptures(replacementTemplate, m.captures);\n const after = preserveTrailingSemicolon(m.matchedText, raw);\n return {\n file: m.file,\n line: m.line,\n column: m.column,\n before: m.matchedText,\n after,\n };\n });\n}\n\n/**\n * Apply rewrite changes to files. Modifies files in-place.\n * Applies changes bottom-up (last offset first) within each file to preserve byte offsets.\n */\nexport async function applyRewrites(\n matches: SearchMatch[],\n replacementTemplate: string,\n): Promise<RewriteResult> {\n // Group matches by file\n const byFile = new Map<string, SearchMatch[]>();\n for (const m of matches) {\n const existing = byFile.get(m.file);\n if (existing) {\n existing.push(m);\n } else {\n byFile.set(m.file, [m]);\n }\n }\n\n const changes: RewriteChange[] = [];\n let filesModified = 0;\n\n for (const [file, fileMatches] of byFile) {\n // Sort by startIndex descending — apply from bottom to top\n const sorted = [...fileMatches].sort((a, b) => b.startIndex - a.startIndex);\n\n let content = await readFile(file, \"utf-8\");\n let modified = false;\n\n for (const m of sorted) {\n const raw = substituteCaptures(replacementTemplate, m.captures);\n const replacement = preserveTrailingSemicolon(m.matchedText, raw);\n if (replacement !== m.matchedText) {\n content =\n content.slice(0, m.startIndex) +\n replacement +\n content.slice(m.endIndex);\n modified = true;\n }\n changes.push({\n file,\n line: m.line,\n column: m.column,\n before: m.matchedText,\n after: replacement,\n });\n }\n\n if (modified) {\n await writeFile(file, content, \"utf-8\");\n filesModified++;\n }\n }\n\n // Reverse so changes appear top-to-bottom\n changes.reverse();\n\n return { changes, filesModified };\n}\n"]}
1
+ {"version":3,"file":"rewrite-engine.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IACvE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAMR;AAiBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,mBAAmB,EAAE,MAAM,GAC1B,aAAa,EAAE,CAYjB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EAAE,EACtB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,CA8DxB","sourcesContent":["/**\n * Rewrite Engine — apply structural replacements using matched patterns.\n *\n * Takes search matches and a replacement template with metavariable references,\n * substitutes captured values, and applies the text changes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { dirname } from \"node:path\";\nimport { protectedTargetWriteReason } from \"../../../../core/protected-targets.js\";\nimport { withFileMutationQueue } from \"../../../../core/tools/file-mutation-queue.js\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport type { SearchMatch } from \"./search-engine.js\";\n\n// ── Result types ────────────────────────────────────────────────────────────\n\nexport interface RewriteChange {\n file: string;\n line: number;\n column: number;\n before: string;\n after: string;\n}\n\nexport interface RewriteResult {\n changes: RewriteChange[];\n filesModified: number;\n modifiedFiles: string[];\n failures: { file: string; reason: string; writeAttempted?: boolean }[];\n skippedFiles: string[];\n}\n\n// ── Replacement template substitution ───────────────────────────────────────\n\nconst METAVAR_REF_RE = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n\n/**\n * Substitute metavariable references in a replacement template with captured values.\n */\nexport function substituteCaptures(\n template: string,\n captures: Record<string, string>,\n): string {\n return template.replace(METAVAR_REF_RE, (match, variadicName, singleName) => {\n const name = variadicName ?? singleName;\n if (name in captures) return captures[name];\n return match; // Leave unmatched references as-is\n });\n}\n\n/**\n * If the original matched text ends with a semicolon (possibly preceded by whitespace)\n * and the replacement doesn't, append the semicolon. This preserves statement terminators\n * that are part of the AST node but not part of the pattern/replacement.\n */\nfunction preserveTrailingSemicolon(original: string, replacement: string): string {\n const trailingMatch = original.match(/(\\s*;)\\s*$/);\n if (trailingMatch && !replacement.trimEnd().endsWith(\";\")) {\n return replacement + trailingMatch[1];\n }\n return replacement;\n}\n\n// ── Rewrite application ─────────────────────────────────────────────────────\n\n/**\n * Compute rewrite changes from matches and a replacement template.\n * Returns the list of changes without applying them.\n */\nexport function computeRewrites(\n matches: SearchMatch[],\n replacementTemplate: string,\n): RewriteChange[] {\n return matches.map((m) => {\n const raw = substituteCaptures(replacementTemplate, m.captures);\n const after = preserveTrailingSemicolon(m.matchedText, raw);\n return {\n file: m.file,\n line: m.line,\n column: m.column,\n before: m.matchedText,\n after,\n };\n });\n}\n\n/**\n * Preflight every protected destination, then queue each file's read/validate/write.\n * Stop on the first failure and retain an accurate partial result. This is not a\n * multi-file transaction; earlier successful files remain changed.\n */\nexport async function applyRewrites(\n matches: SearchMatch[],\n replacementTemplate: string,\n cwd?: string,\n): Promise<RewriteResult> {\n const byFile = new Map<string, SearchMatch[]>();\n for (const match of matches) {\n const existing = byFile.get(match.file);\n if (existing) existing.push(match);\n else byFile.set(match.file, [match]);\n }\n const result: RewriteResult = { changes: [], filesModified: 0, modifiedFiles: [], failures: [], skippedFiles: [] };\n const files = [...byFile.keys()];\n // An allowed directory scope never authorizes a protected matched file.\n for (const file of files) {\n const reason = protectedTargetWriteReason(file, cwd ?? dirname(file));\n if (reason) result.failures.push({ file, reason });\n }\n if (result.failures.length) {\n result.skippedFiles = files.filter((file) => !result.failures.some((failure) => failure.file === file));\n return result;\n }\n\n for (const [file, fileMatches] of byFile) {\n let writeAttempted = false;\n try {\n const applied = await withFileMutationQueue(file, async () => {\n const reason = protectedTargetWriteReason(file, cwd ?? dirname(file));\n if (reason) throw new Error(reason);\n const source = await readFile(file, \"utf-8\");\n const sourceHash = createHash(\"sha256\").update(source).digest(\"hex\");\n const sorted = [...fileMatches].sort((a, b) => b.startIndex - a.startIndex);\n let nextStart = source.length;\n for (const match of sorted) {\n if (match.sourceHash !== sourceHash || !Number.isInteger(match.startIndex) ||\n !Number.isInteger(match.endIndex) || match.startIndex < 0 || match.endIndex > nextStart ||\n match.startIndex > match.endIndex || source.slice(match.startIndex, match.endIndex) !== match.matchedText) {\n throw new Error(\"Source changed or match offsets are invalid. Search again before applying a rewrite.\");\n }\n nextStart = match.startIndex;\n }\n let content = source;\n const changes: RewriteChange[] = [];\n for (const match of sorted) {\n const raw = substituteCaptures(replacementTemplate, match.captures);\n const replacement = preserveTrailingSemicolon(match.matchedText, raw);\n content = content.slice(0, match.startIndex) + replacement + content.slice(match.endIndex);\n changes.push({ file, line: match.line, column: match.column, before: match.matchedText, after: replacement });\n }\n const modified = content !== source;\n if (modified) {\n writeAttempted = true;\n await writeFile(file, content, \"utf-8\");\n }\n return { changes: changes.reverse(), modified };\n });\n result.changes.push(...applied.changes);\n if (applied.modified) result.modifiedFiles.push(file);\n } catch (error) {\n result.failures.push({ file, reason: error instanceof Error ? error.message : String(error), writeAttempted });\n result.skippedFiles = files.slice(files.indexOf(file) + 1);\n break;\n }\n }\n result.filesModified = result.modifiedFiles.length;\n return result;\n}\n"]}