@ashx-j/lunr 0.1.0 → 0.1.2

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 (869) hide show
  1. package/dist/builtin-extensions/ashxj-spinners.d.ts +1 -1
  2. package/dist/builtin-extensions/ashxj-spinners.d.ts.map +1 -1
  3. package/dist/builtin-extensions/ashxj-spinners.js.map +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts +5 -5
  5. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js +3 -3
  7. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts +2 -2
  9. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  10. package/dist/builtin-extensions/ashxj-tui.js +2 -2
  11. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  12. package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
  13. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/index.d.ts +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/index.d.ts.map +1 -1
  17. package/dist/builtin-extensions/lunr-local-providers/index.js.map +1 -1
  18. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts +1 -1
  19. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  20. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  21. package/dist/builtin-extensions/lunr-plan-tools.d.ts +1 -1
  22. package/dist/builtin-extensions/lunr-plan-tools.d.ts.map +1 -1
  23. package/dist/builtin-extensions/lunr-plan-tools.js +1 -1
  24. package/dist/builtin-extensions/lunr-plan-tools.js.map +1 -1
  25. package/dist/builtin-extensions/lunr-skill-creator/index.d.ts +1 -1
  26. package/dist/builtin-extensions/lunr-skill-creator/index.d.ts.map +1 -1
  27. package/dist/builtin-extensions/lunr-skill-creator/index.js.map +1 -1
  28. package/dist/builtin-extensions/lunr-todos.d.ts +1 -1
  29. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  30. package/dist/builtin-extensions/lunr-todos.js +1 -1
  31. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  32. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  33. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  34. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts +1 -1
  35. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  36. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  37. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +2 -2
  38. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  39. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  40. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  41. package/dist/builtin-extensions/pi-intercom/index.d.ts +1 -1
  42. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  44. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  45. package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts +2 -2
  46. package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-intercom/ui/compose.js +1 -1
  48. package/dist/builtin-extensions/pi-intercom/ui/compose.js.map +1 -1
  49. package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts +2 -2
  50. package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-intercom/ui/inline-message.js +1 -1
  52. package/dist/builtin-extensions/pi-intercom/ui/inline-message.js.map +1 -1
  53. package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts +2 -2
  54. package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-intercom/ui/session-list.js +1 -1
  56. package/dist/builtin-extensions/pi-intercom/ui/session-list.js.map +1 -1
  57. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  60. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +1 -1
  61. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -1
  63. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  64. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts +1 -1
  65. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js +1 -1
  67. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js.map +1 -1
  68. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js +1 -1
  71. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js.map +1 -1
  72. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +1 -1
  73. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  74. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  75. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts +1 -1
  76. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts.map +1 -1
  77. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.js.map +1 -1
  78. package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts +1 -1
  79. package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts.map +1 -1
  80. package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js +1 -1
  81. package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js.map +1 -1
  82. package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts +1 -1
  83. package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts.map +1 -1
  84. package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js +1 -1
  85. package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js.map +1 -1
  86. package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts +1 -1
  87. package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts.map +1 -1
  88. package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js +1 -1
  89. package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js.map +1 -1
  90. package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts +1 -1
  91. package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts.map +1 -1
  92. package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js +1 -1
  93. package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js.map +1 -1
  94. package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts +1 -1
  95. package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js +1 -1
  97. package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js.map +1 -1
  98. package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts +1 -1
  99. package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js +1 -1
  101. package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js.map +1 -1
  102. package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts +1 -1
  103. package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js +1 -1
  105. package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js.map +1 -1
  106. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +1 -1
  107. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  108. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  109. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +1 -1
  110. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
  112. package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts +1 -1
  113. package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.js.map +1 -1
  115. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts +1 -1
  116. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  118. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +1 -1
  119. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  121. package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.d.ts.map +1 -1
  122. package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js +1 -1
  123. package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js.map +1 -1
  124. package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.d.ts.map +1 -1
  125. package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js +1 -1
  126. package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js.map +1 -1
  127. package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js +1 -1
  129. package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js.map +1 -1
  130. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts +1 -1
  131. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  132. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  133. package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts +2 -2
  134. package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js +1 -1
  136. package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js.map +1 -1
  137. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +1 -1
  138. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  139. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  140. package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts +2 -2
  141. package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js +1 -1
  143. package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js.map +1 -1
  144. package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts +1 -1
  145. package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts.map +1 -1
  146. package/dist/builtin-extensions/pi-mcp-adapter/types.js.map +1 -1
  147. package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts +1 -1
  148. package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts.map +1 -1
  149. package/dist/builtin-extensions/pi-mcp-adapter/utils.js.map +1 -1
  150. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  151. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  152. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  153. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +1 -1
  154. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts +1 -1
  156. package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts.map +1 -1
  157. package/dist/builtin-extensions/pi-ollama-cloud/models.generated.js.map +1 -1
  158. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  159. package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts +1 -1
  160. package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.js.map +1 -1
  162. package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts +2 -2
  163. package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts.map +1 -1
  164. package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js +1 -1
  165. package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js.map +1 -1
  166. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts +1 -1
  167. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  168. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  169. package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts +1 -1
  170. package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts.map +1 -1
  171. package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.js.map +1 -1
  172. package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts +1 -1
  173. package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-prompt-template-model/model-selection.js.map +1 -1
  175. package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts +1 -1
  176. package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-prompt-template-model/notifications.js.map +1 -1
  178. package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts +1 -1
  179. package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.js.map +1 -1
  181. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +1 -1
  182. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  183. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +1 -1
  184. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  185. package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts +2 -2
  186. package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js +1 -1
  188. package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js.map +1 -1
  189. package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts +2 -2
  190. package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js +1 -1
  192. package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js.map +1 -1
  193. package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts +3 -3
  194. package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts.map +1 -1
  195. package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js +1 -1
  196. package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js.map +1 -1
  197. package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts +2 -2
  198. package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts.map +1 -1
  199. package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js +1 -1
  200. package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js.map +1 -1
  201. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
  202. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  203. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
  204. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  205. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +2 -2
  206. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
  207. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +1 -1
  208. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
  209. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
  210. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
  211. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts +1 -1
  212. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  213. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  214. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  215. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  216. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +2 -2
  217. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  218. package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts +2 -2
  219. package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts.map +1 -1
  220. package/dist/builtin-extensions/pi-subagents/src/extension/rpc.js.map +1 -1
  221. package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts +1 -1
  222. package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts.map +1 -1
  223. package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.js.map +1 -1
  224. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -1
  225. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  226. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  227. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +1 -1
  228. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +1 -1
  229. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +1 -1
  230. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +1 -1
  231. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  232. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  233. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts +1 -1
  234. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
  235. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
  236. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -1
  237. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
  238. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
  239. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts +1 -1
  240. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
  241. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
  242. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  243. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  244. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  245. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts +1 -1
  246. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  247. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  248. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +2 -2
  249. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
  250. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
  251. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  252. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  253. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -1
  254. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  255. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  256. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
  257. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  258. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  259. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts +1 -1
  260. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts.map +1 -1
  261. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.js.map +1 -1
  262. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
  263. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
  264. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js +1 -1
  265. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
  266. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +2 -2
  267. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  268. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  269. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  270. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  271. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +2 -2
  272. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  273. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  274. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
  275. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
  276. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
  277. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts +1 -1
  278. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts.map +1 -1
  279. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js +1 -1
  280. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js.map +1 -1
  281. package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts +1 -1
  282. package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts.map +1 -1
  283. package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.js.map +1 -1
  284. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts +1 -1
  285. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  286. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  287. package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts +1 -1
  288. package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts.map +1 -1
  289. package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.js.map +1 -1
  290. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
  291. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
  292. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
  293. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -3
  294. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  295. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  296. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  297. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  298. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +1 -1
  299. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  300. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +1 -1
  301. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  302. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  303. package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts +2 -2
  304. package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts.map +1 -1
  305. package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.js.map +1 -1
  306. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
  307. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  308. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +2 -2
  309. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  310. package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts +1 -1
  311. package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts.map +1 -1
  312. package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.js.map +1 -1
  313. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts +2 -2
  314. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
  315. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +1 -1
  316. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
  317. package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts +1 -1
  318. package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts.map +1 -1
  319. package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js +1 -1
  320. package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js.map +1 -1
  321. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +3 -3
  322. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  323. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +2 -2
  324. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  325. package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts +1 -1
  326. package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts.map +1 -1
  327. package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.js.map +1 -1
  328. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts +1 -1
  329. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts.map +1 -1
  330. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.js.map +1 -1
  331. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts +1 -1
  332. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
  333. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
  334. package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
  335. package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts +1 -1
  336. package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts.map +1 -1
  337. package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js +1 -1
  338. package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js.map +1 -1
  339. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +3 -3
  340. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  341. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  342. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  343. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +1 -1
  344. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
  345. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
  346. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -2
  347. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
  348. package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
  349. package/dist/builtin-extensions/pi-tps.d.ts +1 -1
  350. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  351. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  352. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
  353. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
  354. package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
  355. package/dist/builtin-extensions/pi-web-access/index.d.ts +1 -1
  356. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  357. package/dist/builtin-extensions/pi-web-access/index.js +2 -2
  358. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  359. package/dist/builtin-extensions/pi-web-access/openai-search.d.ts +1 -1
  360. package/dist/builtin-extensions/pi-web-access/openai-search.d.ts.map +1 -1
  361. package/dist/builtin-extensions/pi-web-access/openai-search.js +1 -1
  362. package/dist/builtin-extensions/pi-web-access/openai-search.js.map +1 -1
  363. package/dist/builtin-extensions/pi-web-access/storage.d.ts +1 -1
  364. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  365. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  366. package/dist/builtin-extensions/pi-web-access/summary-review.d.ts +1 -1
  367. package/dist/builtin-extensions/pi-web-access/summary-review.d.ts.map +1 -1
  368. package/dist/builtin-extensions/pi-web-access/summary-review.js +1 -1
  369. package/dist/builtin-extensions/pi-web-access/summary-review.js.map +1 -1
  370. package/dist/bun/cli.d.ts.map +1 -1
  371. package/dist/bun/cli.js +1 -1
  372. package/dist/bun/cli.js.map +1 -1
  373. package/dist/bun/register-bedrock.d.ts.map +1 -1
  374. package/dist/bun/register-bedrock.js +2 -2
  375. package/dist/bun/register-bedrock.js.map +1 -1
  376. package/dist/catalog/models.json +1 -1
  377. package/dist/catalog/providers/opencode-go.json +1 -1
  378. package/dist/catalog/providers/openrouter.json +1 -1
  379. package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
  380. package/dist/catalog/providers/qwen-token-plan.json +1 -1
  381. package/dist/catalog/publication.json +3 -3
  382. package/dist/cli/args.d.ts +1 -1
  383. package/dist/cli/args.d.ts.map +1 -1
  384. package/dist/cli/args.js.map +1 -1
  385. package/dist/cli/config-selector.d.ts.map +1 -1
  386. package/dist/cli/config-selector.js +1 -1
  387. package/dist/cli/config-selector.js.map +1 -1
  388. package/dist/cli/file-processor.d.ts +1 -1
  389. package/dist/cli/file-processor.d.ts.map +1 -1
  390. package/dist/cli/file-processor.js.map +1 -1
  391. package/dist/cli/initial-message.d.ts +1 -1
  392. package/dist/cli/initial-message.d.ts.map +1 -1
  393. package/dist/cli/initial-message.js.map +1 -1
  394. package/dist/cli/list-models.d.ts.map +1 -1
  395. package/dist/cli/list-models.js +1 -1
  396. package/dist/cli/list-models.js.map +1 -1
  397. package/dist/cli/session-picker.d.ts.map +1 -1
  398. package/dist/cli/session-picker.js +1 -1
  399. package/dist/cli/session-picker.js.map +1 -1
  400. package/dist/cli/startup-ui.d.ts +1 -1
  401. package/dist/cli/startup-ui.d.ts.map +1 -1
  402. package/dist/cli/startup-ui.js +2 -2
  403. package/dist/cli/startup-ui.js.map +1 -1
  404. package/dist/config.d.ts.map +1 -1
  405. package/dist/config.js +1 -1
  406. package/dist/config.js.map +1 -1
  407. package/dist/core/agent-session-services.d.ts +2 -2
  408. package/dist/core/agent-session-services.d.ts.map +1 -1
  409. package/dist/core/agent-session-services.js.map +1 -1
  410. package/dist/core/agent-session.d.ts +2 -2
  411. package/dist/core/agent-session.d.ts.map +1 -1
  412. package/dist/core/agent-session.js +1 -1
  413. package/dist/core/agent-session.js.map +1 -1
  414. package/dist/core/auth-storage.d.ts +1 -1
  415. package/dist/core/auth-storage.d.ts.map +1 -1
  416. package/dist/core/auth-storage.js.map +1 -1
  417. package/dist/core/cache-stats.d.ts +1 -1
  418. package/dist/core/cache-stats.d.ts.map +1 -1
  419. package/dist/core/cache-stats.js.map +1 -1
  420. package/dist/core/catalog-merge.d.ts +1 -1
  421. package/dist/core/catalog-merge.d.ts.map +1 -1
  422. package/dist/core/catalog-merge.js +7 -1
  423. package/dist/core/catalog-merge.js.map +1 -1
  424. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  425. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  426. package/dist/core/compaction/branch-summarization.js +1 -1
  427. package/dist/core/compaction/branch-summarization.js.map +1 -1
  428. package/dist/core/compaction/compaction.d.ts +2 -2
  429. package/dist/core/compaction/compaction.d.ts.map +1 -1
  430. package/dist/core/compaction/compaction.js +1 -1
  431. package/dist/core/compaction/compaction.js.map +1 -1
  432. package/dist/core/compaction/utils.d.ts +2 -2
  433. package/dist/core/compaction/utils.d.ts.map +1 -1
  434. package/dist/core/compaction/utils.js.map +1 -1
  435. package/dist/core/context-breakdown.d.ts +1 -1
  436. package/dist/core/context-breakdown.d.ts.map +1 -1
  437. package/dist/core/context-breakdown.js.map +1 -1
  438. package/dist/core/defaults.d.ts +1 -1
  439. package/dist/core/defaults.d.ts.map +1 -1
  440. package/dist/core/defaults.js.map +1 -1
  441. package/dist/core/export-html/index.d.ts +1 -1
  442. package/dist/core/export-html/index.d.ts.map +1 -1
  443. package/dist/core/export-html/index.js.map +1 -1
  444. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  445. package/dist/core/export-html/tool-renderer.js.map +1 -1
  446. package/dist/core/extensions/loader.d.ts.map +1 -1
  447. package/dist/core/extensions/loader.js +25 -25
  448. package/dist/core/extensions/loader.js.map +1 -1
  449. package/dist/core/extensions/runner.d.ts +3 -3
  450. package/dist/core/extensions/runner.d.ts.map +1 -1
  451. package/dist/core/extensions/runner.js.map +1 -1
  452. package/dist/core/extensions/types.d.ts +5 -5
  453. package/dist/core/extensions/types.d.ts.map +1 -1
  454. package/dist/core/extensions/types.js.map +1 -1
  455. package/dist/core/extensions/wrapper.d.ts +1 -1
  456. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  457. package/dist/core/extensions/wrapper.js.map +1 -1
  458. package/dist/core/grok-cli-auth.d.ts +32 -0
  459. package/dist/core/grok-cli-auth.d.ts.map +1 -0
  460. package/dist/core/grok-cli-auth.js +218 -0
  461. package/dist/core/grok-cli-auth.js.map +1 -0
  462. package/dist/core/keybindings.d.ts +2 -2
  463. package/dist/core/keybindings.d.ts.map +1 -1
  464. package/dist/core/keybindings.js +1 -1
  465. package/dist/core/keybindings.js.map +1 -1
  466. package/dist/core/live-catalog.d.ts +1 -1
  467. package/dist/core/live-catalog.d.ts.map +1 -1
  468. package/dist/core/live-catalog.js.map +1 -1
  469. package/dist/core/messages.d.ts +3 -3
  470. package/dist/core/messages.d.ts.map +1 -1
  471. package/dist/core/messages.js.map +1 -1
  472. package/dist/core/model-registry.d.ts +1 -1
  473. package/dist/core/model-registry.d.ts.map +1 -1
  474. package/dist/core/model-registry.js.map +1 -1
  475. package/dist/core/model-resolver.d.ts +2 -2
  476. package/dist/core/model-resolver.d.ts.map +1 -1
  477. package/dist/core/model-resolver.js +1 -1
  478. package/dist/core/model-resolver.js.map +1 -1
  479. package/dist/core/model-runtime.d.ts +10 -1
  480. package/dist/core/model-runtime.d.ts.map +1 -1
  481. package/dist/core/model-runtime.js +24 -5
  482. package/dist/core/model-runtime.js.map +1 -1
  483. package/dist/core/models-store.d.ts +1 -1
  484. package/dist/core/models-store.d.ts.map +1 -1
  485. package/dist/core/models-store.js.map +1 -1
  486. package/dist/core/official-catalog.d.ts +1 -1
  487. package/dist/core/official-catalog.d.ts.map +1 -1
  488. package/dist/core/official-catalog.js.map +1 -1
  489. package/dist/core/provider-attribution.d.ts +1 -1
  490. package/dist/core/provider-attribution.d.ts.map +1 -1
  491. package/dist/core/provider-attribution.js.map +1 -1
  492. package/dist/core/provider-composer.d.ts +1 -1
  493. package/dist/core/provider-composer.d.ts.map +1 -1
  494. package/dist/core/provider-composer.js +2 -2
  495. package/dist/core/provider-composer.js.map +1 -1
  496. package/dist/core/runtime-credentials.d.ts +1 -1
  497. package/dist/core/runtime-credentials.d.ts.map +1 -1
  498. package/dist/core/runtime-credentials.js.map +1 -1
  499. package/dist/core/sdk.d.ts +3 -3
  500. package/dist/core/sdk.d.ts.map +1 -1
  501. package/dist/core/sdk.js +3 -3
  502. package/dist/core/sdk.js.map +1 -1
  503. package/dist/core/session-manager.d.ts +2 -2
  504. package/dist/core/session-manager.d.ts.map +1 -1
  505. package/dist/core/session-manager.js +1 -1
  506. package/dist/core/session-manager.js.map +1 -1
  507. package/dist/core/settings-manager.d.ts +2 -2
  508. package/dist/core/settings-manager.d.ts.map +1 -1
  509. package/dist/core/settings-manager.js.map +1 -1
  510. package/dist/core/subscriptions.d.ts +1 -1
  511. package/dist/core/subscriptions.d.ts.map +1 -1
  512. package/dist/core/subscriptions.js.map +1 -1
  513. package/dist/core/tools/bash.d.ts +1 -1
  514. package/dist/core/tools/bash.d.ts.map +1 -1
  515. package/dist/core/tools/bash.js +1 -1
  516. package/dist/core/tools/bash.js.map +1 -1
  517. package/dist/core/tools/edit.d.ts +2 -2
  518. package/dist/core/tools/edit.d.ts.map +1 -1
  519. package/dist/core/tools/edit.js +1 -1
  520. package/dist/core/tools/edit.js.map +1 -1
  521. package/dist/core/tools/find.d.ts +1 -1
  522. package/dist/core/tools/find.d.ts.map +1 -1
  523. package/dist/core/tools/find.js +1 -1
  524. package/dist/core/tools/find.js.map +1 -1
  525. package/dist/core/tools/grep.d.ts +1 -1
  526. package/dist/core/tools/grep.d.ts.map +1 -1
  527. package/dist/core/tools/grep.js +1 -1
  528. package/dist/core/tools/grep.js.map +1 -1
  529. package/dist/core/tools/index.d.ts +1 -1
  530. package/dist/core/tools/index.d.ts.map +1 -1
  531. package/dist/core/tools/index.js.map +1 -1
  532. package/dist/core/tools/ls.d.ts +1 -1
  533. package/dist/core/tools/ls.d.ts.map +1 -1
  534. package/dist/core/tools/ls.js +1 -1
  535. package/dist/core/tools/ls.js.map +1 -1
  536. package/dist/core/tools/read.d.ts +1 -1
  537. package/dist/core/tools/read.d.ts.map +1 -1
  538. package/dist/core/tools/read.js +1 -1
  539. package/dist/core/tools/read.js.map +1 -1
  540. package/dist/core/tools/render-utils.d.ts +1 -1
  541. package/dist/core/tools/render-utils.d.ts.map +1 -1
  542. package/dist/core/tools/render-utils.js +1 -1
  543. package/dist/core/tools/render-utils.js.map +1 -1
  544. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  545. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  546. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  547. package/dist/core/tools/write.d.ts +1 -1
  548. package/dist/core/tools/write.d.ts.map +1 -1
  549. package/dist/core/tools/write.js +1 -1
  550. package/dist/core/tools/write.js.map +1 -1
  551. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  552. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  553. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  554. package/dist/core/usage-adapters/xai.js +4 -0
  555. package/dist/core/usage-adapters/xai.js.map +1 -1
  556. package/dist/core/usage-history.d.ts.map +1 -1
  557. package/dist/core/usage-history.js.map +1 -1
  558. package/dist/core/usage-service.d.ts +11 -1
  559. package/dist/core/usage-service.d.ts.map +1 -1
  560. package/dist/core/usage-service.js +45 -9
  561. package/dist/core/usage-service.js.map +1 -1
  562. package/dist/core/user-models.d.ts +1 -1
  563. package/dist/core/user-models.d.ts.map +1 -1
  564. package/dist/core/user-models.js.map +1 -1
  565. package/dist/gateway/agent-bridge.d.ts +3 -3
  566. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  567. package/dist/gateway/agent-bridge.js.map +1 -1
  568. package/dist/gateway/commands.d.ts.map +1 -1
  569. package/dist/gateway/commands.js.map +1 -1
  570. package/dist/gateway/cron.d.ts.map +1 -1
  571. package/dist/gateway/cron.js.map +1 -1
  572. package/dist/main.d.ts.map +1 -1
  573. package/dist/main.js +1 -1
  574. package/dist/main.js.map +1 -1
  575. package/dist/modes/interactive/components/armin.d.ts +1 -1
  576. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/armin.js.map +1 -1
  578. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  579. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  580. package/dist/modes/interactive/components/assistant-message.js +1 -1
  581. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  582. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  583. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  584. package/dist/modes/interactive/components/bash-execution.js +1 -1
  585. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  586. package/dist/modes/interactive/components/boot-screen.d.ts +1 -1
  587. package/dist/modes/interactive/components/boot-screen.d.ts.map +1 -1
  588. package/dist/modes/interactive/components/boot-screen.js +1 -1
  589. package/dist/modes/interactive/components/boot-screen.js.map +1 -1
  590. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  591. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  592. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  593. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  594. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  595. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  596. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  597. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  598. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  599. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  600. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  601. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  602. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  603. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  604. package/dist/modes/interactive/components/config-selector.js +1 -1
  605. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  606. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  607. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  608. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  609. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  610. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  611. package/dist/modes/interactive/components/custom-editor.js +1 -1
  612. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  613. package/dist/modes/interactive/components/custom-entry.d.ts +1 -1
  614. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/custom-entry.js +1 -1
  616. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  617. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  618. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  619. package/dist/modes/interactive/components/custom-message.js +1 -1
  620. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  621. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  622. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  623. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  624. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  625. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  626. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  627. package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
  628. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  630. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  631. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  632. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  633. package/dist/modes/interactive/components/extension-editor.js +1 -1
  634. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  635. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  636. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  637. package/dist/modes/interactive/components/extension-input.js +1 -1
  638. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  639. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  640. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  641. package/dist/modes/interactive/components/extension-selector.js +1 -1
  642. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  643. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
  644. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  645. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  646. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  647. package/dist/modes/interactive/components/footer.d.ts +1 -1
  648. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  649. package/dist/modes/interactive/components/footer.js +1 -1
  650. package/dist/modes/interactive/components/footer.js.map +1 -1
  651. package/dist/modes/interactive/components/injected-prompt-message.d.ts +1 -1
  652. package/dist/modes/interactive/components/injected-prompt-message.d.ts.map +1 -1
  653. package/dist/modes/interactive/components/injected-prompt-message.js +1 -1
  654. package/dist/modes/interactive/components/injected-prompt-message.js.map +1 -1
  655. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  656. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  657. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  658. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  659. package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
  660. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  661. package/dist/modes/interactive/components/login-dialog.js +1 -1
  662. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  663. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  664. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  665. package/dist/modes/interactive/components/model-selector.js +2 -2
  666. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  667. package/dist/modes/interactive/components/oauth-selector.d.ts +2 -2
  668. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  669. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  670. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  671. package/dist/modes/interactive/components/processes-selector.d.ts +1 -1
  672. package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
  673. package/dist/modes/interactive/components/processes-selector.js +1 -1
  674. package/dist/modes/interactive/components/processes-selector.js.map +1 -1
  675. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  676. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  677. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  678. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  679. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  680. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  681. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  682. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  683. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  684. package/dist/modes/interactive/components/session-selector.js +1 -1
  685. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  686. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  687. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  688. package/dist/modes/interactive/components/settings-selector.js +1 -1
  689. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  690. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  691. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  692. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  693. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  694. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  695. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  696. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  697. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  698. package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
  699. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  700. package/dist/modes/interactive/components/status-indicator.js +1 -1
  701. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  702. package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
  703. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  704. package/dist/modes/interactive/components/theme-selector.js +1 -1
  705. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  706. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
  707. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  708. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  709. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  710. package/dist/modes/interactive/components/thinking-summary.d.ts +1 -1
  711. package/dist/modes/interactive/components/thinking-summary.d.ts.map +1 -1
  712. package/dist/modes/interactive/components/thinking-summary.js.map +1 -1
  713. package/dist/modes/interactive/components/thinking-tail.d.ts +1 -1
  714. package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
  715. package/dist/modes/interactive/components/thinking-tail.js +1 -1
  716. package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
  717. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  718. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  719. package/dist/modes/interactive/components/tool-execution.js +1 -1
  720. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  721. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  722. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  723. package/dist/modes/interactive/components/tree-selector.js +1 -1
  724. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  725. package/dist/modes/interactive/components/trust-selector.d.ts +1 -1
  726. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  727. package/dist/modes/interactive/components/trust-selector.js +1 -1
  728. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  729. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  730. package/dist/modes/interactive/components/usage-view.js +1 -1
  731. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  732. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  733. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  734. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  735. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  736. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  737. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  738. package/dist/modes/interactive/components/user-message.js +1 -1
  739. package/dist/modes/interactive/components/user-message.js.map +1 -1
  740. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  741. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  742. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  743. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  744. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  745. package/dist/modes/interactive/interactive-mode.js +29 -4
  746. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  747. package/dist/modes/interactive/smooth-streaming.d.ts +1 -1
  748. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  749. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  750. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -1
  751. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  752. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  753. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  754. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  755. package/dist/modes/interactive/theme/theme.js +2 -2
  756. package/dist/modes/interactive/theme/theme.js.map +1 -1
  757. package/dist/modes/print-mode.d.ts +1 -1
  758. package/dist/modes/print-mode.d.ts.map +1 -1
  759. package/dist/modes/print-mode.js.map +1 -1
  760. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  761. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  762. package/dist/modes/rpc/rpc-client.js.map +1 -1
  763. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  764. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  765. package/dist/modes/rpc/rpc-types.js.map +1 -1
  766. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  767. package/examples/extensions/bash-spawn-hook.ts +2 -2
  768. package/examples/extensions/bookmark.ts +1 -1
  769. package/examples/extensions/border-status-editor.ts +3 -3
  770. package/examples/extensions/built-in-tool-renderer.ts +3 -3
  771. package/examples/extensions/claude-rules.ts +1 -1
  772. package/examples/extensions/commands.ts +1 -1
  773. package/examples/extensions/confirm-destructive.ts +1 -1
  774. package/examples/extensions/custom-compaction.ts +3 -3
  775. package/examples/extensions/custom-footer.ts +3 -3
  776. package/examples/extensions/custom-header.ts +2 -2
  777. package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
  778. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  779. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  780. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  781. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  782. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  783. package/examples/extensions/dirty-repo-guard.ts +1 -1
  784. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  785. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  786. package/examples/extensions/doom-overlay/index.ts +1 -1
  787. package/examples/extensions/dynamic-resources/index.ts +1 -1
  788. package/examples/extensions/dynamic-tools.ts +1 -1
  789. package/examples/extensions/entry-renderer.ts +2 -2
  790. package/examples/extensions/event-bus.ts +1 -1
  791. package/examples/extensions/file-trigger.ts +1 -1
  792. package/examples/extensions/git-checkpoint.ts +1 -1
  793. package/examples/extensions/git-merge-and-resolve.ts +1 -1
  794. package/examples/extensions/github-issue-autocomplete.ts +2 -2
  795. package/examples/extensions/gondolin/index.ts +2 -2
  796. package/examples/extensions/gondolin/package-lock.json +2 -2
  797. package/examples/extensions/gondolin/package.json +1 -1
  798. package/examples/extensions/handoff.ts +4 -4
  799. package/examples/extensions/hello.ts +2 -2
  800. package/examples/extensions/hidden-thinking-label.ts +1 -1
  801. package/examples/extensions/inline-bash.ts +1 -1
  802. package/examples/extensions/input-transform-streaming.ts +1 -1
  803. package/examples/extensions/input-transform.ts +1 -1
  804. package/examples/extensions/interactive-shell.ts +1 -1
  805. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  806. package/examples/extensions/mac-system-theme.ts +1 -1
  807. package/examples/extensions/message-renderer.ts +2 -2
  808. package/examples/extensions/minimal-mode.ts +3 -3
  809. package/examples/extensions/modal-editor.ts +2 -2
  810. package/examples/extensions/model-status.ts +1 -1
  811. package/examples/extensions/notify.ts +1 -1
  812. package/examples/extensions/overlay-qa-tests.ts +3 -3
  813. package/examples/extensions/overlay-test.ts +2 -2
  814. package/examples/extensions/permission-gate.ts +1 -1
  815. package/examples/extensions/pirate.ts +1 -1
  816. package/examples/extensions/plan-mode/index.ts +4 -4
  817. package/examples/extensions/preset.ts +4 -4
  818. package/examples/extensions/project-trust.ts +1 -1
  819. package/examples/extensions/prompt-customizer.ts +1 -1
  820. package/examples/extensions/protected-paths.ts +1 -1
  821. package/examples/extensions/provider-payload.ts +1 -1
  822. package/examples/extensions/qna.ts +3 -3
  823. package/examples/extensions/question.ts +2 -2
  824. package/examples/extensions/questionnaire.ts +2 -2
  825. package/examples/extensions/rainbow-editor.ts +1 -1
  826. package/examples/extensions/reload-runtime.ts +1 -1
  827. package/examples/extensions/rpc-demo.ts +1 -1
  828. package/examples/extensions/sandbox/index.ts +2 -2
  829. package/examples/extensions/send-user-message.ts +1 -1
  830. package/examples/extensions/session-name.ts +1 -1
  831. package/examples/extensions/shutdown-command.ts +1 -1
  832. package/examples/extensions/snake.ts +2 -2
  833. package/examples/extensions/space-invaders.ts +2 -2
  834. package/examples/extensions/ssh.ts +2 -2
  835. package/examples/extensions/status-line.ts +1 -1
  836. package/examples/extensions/structured-output.ts +2 -2
  837. package/examples/extensions/subagent/agents.ts +1 -1
  838. package/examples/extensions/subagent/index.ts +5 -5
  839. package/examples/extensions/summarize.ts +4 -4
  840. package/examples/extensions/system-prompt-header.ts +1 -1
  841. package/examples/extensions/tic-tac-toe.ts +3 -3
  842. package/examples/extensions/timed-confirm.ts +1 -1
  843. package/examples/extensions/titlebar-spinner.ts +1 -1
  844. package/examples/extensions/todo.ts +3 -3
  845. package/examples/extensions/tool-override.ts +2 -2
  846. package/examples/extensions/tools.ts +3 -3
  847. package/examples/extensions/trigger-compact.ts +1 -1
  848. package/examples/extensions/truncated-tool.ts +3 -3
  849. package/examples/extensions/widget-placement.ts +1 -1
  850. package/examples/extensions/with-deps/index.ts +1 -1
  851. package/examples/extensions/with-deps/package-lock.json +2 -2
  852. package/examples/extensions/with-deps/package.json +1 -1
  853. package/examples/extensions/working-indicator.ts +1 -1
  854. package/examples/extensions/working-message-test.ts +1 -1
  855. package/examples/rpc-extension-ui.ts +1 -1
  856. package/examples/sdk/01-minimal.ts +1 -1
  857. package/examples/sdk/02-custom-model.ts +2 -2
  858. package/examples/sdk/03-custom-prompt.ts +1 -1
  859. package/examples/sdk/04-skills.ts +1 -1
  860. package/examples/sdk/05-tools.ts +1 -1
  861. package/examples/sdk/06-extensions.ts +2 -2
  862. package/examples/sdk/07-context-files.ts +1 -1
  863. package/examples/sdk/08-prompt-templates.ts +1 -1
  864. package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
  865. package/examples/sdk/10-settings.ts +1 -1
  866. package/examples/sdk/11-sessions.ts +1 -1
  867. package/examples/sdk/12-full-control.ts +2 -2
  868. package/examples/sdk/13-session-runtime.ts +1 -1
  869. package/package.json +4 -4
