@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
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/definition.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,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;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAUxE,QAAA,MAAM,gBAAgB;;;;;EAKpB,CAAC;AAEH,UAAU,iBAAiB;IAAG,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACrC,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,GACrC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CAyJ5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_definition — Go to the definition of a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location, LocationLink } 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 type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getNodeAtPosition, findDefinition } from \"../tree-sitter/symbol-extractor.js\";\nimport { formatLocation, formatLocationLink } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\n\ntype DefinitionResult = Location | Location[] | LocationLink[] | null;\n\nconst DefinitionParams = 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});\n\ninterface DefinitionDetails { count: number }\n\nexport function createDefinitionTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n workspaceIndex?: WorkspaceIndex | null,\n): ToolDefinition<typeof DefinitionParams, DefinitionDetails> {\n return {\n name: \"lsp_definition\",\n label: \"LSP Definition\",\n description: \"Go to the definition of a symbol at a specific position. Returns the file path and location of the definition. Line and character are 1-indexed.\",\n promptSnippet: \"Jump to the definition of a symbol at a file position via LSP\",\n parameters: DefinitionParams,\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 } };\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 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const result = await client.sendRequest<DefinitionResult>(\"textDocument/definition\", {\n textDocument: { uri }, position,\n });\n\n if (!result) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n let locations: string[];\n\n if (Array.isArray(result)) {\n if (result.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n if (\"targetUri\" in result[0]) {\n locations = (result as LocationLink[]).map((l) => formatLocationLink(l, rootDir));\n } else {\n locations = (result as Location[]).map((l) => formatLocation(l, rootDir));\n }\n } else {\n locations = [formatLocation(result as Location, rootDir)];\n }\n\n let text = locations.length === 1\n ? `Definition: ${locations[0]}`\n : `Definitions:\\n${locations.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return { content: [{ type: \"text\", text }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP definition request failed: ${err.message}` }], details: { count: 0 } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n // Get the symbol name at the cursor position\n const node = getNodeAtPosition(tree, line - 1, character - 1);\n if (node) {\n const symbolName = node.text;\n const rootDir = manager.resolvePath(\".\");\n const relPath = relative(rootDir, absPath);\n\n // Search current file first\n const localDefs = findDefinition(tree, symbolName, provider.languageId);\n if (localDefs.length > 0) {\n const locs = localDefs.map((d) => `${relPath}:${d.line}:1`);\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n\n // Search workspace index\n if (workspaceIndex) {\n await workspaceIndex.build();\n const entries = workspaceIndex.search(symbolName);\n const exact = entries.filter((e) => e.name === symbolName);\n if (exact.length > 0) {\n const rootDir2 = manager.resolvePath(\".\");\n const locs = exact.slice(0, 10).map((e) => {\n const rel = relative(rootDir2, e.file);\n return `${rel}:${e.line}:1`;\n });\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n }\n\n const msg = `No definition found for \"${symbolName}\" [tree-sitter]`;\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${msg}` : msg;\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0 } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_definition \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Resolving...\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No result\"), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/definition.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,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;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAUxE,QAAA,MAAM,gBAAgB;;;;;EAKpB,CAAC;AAEH,UAAU,iBAAiB;IAAG,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,EACrC,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,GACrC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CAyJ5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_definition — Go to the definition of a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location, LocationLink } 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 type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getNodeAtPosition, findDefinition } from \"../tree-sitter/symbol-extractor.js\";\nimport { formatLocation, formatLocationLink } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\n\ntype DefinitionResult = Location | Location[] | LocationLink[] | null;\n\nconst DefinitionParams = 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});\n\ninterface DefinitionDetails { count: number }\n\nexport function createDefinitionTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n workspaceIndex?: WorkspaceIndex | null,\n): ToolDefinition<typeof DefinitionParams, DefinitionDetails> {\n return {\n name: \"lsp_definition\",\n label: \"LSP Definition\",\n description: \"Go to the definition of a symbol at a specific position. Returns the file path and location of the definition. Line and character are 1-indexed.\",\n promptSnippet: \"Jump to the definition of a symbol at a file position via LSP\",\n parameters: DefinitionParams,\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 } };\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 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const result = await client.sendRequest<DefinitionResult>(\"textDocument/definition\", {\n textDocument: { uri }, position,\n });\n\n if (!result) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n let locations: string[];\n\n if (Array.isArray(result)) {\n if (result.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n if (\"targetUri\" in result[0]) {\n locations = (result as LocationLink[]).map((l) => formatLocationLink(l, rootDir));\n } else {\n locations = (result as Location[]).map((l) => formatLocation(l, rootDir));\n }\n } else {\n locations = [formatLocation(result as Location, rootDir)];\n }\n\n let text = locations.length === 1\n ? `Definition: ${locations[0]}`\n : `Definitions:\\n${locations.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return { content: [{ type: \"text\", text }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP definition request failed: ${err.message}` }], details: { count: 0 } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n // Get the symbol name at the cursor position\n const node = getNodeAtPosition(tree, line - 1, character - 1);\n if (node) {\n const symbolName = node.text;\n const rootDir = manager.resolvePath(\".\");\n const relPath = relative(rootDir, absPath);\n\n // Search current file first\n const localDefs = findDefinition(tree, symbolName, provider.languageId);\n if (localDefs.length > 0) {\n const locs = localDefs.map((d) => `${relPath}:${d.line}:1`);\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n\n // Search workspace index\n if (workspaceIndex) {\n await workspaceIndex.build();\n const entries = workspaceIndex.search(symbolName);\n const exact = entries.filter((e) => e.name === symbolName);\n if (exact.length > 0) {\n const rootDir2 = manager.resolvePath(\".\");\n const locs = exact.slice(0, 10).map((e) => {\n const rel = relative(rootDir2, e.file);\n return `${rel}:${e.line}:1`;\n });\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n }\n\n const msg = `No definition found for \"${symbolName}\" [tree-sitter]`;\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${msg}` : msg;\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0 } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_definition \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Resolving...\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No result\"), 0, 0);\n },\n };\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * lsp_definition — Go to the definition of a symbol.
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 { resolveProvider } from "../resolve-provider.js";
8
8
  import { getNodeAtPosition, findDefinition } from "../tree-sitter/symbol-extractor.js";