@@ -21,7 +21,7 @@
21
21
  * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts
22
22
  * 3. LSP servers start lazily when you first use a tool on a file
23
23
  */
24
- import { isReadToolResult, isWriteToolResult, isEditToolResult, } from "@earendil-works/pi-coding-agent";
24
+ import { isReadToolResult, isWriteToolResult, isEditToolResult, } from "@ashx-j/lunr";
25
25
  import { DiagnosticSeverity } from "vscode-languageserver-protocol";
26
26
  import { LspManager } from "./lsp-manager.js";
27
27
  import { FileSync } from "./file-sync.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"@earendil-works/pi-coding-agent\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\n\nimport { LspManager, type ServerConfig, type LspManagerCallbacks } from \"./lsp-manager.js\";\nimport { FileSync } from \"./file-sync.js\";\nimport { TreeSitterManager } from \"./tree-sitter/parser-manager.js\";\nimport { WorkspaceIndex } from \"./tree-sitter/workspace-index.js\";\nimport { type WorkspaceProvider, DefaultWorkspaceProvider } from \"./workspace-provider.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n // Prevent EPIPE errors from LSP server exits from crashing the host process.\n // When an LSP server exits unexpectedly, in-flight writes to its stdin pipe\n // can produce EPIPE errors that escape all connection-level error handlers.\n const origListeners = process.listeners(\"uncaughtException\");\n process.on(\"uncaughtException\", (err: any) => {\n if (err?.code === \"EPIPE\") return; // swallow — LSP server exited, harmless\n // Re-throw for other handlers\n for (const listener of origListeners) (listener as any)(err);\n if (origListeners.length === 0) {\n console.error(\"[LSP] Uncaught exception:\", err);\n }\n });\n\n let manager: LspManager | null = null;\n let fileSync: FileSync | null = null;\n let treeSitter: TreeSitterManager | null = null;\n let workspaceIndex: WorkspaceIndex | null = null;\n let pendingProvider: WorkspaceProvider | null = null;\n // Store latest ctx for lifecycle callbacks (updated on each event)\n let latestCtx: any = null;\n // Project config — loaded on session_start, used by auto-injection guard\n let projectConfig: ProjectLspConfig | null = null;\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n // Listen for external workspace providers (e.g. bemol extension).\n // Also check if one was already registered before we loaded (load order varies).\n // Store as pendingProvider so it's available when the manager is created later.\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n if (manager) {\n manager.setWorkspaceProvider(provider);\n }\n // Update status if we have a UI context\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n /** Build lifecycle callbacks that update UI status */\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspManagerCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n // Create manager eagerly so tools can reference it, but servers start lazily\n const getManager = (): LspManager => {\n if (!manager) {\n manager = new LspManager(process.cwd(), undefined, makeCallbacks(), undefined, pendingProvider ?? undefined);\n fileSync = new FileSync(manager);\n fileSync.setSyntheticDotChecker((uri) => syntheticDotLocks.has(uri));\n treeSitter = new TreeSitterManager();\n workspaceIndex = new WorkspaceIndex(process.cwd(), treeSitter);\n fileSync.setTreeSitter(treeSitter, workspaceIndex);\n }\n return manager;\n };\n\n const getFileSync = (): FileSync => {\n if (!fileSync) {\n getManager(); // ensures fileSync is created\n }\n return fileSync!;\n };\n\n const getTreeSitter = (): TreeSitterManager => {\n if (!treeSitter) {\n getManager(); // ensures treeSitter is created\n }\n return treeSitter!;\n };\n\n const getWorkspaceIndex = (): WorkspaceIndex => {\n if (!workspaceIndex) {\n getManager(); // ensures workspaceIndex is created\n }\n return workspaceIndex!;\n };\n\n // Initialize manager (uses cwd at session start time)\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n\n // If manager was already created eagerly (e.g. by a tool before session_start),\n // shut it down so we can re-create with the correct ctx.cwd.\n if (manager) {\n await manager.shutdownAll().catch(() => {});\n if (treeSitter) treeSitter.shutdown();\n }\n\n manager = new LspManager(ctx.cwd, undefined, makeCallbacks(), undefined, pendingProvider ?? undefined);\n fileSync = new FileSync(manager);\n fileSync.setSyntheticDotChecker((uri) => syntheticDotLocks.has(uri));\n treeSitter = new TreeSitterManager();\n workspaceIndex = new WorkspaceIndex(ctx.cwd, treeSitter);\n fileSync.setTreeSitter(treeSitter, workspaceIndex);\n\n // Initialize tree-sitter in the background (don't block session start)\n treeSitter.init().catch((err) => {\n console.error(`[pi-lsp-extension] tree-sitter WASM init failed: ${err?.message ?? err}`);\n });\n\n // Show workspace provider status\n const wsProvider = manager.workspace;\n const statusText = wsProvider.getStatusText();\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n // Load project config and apply settings\n projectConfig = loadProjectConfig(ctx.cwd);\n if (projectConfig) {\n // Apply custom server configs\n if (projectConfig.servers) {\n for (const [lang, serverConf] of Object.entries(projectConfig.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n\n // Set Lombok jar path (explicit path or \"auto\" for auto-detection)\n if (projectConfig.lombokJar) {\n if (projectConfig.lombokJar !== \"auto\") {\n manager.setLombokJar(projectConfig.lombokJar);\n }\n // \"auto\" is the default behavior — findLombokJar() already auto-detects.\n // Setting it explicitly just confirms the user wants Lombok support.\n }\n\n // Auto-start configured languages in the background\n if (projectConfig.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const lombokNote = langs.includes(\"java\") && manager.getLombokJar()\n ? ` (lombok: ${manager.getLombokJar()?.split(\"/\").pop()})` : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n manager.startEagerly(langs);\n }\n }\n });\n\n // Register all LSP tools\n // Tools call getManager() lazily so they work even if session_start hasn't fired\n const managerProxy = new Proxy({} as LspManager, {\n get(_target, prop) {\n return (getManager() as any)[prop];\n },\n });\n\n const treeSitterProxy = new Proxy({} as TreeSitterManager, {\n get(_target, prop) {\n return (getTreeSitter() as any)[prop];\n },\n });\n\n const workspaceIndexProxy = new Proxy({} as WorkspaceIndex, {\n get(_target, prop) {\n return (getWorkspaceIndex() as any)[prop];\n },\n });\n\n pi.registerTool(createDiagnosticsTool(managerProxy, treeSitterProxy));\n pi.registerTool(createHoverTool(managerProxy, treeSitterProxy));\n pi.registerTool(createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createReferencesTool(managerProxy, treeSitterProxy));\n pi.registerTool(createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createRenameTool(managerProxy, treeSitterProxy));\n pi.registerTool(createCodeActionsTool(managerProxy, treeSitterProxy));\n pi.registerTool(createCompletionsTool(managerProxy, {\n getTrackedVersion: (uri) => getFileSync().getTrackedVersion(uri),\n setTrackedVersion: (uri, v) => getFileSync().setTrackedVersion(uri, v),\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n }, treeSitterProxy));\n const getRootDir = () => manager?.resolvePath(\".\") ?? process.cwd();\n pi.registerTool(createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createCodeSearchTool(getRootDir, treeSitterProxy));\n pi.registerTool(createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n getFileSync().handleFileWrite(filePath).catch(() => {});\n },\n }));\n pi.registerTool(createCodeActionsTool(managerProxy, treeSitterProxy));\n\n // File sync: track file reads/writes/edits\n // After writes/edits, append file-scoped error diagnostics to the tool result\n pi.on(\"tool_result\", async (event) => {\n const sync = getFileSync();\n\n try {\n if (isReadToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileRead(path);\n }\n\n if (isWriteToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileWrite(path);\n }\n\n if (isEditToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileWrite(path);\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n // Auto-append diagnostics for the changed file (write/edit only)\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && manager) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n if (!manager) return;\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n if (!manager) {\n ctx.ui.notify(\"LSP manager not initialized\", \"warning\");\n return;\n }\n\n const statuses = manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n if (!manager) {\n ctx.ui.notify(\"LSP manager not initialized\", \"warning\");\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n getManager().setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const mgr = getManager();\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const { existsSync } = await import(\"node:fs\");\n const { resolve } = await import(\"node:path\");\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown (includes workspace provider, all LSP servers, and tree-sitter)\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n if (manager) {\n await manager.shutdownAll();\n manager = null;\n fileSync = null;\n }\n if (treeSitter) {\n treeSitter.shutdown();\n treeSitter = null;\n }\n workspaceIndex = null;\n });\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"@ashx-j/lunr\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\n\nimport { LspManager, type ServerConfig, type LspManagerCallbacks } from \"./lsp-manager.js\";\nimport { FileSync } from \"./file-sync.js\";\nimport { TreeSitterManager } from \"./tree-sitter/parser-manager.js\";\nimport { WorkspaceIndex } from \"./tree-sitter/workspace-index.js\";\nimport { type WorkspaceProvider, DefaultWorkspaceProvider } from \"./workspace-provider.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n // Prevent EPIPE errors from LSP server exits from crashing the host process.\n // When an LSP server exits unexpectedly, in-flight writes to its stdin pipe\n // can produce EPIPE errors that escape all connection-level error handlers.\n const origListeners = process.listeners(\"uncaughtException\");\n process.on(\"uncaughtException\", (err: any) => {\n if (err?.code === \"EPIPE\") return; // swallow — LSP server exited, harmless\n // Re-throw for other handlers\n for (const listener of origListeners) (listener as any)(err);\n if (origListeners.length === 0) {\n console.error(\"[LSP] Uncaught exception:\", err);\n }\n });\n\n let manager: LspManager | null = null;\n let fileSync: FileSync | null = null;\n let treeSitter: TreeSitterManager | null = null;\n let workspaceIndex: WorkspaceIndex | null = null;\n let pendingProvider: WorkspaceProvider | null = null;\n // Store latest ctx for lifecycle callbacks (updated on each event)\n let latestCtx: any = null;\n // Project config — loaded on session_start, used by auto-injection guard\n let projectConfig: ProjectLspConfig | null = null;\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n // Listen for external workspace providers (e.g. bemol extension).\n // Also check if one was already registered before we loaded (load order varies).\n // Store as pendingProvider so it's available when the manager is created later.\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n if (manager) {\n manager.setWorkspaceProvider(provider);\n }\n // Update status if we have a UI context\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n /** Build lifecycle callbacks that update UI status */\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspManagerCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n // Create manager eagerly so tools can reference it, but servers start lazily\n const getManager = (): LspManager => {\n if (!manager) {\n manager = new LspManager(process.cwd(), undefined, makeCallbacks(), undefined, pendingProvider ?? undefined);\n fileSync = new FileSync(manager);\n fileSync.setSyntheticDotChecker((uri) => syntheticDotLocks.has(uri));\n treeSitter = new TreeSitterManager();\n workspaceIndex = new WorkspaceIndex(process.cwd(), treeSitter);\n fileSync.setTreeSitter(treeSitter, workspaceIndex);\n }\n return manager;\n };\n\n const getFileSync = (): FileSync => {\n if (!fileSync) {\n getManager(); // ensures fileSync is created\n }\n return fileSync!;\n };\n\n const getTreeSitter = (): TreeSitterManager => {\n if (!treeSitter) {\n getManager(); // ensures treeSitter is created\n }\n return treeSitter!;\n };\n\n const getWorkspaceIndex = (): WorkspaceIndex => {\n if (!workspaceIndex) {\n getManager(); // ensures workspaceIndex is created\n }\n return workspaceIndex!;\n };\n\n // Initialize manager (uses cwd at session start time)\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n\n // If manager was already created eagerly (e.g. by a tool before session_start),\n // shut it down so we can re-create with the correct ctx.cwd.\n if (manager) {\n await manager.shutdownAll().catch(() => {});\n if (treeSitter) treeSitter.shutdown();\n }\n\n manager = new LspManager(ctx.cwd, undefined, makeCallbacks(), undefined, pendingProvider ?? undefined);\n fileSync = new FileSync(manager);\n fileSync.setSyntheticDotChecker((uri) => syntheticDotLocks.has(uri));\n treeSitter = new TreeSitterManager();\n workspaceIndex = new WorkspaceIndex(ctx.cwd, treeSitter);\n fileSync.setTreeSitter(treeSitter, workspaceIndex);\n\n // Initialize tree-sitter in the background (don't block session start)\n treeSitter.init().catch((err) => {\n console.error(`[pi-lsp-extension] tree-sitter WASM init failed: ${err?.message ?? err}`);\n });\n\n // Show workspace provider status\n const wsProvider = manager.workspace;\n const statusText = wsProvider.getStatusText();\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n // Load project config and apply settings\n projectConfig = loadProjectConfig(ctx.cwd);\n if (projectConfig) {\n // Apply custom server configs\n if (projectConfig.servers) {\n for (const [lang, serverConf] of Object.entries(projectConfig.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n\n // Set Lombok jar path (explicit path or \"auto\" for auto-detection)\n if (projectConfig.lombokJar) {\n if (projectConfig.lombokJar !== \"auto\") {\n manager.setLombokJar(projectConfig.lombokJar);\n }\n // \"auto\" is the default behavior — findLombokJar() already auto-detects.\n // Setting it explicitly just confirms the user wants Lombok support.\n }\n\n // Auto-start configured languages in the background\n if (projectConfig.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const lombokNote = langs.includes(\"java\") && manager.getLombokJar()\n ? ` (lombok: ${manager.getLombokJar()?.split(\"/\").pop()})` : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n manager.startEagerly(langs);\n }\n }\n });\n\n // Register all LSP tools\n // Tools call getManager() lazily so they work even if session_start hasn't fired\n const managerProxy = new Proxy({} as LspManager, {\n get(_target, prop) {\n return (getManager() as any)[prop];\n },\n });\n\n const treeSitterProxy = new Proxy({} as TreeSitterManager, {\n get(_target, prop) {\n return (getTreeSitter() as any)[prop];\n },\n });\n\n const workspaceIndexProxy = new Proxy({} as WorkspaceIndex, {\n get(_target, prop) {\n return (getWorkspaceIndex() as any)[prop];\n },\n });\n\n pi.registerTool(createDiagnosticsTool(managerProxy, treeSitterProxy));\n pi.registerTool(createHoverTool(managerProxy, treeSitterProxy));\n pi.registerTool(createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createReferencesTool(managerProxy, treeSitterProxy));\n pi.registerTool(createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createRenameTool(managerProxy, treeSitterProxy));\n pi.registerTool(createCodeActionsTool(managerProxy, treeSitterProxy));\n pi.registerTool(createCompletionsTool(managerProxy, {\n getTrackedVersion: (uri) => getFileSync().getTrackedVersion(uri),\n setTrackedVersion: (uri, v) => getFileSync().setTrackedVersion(uri, v),\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n }, treeSitterProxy));\n const getRootDir = () => manager?.resolvePath(\".\") ?? process.cwd();\n pi.registerTool(createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy));\n pi.registerTool(createCodeSearchTool(getRootDir, treeSitterProxy));\n pi.registerTool(createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n getFileSync().handleFileWrite(filePath).catch(() => {});\n },\n }));\n pi.registerTool(createCodeActionsTool(managerProxy, treeSitterProxy));\n\n // File sync: track file reads/writes/edits\n // After writes/edits, append file-scoped error diagnostics to the tool result\n pi.on(\"tool_result\", async (event) => {\n const sync = getFileSync();\n\n try {\n if (isReadToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileRead(path);\n }\n\n if (isWriteToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileWrite(path);\n }\n\n if (isEditToolResult(event) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) await sync.handleFileWrite(path);\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n // Auto-append diagnostics for the changed file (write/edit only)\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && manager) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n if (!manager) return;\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n if (!manager) {\n ctx.ui.notify(\"LSP manager not initialized\", \"warning\");\n return;\n }\n\n const statuses = manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n if (!manager) {\n ctx.ui.notify(\"LSP manager not initialized\", \"warning\");\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n getManager().setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const mgr = getManager();\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const { existsSync } = await import(\"node:fs\");\n const { resolve } = await import(\"node:path\");\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown (includes workspace provider, all LSP servers, and tree-sitter)\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n if (manager) {\n await manager.shutdownAll();\n manager = null;\n fileSync = null;\n }\n if (treeSitter) {\n treeSitter.shutdown();\n treeSitter = null;\n }\n workspaceIndex = null;\n });\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.
3
3
  */
4
4
  import { Type } from "@sinclair/typebox";
5
- import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
5
+ import type { ToolDefinition } from "@ashx-j/lunr";
6
6
  import type { LspManager } from "../lsp-manager.js";
7
7
  import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
8
8
  declare const CodeActionsParams: Type.TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"code-actions.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-actions.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAO1E,QAAA,MAAM,iBAAiB;;;;;;;;EAQrB,CAAC;AAEH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAyED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CA4K9D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CodeAction,\n Command,\n Diagnostic,\n TextEdit,\n WorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { relative } from \"node:path\";\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\nconst CodeActionsParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n endLine: Type.Optional(Type.Number({ description: \"End line for range selection (1-indexed). Defaults to line.\" })),\n endCharacter: Type.Optional(Type.Number({ description: \"End column for range selection (1-indexed). Defaults to character.\" })),\n kind: Type.Optional(Type.String({ description: 'Filter by action kind (e.g., \"quickfix\", \"refactor\", \"source\")' })),\n});\n\ninterface CodeActionsDetails {\n count: number;\n preferredCount: number;\n}\n\n/** Check if a range contains a position (all 0-indexed) */\nfunction rangeContainsPosition(\n range: { start: { line: number; character: number }; end: { line: number; character: number } },\n line: number,\n character: number,\n): boolean {\n if (line < range.start.line || line > range.end.line) return false;\n if (line === range.start.line && character < range.start.character) return false;\n if (line === range.end.line && character > range.end.character) return false;\n return true;\n}\n\n/** Format a workspace edit's changes into readable lines */\nfunction formatEditSummary(edit: WorkspaceEdit, rootDir: string): string[] {\n const lines: string[] = [];\n\n if (edit.documentChanges) {\n for (const change of edit.documentChanges) {\n if (\"textDocument\" in change && \"edits\" in change) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(change.textDocument.uri)); } catch { relPath = change.textDocument.uri; }\n for (const textEdit of (change.edits as TextEdit[]).slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = (change.edits as TextEdit[]).length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n }\n }\n\n const changes = edit.changes ?? {};\n for (const [uri, edits] of Object.entries(changes)) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(uri)); } catch { relPath = uri; }\n for (const textEdit of edits.slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = edits.length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n\n return lines;\n}\n\n/** Check if a response item is a CodeAction (vs a Command) */\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n return \"kind\" in item || \"edit\" in item || \"diagnostics\" in item || \"isPreferred\" in item;\n}\n\nexport function createCodeActionsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CodeActionsParams, CodeActionsDetails> {\n return {\n name: \"lsp_code_actions\",\n label: \"LSP Code Actions\",\n description: \"Get available code actions (quick fixes, refactorings, source actions) at a position or range. Returns actionable fixes the LSP server can suggest — auto-imports, remove unused, extract method, etc.\",\n promptSnippet: \"Get available code actions (quick fixes, refactorings) at a file position via LSP. Use after lsp_diagnostics shows errors to find auto-fixes.\",\n parameters: CodeActionsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line;\n character = resolved.character;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n const names = await getSymbolNames(filePath, manager, treeSitter);\n const hint = names.length > 0 ? `\\nAvailable symbols: ${names.slice(0, 20).join(\", \")}` : \"\";\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}${hint}` }], details: { count: 0, preferredCount: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, preferredCount: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Check if server supports code actions\n const caps = client.serverCapabilities;\n if (caps && !caps.codeActionProvider) {\n return {\n content: [{ type: \"text\", text: \"LSP server for this file does not support code actions.\" }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const startLine = line - 1;\n const startChar = character - 1;\n const endLine = (params.endLine ?? line) - 1;\n const endChar = (params.endCharacter ?? character) - 1;\n\n // Collect diagnostics that overlap with the requested range\n const allDiags = client.getDiagnostics(uri) ?? [];\n const rangeDiags = allDiags.filter((d: Diagnostic) =>\n rangeContainsPosition(d.range, startLine, startChar) ||\n rangeContainsPosition({ start: { line: startLine, character: startChar }, end: { line: endLine, character: endChar } }, d.range.start.line, d.range.start.character)\n );\n\n try {\n const response = await client.sendRequest<CodeActionResponse>(\"textDocument/codeAction\", {\n textDocument: { uri },\n range: {\n start: { line: startLine, character: startChar },\n end: { line: endLine, character: endChar },\n },\n context: {\n diagnostics: rangeDiags,\n only: params.kind ? [params.kind] : undefined,\n },\n });\n\n if (!response || response.length === 0) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo code actions available at this position.`\n : \"No code actions available at this position.\";\n return { content: [{ type: \"text\", text }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Separate CodeActions from Commands, sort: preferred first, then by kind\n const actions: CodeAction[] = [];\n const commands: Command[] = [];\n\n for (const item of response) {\n if (isCodeAction(item)) {\n actions.push(item);\n } else {\n commands.push(item);\n }\n }\n\n // Sort: preferred first, then quickfix > refactor > source > other\n const kindOrder: Record<string, number> = { quickfix: 0, refactor: 1, source: 2 };\n actions.sort((a, b) => {\n if (a.isPreferred && !b.isPreferred) return -1;\n if (!a.isPreferred && b.isPreferred) return 1;\n const aKind = a.kind?.split(\".\")[0] ?? \"zzz\";\n const bKind = b.kind?.split(\".\")[0] ?? \"zzz\";\n return (kindOrder[aKind] ?? 3) - (kindOrder[bKind] ?? 3);\n });\n\n const rootDir = manager.resolvePath(\".\");\n const outputLines: string[] = [];\n let preferredCount = 0;\n\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const preferred = action.isPreferred ? \"★ \" : \"\";\n if (action.isPreferred) preferredCount++;\n const kindStr = action.kind ? ` [${action.kind}]` : \"\";\n outputLines.push(` ${i + 1}. ${preferred}${action.title}${kindStr}`);\n\n if (action.edit) {\n const editLines = formatEditSummary(action.edit, rootDir);\n outputLines.push(...editLines);\n } else if (action.command && !action.edit) {\n outputLines.push(` (command: ${action.command.title || action.command.command})`);\n } else {\n outputLines.push(\" (resolve required)\");\n }\n }\n\n // Append plain commands at the end\n for (const cmd of commands) {\n outputLines.push(` • ${cmd.title} (command-only, requires IDE execution)`);\n }\n\n const totalCount = actions.length + commands.length;\n const header = `${totalCount} code action(s) at ${filePath}:${line}:${character}`;\n const preferredNote = preferredCount > 0 ? ` (${preferredCount} preferred)` : \"\";\n\n let text = `${header}${preferredNote}\\n\\n${outputLines.join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: totalCount, preferredCount },\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `LSP code action request failed: ${err.message}` }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", args.path);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else if (args.endLine) {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}-${args.endLine}:${args.endCharacter}`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n if (args.kind) {\n text += theme.fg(\"dim\", ` [${args.kind}]`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Loading...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"dim\", \"No code actions available\"), 0, 0);\n }\n const preferred = details.preferredCount > 0 ? ` (${details.preferredCount} preferred)` : \"\";\n return new Text(theme.fg(\"success\", `${details.count} action(s)${preferred}`), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"code-actions.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-actions.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAO1E,QAAA,MAAM,iBAAiB;;;;;;;;EAQrB,CAAC;AAEH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAyED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CA4K9D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CodeAction,\n Command,\n Diagnostic,\n TextEdit,\n WorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { Text } from \"@ashx-j/lunr-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { relative } from \"node:path\";\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\nconst CodeActionsParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n endLine: Type.Optional(Type.Number({ description: \"End line for range selection (1-indexed). Defaults to line.\" })),\n endCharacter: Type.Optional(Type.Number({ description: \"End column for range selection (1-indexed). Defaults to character.\" })),\n kind: Type.Optional(Type.String({ description: 'Filter by action kind (e.g., \"quickfix\", \"refactor\", \"source\")' })),\n});\n\ninterface CodeActionsDetails {\n count: number;\n preferredCount: number;\n}\n\n/** Check if a range contains a position (all 0-indexed) */\nfunction rangeContainsPosition(\n range: { start: { line: number; character: number }; end: { line: number; character: number } },\n line: number,\n character: number,\n): boolean {\n if (line < range.start.line || line > range.end.line) return false;\n if (line === range.start.line && character < range.start.character) return false;\n if (line === range.end.line && character > range.end.character) return false;\n return true;\n}\n\n/** Format a workspace edit's changes into readable lines */\nfunction formatEditSummary(edit: WorkspaceEdit, rootDir: string): string[] {\n const lines: string[] = [];\n\n if (edit.documentChanges) {\n for (const change of edit.documentChanges) {\n if (\"textDocument\" in change && \"edits\" in change) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(change.textDocument.uri)); } catch { relPath = change.textDocument.uri; }\n for (const textEdit of (change.edits as TextEdit[]).slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = (change.edits as TextEdit[]).length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n }\n }\n\n const changes = edit.changes ?? {};\n for (const [uri, edits] of Object.entries(changes)) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(uri)); } catch { relPath = uri; }\n for (const textEdit of edits.slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = edits.length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n\n return lines;\n}\n\n/** Check if a response item is a CodeAction (vs a Command) */\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n return \"kind\" in item || \"edit\" in item || \"diagnostics\" in item || \"isPreferred\" in item;\n}\n\nexport function createCodeActionsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CodeActionsParams, CodeActionsDetails> {\n return {\n name: \"lsp_code_actions\",\n label: \"LSP Code Actions\",\n description: \"Get available code actions (quick fixes, refactorings, source actions) at a position or range. Returns actionable fixes the LSP server can suggest — auto-imports, remove unused, extract method, etc.\",\n promptSnippet: \"Get available code actions (quick fixes, refactorings) at a file position via LSP. Use after lsp_diagnostics shows errors to find auto-fixes.\",\n parameters: CodeActionsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line;\n character = resolved.character;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n const names = await getSymbolNames(filePath, manager, treeSitter);\n const hint = names.length > 0 ? `\\nAvailable symbols: ${names.slice(0, 20).join(\", \")}` : \"\";\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}${hint}` }], details: { count: 0, preferredCount: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, preferredCount: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Check if server supports code actions\n const caps = client.serverCapabilities;\n if (caps && !caps.codeActionProvider) {\n return {\n content: [{ type: \"text\", text: \"LSP server for this file does not support code actions.\" }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const startLine = line - 1;\n const startChar = character - 1;\n const endLine = (params.endLine ?? line) - 1;\n const endChar = (params.endCharacter ?? character) - 1;\n\n // Collect diagnostics that overlap with the requested range\n const allDiags = client.getDiagnostics(uri) ?? [];\n const rangeDiags = allDiags.filter((d: Diagnostic) =>\n rangeContainsPosition(d.range, startLine, startChar) ||\n rangeContainsPosition({ start: { line: startLine, character: startChar }, end: { line: endLine, character: endChar } }, d.range.start.line, d.range.start.character)\n );\n\n try {\n const response = await client.sendRequest<CodeActionResponse>(\"textDocument/codeAction\", {\n textDocument: { uri },\n range: {\n start: { line: startLine, character: startChar },\n end: { line: endLine, character: endChar },\n },\n context: {\n diagnostics: rangeDiags,\n only: params.kind ? [params.kind] : undefined,\n },\n });\n\n if (!response || response.length === 0) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo code actions available at this position.`\n : \"No code actions available at this position.\";\n return { content: [{ type: \"text\", text }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Separate CodeActions from Commands, sort: preferred first, then by kind\n const actions: CodeAction[] = [];\n const commands: Command[] = [];\n\n for (const item of response) {\n if (isCodeAction(item)) {\n actions.push(item);\n } else {\n commands.push(item);\n }\n }\n\n // Sort: preferred first, then quickfix > refactor > source > other\n const kindOrder: Record<string, number> = { quickfix: 0, refactor: 1, source: 2 };\n actions.sort((a, b) => {\n if (a.isPreferred && !b.isPreferred) return -1;\n if (!a.isPreferred && b.isPreferred) return 1;\n const aKind = a.kind?.split(\".\")[0] ?? \"zzz\";\n const bKind = b.kind?.split(\".\")[0] ?? \"zzz\";\n return (kindOrder[aKind] ?? 3) - (kindOrder[bKind] ?? 3);\n });\n\n const rootDir = manager.resolvePath(\".\");\n const outputLines: string[] = [];\n let preferredCount = 0;\n\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const preferred = action.isPreferred ? \"★ \" : \"\";\n if (action.isPreferred) preferredCount++;\n const kindStr = action.kind ? ` [${action.kind}]` : \"\";\n outputLines.push(` ${i + 1}. ${preferred}${action.title}${kindStr}`);\n\n if (action.edit) {\n const editLines = formatEditSummary(action.edit, rootDir);\n outputLines.push(...editLines);\n } else if (action.command && !action.edit) {\n outputLines.push(` (command: ${action.command.title || action.command.command})`);\n } else {\n outputLines.push(\" (resolve required)\");\n }\n }\n\n // Append plain commands at the end\n for (const cmd of commands) {\n outputLines.push(` • ${cmd.title} (command-only, requires IDE execution)`);\n }\n\n const totalCount = actions.length + commands.length;\n const header = `${totalCount} code action(s) at ${filePath}:${line}:${character}`;\n const preferredNote = preferredCount > 0 ? ` (${preferredCount} preferred)` : \"\";\n\n let text = `${header}${preferredNote}\\n\\n${outputLines.join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: totalCount, preferredCount },\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `LSP code action request failed: ${err.message}` }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", args.path);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else if (args.endLine) {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}-${args.endLine}:${args.endCharacter}`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n if (args.kind) {\n text += theme.fg(\"dim\", ` [${args.kind}]`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Loading...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"dim\", \"No code actions available\"), 0, 0);\n }\n const preferred = details.preferredCount > 0 ? ` (${details.preferredCount} preferred)` : \"\";\n return new Text(theme.fg(\"success\", `${details.count} action(s)${preferred}`), 0, 0);\n },\n };\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.
4
4
  */
5
5
  import { Type } from "@sinclair/typebox";
6
- import { Text } from "@earendil-works/pi-tui";
6
+ import { Text } from "@ashx-j/lunr-tui";
7
7
  import { resolveSymbolPosition, getSymbolNames } from "../shared/resolve-position.js";
8
8
  import { fileURLToPath } from "node:url";
9
9
  import { relative } from "node:path";
@@ -1 +1 @@
1
- {"version":3,"file":"code-actions.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CodeAction,\n Command,\n Diagnostic,\n TextEdit,\n WorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { relative } from \"node:path\";\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\nconst CodeActionsParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n endLine: Type.Optional(Type.Number({ description: \"End line for range selection (1-indexed). Defaults to line.\" })),\n endCharacter: Type.Optional(Type.Number({ description: \"End column for range selection (1-indexed). Defaults to character.\" })),\n kind: Type.Optional(Type.String({ description: 'Filter by action kind (e.g., \"quickfix\", \"refactor\", \"source\")' })),\n});\n\ninterface CodeActionsDetails {\n count: number;\n preferredCount: number;\n}\n\n/** Check if a range contains a position (all 0-indexed) */\nfunction rangeContainsPosition(\n range: { start: { line: number; character: number }; end: { line: number; character: number } },\n line: number,\n character: number,\n): boolean {\n if (line < range.start.line || line > range.end.line) return false;\n if (line === range.start.line && character < range.start.character) return false;\n if (line === range.end.line && character > range.end.character) return false;\n return true;\n}\n\n/** Format a workspace edit's changes into readable lines */\nfunction formatEditSummary(edit: WorkspaceEdit, rootDir: string): string[] {\n const lines: string[] = [];\n\n if (edit.documentChanges) {\n for (const change of edit.documentChanges) {\n if (\"textDocument\" in change && \"edits\" in change) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(change.textDocument.uri)); } catch { relPath = change.textDocument.uri; }\n for (const textEdit of (change.edits as TextEdit[]).slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = (change.edits as TextEdit[]).length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n }\n }\n\n const changes = edit.changes ?? {};\n for (const [uri, edits] of Object.entries(changes)) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(uri)); } catch { relPath = uri; }\n for (const textEdit of edits.slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = edits.length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n\n return lines;\n}\n\n/** Check if a response item is a CodeAction (vs a Command) */\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n return \"kind\" in item || \"edit\" in item || \"diagnostics\" in item || \"isPreferred\" in item;\n}\n\nexport function createCodeActionsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CodeActionsParams, CodeActionsDetails> {\n return {\n name: \"lsp_code_actions\",\n label: \"LSP Code Actions\",\n description: \"Get available code actions (quick fixes, refactorings, source actions) at a position or range. Returns actionable fixes the LSP server can suggest — auto-imports, remove unused, extract method, etc.\",\n promptSnippet: \"Get available code actions (quick fixes, refactorings) at a file position via LSP. Use after lsp_diagnostics shows errors to find auto-fixes.\",\n parameters: CodeActionsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line;\n character = resolved.character;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n const names = await getSymbolNames(filePath, manager, treeSitter);\n const hint = names.length > 0 ? `\\nAvailable symbols: ${names.slice(0, 20).join(\", \")}` : \"\";\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}${hint}` }], details: { count: 0, preferredCount: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, preferredCount: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Check if server supports code actions\n const caps = client.serverCapabilities;\n if (caps && !caps.codeActionProvider) {\n return {\n content: [{ type: \"text\", text: \"LSP server for this file does not support code actions.\" }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const startLine = line - 1;\n const startChar = character - 1;\n const endLine = (params.endLine ?? line) - 1;\n const endChar = (params.endCharacter ?? character) - 1;\n\n // Collect diagnostics that overlap with the requested range\n const allDiags = client.getDiagnostics(uri) ?? [];\n const rangeDiags = allDiags.filter((d: Diagnostic) =>\n rangeContainsPosition(d.range, startLine, startChar) ||\n rangeContainsPosition({ start: { line: startLine, character: startChar }, end: { line: endLine, character: endChar } }, d.range.start.line, d.range.start.character)\n );\n\n try {\n const response = await client.sendRequest<CodeActionResponse>(\"textDocument/codeAction\", {\n textDocument: { uri },\n range: {\n start: { line: startLine, character: startChar },\n end: { line: endLine, character: endChar },\n },\n context: {\n diagnostics: rangeDiags,\n only: params.kind ? [params.kind] : undefined,\n },\n });\n\n if (!response || response.length === 0) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo code actions available at this position.`\n : \"No code actions available at this position.\";\n return { content: [{ type: \"text\", text }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Separate CodeActions from Commands, sort: preferred first, then by kind\n const actions: CodeAction[] = [];\n const commands: Command[] = [];\n\n for (const item of response) {\n if (isCodeAction(item)) {\n actions.push(item);\n } else {\n commands.push(item);\n }\n }\n\n // Sort: preferred first, then quickfix > refactor > source > other\n const kindOrder: Record<string, number> = { quickfix: 0, refactor: 1, source: 2 };\n actions.sort((a, b) => {\n if (a.isPreferred && !b.isPreferred) return -1;\n if (!a.isPreferred && b.isPreferred) return 1;\n const aKind = a.kind?.split(\".\")[0] ?? \"zzz\";\n const bKind = b.kind?.split(\".\")[0] ?? \"zzz\";\n return (kindOrder[aKind] ?? 3) - (kindOrder[bKind] ?? 3);\n });\n\n const rootDir = manager.resolvePath(\".\");\n const outputLines: string[] = [];\n let preferredCount = 0;\n\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const preferred = action.isPreferred ? \"★ \" : \"\";\n if (action.isPreferred) preferredCount++;\n const kindStr = action.kind ? ` [${action.kind}]` : \"\";\n outputLines.push(` ${i + 1}. ${preferred}${action.title}${kindStr}`);\n\n if (action.edit) {\n const editLines = formatEditSummary(action.edit, rootDir);\n outputLines.push(...editLines);\n } else if (action.command && !action.edit) {\n outputLines.push(` (command: ${action.command.title || action.command.command})`);\n } else {\n outputLines.push(\" (resolve required)\");\n }\n }\n\n // Append plain commands at the end\n for (const cmd of commands) {\n outputLines.push(` • ${cmd.title} (command-only, requires IDE execution)`);\n }\n\n const totalCount = actions.length + commands.length;\n const header = `${totalCount} code action(s) at ${filePath}:${line}:${character}`;\n const preferredNote = preferredCount > 0 ? ` (${preferredCount} preferred)` : \"\";\n\n let text = `${header}${preferredNote}\\n\\n${outputLines.join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: totalCount, preferredCount },\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `LSP code action request failed: ${err.message}` }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", args.path);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else if (args.endLine) {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}-${args.endLine}:${args.endCharacter}`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n if (args.kind) {\n text += theme.fg(\"dim\", ` [${args.kind}]`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Loading...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"dim\", \"No code actions available\"), 0, 0);\n }\n const preferred = details.preferredCount > 0 ? ` (${details.preferredCount} preferred)` : \"\";\n return new Text(theme.fg(\"success\", `${details.count} action(s)${preferred}`), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"code-actions.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_code_actions — Get available code actions (quick fixes, refactorings) at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CodeAction,\n Command,\n Diagnostic,\n TextEdit,\n WorkspaceEdit,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { Text } from \"@ashx-j/lunr-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { relative } from \"node:path\";\n\ntype CodeActionResponse = (CodeAction | Command)[] | null;\n\nconst CodeActionsParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n endLine: Type.Optional(Type.Number({ description: \"End line for range selection (1-indexed). Defaults to line.\" })),\n endCharacter: Type.Optional(Type.Number({ description: \"End column for range selection (1-indexed). Defaults to character.\" })),\n kind: Type.Optional(Type.String({ description: 'Filter by action kind (e.g., \"quickfix\", \"refactor\", \"source\")' })),\n});\n\ninterface CodeActionsDetails {\n count: number;\n preferredCount: number;\n}\n\n/** Check if a range contains a position (all 0-indexed) */\nfunction rangeContainsPosition(\n range: { start: { line: number; character: number }; end: { line: number; character: number } },\n line: number,\n character: number,\n): boolean {\n if (line < range.start.line || line > range.end.line) return false;\n if (line === range.start.line && character < range.start.character) return false;\n if (line === range.end.line && character > range.end.character) return false;\n return true;\n}\n\n/** Format a workspace edit's changes into readable lines */\nfunction formatEditSummary(edit: WorkspaceEdit, rootDir: string): string[] {\n const lines: string[] = [];\n\n if (edit.documentChanges) {\n for (const change of edit.documentChanges) {\n if (\"textDocument\" in change && \"edits\" in change) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(change.textDocument.uri)); } catch { relPath = change.textDocument.uri; }\n for (const textEdit of (change.edits as TextEdit[]).slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = (change.edits as TextEdit[]).length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n }\n }\n\n const changes = edit.changes ?? {};\n for (const [uri, edits] of Object.entries(changes)) {\n let relPath: string;\n try { relPath = relative(rootDir, fileURLToPath(uri)); } catch { relPath = uri; }\n for (const textEdit of edits.slice(0, 5)) {\n const ln = textEdit.range.start.line + 1;\n const col = textEdit.range.start.character + 1;\n const endLn = textEdit.range.end.line + 1;\n const endCol = textEdit.range.end.character + 1;\n const newText = textEdit.newText.length > 60\n ? textEdit.newText.slice(0, 57) + \"...\"\n : textEdit.newText;\n if (textEdit.range.start.line === textEdit.range.end.line && textEdit.range.start.character === textEdit.range.end.character) {\n lines.push(` ${relPath}:${ln}:${col} insert \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n } else {\n lines.push(` ${relPath}:${ln}:${col}-${endLn}:${endCol} → \"${newText.replace(/\\n/g, \"\\\\n\")}\"`);\n }\n }\n const remaining = edits.length - 5;\n if (remaining > 0) lines.push(` ... and ${remaining} more edits in ${relPath}`);\n }\n\n return lines;\n}\n\n/** Check if a response item is a CodeAction (vs a Command) */\nfunction isCodeAction(item: CodeAction | Command): item is CodeAction {\n return \"kind\" in item || \"edit\" in item || \"diagnostics\" in item || \"isPreferred\" in item;\n}\n\nexport function createCodeActionsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CodeActionsParams, CodeActionsDetails> {\n return {\n name: \"lsp_code_actions\",\n label: \"LSP Code Actions\",\n description: \"Get available code actions (quick fixes, refactorings, source actions) at a position or range. Returns actionable fixes the LSP server can suggest — auto-imports, remove unused, extract method, etc.\",\n promptSnippet: \"Get available code actions (quick fixes, refactorings) at a file position via LSP. Use after lsp_diagnostics shows errors to find auto-fixes.\",\n parameters: CodeActionsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line;\n character = resolved.character;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n const names = await getSymbolNames(filePath, manager, treeSitter);\n const hint = names.length > 0 ? `\\nAvailable symbols: ${names.slice(0, 20).join(\", \")}` : \"\";\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}${hint}` }], details: { count: 0, preferredCount: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, preferredCount: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Check if server supports code actions\n const caps = client.serverCapabilities;\n if (caps && !caps.codeActionProvider) {\n return {\n content: [{ type: \"text\", text: \"LSP server for this file does not support code actions.\" }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const startLine = line - 1;\n const startChar = character - 1;\n const endLine = (params.endLine ?? line) - 1;\n const endChar = (params.endCharacter ?? character) - 1;\n\n // Collect diagnostics that overlap with the requested range\n const allDiags = client.getDiagnostics(uri) ?? [];\n const rangeDiags = allDiags.filter((d: Diagnostic) =>\n rangeContainsPosition(d.range, startLine, startChar) ||\n rangeContainsPosition({ start: { line: startLine, character: startChar }, end: { line: endLine, character: endChar } }, d.range.start.line, d.range.start.character)\n );\n\n try {\n const response = await client.sendRequest<CodeActionResponse>(\"textDocument/codeAction\", {\n textDocument: { uri },\n range: {\n start: { line: startLine, character: startChar },\n end: { line: endLine, character: endChar },\n },\n context: {\n diagnostics: rangeDiags,\n only: params.kind ? [params.kind] : undefined,\n },\n });\n\n if (!response || response.length === 0) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo code actions available at this position.`\n : \"No code actions available at this position.\";\n return { content: [{ type: \"text\", text }], details: { count: 0, preferredCount: 0 } };\n }\n\n // Separate CodeActions from Commands, sort: preferred first, then by kind\n const actions: CodeAction[] = [];\n const commands: Command[] = [];\n\n for (const item of response) {\n if (isCodeAction(item)) {\n actions.push(item);\n } else {\n commands.push(item);\n }\n }\n\n // Sort: preferred first, then quickfix > refactor > source > other\n const kindOrder: Record<string, number> = { quickfix: 0, refactor: 1, source: 2 };\n actions.sort((a, b) => {\n if (a.isPreferred && !b.isPreferred) return -1;\n if (!a.isPreferred && b.isPreferred) return 1;\n const aKind = a.kind?.split(\".\")[0] ?? \"zzz\";\n const bKind = b.kind?.split(\".\")[0] ?? \"zzz\";\n return (kindOrder[aKind] ?? 3) - (kindOrder[bKind] ?? 3);\n });\n\n const rootDir = manager.resolvePath(\".\");\n const outputLines: string[] = [];\n let preferredCount = 0;\n\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const preferred = action.isPreferred ? \"★ \" : \"\";\n if (action.isPreferred) preferredCount++;\n const kindStr = action.kind ? ` [${action.kind}]` : \"\";\n outputLines.push(` ${i + 1}. ${preferred}${action.title}${kindStr}`);\n\n if (action.edit) {\n const editLines = formatEditSummary(action.edit, rootDir);\n outputLines.push(...editLines);\n } else if (action.command && !action.edit) {\n outputLines.push(` (command: ${action.command.title || action.command.command})`);\n } else {\n outputLines.push(\" (resolve required)\");\n }\n }\n\n // Append plain commands at the end\n for (const cmd of commands) {\n outputLines.push(` • ${cmd.title} (command-only, requires IDE execution)`);\n }\n\n const totalCount = actions.length + commands.length;\n const header = `${totalCount} code action(s) at ${filePath}:${line}:${character}`;\n const preferredNote = preferredCount > 0 ? ` (${preferredCount} preferred)` : \"\";\n\n let text = `${header}${preferredNote}\\n\\n${outputLines.join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: totalCount, preferredCount },\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `LSP code action request failed: ${err.message}` }],\n details: { count: 0, preferredCount: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_code_actions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", args.path);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else if (args.endLine) {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}-${args.endLine}:${args.endCharacter}`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n if (args.kind) {\n text += theme.fg(\"dim\", ` [${args.kind}]`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Loading...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"dim\", \"No code actions available\"), 0, 0);\n }\n const preferred = details.preferredCount > 0 ? ` (${details.preferredCount} preferred)` : \"\";\n return new Text(theme.fg(\"success\", `${details.count} action(s)${preferred}`), 0, 0);\n },\n };\n}\n"]}
@@ -7,7 +7,7 @@
7
7
  * - Dependency manifests
8
8
  */
9
9
  import { Type } from "@sinclair/typebox";
10
- import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
10
+ import type { ToolDefinition } from "@ashx-j/lunr";
11
11
  import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
12
12
  import type { WorkspaceIndex } from "../tree-sitter/workspace-index.js";
13
13
  declare const OverviewParams: Type.TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"code-overview.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-overview.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA0BxE,QAAA,MAAM,cAAc;;;EAGlB,CAAC;AAEH,UAAU,eAAe;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAE5D,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,cAAc,EAAE,cAAc,GAC7B,cAAc,CAAC,OAAO,cAAc,EAAE,eAAe,CAAC,CA2GxD","sourcesContent":["// @ts-nocheck\n/**\n * code_overview — Summarize project structure, key files, and symbols.\n *\n * Uses tree-sitter for symbol extraction. Shows:\n * - Directory tree (respecting .gitignore, max depth ~3)\n * - Top-level symbols per key file\n * - Dependency manifests\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { resolve, relative } from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { extractSymbols } from \"../tree-sitter/symbol-extractor.js\";\nimport { SKIP_DIRS } from \"../shared/constants.js\";\n\n// Shared constant imported from ../shared/constants.ts\n\n/** Known dependency manifest files */\nconst MANIFESTS = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"go.sum\",\n \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n \"requirements.txt\", \"pyproject.toml\", \"setup.py\", \"setup.cfg\",\n \"Gemfile\", \"Makefile\", \"CMakeLists.txt\",\n];\n\n/** Known entry point patterns */\nconst ENTRY_PATTERNS = [\n \"index.ts\", \"index.js\", \"main.ts\", \"main.js\", \"app.ts\", \"app.js\",\n \"main.py\", \"app.py\", \"__init__.py\",\n \"main.rs\", \"lib.rs\",\n \"main.go\",\n \"Main.java\", \"Application.java\",\n];\n\nconst MAX_TREE_DEPTH = 3;\nconst MAX_TREE_ENTRIES = 200;\n\nconst OverviewParams = Type.Object({\n path: Type.Optional(Type.String({ description: \"Root directory to analyze (defaults to project root)\" })),\n depth: Type.Optional(Type.Number({ description: \"Maximum directory depth (default: 3)\" })),\n});\n\ninterface OverviewDetails { files: number; symbols: number }\n\nexport function createCodeOverviewTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n workspaceIndex: WorkspaceIndex,\n): ToolDefinition<typeof OverviewParams, OverviewDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_overview\",\n label: \"Code Overview\",\n description: \"Summarize project structure: directory tree, top-level symbols per key file, dependency manifests. Uses tree-sitter for symbol extraction — no LSP required.\",\n promptSnippet: \"Get a structural overview of the project (directories, key files, symbols)\",\n parameters: OverviewParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const targetDir = resolve(rootDir, params.path ?? \".\");\n const maxDepth = params.depth ?? MAX_TREE_DEPTH;\n\n const sections: string[] = [];\n let totalFiles = 0;\n let totalSymbols = 0;\n\n // 1. Directory tree\n const treeLines: string[] = [];\n await buildTree(targetDir, \"\", 0, maxDepth, treeLines);\n totalFiles = treeLines.filter((l) => !l.endsWith(\"/\")).length;\n sections.push(\"## Directory Structure\\n\\n```\\n\" + treeLines.join(\"\\n\") + \"\\n```\");\n\n // 2. Dependency manifests\n const manifests: string[] = [];\n for (const m of MANIFESTS) {\n const path = resolve(targetDir, m);\n if (existsSync(path)) {\n manifests.push(m);\n }\n }\n if (manifests.length > 0) {\n sections.push(\"## Dependency Manifests\\n\\n\" + manifests.map((m) => `- ${m}`).join(\"\\n\"));\n }\n\n // 3. Key files with symbols\n const keyFiles = await findKeyFiles(targetDir);\n if (keyFiles.length > 0) {\n const symbolSections: string[] = [];\n for (const file of keyFiles.slice(0, 10)) {\n try {\n const content = await readFile(file, \"utf-8\");\n const languageId = treeSitter.getLanguageId(file);\n if (!languageId) continue;\n\n const tree = await treeSitter.parse(file, content);\n if (!tree) continue;\n\n const symbols = extractSymbols(tree, languageId);\n if (symbols.length === 0) continue;\n\n const relPath = relative(targetDir, file);\n const symbolLines = symbols.slice(0, 20).map((s) => {\n const kindNames: Record<number, string> = {\n 5: \"class\", 6: \"method\", 10: \"enum\", 11: \"interface\",\n 12: \"function\", 13: \"variable\", 14: \"constant\", 22: \"struct\",\n };\n const kind = kindNames[s.kind] ?? \"symbol\";\n return ` ${kind} ${s.name} (line ${s.line})`;\n });\n if (symbols.length > 20) {\n symbolLines.push(` ... and ${symbols.length - 20} more`);\n }\n totalSymbols += symbols.length;\n symbolSections.push(`### ${relPath}\\n${symbolLines.join(\"\\n\")}`);\n } catch { /* skip */ }\n }\n if (symbolSections.length > 0) {\n sections.push(\"## Key Files\\n\\n\" + symbolSections.join(\"\\n\\n\"));\n }\n }\n\n // 4. Workspace index stats\n if (workspaceIndex.isBuilt) {\n const stats = workspaceIndex.getStats();\n sections.push(`## Index Stats\\n\\n- ${stats.files} indexed files\\n- ${stats.symbols} symbols`);\n }\n\n const output = sections.join(\"\\n\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let text = truncation.content;\n if (truncation.truncated) {\n text += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text }],\n details: { files: totalFiles, symbols: totalSymbols },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"code_overview \"));\n if (args.path) text += theme.fg(\"accent\", args.path);\n else text += theme.fg(\"dim\", \"(project root)\");\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Analyzing...\"), 0, 0);\n const d = result.details;\n if (!d) return new Text(theme.fg(\"dim\", \"No overview\"), 0, 0);\n return new Text(theme.fg(\"success\", `${d.files} files, ${d.symbols} symbols`), 0, 0);\n },\n };\n}\n\n/** Build a directory tree representation */\nasync function buildTree(\n dir: string,\n prefix: string,\n depth: number,\n maxDepth: number,\n lines: string[],\n): Promise<void> {\n if (depth > maxDepth || lines.length > MAX_TREE_ENTRIES) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n // Sort: directories first, then files\n const sorted = entries\n .filter((e) => !e.name.startsWith(\".\") || e.name === \".github\")\n .sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < sorted.length; i++) {\n if (lines.length > MAX_TREE_ENTRIES) {\n lines.push(`${prefix}... (truncated)`);\n return;\n }\n\n const entry = sorted[i];\n const isLast = i === sorted.length - 1;\n const connector = isLast ? \"└── \" : \"├── \";\n const childPrefix = isLast ? \" \" : \"│ \";\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n lines.push(`${prefix}${connector}${entry.name}/ (skipped)`);\n continue;\n }\n lines.push(`${prefix}${connector}${entry.name}/`);\n await buildTree(\n resolve(dir, entry.name),\n prefix + childPrefix,\n depth + 1,\n maxDepth,\n lines,\n );\n } else {\n lines.push(`${prefix}${connector}${entry.name}`);\n }\n }\n } catch { /* permission denied */ }\n}\n\n/** Find key/entry-point files in the project */\nasync function findKeyFiles(dir: string): Promise<string[]> {\n const found: string[] = [];\n\n // Check common entry point locations\n const searchDirs = [dir, resolve(dir, \"src\"), resolve(dir, \"lib\"), resolve(dir, \"app\")];\n\n for (const searchDir of searchDirs) {\n for (const pattern of ENTRY_PATTERNS) {\n const fullPath = resolve(searchDir, pattern);\n if (existsSync(fullPath)) {\n found.push(fullPath);\n }\n }\n }\n\n return [...new Set(found)]; // deduplicate\n}\n"]}