9
9
  import { formatLocation, formatLocationLink } from "../shared/format.js";
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/definition.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_definition — Go to the definition of a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location, LocationLink } 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 type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getNodeAtPosition, findDefinition } from \"../tree-sitter/symbol-extractor.js\";\nimport { formatLocation, formatLocationLink } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\n\ntype DefinitionResult = Location | Location[] | LocationLink[] | null;\n\nconst DefinitionParams = 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});\n\ninterface DefinitionDetails { count: number }\n\nexport function createDefinitionTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n workspaceIndex?: WorkspaceIndex | null,\n): ToolDefinition<typeof DefinitionParams, DefinitionDetails> {\n return {\n name: \"lsp_definition\",\n label: \"LSP Definition\",\n description: \"Go to the definition of a symbol at a specific position. Returns the file path and location of the definition. Line and character are 1-indexed.\",\n promptSnippet: \"Jump to the definition of a symbol at a file position via LSP\",\n parameters: DefinitionParams,\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 } };\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 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const result = await client.sendRequest<DefinitionResult>(\"textDocument/definition\", {\n textDocument: { uri }, position,\n });\n\n if (!result) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n let locations: string[];\n\n if (Array.isArray(result)) {\n if (result.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n if (\"targetUri\" in result[0]) {\n locations = (result as LocationLink[]).map((l) => formatLocationLink(l, rootDir));\n } else {\n locations = (result as Location[]).map((l) => formatLocation(l, rootDir));\n }\n } else {\n locations = [formatLocation(result as Location, rootDir)];\n }\n\n let text = locations.length === 1\n ? `Definition: ${locations[0]}`\n : `Definitions:\\n${locations.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return { content: [{ type: \"text\", text }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP definition request failed: ${err.message}` }], details: { count: 0 } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n // Get the symbol name at the cursor position\n const node = getNodeAtPosition(tree, line - 1, character - 1);\n if (node) {\n const symbolName = node.text;\n const rootDir = manager.resolvePath(\".\");\n const relPath = relative(rootDir, absPath);\n\n // Search current file first\n const localDefs = findDefinition(tree, symbolName, provider.languageId);\n if (localDefs.length > 0) {\n const locs = localDefs.map((d) => `${relPath}:${d.line}:1`);\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n\n // Search workspace index\n if (workspaceIndex) {\n await workspaceIndex.build();\n const entries = workspaceIndex.search(symbolName);\n const exact = entries.filter((e) => e.name === symbolName);\n if (exact.length > 0) {\n const rootDir2 = manager.resolvePath(\".\");\n const locs = exact.slice(0, 10).map((e) => {\n const rel = relative(rootDir2, e.file);\n return `${rel}:${e.line}:1`;\n });\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n }\n\n const msg = `No definition found for \"${symbolName}\" [tree-sitter]`;\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${msg}` : msg;\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0 } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_definition \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Resolving...\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No result\"), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/definition.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAI9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAC/C,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC,CAAC;IAChH,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC,CAAC;IACvH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kHAAgH,EAAE,CAAC,CAAC;CACrK,CAAC,CAAC;AAIH,MAAM,UAAU,oBAAoB,CAClC,OAAmB,EACnB,UAAqC,EACrC,cAAsC,EACsB;IAC5D,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,kJAAkJ;QAC/J,aAAa,EAAE,+DAA+D;QAC9E,UAAU,EAAE,gBAAgB;QAE5B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACvB,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YACjC,IAAI,YAAgC,CAAC;YAErC,6DAA6D;YAC7D,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC1F,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;oBACrB,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;oBAC/B,YAAY,GAAG,aAAa,MAAM,CAAC,KAAK,SAAO,QAAQ,CAAC,UAAU,OAAO,IAAI,IAAI,SAAS,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACpH,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;oBAClE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,KAAK,QAAQ,QAAQ,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvI,CAAC;YACH,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACrH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE1E,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW;gBACX,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;gBAE9D,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAmB,yBAAyB,EAAE;wBACnF,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ;qBAChC,CAAC,CAAC;oBAEH,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,0BAA0B,CAAC,CAAC,CAAC,sBAAsB,CAAC;wBAC/F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtE,CAAC;oBAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBACzC,IAAI,SAAmB,CAAC;oBAExB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BACxB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,0BAA0B,CAAC,CAAC,CAAC,sBAAsB,CAAC;4BAC/F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtE,CAAC;wBACD,IAAI,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7B,SAAS,GAAI,MAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;wBACpF,CAAC;6BAAM,CAAC;4BACN,SAAS,GAAI,MAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;wBAC5E,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,CAAC,cAAc,CAAC,MAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC5D,CAAC;oBAED,IAAI,IAAI,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC;wBAC/B,CAAC,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,EAAE;wBAC/B,CAAC,CAAC,iBAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,IAAI,YAAY;wBAAE,IAAI,GAAG,GAAG,YAAY,OAAO,IAAI,EAAE,CAAC;oBAEtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrF,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAChE,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACjD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACtD,IAAI,IAAI,EAAE,CAAC;4BACT,6CAA6C;4BAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;4BAC9D,IAAI,IAAI,EAAE,CAAC;gCACT,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;gCAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gCACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gCAE3C,4BAA4B;gCAC5B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;gCACxE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCACzB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;oCAC5D,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC;wCAC1B,CAAC,CAAC,6BAA6B,IAAI,CAAC,CAAC,CAAC,EAAE;wCACxC,CAAC,CAAC,+BAA+B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oCAC1E,IAAI,YAAY;wCAAE,IAAI,GAAG,GAAG,YAAY,OAAO,IAAI,EAAE,CAAC;oCACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gCAChF,CAAC;gCAED,yBAAyB;gCACzB,IAAI,cAAc,EAAE,CAAC;oCACnB,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;oCAC7B,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oCAClD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;oCAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wCACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wCAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;4CACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;4CACvC,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;wCAAA,CAC7B,CAAC,CAAC;wCACH,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC;4CAC1B,CAAC,CAAC,6BAA6B,IAAI,CAAC,CAAC,CAAC,EAAE;4CACxC,CAAC,CAAC,+BAA+B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wCAC1E,IAAI,YAAY;4CAAE,IAAI,GAAG,GAAG,YAAY,OAAO,IAAI,EAAE,CAAC;wCACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;oCAChF,CAAC;gCACH,CAAC;gCAED,MAAM,GAAG,GAAG,4BAA4B,UAAU,iBAAiB,CAAC;gCACpE,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gCAC9D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;4BACtE,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAAA,CAC7G;QAED,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YACtB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC7B;QAED,YAAY,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE;YACzC,IAAI,SAAS;gBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,OAAO,EAAE,IAAI,KAAK,MAAM;gBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CACrD;KACF,CAAC;AAAA,CACH","sourcesContent":["// @ts-nocheck\n/**\n * lsp_definition — Go to the definition of a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location, LocationLink } 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 type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getNodeAtPosition, findDefinition } from \"../tree-sitter/symbol-extractor.js\";\nimport { formatLocation, formatLocationLink } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\n\ntype DefinitionResult = Location | Location[] | LocationLink[] | null;\n\nconst DefinitionParams = 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});\n\ninterface DefinitionDetails { count: number }\n\nexport function createDefinitionTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n workspaceIndex?: WorkspaceIndex | null,\n): ToolDefinition<typeof DefinitionParams, DefinitionDetails> {\n return {\n name: \"lsp_definition\",\n label: \"LSP Definition\",\n description: \"Go to the definition of a symbol at a specific position. Returns the file path and location of the definition. Line and character are 1-indexed.\",\n promptSnippet: \"Jump to the definition of a symbol at a file position via LSP\",\n parameters: DefinitionParams,\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 } };\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 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const result = await client.sendRequest<DefinitionResult>(\"textDocument/definition\", {\n textDocument: { uri }, position,\n });\n\n if (!result) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n let locations: string[];\n\n if (Array.isArray(result)) {\n if (result.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo definition found.` : \"No definition found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n if (\"targetUri\" in result[0]) {\n locations = (result as LocationLink[]).map((l) => formatLocationLink(l, rootDir));\n } else {\n locations = (result as Location[]).map((l) => formatLocation(l, rootDir));\n }\n } else {\n locations = [formatLocation(result as Location, rootDir)];\n }\n\n let text = locations.length === 1\n ? `Definition: ${locations[0]}`\n : `Definitions:\\n${locations.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n\n return { content: [{ type: \"text\", text }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP definition request failed: ${err.message}` }], details: { count: 0 } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n // Get the symbol name at the cursor position\n const node = getNodeAtPosition(tree, line - 1, character - 1);\n if (node) {\n const symbolName = node.text;\n const rootDir = manager.resolvePath(\".\");\n const relPath = relative(rootDir, absPath);\n\n // Search current file first\n const localDefs = findDefinition(tree, symbolName, provider.languageId);\n if (localDefs.length > 0) {\n const locs = localDefs.map((d) => `${relPath}:${d.line}:1`);\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n\n // Search workspace index\n if (workspaceIndex) {\n await workspaceIndex.build();\n const entries = workspaceIndex.search(symbolName);\n const exact = entries.filter((e) => e.name === symbolName);\n if (exact.length > 0) {\n const rootDir2 = manager.resolvePath(\".\");\n const locs = exact.slice(0, 10).map((e) => {\n const rel = relative(rootDir2, e.file);\n return `${rel}:${e.line}:1`;\n });\n let text = locs.length === 1\n ? `Definition [tree-sitter]: ${locs[0]}`\n : `Definitions [tree-sitter]:\\n${locs.map((l) => ` ${l}`).join(\"\\n\")}`;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { count: locs.length } };\n }\n }\n\n const msg = `No definition found for \"${symbolName}\" [tree-sitter]`;\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${msg}` : msg;\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { count: 0 } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_definition \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Resolving...\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No result\"), 0, 0);\n },\n };\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  * When `path` is omitted: returns all cached diagnostics across all running LSP servers.
6
6
  */
7
7
  import { Type } from "@sinclair/typebox";
8
- import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
8
+ import type { ToolDefinition } from "@ashx-j/lunr";
9
9
  import type { LspManager } from "../lsp-manager.js";
10
10
  import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
11
11
  declare const DiagnosticsParams: Type.TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA0B1E,QAAA,MAAM,iBAAiB;;EAErB,CAAC;AAEH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAkI9D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_diagnostics — Get compilation errors and warnings for a file or the whole workspace.\n *\n * When `path` is provided: returns diagnostics for that single file.\n * When `path` is omitted: returns all cached diagnostics across all running LSP servers.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getSyntaxErrors } from \"../tree-sitter/symbol-extractor.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction severityToString(severity: number | undefined): string {\n switch (severity) {\n case DiagnosticSeverity.Error: return \"error\";\n case DiagnosticSeverity.Warning: return \"warning\";\n case DiagnosticSeverity.Information: return \"info\";\n case DiagnosticSeverity.Hint: return \"hint\";\n default: return \"unknown\";\n }\n}\n\nfunction formatDiagnostic(diag: Diagnostic, filePath: string): string {\n const line = diag.range.start.line + 1;\n const col = diag.range.start.character + 1;\n const sev = severityToString(diag.severity);\n const source = diag.source ? ` [${diag.source}]` : \"\";\n const code = diag.code !== undefined ? ` (${diag.code})` : \"\";\n return `${filePath}:${line}:${col} ${sev}: ${diag.message}${code}${source}`;\n}\n\nconst DiagnosticsParams = Type.Object({\n path: Type.String({ description: \"File path to get diagnostics for. Pass \\\"*\\\" to get all workspace diagnostics from all running LSP servers.\" }),\n});\n\ninterface DiagnosticsDetails {\n count: number;\n errors?: number;\n warnings?: number;\n files?: number;\n}\n\nexport function createDiagnosticsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof DiagnosticsParams, DiagnosticsDetails> {\n return {\n name: \"lsp_diagnostics\",\n label: \"LSP Diagnostics\",\n description: \"Get compilation errors and warnings from the LSP server. Pass a file path to check a single file, or pass \\\"*\\\" to get all cached diagnostics across the workspace.\",\n promptSnippet: \"Get compiler errors, warnings, and hints for a source file via LSP. Pass path=\\\"*\\\" to get all workspace diagnostics.\",\n promptGuidelines: [\n \"After making code changes with edit or write, use lsp_diagnostics to check for compilation errors before moving on.\",\n \"To review all workspace diagnostics at once, call lsp_diagnostics with path=\\\"*\\\" — this returns all cached diagnostics from running LSP servers without needing to check files individually.\",\n ],\n parameters: DiagnosticsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n\n // Workspace-wide mode\n if (filePath === \"*\" || filePath === \"\") {\n return executeWorkspaceDiagnostics(manager);\n }\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const diagnostics = client.getDiagnostics(uri);\n\n if (diagnostics.length === 0) {\n return { content: [{ type: \"text\", text: \"No diagnostics (clean).\" }], details: { count: 0 } };\n }\n\n const sorted = [...diagnostics].sort((a, b) => (a.severity ?? 99) - (b.severity ?? 99));\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(filePath));\n const lines = sorted.map((d) => formatDiagnostic(d, relPath));\n const output = lines.join(\"\\n\");\n\n const errors = sorted.filter((d) => d.severity === DiagnosticSeverity.Error).length;\n const warnings = sorted.filter((d) => d.severity === DiagnosticSeverity.Warning).length;\n const other = sorted.length - errors - warnings;\n\n const summary = [\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: sorted.length, errors, warnings },\n };\n }\n\n // Tree-sitter fallback: report syntax errors\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const syntaxErrors = getSyntaxErrors(tree);\n if (syntaxErrors.length === 0) {\n return { content: [{ type: \"text\", text: \"No syntax errors detected. [tree-sitter — syntax only, no type checking]\" }], details: { count: 0 } };\n }\n const relPath = relative(manager.resolvePath(\".\"), absPath);\n const lines = syntaxErrors.map((e) =>\n `${relPath}:${e.line + 1}:${e.character + 1} error: ${e.message}`\n );\n const output = lines.join(\"\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${syntaxErrors.length} syntax error(s) [tree-sitter — syntax only, no type checking]\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: syntaxErrors.length, errors: syntaxErrors.length },\n };\n }\n } catch { /* fall through */ }\n }\n }\n\n return {\n content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }],\n details: { count: 0 },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_diagnostics \"));\n if (args.path && args.path !== \"*\") {\n text += theme.fg(\"accent\", args.path);\n } else {\n text += theme.fg(\"dim\", \"(workspace)\");\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Checking...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"success\", \"✓ No diagnostics\"), 0, 0);\n }\n let text = \"\";\n if (details.errors && details.errors > 0) text += theme.fg(\"error\", `${details.errors} error(s)`);\n if (details.warnings && details.warnings > 0) {\n if (text) text += \" \";\n text += theme.fg(\"warning\", `${details.warnings} warning(s)`);\n }\n if (details.files && details.files > 0) {\n text += theme.fg(\"dim\", ` in ${details.files} file(s)`);\n }\n if (expanded) {\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 30);\n for (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n }\n }\n return new Text(text, 0, 0);\n },\n };\n}\n\n/** Collect all diagnostics from all running LSP servers */\nfunction executeWorkspaceDiagnostics(manager: LspManager) {\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n\n if (running.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"No LSP servers are running. Use lsp_diagnostics with a file path to start a server and check that file.\" }],\n details: { count: 0 },\n };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const allDiagnostics: { relPath: string; diag: Diagnostic }[] = [];\n\n for (const status of running) {\n const client = manager.getRunningClient(status.languageId);\n if (!client) continue;\n\n const diagMap = client.getAllDiagnostics();\n for (const [uri, diagnostics] of diagMap) {\n if (diagnostics.length === 0) continue;\n let absPath: string;\n try {\n absPath = fileURLToPath(uri);\n } catch {\n absPath = uri;\n }\n const relPath = relative(rootDir, absPath);\n for (const diag of diagnostics) {\n allDiagnostics.push({ relPath, diag });\n }\n }\n }\n\n if (allDiagnostics.length === 0) {\n const langs = running.map((s) => s.languageId).join(\", \");\n return {\n content: [{ type: \"text\" as const, text: `No diagnostics across ${running.length} running server(s) (${langs}).` }],\n details: { count: 0 },\n };\n }\n\n // Sort: errors first, then by file path\n allDiagnostics.sort((a, b) => {\n const sevDiff = (a.diag.severity ?? 99) - (b.diag.severity ?? 99);\n if (sevDiff !== 0) return sevDiff;\n return a.relPath.localeCompare(b.relPath);\n });\n\n const errors = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Error).length;\n const warnings = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Warning).length;\n const other = allDiagnostics.length - errors - warnings;\n const fileCount = new Set(allDiagnostics.map((d) => d.relPath)).size;\n\n const summary = [\n `${allDiagnostics.length} diagnostic(s) in ${fileCount} file(s)`,\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const lines = allDiagnostics.map((d) => formatDiagnostic(d.diag, d.relPath));\n const output = lines.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\" as const, text: resultText }],\n details: { count: allDiagnostics.length, errors, warnings, files: fileCount },\n };\n}\n"]}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA0B1E,QAAA,MAAM,iBAAiB;;EAErB,CAAC;AAEH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAkI9D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_diagnostics — Get compilation errors and warnings for a file or the whole workspace.\n *\n * When `path` is provided: returns diagnostics for that single file.\n * When `path` is omitted: returns all cached diagnostics across all running LSP servers.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getSyntaxErrors } from \"../tree-sitter/symbol-extractor.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction severityToString(severity: number | undefined): string {\n switch (severity) {\n case DiagnosticSeverity.Error: return \"error\";\n case DiagnosticSeverity.Warning: return \"warning\";\n case DiagnosticSeverity.Information: return \"info\";\n case DiagnosticSeverity.Hint: return \"hint\";\n default: return \"unknown\";\n }\n}\n\nfunction formatDiagnostic(diag: Diagnostic, filePath: string): string {\n const line = diag.range.start.line + 1;\n const col = diag.range.start.character + 1;\n const sev = severityToString(diag.severity);\n const source = diag.source ? ` [${diag.source}]` : \"\";\n const code = diag.code !== undefined ? ` (${diag.code})` : \"\";\n return `${filePath}:${line}:${col} ${sev}: ${diag.message}${code}${source}`;\n}\n\nconst DiagnosticsParams = Type.Object({\n path: Type.String({ description: \"File path to get diagnostics for. Pass \\\"*\\\" to get all workspace diagnostics from all running LSP servers.\" }),\n});\n\ninterface DiagnosticsDetails {\n count: number;\n errors?: number;\n warnings?: number;\n files?: number;\n}\n\nexport function createDiagnosticsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof DiagnosticsParams, DiagnosticsDetails> {\n return {\n name: \"lsp_diagnostics\",\n label: \"LSP Diagnostics\",\n description: \"Get compilation errors and warnings from the LSP server. Pass a file path to check a single file, or pass \\\"*\\\" to get all cached diagnostics across the workspace.\",\n promptSnippet: \"Get compiler errors, warnings, and hints for a source file via LSP. Pass path=\\\"*\\\" to get all workspace diagnostics.\",\n promptGuidelines: [\n \"After making code changes with edit or write, use lsp_diagnostics to check for compilation errors before moving on.\",\n \"To review all workspace diagnostics at once, call lsp_diagnostics with path=\\\"*\\\" — this returns all cached diagnostics from running LSP servers without needing to check files individually.\",\n ],\n parameters: DiagnosticsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n\n // Workspace-wide mode\n if (filePath === \"*\" || filePath === \"\") {\n return executeWorkspaceDiagnostics(manager);\n }\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const diagnostics = client.getDiagnostics(uri);\n\n if (diagnostics.length === 0) {\n return { content: [{ type: \"text\", text: \"No diagnostics (clean).\" }], details: { count: 0 } };\n }\n\n const sorted = [...diagnostics].sort((a, b) => (a.severity ?? 99) - (b.severity ?? 99));\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(filePath));\n const lines = sorted.map((d) => formatDiagnostic(d, relPath));\n const output = lines.join(\"\\n\");\n\n const errors = sorted.filter((d) => d.severity === DiagnosticSeverity.Error).length;\n const warnings = sorted.filter((d) => d.severity === DiagnosticSeverity.Warning).length;\n const other = sorted.length - errors - warnings;\n\n const summary = [\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: sorted.length, errors, warnings },\n };\n }\n\n // Tree-sitter fallback: report syntax errors\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const syntaxErrors = getSyntaxErrors(tree);\n if (syntaxErrors.length === 0) {\n return { content: [{ type: \"text\", text: \"No syntax errors detected. [tree-sitter — syntax only, no type checking]\" }], details: { count: 0 } };\n }\n const relPath = relative(manager.resolvePath(\".\"), absPath);\n const lines = syntaxErrors.map((e) =>\n `${relPath}:${e.line + 1}:${e.character + 1} error: ${e.message}`\n );\n const output = lines.join(\"\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${syntaxErrors.length} syntax error(s) [tree-sitter — syntax only, no type checking]\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: syntaxErrors.length, errors: syntaxErrors.length },\n };\n }\n } catch { /* fall through */ }\n }\n }\n\n return {\n content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }],\n details: { count: 0 },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_diagnostics \"));\n if (args.path && args.path !== \"*\") {\n text += theme.fg(\"accent\", args.path);\n } else {\n text += theme.fg(\"dim\", \"(workspace)\");\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Checking...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"success\", \"✓ No diagnostics\"), 0, 0);\n }\n let text = \"\";\n if (details.errors && details.errors > 0) text += theme.fg(\"error\", `${details.errors} error(s)`);\n if (details.warnings && details.warnings > 0) {\n if (text) text += \" \";\n text += theme.fg(\"warning\", `${details.warnings} warning(s)`);\n }\n if (details.files && details.files > 0) {\n text += theme.fg(\"dim\", ` in ${details.files} file(s)`);\n }\n if (expanded) {\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 30);\n for (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n }\n }\n return new Text(text, 0, 0);\n },\n };\n}\n\n/** Collect all diagnostics from all running LSP servers */\nfunction executeWorkspaceDiagnostics(manager: LspManager) {\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n\n if (running.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"No LSP servers are running. Use lsp_diagnostics with a file path to start a server and check that file.\" }],\n details: { count: 0 },\n };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const allDiagnostics: { relPath: string; diag: Diagnostic }[] = [];\n\n for (const status of running) {\n const client = manager.getRunningClient(status.languageId);\n if (!client) continue;\n\n const diagMap = client.getAllDiagnostics();\n for (const [uri, diagnostics] of diagMap) {\n if (diagnostics.length === 0) continue;\n let absPath: string;\n try {\n absPath = fileURLToPath(uri);\n } catch {\n absPath = uri;\n }\n const relPath = relative(rootDir, absPath);\n for (const diag of diagnostics) {\n allDiagnostics.push({ relPath, diag });\n }\n }\n }\n\n if (allDiagnostics.length === 0) {\n const langs = running.map((s) => s.languageId).join(\", \");\n return {\n content: [{ type: \"text\" as const, text: `No diagnostics across ${running.length} running server(s) (${langs}).` }],\n details: { count: 0 },\n };\n }\n\n // Sort: errors first, then by file path\n allDiagnostics.sort((a, b) => {\n const sevDiff = (a.diag.severity ?? 99) - (b.diag.severity ?? 99);\n if (sevDiff !== 0) return sevDiff;\n return a.relPath.localeCompare(b.relPath);\n });\n\n const errors = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Error).length;\n const warnings = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Warning).length;\n const other = allDiagnostics.length - errors - warnings;\n const fileCount = new Set(allDiagnostics.map((d) => d.relPath)).size;\n\n const summary = [\n `${allDiagnostics.length} diagnostic(s) in ${fileCount} file(s)`,\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const lines = allDiagnostics.map((d) => formatDiagnostic(d.diag, d.relPath));\n const output = lines.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\" as const, text: resultText }],\n details: { count: allDiagnostics.length, errors, warnings, files: fileCount },\n };\n}\n"]}
@@ -8,7 +8,7 @@
8
8
  import { Type } from "@sinclair/typebox";
9
9
  import { DiagnosticSeverity } from "vscode-languageserver-protocol";
10
10
  import { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from "../../../../core/tools/truncate.js";
11
- import { Text } from "@earendil-works/pi-tui";
11
+ import { Text } from "@ashx-j/lunr-tui";
12
12
  import { resolveProvider } from "../resolve-provider.js";
13
13
  import { getSyntaxErrors } from "../tree-sitter/symbol-extractor.js";
14
14
  import { readFile } from "node:fs/promises";
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAmB,MAAM,gCAAgC,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,gBAAgB,CAAC,QAA4B,EAAU;IAC9D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,kBAAkB,CAAC,KAAK,EAAE,OAAO,OAAO,CAAC;QAC9C,KAAK,kBAAkB,CAAC,OAAO,EAAE,OAAO,SAAS,CAAC;QAClD,KAAK,kBAAkB,CAAC,WAAW,EAAE,OAAO,MAAM,CAAC;QACnD,KAAK,kBAAkB,CAAC,IAAI,EAAE,OAAO,MAAM,CAAC;QAC5C,SAAS,OAAO,SAAS,CAAC;IAC5B,CAAC;AAAA,CACF;AAED,SAAS,gBAAgB,CAAC,IAAgB,EAAE,QAAgB,EAAU;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,GAAG,QAAQ,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAAA,CAC7E;AAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6GAA6G,EAAE,CAAC;CAClJ,CAAC,CAAC;AASH,MAAM,UAAU,qBAAqB,CACnC,OAAmB,EACnB,UAAqC,EACyB;IAC9D,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,qKAAqK;QAClL,aAAa,EAAE,uHAAuH;QACtI,gBAAgB,EAAE;YAChB,qHAAqH;YACrH,iMAA+L;SAChM;QACD,UAAU,EAAE,iBAAiB;QAE7B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAE/C,sBAAsB;YACtB,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACxC,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE1E,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW;gBACX,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAE/C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjG,CAAC;gBAED,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAClF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;gBACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;gBACxF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;gBAEhD,MAAM,OAAO,GAAG;oBACd,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI;oBACxC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,aAAa,CAAC,CAAC,CAAC,IAAI;oBAC9C,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI;iBACpC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE7B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACtG,IAAI,UAAU,GAAG,GAAG,OAAO,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;oBACzB,UAAU,IAAI,kCAAkC,UAAU,CAAC,WAAW,OAAO,UAAU,CAAC,UAAU,eAAe,CAAC;gBACpH,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;oBAC7C,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;iBACpD,CAAC;YACJ,CAAC;YAED,6CAA6C;YAC7C,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAChE,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACjD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACtD,IAAI,IAAI,EAAE,CAAC;4BACT,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;4BAC3C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gCAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4EAA0E,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;4BAClJ,CAAC;4BACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;4BAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,GAAG,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;4BACF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAChC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;4BACtG,IAAI,UAAU,GAAG,GAAG,YAAY,CAAC,MAAM,uEAAqE,UAAU,CAAC,OAAO,EAAE,CAAC;4BACjI,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gCACzB,UAAU,IAAI,kCAAkC,UAAU,CAAC,WAAW,OAAO,UAAU,CAAC,UAAU,eAAe,CAAC;4BACpH,CAAC;4BACD,OAAO;gCACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gCAC7C,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE;6BACrE,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aACtB,CAAC;QAAA,CACH;QAED,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YACtB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACnC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC7B;QAED,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE;YACnD,IAAI,SAAS;gBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;YAClG,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC7C,IAAI,IAAI;oBAAE,IAAI,IAAI,GAAG,CAAC;gBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,aAAa,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpD,KAAK,MAAM,IAAI,IAAI,KAAK;wBAAE,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBACjE,CAAC;YACH,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC7B;KACF,CAAC;AAAA,CACH;AAED,2DAA2D;AAC3D,SAAS,2BAA2B,CAAC,OAAmB,EAAE;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yGAAyG,EAAE,CAAC;YACrJ,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,cAAc,GAA4C,EAAE,CAAC;IAEnE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;YACzC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACvC,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,GAAG,CAAC;YAChB,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,OAAO,CAAC,MAAM,uBAAuB,KAAK,IAAI,EAAE,CAAC;YACnH,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAAA,CAC3C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACjG,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrG,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,OAAO,GAAG;QACd,GAAG,cAAc,CAAC,MAAM,qBAAqB,SAAS,UAAU;QAChE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI;QACxC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,aAAa,CAAC,CAAC,CAAC,IAAI;QAC9C,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI;KACpC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACtG,IAAI,UAAU,GAAG,GAAG,OAAO,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;IACvD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,UAAU,IAAI,kCAAkC,UAAU,CAAC,WAAW,OAAO,UAAU,CAAC,UAAU,eAAe,CAAC;IACpH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACtD,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;KAC9E,CAAC;AAAA,CACH","sourcesContent":["// @ts-nocheck\n/**\n * lsp_diagnostics — Get compilation errors and warnings for a file or the whole workspace.\n *\n * When `path` is provided: returns diagnostics for that single file.\n * When `path` is omitted: returns all cached diagnostics across all running LSP servers.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getSyntaxErrors } from \"../tree-sitter/symbol-extractor.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction severityToString(severity: number | undefined): string {\n switch (severity) {\n case DiagnosticSeverity.Error: return \"error\";\n case DiagnosticSeverity.Warning: return \"warning\";\n case DiagnosticSeverity.Information: return \"info\";\n case DiagnosticSeverity.Hint: return \"hint\";\n default: return \"unknown\";\n }\n}\n\nfunction formatDiagnostic(diag: Diagnostic, filePath: string): string {\n const line = diag.range.start.line + 1;\n const col = diag.range.start.character + 1;\n const sev = severityToString(diag.severity);\n const source = diag.source ? ` [${diag.source}]` : \"\";\n const code = diag.code !== undefined ? ` (${diag.code})` : \"\";\n return `${filePath}:${line}:${col} ${sev}: ${diag.message}${code}${source}`;\n}\n\nconst DiagnosticsParams = Type.Object({\n path: Type.String({ description: \"File path to get diagnostics for. Pass \\\"*\\\" to get all workspace diagnostics from all running LSP servers.\" }),\n});\n\ninterface DiagnosticsDetails {\n count: number;\n errors?: number;\n warnings?: number;\n files?: number;\n}\n\nexport function createDiagnosticsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof DiagnosticsParams, DiagnosticsDetails> {\n return {\n name: \"lsp_diagnostics\",\n label: \"LSP Diagnostics\",\n description: \"Get compilation errors and warnings from the LSP server. Pass a file path to check a single file, or pass \\\"*\\\" to get all cached diagnostics across the workspace.\",\n promptSnippet: \"Get compiler errors, warnings, and hints for a source file via LSP. Pass path=\\\"*\\\" to get all workspace diagnostics.\",\n promptGuidelines: [\n \"After making code changes with edit or write, use lsp_diagnostics to check for compilation errors before moving on.\",\n \"To review all workspace diagnostics at once, call lsp_diagnostics with path=\\\"*\\\" — this returns all cached diagnostics from running LSP servers without needing to check files individually.\",\n ],\n parameters: DiagnosticsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n\n // Workspace-wide mode\n if (filePath === \"*\" || filePath === \"\") {\n return executeWorkspaceDiagnostics(manager);\n }\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const diagnostics = client.getDiagnostics(uri);\n\n if (diagnostics.length === 0) {\n return { content: [{ type: \"text\", text: \"No diagnostics (clean).\" }], details: { count: 0 } };\n }\n\n const sorted = [...diagnostics].sort((a, b) => (a.severity ?? 99) - (b.severity ?? 99));\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(filePath));\n const lines = sorted.map((d) => formatDiagnostic(d, relPath));\n const output = lines.join(\"\\n\");\n\n const errors = sorted.filter((d) => d.severity === DiagnosticSeverity.Error).length;\n const warnings = sorted.filter((d) => d.severity === DiagnosticSeverity.Warning).length;\n const other = sorted.length - errors - warnings;\n\n const summary = [\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: sorted.length, errors, warnings },\n };\n }\n\n // Tree-sitter fallback: report syntax errors\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const syntaxErrors = getSyntaxErrors(tree);\n if (syntaxErrors.length === 0) {\n return { content: [{ type: \"text\", text: \"No syntax errors detected. [tree-sitter — syntax only, no type checking]\" }], details: { count: 0 } };\n }\n const relPath = relative(manager.resolvePath(\".\"), absPath);\n const lines = syntaxErrors.map((e) =>\n `${relPath}:${e.line + 1}:${e.character + 1} error: ${e.message}`\n );\n const output = lines.join(\"\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${syntaxErrors.length} syntax error(s) [tree-sitter — syntax only, no type checking]\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: syntaxErrors.length, errors: syntaxErrors.length },\n };\n }\n } catch { /* fall through */ }\n }\n }\n\n return {\n content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }],\n details: { count: 0 },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_diagnostics \"));\n if (args.path && args.path !== \"*\") {\n text += theme.fg(\"accent\", args.path);\n } else {\n text += theme.fg(\"dim\", \"(workspace)\");\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Checking...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"success\", \"✓ No diagnostics\"), 0, 0);\n }\n let text = \"\";\n if (details.errors && details.errors > 0) text += theme.fg(\"error\", `${details.errors} error(s)`);\n if (details.warnings && details.warnings > 0) {\n if (text) text += \" \";\n text += theme.fg(\"warning\", `${details.warnings} warning(s)`);\n }\n if (details.files && details.files > 0) {\n text += theme.fg(\"dim\", ` in ${details.files} file(s)`);\n }\n if (expanded) {\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 30);\n for (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n }\n }\n return new Text(text, 0, 0);\n },\n };\n}\n\n/** Collect all diagnostics from all running LSP servers */\nfunction executeWorkspaceDiagnostics(manager: LspManager) {\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n\n if (running.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"No LSP servers are running. Use lsp_diagnostics with a file path to start a server and check that file.\" }],\n details: { count: 0 },\n };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const allDiagnostics: { relPath: string; diag: Diagnostic }[] = [];\n\n for (const status of running) {\n const client = manager.getRunningClient(status.languageId);\n if (!client) continue;\n\n const diagMap = client.getAllDiagnostics();\n for (const [uri, diagnostics] of diagMap) {\n if (diagnostics.length === 0) continue;\n let absPath: string;\n try {\n absPath = fileURLToPath(uri);\n } catch {\n absPath = uri;\n }\n const relPath = relative(rootDir, absPath);\n for (const diag of diagnostics) {\n allDiagnostics.push({ relPath, diag });\n }\n }\n }\n\n if (allDiagnostics.length === 0) {\n const langs = running.map((s) => s.languageId).join(\", \");\n return {\n content: [{ type: \"text\" as const, text: `No diagnostics across ${running.length} running server(s) (${langs}).` }],\n details: { count: 0 },\n };\n }\n\n // Sort: errors first, then by file path\n allDiagnostics.sort((a, b) => {\n const sevDiff = (a.diag.severity ?? 99) - (b.diag.severity ?? 99);\n if (sevDiff !== 0) return sevDiff;\n return a.relPath.localeCompare(b.relPath);\n });\n\n const errors = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Error).length;\n const warnings = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Warning).length;\n const other = allDiagnostics.length - errors - warnings;\n const fileCount = new Set(allDiagnostics.map((d) => d.relPath)).size;\n\n const summary = [\n `${allDiagnostics.length} diagnostic(s) in ${fileCount} file(s)`,\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const lines = allDiagnostics.map((d) => formatDiagnostic(d.diag, d.relPath));\n const output = lines.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\" as const, text: resultText }],\n details: { count: allDiagnostics.length, errors, warnings, files: fileCount },\n };\n}\n"]}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_diagnostics — Get compilation errors and warnings for a file or the whole workspace.\n *\n * When `path` is provided: returns diagnostics for that single file.\n * When `path` is omitted: returns all cached diagnostics across all running LSP servers.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport { DiagnosticSeverity, type Diagnostic } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveProvider } from \"../resolve-provider.js\";\nimport { getSyntaxErrors } from \"../tree-sitter/symbol-extractor.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction severityToString(severity: number | undefined): string {\n switch (severity) {\n case DiagnosticSeverity.Error: return \"error\";\n case DiagnosticSeverity.Warning: return \"warning\";\n case DiagnosticSeverity.Information: return \"info\";\n case DiagnosticSeverity.Hint: return \"hint\";\n default: return \"unknown\";\n }\n}\n\nfunction formatDiagnostic(diag: Diagnostic, filePath: string): string {\n const line = diag.range.start.line + 1;\n const col = diag.range.start.character + 1;\n const sev = severityToString(diag.severity);\n const source = diag.source ? ` [${diag.source}]` : \"\";\n const code = diag.code !== undefined ? ` (${diag.code})` : \"\";\n return `${filePath}:${line}:${col} ${sev}: ${diag.message}${code}${source}`;\n}\n\nconst DiagnosticsParams = Type.Object({\n path: Type.String({ description: \"File path to get diagnostics for. Pass \\\"*\\\" to get all workspace diagnostics from all running LSP servers.\" }),\n});\n\ninterface DiagnosticsDetails {\n count: number;\n errors?: number;\n warnings?: number;\n files?: number;\n}\n\nexport function createDiagnosticsTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof DiagnosticsParams, DiagnosticsDetails> {\n return {\n name: \"lsp_diagnostics\",\n label: \"LSP Diagnostics\",\n description: \"Get compilation errors and warnings from the LSP server. Pass a file path to check a single file, or pass \\\"*\\\" to get all cached diagnostics across the workspace.\",\n promptSnippet: \"Get compiler errors, warnings, and hints for a source file via LSP. Pass path=\\\"*\\\" to get all workspace diagnostics.\",\n promptGuidelines: [\n \"After making code changes with edit or write, use lsp_diagnostics to check for compilation errors before moving on.\",\n \"To review all workspace diagnostics at once, call lsp_diagnostics with path=\\\"*\\\" — this returns all cached diagnostics from running LSP servers without needing to check files individually.\",\n ],\n parameters: DiagnosticsParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n\n // Workspace-wide mode\n if (filePath === \"*\" || filePath === \"\") {\n return executeWorkspaceDiagnostics(manager);\n }\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const diagnostics = client.getDiagnostics(uri);\n\n if (diagnostics.length === 0) {\n return { content: [{ type: \"text\", text: \"No diagnostics (clean).\" }], details: { count: 0 } };\n }\n\n const sorted = [...diagnostics].sort((a, b) => (a.severity ?? 99) - (b.severity ?? 99));\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(filePath));\n const lines = sorted.map((d) => formatDiagnostic(d, relPath));\n const output = lines.join(\"\\n\");\n\n const errors = sorted.filter((d) => d.severity === DiagnosticSeverity.Error).length;\n const warnings = sorted.filter((d) => d.severity === DiagnosticSeverity.Warning).length;\n const other = sorted.length - errors - warnings;\n\n const summary = [\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: sorted.length, errors, warnings },\n };\n }\n\n // Tree-sitter fallback: report syntax errors\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const syntaxErrors = getSyntaxErrors(tree);\n if (syntaxErrors.length === 0) {\n return { content: [{ type: \"text\", text: \"No syntax errors detected. [tree-sitter — syntax only, no type checking]\" }], details: { count: 0 } };\n }\n const relPath = relative(manager.resolvePath(\".\"), absPath);\n const lines = syntaxErrors.map((e) =>\n `${relPath}:${e.line + 1}:${e.character + 1} error: ${e.message}`\n );\n const output = lines.join(\"\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${syntaxErrors.length} syntax error(s) [tree-sitter — syntax only, no type checking]\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n return {\n content: [{ type: \"text\", text: resultText }],\n details: { count: syntaxErrors.length, errors: syntaxErrors.length },\n };\n }\n } catch { /* fall through */ }\n }\n }\n\n return {\n content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }],\n details: { count: 0 },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_diagnostics \"));\n if (args.path && args.path !== \"*\") {\n text += theme.fg(\"accent\", args.path);\n } else {\n text += theme.fg(\"dim\", \"(workspace)\");\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { expanded, isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Checking...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) {\n return new Text(theme.fg(\"success\", \"✓ No diagnostics\"), 0, 0);\n }\n let text = \"\";\n if (details.errors && details.errors > 0) text += theme.fg(\"error\", `${details.errors} error(s)`);\n if (details.warnings && details.warnings > 0) {\n if (text) text += \" \";\n text += theme.fg(\"warning\", `${details.warnings} warning(s)`);\n }\n if (details.files && details.files > 0) {\n text += theme.fg(\"dim\", ` in ${details.files} file(s)`);\n }\n if (expanded) {\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 30);\n for (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n }\n }\n return new Text(text, 0, 0);\n },\n };\n}\n\n/** Collect all diagnostics from all running LSP servers */\nfunction executeWorkspaceDiagnostics(manager: LspManager) {\n const statuses = manager.getStatus();\n const running = statuses.filter((s) => s.running);\n\n if (running.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"No LSP servers are running. Use lsp_diagnostics with a file path to start a server and check that file.\" }],\n details: { count: 0 },\n };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const allDiagnostics: { relPath: string; diag: Diagnostic }[] = [];\n\n for (const status of running) {\n const client = manager.getRunningClient(status.languageId);\n if (!client) continue;\n\n const diagMap = client.getAllDiagnostics();\n for (const [uri, diagnostics] of diagMap) {\n if (diagnostics.length === 0) continue;\n let absPath: string;\n try {\n absPath = fileURLToPath(uri);\n } catch {\n absPath = uri;\n }\n const relPath = relative(rootDir, absPath);\n for (const diag of diagnostics) {\n allDiagnostics.push({ relPath, diag });\n }\n }\n }\n\n if (allDiagnostics.length === 0) {\n const langs = running.map((s) => s.languageId).join(\", \");\n return {\n content: [{ type: \"text\" as const, text: `No diagnostics across ${running.length} running server(s) (${langs}).` }],\n details: { count: 0 },\n };\n }\n\n // Sort: errors first, then by file path\n allDiagnostics.sort((a, b) => {\n const sevDiff = (a.diag.severity ?? 99) - (b.diag.severity ?? 99);\n if (sevDiff !== 0) return sevDiff;\n return a.relPath.localeCompare(b.relPath);\n });\n\n const errors = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Error).length;\n const warnings = allDiagnostics.filter((d) => d.diag.severity === DiagnosticSeverity.Warning).length;\n const other = allDiagnostics.length - errors - warnings;\n const fileCount = new Set(allDiagnostics.map((d) => d.relPath)).size;\n\n const summary = [\n `${allDiagnostics.length} diagnostic(s) in ${fileCount} file(s)`,\n errors > 0 ? `${errors} error(s)` : null,\n warnings > 0 ? `${warnings} warning(s)` : null,\n other > 0 ? `${other} other` : null,\n ].filter(Boolean).join(\", \");\n\n const lines = allDiagnostics.map((d) => formatDiagnostic(d.diag, d.relPath));\n const output = lines.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${summary}\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} diagnostics]`;\n }\n\n return {\n content: [{ type: \"text\" as const, text: resultText }],\n details: { count: allDiagnostics.length, errors, warnings, files: fileCount },\n };\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * lsp_hover — Get type information and documentation 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 HoverParams: Type.TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/hover.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,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;AAuB1E,QAAA,MAAM,WAAW;;;;;EAKf,CAAC;AAEH,UAAU,YAAY;IAAG,SAAS,EAAE,OAAO,CAAA;CAAE;AAE7C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,WAAW,EAAE,YAAY,CAAC,CA4GlD","sourcesContent":["// @ts-nocheck\n/**\n * lsp_hover — Get type information and documentation at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Hover, MarkupContent } 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 { resolveProvider } from \"../resolve-provider.js\";\nimport { getEnclosingDeclaration, getSignatureText } from \"../tree-sitter/symbol-extractor.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\n\nfunction formatHoverContent(hover: Hover): string {\n const contents = hover.contents;\n if (typeof contents === \"string\") return contents;\n if (\"kind\" in contents && \"value\" in contents) return (contents as MarkupContent).value;\n if (\"language\" in contents && \"value\" in contents) {\n return `\\`\\`\\`${(contents as any).language}\\n${(contents as any).value}\\n\\`\\`\\``;\n }\n if (Array.isArray(contents)) {\n return contents.map((c) => {\n if (typeof c === \"string\") return c;\n if (\"language\" in c && \"value\" in c) return `\\`\\`\\`${c.language}\\n${c.value}\\n\\`\\`\\``;\n return String(c);\n }).join(\"\\n\\n\");\n }\n return String(contents);\n}\n\nconst HoverParams = 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});\n\ninterface HoverDetails { hasResult: boolean }\n\nexport function createHoverTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof HoverParams, HoverDetails> {\n return {\n name: \"lsp_hover\",\n label: \"LSP Hover\",\n description: \"Get type information and documentation for a symbol at a specific position in a file. Line and character are 1-indexed.\",\n promptSnippet: \"Get type info and docs for a symbol at a file position via LSP\",\n parameters: HoverParams,\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: { hasResult: false } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { hasResult: false } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const hover = await client.sendRequest<Hover | null>(\"textDocument/hover\", {\n textDocument: { uri }, position,\n });\n if (!hover) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position.`\n : \"No hover information available at this position.\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n const hoverText = formatHoverContent(hover);\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${hoverText}` : hoverText;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP hover request failed: ${err.message}` }], details: { hasResult: false } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const decl = getEnclosingDeclaration(tree, line - 1, character - 1);\n if (decl) {\n const sig = getSignatureText(decl);\n const kindLabel = decl.type.replace(/_/g, \" \");\n let text = `${kindLabel} [tree-sitter]\\n\\n\\`\\`\\`\\n${sig}\\n\\`\\`\\``;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n }\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position. [tree-sitter]`\n : \"No hover information available at this position. [tree-sitter]\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { hasResult: false } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_hover \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Looking up...\"), 0, 0);\n if (!result.details?.hasResult) return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 5);\n return new Text(lines.map((l) => theme.fg(\"dim\", l)).join(\"\\n\"), 0, 0);\n }\n return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/hover.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,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;AAuB1E,QAAA,MAAM,WAAW;;;;;EAKf,CAAC;AAEH,UAAU,YAAY;IAAG,SAAS,EAAE,OAAO,CAAA;CAAE;AAE7C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,WAAW,EAAE,YAAY,CAAC,CA4GlD","sourcesContent":["// @ts-nocheck\n/**\n * lsp_hover — Get type information and documentation at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Hover, MarkupContent } 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 { resolveProvider } from \"../resolve-provider.js\";\nimport { getEnclosingDeclaration, getSignatureText } from \"../tree-sitter/symbol-extractor.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\n\nfunction formatHoverContent(hover: Hover): string {\n const contents = hover.contents;\n if (typeof contents === \"string\") return contents;\n if (\"kind\" in contents && \"value\" in contents) return (contents as MarkupContent).value;\n if (\"language\" in contents && \"value\" in contents) {\n return `\\`\\`\\`${(contents as any).language}\\n${(contents as any).value}\\n\\`\\`\\``;\n }\n if (Array.isArray(contents)) {\n return contents.map((c) => {\n if (typeof c === \"string\") return c;\n if (\"language\" in c && \"value\" in c) return `\\`\\`\\`${c.language}\\n${c.value}\\n\\`\\`\\``;\n return String(c);\n }).join(\"\\n\\n\");\n }\n return String(contents);\n}\n\nconst HoverParams = 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});\n\ninterface HoverDetails { hasResult: boolean }\n\nexport function createHoverTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof HoverParams, HoverDetails> {\n return {\n name: \"lsp_hover\",\n label: \"LSP Hover\",\n description: \"Get type information and documentation for a symbol at a specific position in a file. Line and character are 1-indexed.\",\n promptSnippet: \"Get type info and docs for a symbol at a file position via LSP\",\n parameters: HoverParams,\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: { hasResult: false } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { hasResult: false } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const hover = await client.sendRequest<Hover | null>(\"textDocument/hover\", {\n textDocument: { uri }, position,\n });\n if (!hover) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position.`\n : \"No hover information available at this position.\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n const hoverText = formatHoverContent(hover);\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${hoverText}` : hoverText;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP hover request failed: ${err.message}` }], details: { hasResult: false } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const decl = getEnclosingDeclaration(tree, line - 1, character - 1);\n if (decl) {\n const sig = getSignatureText(decl);\n const kindLabel = decl.type.replace(/_/g, \" \");\n let text = `${kindLabel} [tree-sitter]\\n\\n\\`\\`\\`\\n${sig}\\n\\`\\`\\``;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n }\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position. [tree-sitter]`\n : \"No hover information available at this position. [tree-sitter]\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { hasResult: false } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_hover \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Looking up...\"), 0, 0);\n if (!result.details?.hasResult) return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 5);\n return new Text(lines.map((l) => theme.fg(\"dim\", l)).join(\"\\n\"), 0, 0);\n }\n return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n },\n };\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * lsp_hover — Get type information and documentation 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 { resolveProvider } from "../resolve-provider.js";
8
8
  import { getEnclosingDeclaration, getSignatureText } from "../tree-sitter/symbol-extractor.js";
9
9
  import { resolveSymbolPosition, getSymbolNames } from "../shared/resolve-position.js";
@@ -1 +1 @@
1
- {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/hover.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_hover — Get type information and documentation at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Hover, MarkupContent } 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 { resolveProvider } from \"../resolve-provider.js\";\nimport { getEnclosingDeclaration, getSignatureText } from \"../tree-sitter/symbol-extractor.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\n\nfunction formatHoverContent(hover: Hover): string {\n const contents = hover.contents;\n if (typeof contents === \"string\") return contents;\n if (\"kind\" in contents && \"value\" in contents) return (contents as MarkupContent).value;\n if (\"language\" in contents && \"value\" in contents) {\n return `\\`\\`\\`${(contents as any).language}\\n${(contents as any).value}\\n\\`\\`\\``;\n }\n if (Array.isArray(contents)) {\n return contents.map((c) => {\n if (typeof c === \"string\") return c;\n if (\"language\" in c && \"value\" in c) return `\\`\\`\\`${c.language}\\n${c.value}\\n\\`\\`\\``;\n return String(c);\n }).join(\"\\n\\n\");\n }\n return String(contents);\n}\n\nconst HoverParams = 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});\n\ninterface HoverDetails { hasResult: boolean }\n\nexport function createHoverTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof HoverParams, HoverDetails> {\n return {\n name: \"lsp_hover\",\n label: \"LSP Hover\",\n description: \"Get type information and documentation for a symbol at a specific position in a file. Line and character are 1-indexed.\",\n promptSnippet: \"Get type info and docs for a symbol at a file position via LSP\",\n parameters: HoverParams,\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: { hasResult: false } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { hasResult: false } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const hover = await client.sendRequest<Hover | null>(\"textDocument/hover\", {\n textDocument: { uri }, position,\n });\n if (!hover) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position.`\n : \"No hover information available at this position.\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n const hoverText = formatHoverContent(hover);\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${hoverText}` : hoverText;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP hover request failed: ${err.message}` }], details: { hasResult: false } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const decl = getEnclosingDeclaration(tree, line - 1, character - 1);\n if (decl) {\n const sig = getSignatureText(decl);\n const kindLabel = decl.type.replace(/_/g, \" \");\n let text = `${kindLabel} [tree-sitter]\\n\\n\\`\\`\\`\\n${sig}\\n\\`\\`\\``;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n }\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position. [tree-sitter]`\n : \"No hover information available at this position. [tree-sitter]\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { hasResult: false } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_hover \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Looking up...\"), 0, 0);\n if (!result.details?.hasResult) return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 5);\n return new Text(lines.map((l) => theme.fg(\"dim\", l)).join(\"\\n\"), 0, 0);\n }\n return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/hover.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_hover — Get type information and documentation at a position.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Hover, MarkupContent } 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 { resolveProvider } from \"../resolve-provider.js\";\nimport { getEnclosingDeclaration, getSignatureText } from \"../tree-sitter/symbol-extractor.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\n\nfunction formatHoverContent(hover: Hover): string {\n const contents = hover.contents;\n if (typeof contents === \"string\") return contents;\n if (\"kind\" in contents && \"value\" in contents) return (contents as MarkupContent).value;\n if (\"language\" in contents && \"value\" in contents) {\n return `\\`\\`\\`${(contents as any).language}\\n${(contents as any).value}\\n\\`\\`\\``;\n }\n if (Array.isArray(contents)) {\n return contents.map((c) => {\n if (typeof c === \"string\") return c;\n if (\"language\" in c && \"value\" in c) return `\\`\\`\\`${c.language}\\n${c.value}\\n\\`\\`\\``;\n return String(c);\n }).join(\"\\n\\n\");\n }\n return String(contents);\n}\n\nconst HoverParams = 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});\n\ninterface HoverDetails { hasResult: boolean }\n\nexport function createHoverTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof HoverParams, HoverDetails> {\n return {\n name: \"lsp_hover\",\n label: \"LSP Hover\",\n description: \"Get type information and documentation for a symbol at a specific position in a file. Line and character are 1-indexed.\",\n promptSnippet: \"Get type info and docs for a symbol at a file position via LSP\",\n parameters: HoverParams,\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: { hasResult: false } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { hasResult: false } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n\n if (client) {\n // LSP path\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const hover = await client.sendRequest<Hover | null>(\"textDocument/hover\", {\n textDocument: { uri }, position,\n });\n if (!hover) {\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position.`\n : \"No hover information available at this position.\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n const hoverText = formatHoverContent(hover);\n const text = resolvedFrom ? `${resolvedFrom}\\n\\n${hoverText}` : hoverText;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP hover request failed: ${err.message}` }], details: { hasResult: false } };\n }\n }\n\n // Tree-sitter fallback\n if (treeSitter) {\n const provider = resolveProvider(filePath, manager, treeSitter);\n if (provider.type === \"tree-sitter\") {\n try {\n const absPath = manager.resolvePath(filePath);\n const content = await readFile(absPath, \"utf-8\");\n const tree = await treeSitter.parse(absPath, content);\n if (tree) {\n const decl = getEnclosingDeclaration(tree, line - 1, character - 1);\n if (decl) {\n const sig = getSignatureText(decl);\n const kindLabel = decl.type.replace(/_/g, \" \");\n let text = `${kindLabel} [tree-sitter]\\n\\n\\`\\`\\`\\n${sig}\\n\\`\\`\\``;\n if (resolvedFrom) text = `${resolvedFrom}\\n\\n${text}`;\n return { content: [{ type: \"text\", text }], details: { hasResult: true } };\n }\n const text = resolvedFrom\n ? `${resolvedFrom}\\n\\nNo hover information available at this position. [tree-sitter]`\n : \"No hover information available at this position. [tree-sitter]\";\n return { content: [{ type: \"text\", text }], details: { hasResult: false } };\n }\n } catch { /* fall through */ }\n }\n }\n\n return { content: [{ type: \"text\", text: manager.getUnavailableReason(filePath) }], details: { hasResult: false } };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_hover \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Looking up...\"), 0, 0);\n if (!result.details?.hasResult) return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n const content = result.content[0];\n if (content?.type === \"text\") {\n const lines = content.text.split(\"\\n\").slice(0, 5);\n return new Text(lines.map((l) => theme.fg(\"dim\", l)).join(\"\\n\"), 0, 0);\n }\n return new Text(theme.fg(\"dim\", \"No info\"), 0, 0);\n },\n };\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * lsp_references — Find all references to a symbol.
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 ReferencesParams: Type.TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/references.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,QAAA,MAAM,gBAAgB;;;;;;EAQpB,CAAC;AAEH,UAAU,iBAAiB;IAAG,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CAsF5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_references — Find all references to a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { formatLocation } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\n\nconst ReferencesParams = 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 includeDeclaration: Type.Optional(\n Type.Boolean({ description: \"Include the declaration in results (default: true)\" })\n ),\n});\n\ninterface ReferencesDetails { count: number }\n\nexport function createReferencesTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof ReferencesParams, ReferencesDetails> {\n return {\n name: \"lsp_references\",\n label: \"LSP References\",\n description: \"Find all references to a symbol at a specific position. Returns a list of file locations. Line and character are 1-indexed.\",\n promptSnippet: \"Find all references to a symbol at a file position via LSP\",\n parameters: ReferencesParams,\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 } };\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 } };\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 } };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const locations = await client.sendRequest<Location[] | null>(\"textDocument/references\", {\n textDocument: { uri }, position,\n context: { includeDeclaration: params.includeDeclaration ?? true },\n });\n\n if (!locations || locations.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo references found.` : \"No references found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const formatted = locations.map((l) => formatLocation(l, rootDir));\n const output = formatted.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${locations.length} reference(s) found:\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} references]`;\n }\n if (resolvedFrom) resultText = `${resolvedFrom}\\n\\n${resultText}`;\n\n return { content: [{ type: \"text\", text: resultText }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP references request failed: ${err.message}` }], details: { count: 0 } };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_references \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Searching...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) return new Text(theme.fg(\"dim\", \"No references found\"), 0, 0);\n return new Text(theme.fg(\"success\", `${details.count} reference(s)`), 0, 0);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/references.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,QAAA,MAAM,gBAAgB;;;;;;EAQpB,CAAC;AAEH,UAAU,iBAAiB;IAAG,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EACnB,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CAsF5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_references — Find all references to a symbol.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Location } from \"vscode-languageserver-protocol\";\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 type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { formatLocation } from \"../shared/format.js\";\nimport { resolveSymbolPosition, getSymbolNames } from \"../shared/resolve-position.js\";\n\nconst ReferencesParams = 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 includeDeclaration: Type.Optional(\n Type.Boolean({ description: \"Include the declaration in results (default: true)\" })\n ),\n});\n\ninterface ReferencesDetails { count: number }\n\nexport function createReferencesTool(\n manager: LspManager,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof ReferencesParams, ReferencesDetails> {\n return {\n name: \"lsp_references\",\n label: \"LSP References\",\n description: \"Find all references to a symbol at a specific position. Returns a list of file locations. Line and character are 1-indexed.\",\n promptSnippet: \"Find all references to a symbol at a file position via LSP\",\n parameters: ReferencesParams,\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 } };\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 } };\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 } };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = { line: line - 1, character: character - 1 };\n\n try {\n const locations = await client.sendRequest<Location[] | null>(\"textDocument/references\", {\n textDocument: { uri }, position,\n context: { includeDeclaration: params.includeDeclaration ?? true },\n });\n\n if (!locations || locations.length === 0) {\n const text = resolvedFrom ? `${resolvedFrom}\\n\\nNo references found.` : \"No references found.\";\n return { content: [{ type: \"text\", text }], details: { count: 0 } };\n }\n\n const rootDir = manager.resolvePath(\".\");\n const formatted = locations.map((l) => formatLocation(l, rootDir));\n const output = formatted.join(\"\\n\");\n\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let resultText = `${locations.length} reference(s) found:\\n\\n${truncation.content}`;\n if (truncation.truncated) {\n resultText += `\\n\\n[Output truncated: showing ${truncation.outputLines} of ${truncation.totalLines} references]`;\n }\n if (resolvedFrom) resultText = `${resolvedFrom}\\n\\n${resultText}`;\n\n return { content: [{ type: \"text\", text: resultText }], details: { count: locations.length } };\n } catch (err: any) {\n return { content: [{ type: \"text\", text: `LSP references request failed: ${err.message}` }], details: { count: 0 } };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_references \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Searching...\"), 0, 0);\n const details = result.details;\n if (!details || details.count === 0) return new Text(theme.fg(\"dim\", \"No references found\"), 0, 0);\n return new Text(theme.fg(\"success\", `${details.count} reference(s)`), 0, 0);\n },\n };\n}\n"]}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { Type } from "@sinclair/typebox";
6
6
  import { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from "../../../../core/tools/truncate.js";
7
- import { Text } from "@earendil-works/pi-tui";
7
+ import { Text } from "@ashx-j/lunr-tui";
8
8
  import { formatLocation } from "../shared/format.js";
9
9
  import { resolveSymbolPosition, getSymbolNames } from "../shared/resolve-position.js";
10
10
  const ReferencesParams = Type.Object({