1
+ {"version":3,"file":"code-overview.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-overview.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA0BxE,QAAA,MAAM,cAAc;;;EAGlB,CAAC;AAEH,UAAU,eAAe;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAE5D,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,cAAc,EAAE,cAAc,GAC7B,cAAc,CAAC,OAAO,cAAc,EAAE,eAAe,CAAC,CA2GxD","sourcesContent":["// @ts-nocheck\n/**\n * code_overview — Summarize project structure, key files, and symbols.\n *\n * Uses tree-sitter for symbol extraction. Shows:\n * - Directory tree (respecting .gitignore, max depth ~3)\n * - Top-level symbols per key file\n * - Dependency manifests\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 { Text } from \"@ashx-j/lunr-tui\";\nimport { resolve, relative } from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { extractSymbols } from \"../tree-sitter/symbol-extractor.js\";\nimport { SKIP_DIRS } from \"../shared/constants.js\";\n\n// Shared constant imported from ../shared/constants.ts\n\n/** Known dependency manifest files */\nconst MANIFESTS = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"go.sum\",\n \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n \"requirements.txt\", \"pyproject.toml\", \"setup.py\", \"setup.cfg\",\n \"Gemfile\", \"Makefile\", \"CMakeLists.txt\",\n];\n\n/** Known entry point patterns */\nconst ENTRY_PATTERNS = [\n \"index.ts\", \"index.js\", \"main.ts\", \"main.js\", \"app.ts\", \"app.js\",\n \"main.py\", \"app.py\", \"__init__.py\",\n \"main.rs\", \"lib.rs\",\n \"main.go\",\n \"Main.java\", \"Application.java\",\n];\n\nconst MAX_TREE_DEPTH = 3;\nconst MAX_TREE_ENTRIES = 200;\n\nconst OverviewParams = Type.Object({\n path: Type.Optional(Type.String({ description: \"Root directory to analyze (defaults to project root)\" })),\n depth: Type.Optional(Type.Number({ description: \"Maximum directory depth (default: 3)\" })),\n});\n\ninterface OverviewDetails { files: number; symbols: number }\n\nexport function createCodeOverviewTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n workspaceIndex: WorkspaceIndex,\n): ToolDefinition<typeof OverviewParams, OverviewDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_overview\",\n label: \"Code Overview\",\n description: \"Summarize project structure: directory tree, top-level symbols per key file, dependency manifests. Uses tree-sitter for symbol extraction — no LSP required.\",\n promptSnippet: \"Get a structural overview of the project (directories, key files, symbols)\",\n parameters: OverviewParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const targetDir = resolve(rootDir, params.path ?? \".\");\n const maxDepth = params.depth ?? MAX_TREE_DEPTH;\n\n const sections: string[] = [];\n let totalFiles = 0;\n let totalSymbols = 0;\n\n // 1. Directory tree\n const treeLines: string[] = [];\n await buildTree(targetDir, \"\", 0, maxDepth, treeLines);\n totalFiles = treeLines.filter((l) => !l.endsWith(\"/\")).length;\n sections.push(\"## Directory Structure\\n\\n```\\n\" + treeLines.join(\"\\n\") + \"\\n```\");\n\n // 2. Dependency manifests\n const manifests: string[] = [];\n for (const m of MANIFESTS) {\n const path = resolve(targetDir, m);\n if (existsSync(path)) {\n manifests.push(m);\n }\n }\n if (manifests.length > 0) {\n sections.push(\"## Dependency Manifests\\n\\n\" + manifests.map((m) => `- ${m}`).join(\"\\n\"));\n }\n\n // 3. Key files with symbols\n const keyFiles = await findKeyFiles(targetDir);\n if (keyFiles.length > 0) {\n const symbolSections: string[] = [];\n for (const file of keyFiles.slice(0, 10)) {\n try {\n const content = await readFile(file, \"utf-8\");\n const languageId = treeSitter.getLanguageId(file);\n if (!languageId) continue;\n\n const tree = await treeSitter.parse(file, content);\n if (!tree) continue;\n\n const symbols = extractSymbols(tree, languageId);\n if (symbols.length === 0) continue;\n\n const relPath = relative(targetDir, file);\n const symbolLines = symbols.slice(0, 20).map((s) => {\n const kindNames: Record<number, string> = {\n 5: \"class\", 6: \"method\", 10: \"enum\", 11: \"interface\",\n 12: \"function\", 13: \"variable\", 14: \"constant\", 22: \"struct\",\n };\n const kind = kindNames[s.kind] ?? \"symbol\";\n return ` ${kind} ${s.name} (line ${s.line})`;\n });\n if (symbols.length > 20) {\n symbolLines.push(` ... and ${symbols.length - 20} more`);\n }\n totalSymbols += symbols.length;\n symbolSections.push(`### ${relPath}\\n${symbolLines.join(\"\\n\")}`);\n } catch { /* skip */ }\n }\n if (symbolSections.length > 0) {\n sections.push(\"## Key Files\\n\\n\" + symbolSections.join(\"\\n\\n\"));\n }\n }\n\n // 4. Workspace index stats\n if (workspaceIndex.isBuilt) {\n const stats = workspaceIndex.getStats();\n sections.push(`## Index Stats\\n\\n- ${stats.files} indexed files\\n- ${stats.symbols} symbols`);\n }\n\n const output = sections.join(\"\\n\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let text = truncation.content;\n if (truncation.truncated) {\n text += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text }],\n details: { files: totalFiles, symbols: totalSymbols },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"code_overview \"));\n if (args.path) text += theme.fg(\"accent\", args.path);\n else text += theme.fg(\"dim\", \"(project root)\");\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Analyzing...\"), 0, 0);\n const d = result.details;\n if (!d) return new Text(theme.fg(\"dim\", \"No overview\"), 0, 0);\n return new Text(theme.fg(\"success\", `${d.files} files, ${d.symbols} symbols`), 0, 0);\n },\n };\n}\n\n/** Build a directory tree representation */\nasync function buildTree(\n dir: string,\n prefix: string,\n depth: number,\n maxDepth: number,\n lines: string[],\n): Promise<void> {\n if (depth > maxDepth || lines.length > MAX_TREE_ENTRIES) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n // Sort: directories first, then files\n const sorted = entries\n .filter((e) => !e.name.startsWith(\".\") || e.name === \".github\")\n .sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < sorted.length; i++) {\n if (lines.length > MAX_TREE_ENTRIES) {\n lines.push(`${prefix}... (truncated)`);\n return;\n }\n\n const entry = sorted[i];\n const isLast = i === sorted.length - 1;\n const connector = isLast ? \"└── \" : \"├── \";\n const childPrefix = isLast ? \" \" : \"│ \";\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n lines.push(`${prefix}${connector}${entry.name}/ (skipped)`);\n continue;\n }\n lines.push(`${prefix}${connector}${entry.name}/`);\n await buildTree(\n resolve(dir, entry.name),\n prefix + childPrefix,\n depth + 1,\n maxDepth,\n lines,\n );\n } else {\n lines.push(`${prefix}${connector}${entry.name}`);\n }\n }\n } catch { /* permission denied */ }\n}\n\n/** Find key/entry-point files in the project */\nasync function findKeyFiles(dir: string): Promise<string[]> {\n const found: string[] = [];\n\n // Check common entry point locations\n const searchDirs = [dir, resolve(dir, \"src\"), resolve(dir, \"lib\"), resolve(dir, \"app\")];\n\n for (const searchDir of searchDirs) {\n for (const pattern of ENTRY_PATTERNS) {\n const fullPath = resolve(searchDir, pattern);\n if (existsSync(fullPath)) {\n found.push(fullPath);\n }\n }\n }\n\n return [...new Set(found)]; // deduplicate\n}\n"]}
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { Type } from "@sinclair/typebox";
11
11
  import { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from "../../../../core/tools/truncate.js";
12
- import { Text } from "@earendil-works/pi-tui";
12
+ import { Text } from "@ashx-j/lunr-tui";
13
13
  import { resolve, relative } from "node:path";
14
14
  import { readdir, readFile } from "node:fs/promises";
15
15
  import { existsSync } from "node:fs";