gsd-pi 2.58.0 → 2.59.0-dev.3de3832

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 (841) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +60 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  28. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  29. package/dist/resources/extensions/gsd/auto-worktree.js +199 -12
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  36. package/dist/resources/extensions/gsd/captures.js +56 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  41. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  42. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  43. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  44. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  45. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  46. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  47. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  48. package/dist/resources/extensions/gsd/doctor.js +3 -1
  49. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  50. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  51. package/dist/resources/extensions/gsd/forensics.js +123 -20
  52. package/dist/resources/extensions/gsd/git-service.js +105 -2
  53. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  54. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  55. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  56. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  57. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  58. package/dist/resources/extensions/gsd/index.js +1 -1
  59. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  60. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  61. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  62. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  63. package/dist/resources/extensions/gsd/model-router.js +35 -1
  64. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  65. package/dist/resources/extensions/gsd/notifications.js +16 -1
  66. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  67. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  68. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  69. package/dist/resources/extensions/gsd/paths.js +45 -0
  70. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  71. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  72. package/dist/resources/extensions/gsd/preferences.js +13 -16
  73. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  79. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  85. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  86. package/dist/resources/extensions/gsd/rethink.js +5 -0
  87. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  88. package/dist/resources/extensions/gsd/state.js +85 -27
  89. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  91. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  92. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  93. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  94. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  95. package/dist/resources/extensions/gsd/undo.js +2 -2
  96. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  97. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  98. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  99. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  100. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  101. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  102. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  103. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  104. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  105. package/dist/resources/extensions/mcp-client/index.js +11 -7
  106. package/dist/resources/extensions/ollama/index.js +112 -0
  107. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  108. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  109. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  110. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  111. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  112. package/dist/resources/extensions/ollama/types.js +2 -0
  113. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  114. package/dist/resources/extensions/search-the-web/url-utils.js +17 -0
  115. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  116. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  117. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  118. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  119. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  120. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  121. package/dist/security-overrides.d.ts +11 -0
  122. package/dist/security-overrides.js +41 -0
  123. package/dist/startup-model-validation.d.ts +39 -0
  124. package/dist/startup-model-validation.js +50 -0
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  127. package/dist/web/standalone/.next/build-manifest.json +4 -4
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  130. package/dist/web/standalone/.next/required-server-files.json +4 -4
  131. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  132. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  134. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  142. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  198. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  218. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  224. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/index.html +1 -1
  234. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  235. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  236. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  237. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  239. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  240. package/dist/web/standalone/.next/server/app/page.js +2 -2
  241. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  243. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  244. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  245. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/middleware.js +2 -2
  248. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  250. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  251. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  252. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  253. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  254. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  255. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  256. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  260. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  262. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  263. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  265. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  267. package/dist/web/standalone/server.js +1 -1
  268. package/dist/web-mode.js +2 -1
  269. package/dist/welcome-screen.d.ts +1 -0
  270. package/dist/welcome-screen.js +32 -6
  271. package/package.json +2 -2
  272. package/packages/daemon/src/daemon.ts +1 -1
  273. package/packages/daemon/src/discord-bot.ts +11 -0
  274. package/packages/daemon/src/event-bridge.ts +15 -9
  275. package/packages/daemon/src/event-formatter.ts +30 -2
  276. package/packages/daemon/src/message-batcher.test.ts +2 -2
  277. package/packages/daemon/src/message-batcher.ts +9 -3
  278. package/packages/daemon/src/orchestrator.test.ts +1 -0
  279. package/packages/daemon/src/orchestrator.ts +106 -2
  280. package/packages/native/dist/ast/index.js +9 -5
  281. package/packages/native/dist/ast/types.js +2 -1
  282. package/packages/native/dist/clipboard/index.js +12 -7
  283. package/packages/native/dist/clipboard/types.js +2 -1
  284. package/packages/native/dist/diff/index.js +12 -7
  285. package/packages/native/dist/diff/types.js +2 -1
  286. package/packages/native/dist/fd/index.js +6 -3
  287. package/packages/native/dist/fd/types.js +2 -1
  288. package/packages/native/dist/glob/index.js +9 -5
  289. package/packages/native/dist/glob/types.js +2 -1
  290. package/packages/native/dist/grep/index.js +9 -5
  291. package/packages/native/dist/grep/types.js +2 -1
  292. package/packages/native/dist/gsd-parser/index.js +18 -11
  293. package/packages/native/dist/gsd-parser/types.js +2 -1
  294. package/packages/native/dist/highlight/index.js +12 -7
  295. package/packages/native/dist/highlight/types.js +2 -1
  296. package/packages/native/dist/html/index.js +6 -3
  297. package/packages/native/dist/html/types.js +2 -1
  298. package/packages/native/dist/image/index.js +10 -5
  299. package/packages/native/dist/image/types.js +7 -4
  300. package/packages/native/dist/index.js +70 -17
  301. package/packages/native/dist/json-parse/index.js +13 -8
  302. package/packages/native/dist/native.js +47 -10
  303. package/packages/native/dist/ps/index.js +15 -9
  304. package/packages/native/dist/ps/types.js +2 -1
  305. package/packages/native/dist/stream-process/index.js +12 -7
  306. package/packages/native/dist/text/index.js +24 -14
  307. package/packages/native/dist/text/types.js +5 -2
  308. package/packages/native/dist/truncate/index.js +12 -7
  309. package/packages/native/dist/ttsr/index.js +12 -7
  310. package/packages/native/dist/ttsr/types.js +2 -1
  311. package/packages/native/dist/xxhash/index.js +9 -5
  312. package/packages/native/package.json +19 -19
  313. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  314. package/packages/native/src/native.ts +9 -8
  315. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  316. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  317. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  318. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  319. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  320. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  321. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  322. package/packages/pi-agent-core/src/proxy.ts +1 -1
  323. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  324. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  325. package/packages/pi-ai/dist/index.d.ts +1 -0
  326. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/index.js +1 -0
  328. package/packages/pi-ai/dist/index.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  331. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  333. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  334. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  335. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  336. package/packages/pi-ai/dist/types.d.ts +3 -3
  337. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  338. package/packages/pi-ai/dist/types.js.map +1 -1
  339. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  340. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  341. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  342. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  343. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  344. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  346. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  347. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  350. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  351. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  352. package/packages/pi-ai/src/index.ts +1 -0
  353. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  354. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  355. package/packages/pi-ai/src/types.ts +3 -2
  356. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  357. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  358. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  359. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  360. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  362. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  364. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  366. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  368. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  369. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  370. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  371. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  373. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  375. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  379. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  380. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  382. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  383. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  384. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  395. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  397. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  399. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  400. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  401. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  402. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  403. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  405. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  407. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  409. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  412. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  414. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  415. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  418. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  420. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  421. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  422. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  423. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  425. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +8 -0
  427. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  428. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +23 -2
  429. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +89 -2
  431. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  433. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  434. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  435. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  437. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  439. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  440. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  441. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  442. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  443. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  444. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts +2 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts.map +1 -0
  446. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js +83 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js.map +1 -0
  448. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -0
  449. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/settings-manager.js +36 -3
  451. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  453. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  454. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  455. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  456. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  457. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  458. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  459. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  460. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  461. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  462. package/packages/pi-coding-agent/dist/index.d.ts +3 -2
  463. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  464. package/packages/pi-coding-agent/dist/index.js +2 -1
  465. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
  533. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  534. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +22 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
  537. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
  538. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
  539. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
  540. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  541. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  542. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +57 -4
  543. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  548. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  549. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  550. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  551. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  552. package/packages/pi-coding-agent/package.json +1 -1
  553. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  554. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  555. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  556. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  557. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  558. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  559. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  560. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  561. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  562. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  563. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  564. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  565. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  566. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  567. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  568. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  569. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  570. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  571. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +111 -1
  572. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +26 -2
  573. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  574. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  575. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  576. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  577. package/packages/pi-coding-agent/src/core/settings-manager.ts +44 -3
  578. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  579. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  580. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  581. package/packages/pi-coding-agent/src/index.ts +11 -0
  582. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  583. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  584. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  585. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  586. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  587. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  588. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  589. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  590. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  591. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  592. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  593. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  594. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  595. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  596. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  597. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  598. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  599. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  600. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  601. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  602. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  603. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  604. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  605. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
  606. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +21 -1
  607. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -3
  608. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -1
  609. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  610. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  611. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  612. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  613. package/packages/pi-tui/dist/terminal.js +9 -0
  614. package/packages/pi-tui/dist/terminal.js.map +1 -1
  615. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  616. package/packages/pi-tui/dist/tui.js +9 -0
  617. package/packages/pi-tui/dist/tui.js.map +1 -1
  618. package/packages/pi-tui/src/terminal.ts +14 -0
  619. package/packages/pi-tui/src/tui.ts +8 -0
  620. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  621. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  622. package/pkg/package.json +1 -1
  623. package/scripts/ensure-workspace-builds.cjs +45 -14
  624. package/src/resources/agents/researcher.md +1 -1
  625. package/src/resources/extensions/ask-user-questions.ts +21 -3
  626. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  627. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  628. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  629. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  630. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  631. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  632. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  633. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  634. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  635. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  636. package/src/resources/extensions/google-search/index.ts +2 -1
  637. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  638. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  639. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  640. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  641. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  642. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  643. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  644. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  645. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  646. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  647. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  648. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  649. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  650. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  651. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  652. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  653. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  654. package/src/resources/extensions/gsd/captures.ts +63 -3
  655. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  656. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  657. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  658. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  659. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  660. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  661. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  662. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  663. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  664. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  665. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  666. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  667. package/src/resources/extensions/gsd/doctor.ts +3 -1
  668. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  669. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  670. package/src/resources/extensions/gsd/forensics.ts +144 -20
  671. package/src/resources/extensions/gsd/git-service.ts +119 -3
  672. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  673. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  674. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  675. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  676. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  677. package/src/resources/extensions/gsd/index.ts +1 -0
  678. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  679. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  680. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  681. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  682. package/src/resources/extensions/gsd/model-router.ts +35 -1
  683. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  684. package/src/resources/extensions/gsd/notifications.ts +16 -0
  685. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  686. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  687. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  688. package/src/resources/extensions/gsd/paths.ts +44 -0
  689. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  690. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  691. package/src/resources/extensions/gsd/preferences.ts +13 -15
  692. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  693. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  694. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  695. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  696. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  697. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  698. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  699. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  700. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  701. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  702. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  703. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  704. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  705. package/src/resources/extensions/gsd/rethink.ts +6 -0
  706. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  707. package/src/resources/extensions/gsd/state.ts +84 -32
  708. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +29 -0
  709. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  710. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  711. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  712. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  713. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  714. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  715. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  716. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  717. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  718. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  719. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  720. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  721. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  722. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  723. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  724. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  725. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  726. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  727. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  728. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  729. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  730. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  731. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  732. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  733. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  734. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  735. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  736. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  737. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  738. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  739. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  740. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  741. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  742. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  743. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  744. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  745. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  746. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  747. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  748. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  749. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  750. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  751. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  752. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  753. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  754. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  755. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  756. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  757. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  758. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  759. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  760. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  761. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  762. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  763. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  764. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  765. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  766. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  767. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  768. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  769. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  770. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  771. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  772. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  773. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  774. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  775. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  776. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  777. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  778. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  779. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  780. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  782. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  783. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  784. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  785. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  786. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  787. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  788. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  789. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  790. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  791. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  792. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  793. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  794. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  795. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  796. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  797. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  798. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  799. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  800. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  801. package/src/resources/extensions/gsd/types.ts +4 -2
  802. package/src/resources/extensions/gsd/undo.ts +2 -2
  803. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  804. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  805. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  806. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  807. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  808. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  809. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  810. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  811. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  812. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  813. package/src/resources/extensions/mcp-client/index.ts +13 -7
  814. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  815. package/src/resources/extensions/ollama/index.ts +130 -0
  816. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  817. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  818. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  819. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  820. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  821. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  822. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  823. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  824. package/src/resources/extensions/ollama/types.ts +130 -0
  825. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  826. package/src/resources/extensions/search-the-web/url-utils.ts +19 -0
  827. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  828. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  829. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  830. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  831. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  832. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  833. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  834. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  835. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  836. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  837. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  838. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  839. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  840. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → Y_HG7cJVptjBpkVSQQiFi}/_buildManifest.js +0 -0
  841. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → Y_HG7cJVptjBpkVSQQiFi}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServerForFile, getServersForFile, type LspConfig, loadConfig, hasRootMarkers, resolveCommand } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function formatLocationResults(\n\tresult: Location | Location[] | LocationLink | LocationLink[] | null,\n\tlabel: string,\n\tcwd: string,\n): Promise<string> {\n\tconst locations = normalizeLocationResult(result);\n\tif (locations.length === 0) {\n\t\treturn `No ${label} found`;\n\t}\n\tconst lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));\n\treturn `Found ${locations.length} ${label}(s):\\n${lines.join(\"\\n\")}`;\n}\n\nasync function formatCallHierarchyResults(\n\tclient: LspClient,\n\tposition: { line: number; character: number },\n\turi: string,\n\tdirection: \"incoming\" | \"outgoing\",\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst prepareResult = (await sendRequest(\n\t\tclient,\n\t\t\"textDocument/prepareCallHierarchy\",\n\t\t{ textDocument: { uri }, position },\n\t\tsignal,\n\t)) as CallHierarchyItem[] | null;\n\n\tif (!prepareResult || prepareResult.length === 0) {\n\t\treturn \"No call hierarchy item found at this position\";\n\t}\n\n\tconst method = direction === \"incoming\" ? \"callHierarchy/incomingCalls\" : \"callHierarchy/outgoingCalls\";\n\tconst callResult = (await sendRequest(client, method, { item: prepareResult[0] }, signal)) as\n\t\t| CallHierarchyIncomingCall[]\n\t\t| CallHierarchyOutgoingCall[]\n\t\t| null;\n\n\tif (!callResult || callResult.length === 0) {\n\t\tconst verb = direction === \"incoming\" ? \"incoming calls\" : \"outgoing calls\";\n\t\tconst prep = direction === \"incoming\" ? \"for\" : \"from\";\n\t\treturn `No ${verb} found ${prep} ${prepareResult[0].name}`;\n\t}\n\n\tconst lines: string[] = [];\n\tconst limited = callResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\tfor (const call of limited) {\n\t\tconst item = \"from\" in call ? call.from : call.to;\n\t\tconst header = formatCallHierarchyItem(item, cwd);\n\t\tconst filePath = uriToFile(item.uri);\n\t\tconst callLine = (\"from\" in call ? call.fromRanges[0]?.start.line : undefined) ?? item.selectionRange.start.line;\n\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\tif (context.length > 0) {\n\t\t\tlines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t} else {\n\t\t\tlines.push(` ${header}`);\n\t\t}\n\t}\n\n\tconst noun = direction === \"incoming\" ? \"caller\" : \"callee\";\n\tconst prep = direction === \"incoming\" ? \"of\" : \"from\";\n\tconst truncation = callResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t? `\\n ... ${callResult.length - REFERENCE_CONTEXT_LIMIT} additional ${noun}(s) omitted`\n\t\t: \"\";\n\treturn `${callResult.length} ${noun}(s) ${prep} ${prepareResult[0].name}:\\n${lines.join(\"\\n\")}${truncation}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tlet serverStatus: string;\n\t\t\t\tif (servers.length > 0) {\n\t\t\t\t\tserverStatus = `Active language servers: ${servers.join(\", \")}`;\n\t\t\t\t} else {\n\t\t\t\t\t// Diagnose why no servers were detected\n\t\t\t\t\tconst DEFAULTS = (await import(\"./defaults.json\", { with: { type: \"json\" } })).default as Record<string, { command: string; rootMarkers: string[] }>;\n\t\t\t\t\tconst diagnostics: string[] = [\"No language servers configured for this project.\"];\n\t\t\t\t\tconst matchedButMissing: string[] = [];\n\t\t\t\t\tconst noMarkers: string[] = [];\n\n\t\t\t\t\tfor (const [name, def] of Object.entries(DEFAULTS)) {\n\t\t\t\t\t\tif (hasRootMarkers(cwd, def.rootMarkers)) {\n\t\t\t\t\t\t\tconst resolved = resolveCommand(def.command, cwd);\n\t\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\t\tmatchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (matchedButMissing.length > 0) {\n\t\t\t\t\t\tdiagnostics.push(\"\\nDetected projects missing language servers:\");\n\t\t\t\t\t\tdiagnostics.push(...matchedButMissing);\n\t\t\t\t\t\tdiagnostics.push(\"\\nInstall the missing server command and restart GSD, or run: lsp reload\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiagnostics.push(\"No recognized project markers found in the working directory.\");\n\t\t\t\t\t\tdiagnostics.push(\"LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tserverStatus = diagnostics.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"type definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"implementation\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"incoming\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"outgoing\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServerForFile, getServersForFile, type LspConfig, loadConfig, hasRootMarkers, resolveCommand } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function formatLocationResults(\n\tresult: Location | Location[] | LocationLink | LocationLink[] | null,\n\tlabel: string,\n\tcwd: string,\n): Promise<string> {\n\tconst locations = normalizeLocationResult(result);\n\tif (locations.length === 0) {\n\t\treturn `No ${label} found`;\n\t}\n\tconst lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));\n\treturn `Found ${locations.length} ${label}(s):\\n${lines.join(\"\\n\")}`;\n}\n\nasync function formatCallHierarchyResults(\n\tclient: LspClient,\n\tposition: { line: number; character: number },\n\turi: string,\n\tdirection: \"incoming\" | \"outgoing\",\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst prepareResult = (await sendRequest(\n\t\tclient,\n\t\t\"textDocument/prepareCallHierarchy\",\n\t\t{ textDocument: { uri }, position },\n\t\tsignal,\n\t)) as CallHierarchyItem[] | null;\n\n\tif (!prepareResult || prepareResult.length === 0) {\n\t\treturn \"No call hierarchy item found at this position\";\n\t}\n\n\tconst method = direction === \"incoming\" ? \"callHierarchy/incomingCalls\" : \"callHierarchy/outgoingCalls\";\n\tconst callResult = (await sendRequest(client, method, { item: prepareResult[0] }, signal)) as\n\t\t| CallHierarchyIncomingCall[]\n\t\t| CallHierarchyOutgoingCall[]\n\t\t| null;\n\n\tif (!callResult || callResult.length === 0) {\n\t\tconst verb = direction === \"incoming\" ? \"incoming calls\" : \"outgoing calls\";\n\t\tconst prep = direction === \"incoming\" ? \"for\" : \"from\";\n\t\treturn `No ${verb} found ${prep} ${prepareResult[0].name}`;\n\t}\n\n\tconst lines: string[] = [];\n\tconst limited = callResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\tfor (const call of limited) {\n\t\tconst item = \"from\" in call ? call.from : call.to;\n\t\tconst header = formatCallHierarchyItem(item, cwd);\n\t\tconst filePath = uriToFile(item.uri);\n\t\tconst callLine = (\"from\" in call ? call.fromRanges[0]?.start.line : undefined) ?? item.selectionRange.start.line;\n\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\tif (context.length > 0) {\n\t\t\tlines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t} else {\n\t\t\tlines.push(` ${header}`);\n\t\t}\n\t}\n\n\tconst noun = direction === \"incoming\" ? \"caller\" : \"callee\";\n\tconst prep = direction === \"incoming\" ? \"of\" : \"from\";\n\tconst truncation = callResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t? `\\n ... ${callResult.length - REFERENCE_CONTEXT_LIMIT} additional ${noun}(s) omitted`\n\t\t: \"\";\n\treturn `${callResult.length} ${noun}(s) ${prep} ${prepareResult[0].name}:\\n${lines.join(\"\\n\")}${truncation}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t// On Windows, project-type commands (tsc, cargo, etc.) may be .cmd\n\t\t// wrappers that need shell resolution to avoid ENOENT/EINVAL (#2854).\n\t\tshell: process.platform === \"win32\",\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tlet serverStatus: string;\n\t\t\t\tif (servers.length > 0) {\n\t\t\t\t\tserverStatus = `Active language servers: ${servers.join(\", \")}`;\n\t\t\t\t} else {\n\t\t\t\t\t// Diagnose why no servers were detected\n\t\t\t\t\tconst DEFAULTS = (await import(\"./defaults.json\", { with: { type: \"json\" } })).default as Record<string, { command: string; rootMarkers: string[] }>;\n\t\t\t\t\tconst diagnostics: string[] = [\"No language servers configured for this project.\"];\n\t\t\t\t\tconst matchedButMissing: string[] = [];\n\t\t\t\t\tconst noMarkers: string[] = [];\n\n\t\t\t\t\tfor (const [name, def] of Object.entries(DEFAULTS)) {\n\t\t\t\t\t\tif (hasRootMarkers(cwd, def.rootMarkers)) {\n\t\t\t\t\t\t\tconst resolved = resolveCommand(def.command, cwd);\n\t\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\t\tmatchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (matchedButMissing.length > 0) {\n\t\t\t\t\t\tdiagnostics.push(\"\\nDetected projects missing language servers:\");\n\t\t\t\t\t\tdiagnostics.push(...matchedButMissing);\n\t\t\t\t\t\tdiagnostics.push(\"\\nInstall the missing server command and restart GSD, or run: lsp reload\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiagnostics.push(\"No recognized project markers found in the working directory.\");\n\t\t\t\t\t\tdiagnostics.push(\"LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tserverStatus = diagnostics.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"type definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"implementation\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"incoming\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"outgoing\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lspmux.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AAMH,UAAU,YAAY;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,WAAW;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AA6ED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyBzD;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AA+BD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAGtG"}
1
+ {"version":3,"file":"lspmux.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AAMH,UAAU,YAAY;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,WAAW;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAgFD,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyBzD;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AA+BD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAGtG"}
@@ -53,6 +53,9 @@ async function checkServerRunning(binaryPath) {
53
53
  try {
54
54
  const proc = spawn(binaryPath, ["status"], {
55
55
  stdio: ["ignore", "pipe", "pipe"],
56
+ // On Windows, the binary may be a .cmd wrapper requiring shell
57
+ // resolution to avoid ENOENT/EINVAL (#2854).
58
+ shell: process.platform === "win32",
56
59
  });
57
60
  const exited = await Promise.race([
58
61
  new Promise((resolve) => {
@@ -1 +1 @@
1
- {"version":3,"file":"lspmux.js","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { LSP_LIVENESS_TIMEOUT_MS, LSP_STATE_CACHE_TTL_MS } from \"../constants.js\";\nimport { which } from \"./config.js\";\n\n/**\n * lspmux integration for LSP server multiplexing.\n *\n * When lspmux is available and running, this module wraps supported LSP server\n * commands to use lspmux client mode, enabling server instance sharing across\n * multiple editor windows.\n *\n * Integration is transparent: if lspmux is unavailable, falls back to direct spawning.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface LspmuxConfig {\n\tinstance_timeout?: number;\n\tgc_interval?: number;\n\tlisten?: [string, number] | string;\n\tconnect?: [string, number] | string;\n\tlog_filters?: string;\n\tpass_environment?: string[];\n}\n\ninterface LspmuxState {\n\tavailable: boolean;\n\trunning: boolean;\n\tbinaryPath: string | null;\n\tconfig: LspmuxConfig | null;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_SUPPORTED_SERVERS = new Set([\n\t\"rust-analyzer\",\n]);\n\n\n// =============================================================================\n// Config Path\n// =============================================================================\n\nfunction getConfigPath(): string {\n\tconst home = os.homedir();\n\tswitch (os.platform()) {\n\t\tcase \"win32\":\n\t\t\treturn path.join(process.env.APPDATA ?? path.join(home, \"AppData\", \"Roaming\"), \"lspmux\", \"config.toml\");\n\t\tcase \"darwin\":\n\t\t\treturn path.join(home, \"Library\", \"Application Support\", \"lspmux\", \"config.toml\");\n\t\tdefault:\n\t\t\treturn path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"lspmux\", \"config.toml\");\n\t}\n}\n\n// =============================================================================\n// State Management\n// =============================================================================\n\nlet cachedState: LspmuxState | null = null;\nlet cacheTimestamp = 0;\n\nasync function parseConfig(): Promise<LspmuxConfig | null> {\n\ttry {\n\t\tconst configPath = getConfigPath();\n\t\t// lspmux config uses TOML, but since we're stripping TOML support,\n\t\t// attempt a simple key=value parse for the config file.\n\t\t// If the config file exists but can't be parsed, return null.\n\t\ttry {\n\t\t\tawait fsPromises.access(configPath);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\t// Config exists but we can't parse TOML without a dependency.\n\t\t// Return an empty config object to indicate the file exists.\n\t\treturn {} as LspmuxConfig;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function checkServerRunning(binaryPath: string): Promise<boolean> {\n\ttry {\n\t\tconst proc = spawn(binaryPath, [\"status\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tconst exited = await Promise.race([\n\t\t\tnew Promise<number>((resolve) => {\n\t\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t\t}),\n\t\t\tnew Promise<null>(resolve => setTimeout(() => resolve(null), LSP_LIVENESS_TIMEOUT_MS)),\n\t\t]);\n\n\t\tif (exited === null) {\n\t\t\tproc.kill();\n\t\t\treturn false;\n\t\t}\n\n\t\treturn exited === 0;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function detectLspmux(): Promise<LspmuxState> {\n\tconst now = Date.now();\n\tif (cachedState && now - cacheTimestamp < LSP_STATE_CACHE_TTL_MS) {\n\t\treturn cachedState;\n\t}\n\n\tif (process.env.PI_DISABLE_LSPMUX === \"1\" || process.env.GSD_DISABLE_LSPMUX === \"1\") {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst binaryPath = which(\"lspmux\");\n\tif (!binaryPath) {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst [config, running] = await Promise.all([parseConfig(), checkServerRunning(binaryPath)]);\n\n\tcachedState = { available: true, running, binaryPath, config };\n\tcacheTimestamp = now;\n\n\treturn cachedState;\n}\n\n// =============================================================================\n// Command Wrapping\n// =============================================================================\n\nexport function isLspmuxSupported(command: string): boolean {\n\tconst baseName = command.split(\"/\").pop() ?? command;\n\treturn DEFAULT_SUPPORTED_SERVERS.has(baseName);\n}\n\nexport interface LspmuxWrappedCommand {\n\tcommand: string;\n\targs: string[];\n\tenv?: Record<string, string>;\n}\n\nfunction wrapWithLspmux(\n\toriginalCommand: string,\n\toriginalArgs: string[] | undefined,\n\tstate: LspmuxState,\n): LspmuxWrappedCommand {\n\tif (!state.available || !state.running || !state.binaryPath) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tif (!isLspmuxSupported(originalCommand)) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tconst baseName = originalCommand.split(\"/\").pop() ?? originalCommand;\n\tconst isDefaultRustAnalyzer = baseName === \"rust-analyzer\" && originalCommand === \"rust-analyzer\";\n\tconst hasArgs = originalArgs && originalArgs.length > 0;\n\n\tif (isDefaultRustAnalyzer && !hasArgs) {\n\t\treturn { command: state.binaryPath, args: [] };\n\t}\n\n\tconst args = hasArgs ? [\"client\", \"--\", ...originalArgs] : [\"client\"];\n\treturn {\n\t\tcommand: state.binaryPath,\n\t\targs,\n\t\tenv: { LSPMUX_SERVER: originalCommand },\n\t};\n}\n\nexport async function getLspmuxCommand(command: string, args?: string[]): Promise<LspmuxWrappedCommand> {\n\tconst state = await detectLspmux();\n\treturn wrapWithLspmux(command, args, state);\n}\n"]}
1
+ {"version":3,"file":"lspmux.js","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { LSP_LIVENESS_TIMEOUT_MS, LSP_STATE_CACHE_TTL_MS } from \"../constants.js\";\nimport { which } from \"./config.js\";\n\n/**\n * lspmux integration for LSP server multiplexing.\n *\n * When lspmux is available and running, this module wraps supported LSP server\n * commands to use lspmux client mode, enabling server instance sharing across\n * multiple editor windows.\n *\n * Integration is transparent: if lspmux is unavailable, falls back to direct spawning.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface LspmuxConfig {\n\tinstance_timeout?: number;\n\tgc_interval?: number;\n\tlisten?: [string, number] | string;\n\tconnect?: [string, number] | string;\n\tlog_filters?: string;\n\tpass_environment?: string[];\n}\n\ninterface LspmuxState {\n\tavailable: boolean;\n\trunning: boolean;\n\tbinaryPath: string | null;\n\tconfig: LspmuxConfig | null;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_SUPPORTED_SERVERS = new Set([\n\t\"rust-analyzer\",\n]);\n\n\n// =============================================================================\n// Config Path\n// =============================================================================\n\nfunction getConfigPath(): string {\n\tconst home = os.homedir();\n\tswitch (os.platform()) {\n\t\tcase \"win32\":\n\t\t\treturn path.join(process.env.APPDATA ?? path.join(home, \"AppData\", \"Roaming\"), \"lspmux\", \"config.toml\");\n\t\tcase \"darwin\":\n\t\t\treturn path.join(home, \"Library\", \"Application Support\", \"lspmux\", \"config.toml\");\n\t\tdefault:\n\t\t\treturn path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"lspmux\", \"config.toml\");\n\t}\n}\n\n// =============================================================================\n// State Management\n// =============================================================================\n\nlet cachedState: LspmuxState | null = null;\nlet cacheTimestamp = 0;\n\nasync function parseConfig(): Promise<LspmuxConfig | null> {\n\ttry {\n\t\tconst configPath = getConfigPath();\n\t\t// lspmux config uses TOML, but since we're stripping TOML support,\n\t\t// attempt a simple key=value parse for the config file.\n\t\t// If the config file exists but can't be parsed, return null.\n\t\ttry {\n\t\t\tawait fsPromises.access(configPath);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\t// Config exists but we can't parse TOML without a dependency.\n\t\t// Return an empty config object to indicate the file exists.\n\t\treturn {} as LspmuxConfig;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function checkServerRunning(binaryPath: string): Promise<boolean> {\n\ttry {\n\t\tconst proc = spawn(binaryPath, [\"status\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t// On Windows, the binary may be a .cmd wrapper requiring shell\n\t\t\t// resolution to avoid ENOENT/EINVAL (#2854).\n\t\t\tshell: process.platform === \"win32\",\n\t\t});\n\n\t\tconst exited = await Promise.race([\n\t\t\tnew Promise<number>((resolve) => {\n\t\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t\t}),\n\t\t\tnew Promise<null>(resolve => setTimeout(() => resolve(null), LSP_LIVENESS_TIMEOUT_MS)),\n\t\t]);\n\n\t\tif (exited === null) {\n\t\t\tproc.kill();\n\t\t\treturn false;\n\t\t}\n\n\t\treturn exited === 0;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function detectLspmux(): Promise<LspmuxState> {\n\tconst now = Date.now();\n\tif (cachedState && now - cacheTimestamp < LSP_STATE_CACHE_TTL_MS) {\n\t\treturn cachedState;\n\t}\n\n\tif (process.env.PI_DISABLE_LSPMUX === \"1\" || process.env.GSD_DISABLE_LSPMUX === \"1\") {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst binaryPath = which(\"lspmux\");\n\tif (!binaryPath) {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst [config, running] = await Promise.all([parseConfig(), checkServerRunning(binaryPath)]);\n\n\tcachedState = { available: true, running, binaryPath, config };\n\tcacheTimestamp = now;\n\n\treturn cachedState;\n}\n\n// =============================================================================\n// Command Wrapping\n// =============================================================================\n\nexport function isLspmuxSupported(command: string): boolean {\n\tconst baseName = command.split(\"/\").pop() ?? command;\n\treturn DEFAULT_SUPPORTED_SERVERS.has(baseName);\n}\n\nexport interface LspmuxWrappedCommand {\n\tcommand: string;\n\targs: string[];\n\tenv?: Record<string, string>;\n}\n\nfunction wrapWithLspmux(\n\toriginalCommand: string,\n\toriginalArgs: string[] | undefined,\n\tstate: LspmuxState,\n): LspmuxWrappedCommand {\n\tif (!state.available || !state.running || !state.binaryPath) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tif (!isLspmuxSupported(originalCommand)) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tconst baseName = originalCommand.split(\"/\").pop() ?? originalCommand;\n\tconst isDefaultRustAnalyzer = baseName === \"rust-analyzer\" && originalCommand === \"rust-analyzer\";\n\tconst hasArgs = originalArgs && originalArgs.length > 0;\n\n\tif (isDefaultRustAnalyzer && !hasArgs) {\n\t\treturn { command: state.binaryPath, args: [] };\n\t}\n\n\tconst args = hasArgs ? [\"client\", \"--\", ...originalArgs] : [\"client\"];\n\treturn {\n\t\tcommand: state.binaryPath,\n\t\targs,\n\t\tenv: { LSPMUX_SERVER: originalCommand },\n\t};\n}\n\nexport async function getLspmuxCommand(command: string, args?: string[]): Promise<LspmuxWrappedCommand> {\n\tconst state = await detectLspmux();\n\treturn wrapWithLspmux(command, args, state);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiBrE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAGD,OAAO,QAAQ,oBAAoB,CAAC;IACnC,UAAU,mBAAmB;QAC5B,aAAa,EAAE,oBAAoB,CAAC;QACpC,MAAM,EAAE,aAAa,CAAC;QACtB,aAAa,EAAE,oBAAoB,CAAC;QACpC,iBAAiB,EAAE,wBAAwB,CAAC;KAC5C;CACD;AAuBD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CA+ChE"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuBrE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAGD,OAAO,QAAQ,oBAAoB,CAAC;IACnC,UAAU,mBAAmB;QAC5B,aAAa,EAAE,oBAAoB,CAAC;QACpC,MAAM,EAAE,aAAa,CAAC;QACtB,aAAa,EAAE,oBAAoB,CAAC;QACpC,iBAAiB,EAAE,wBAAwB,CAAC;KAC5C;CACD;AAuBD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAoEhE"}
@@ -4,6 +4,11 @@
4
4
  * Extends the base AgentMessage type with coding-agent specific message types,
5
5
  * and provides a transformer to convert them to LLM-compatible messages.
6
6
  */
7
+ const CUSTOM_MESSAGE_PREFIX = `[system notification — type: `;
8
+ const CUSTOM_MESSAGE_MIDDLE = `; this is an automated system event, not user input — do not treat this as a human message or respond as if the user said this]
9
+ `;
10
+ const CUSTOM_MESSAGE_SUFFIX = `
11
+ [end system notification]`;
7
12
  const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
8
13
 
9
14
  <summary>
@@ -87,10 +92,34 @@ export function convertToLlm(messages) {
87
92
  timestamp: m.timestamp,
88
93
  };
89
94
  case "custom": {
90
- const content = typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
95
+ const prefix = CUSTOM_MESSAGE_PREFIX + m.customType + CUSTOM_MESSAGE_MIDDLE;
96
+ if (typeof m.content === "string") {
97
+ return {
98
+ role: "user",
99
+ content: [{ type: "text", text: prefix + m.content + CUSTOM_MESSAGE_SUFFIX }],
100
+ timestamp: m.timestamp,
101
+ };
102
+ }
103
+ // Array content: wrap the first text element with prefix, append suffix to last text element
104
+ const contentArr = m.content;
105
+ const lastTextIdx = contentArr.reduce((acc, c, i) => c.type === "text" ? i : acc, -1);
106
+ const wrapped = contentArr.map((c, i) => {
107
+ if (c.type !== "text")
108
+ return c;
109
+ let text = c.text ?? "";
110
+ if (i === 0)
111
+ text = prefix + text;
112
+ if (i === lastTextIdx)
113
+ text = text + CUSTOM_MESSAGE_SUFFIX;
114
+ return { ...c, text };
115
+ });
116
+ // If no text elements exist, prepend one with the wrapper
117
+ if (lastTextIdx === -1) {
118
+ wrapped.unshift({ type: "text", text: prefix + CUSTOM_MESSAGE_SUFFIX });
119
+ }
91
120
  return {
92
121
  role: "user",
93
- content,
122
+ content: wrapped,
94
123
  timestamp: m.timestamp,
95
124
  };
96
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,yBAAyB,GAAG;;;CAGjC,CAAC;AAEF,MAAM,yBAAyB,GAAG;WACvB,CAAC;AAEZ,MAAM,qBAAqB,GAAG;;;CAG7B,CAAC;AAEF,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAuD3C;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAyB;IACrD,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,IAAI,WAAW,GAAG,CAAC,MAAM,UAAU,CAAC;IACzC,CAAC;SAAM,CAAC;QACP,IAAI,IAAI,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,IAAI,yBAAyB,CAAC;IACnC,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACtF,IAAI,IAAI,gCAAgC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,IAAI,uCAAuC,GAAG,CAAC,cAAc,GAAG,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,MAAc,EAAE,SAAiB;IAC5F,OAAO;QACN,IAAI,EAAE,eAAe;QACrB,OAAO;QACP,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;KACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,OAAe,EACf,YAAoB,EACpB,SAAiB;IAEjB,OAAO;QACN,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;QAChB,YAAY;QACZ,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;KACxC,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAClC,UAAkB,EAClB,OAAgD,EAChD,OAAgB,EAChB,OAA4B,EAC5B,SAAiB;IAEjB,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,OAAO;QACP,OAAO;QACP,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;KACxC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,QAAwB;IACpD,OAAO,QAAQ;SACb,GAAG,CAAC,CAAC,CAAC,EAAuB,EAAE;QAC/B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,eAAe;gBACnB,kDAAkD;gBAClD,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;oBAC1B,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,SAAS,EAAE,CAAC,CAAC,SAAS;iBACtB,CAAC;YACH,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzG,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,OAAO;oBACP,SAAS,EAAE,CAAC,CAAC,SAAS;iBACtB,CAAC;YACH,CAAC;YACD,KAAK,eAAe;gBACnB,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,GAAG,CAAC,CAAC,OAAO,GAAG,qBAAqB,EAAE,CAAC;oBACrG,SAAS,EAAE,CAAC,CAAC,SAAS;iBACtB,CAAC;YACH,KAAK,mBAAmB;gBACvB,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACR,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,GAAG,CAAC,CAAC,OAAO,GAAG,yBAAyB,EAAE;qBAClG;oBACD,SAAS,EAAE,CAAC,CAAC,SAAS;iBACtB,CAAC;YACH,KAAK,MAAM,CAAC;YACZ,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBAChB,OAAO,CAAC,CAAC;YACV;gBACC,2DAA2D;gBAC3D,MAAM,gBAAgB,GAAU,CAAC,CAAC;gBAClC,OAAO,SAAS,CAAC;QACnB,CAAC;IACF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AgentMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { ImageContent, Message, TextContent } from \"@gsd/pi-ai\";\n\nconst COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nconst COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nconst BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nconst BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\n/**\n * Message type for bash executions via the ! command.\n */\nexport interface BashExecutionMessage {\n\trole: \"bashExecution\";\n\tcommand: string;\n\toutput: string;\n\texitCode: number | undefined;\n\tcancelled: boolean;\n\ttruncated: boolean;\n\tfullOutputPath?: string;\n\ttimestamp: number;\n\t/** If true, this message is excluded from LLM context (!! prefix) */\n\texcludeFromContext?: boolean;\n}\n\n/**\n * Message type for extension-injected messages via sendMessage().\n * These are custom messages that extensions can inject into the conversation.\n */\nexport interface CustomMessage<T = unknown> {\n\trole: \"custom\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdisplay: boolean;\n\tdetails?: T;\n\ttimestamp: number;\n}\n\nexport interface BranchSummaryMessage {\n\trole: \"branchSummary\";\n\tsummary: string;\n\tfromId: string;\n\ttimestamp: number;\n}\n\nexport interface CompactionSummaryMessage {\n\trole: \"compactionSummary\";\n\tsummary: string;\n\ttokensBefore: number;\n\ttimestamp: number;\n}\n\n// Extend CustomAgentMessages via declaration merging\ndeclare module \"@gsd/pi-agent-core\" {\n\tinterface CustomAgentMessages {\n\t\tbashExecution: BashExecutionMessage;\n\t\tcustom: CustomMessage;\n\t\tbranchSummary: BranchSummaryMessage;\n\t\tcompactionSummary: CompactionSummaryMessage;\n\t}\n}\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nfunction bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary: summary,\n\t\ttokensBefore,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/** Convert CustomMessageEntry to AgentMessage format */\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent,\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/**\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's transormToLlm option (for prompt calls and queued messages)\n * - Compaction's generateSummary (for summarization)\n * - Custom extensions and tools\n */\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m) => m !== undefined);\n}\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AgentMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { ImageContent, Message, TextContent } from \"@gsd/pi-ai\";\n\nconst CUSTOM_MESSAGE_PREFIX = `[system notification — type: `;\nconst CUSTOM_MESSAGE_MIDDLE = `; this is an automated system event, not user input — do not treat this as a human message or respond as if the user said this]\n`;\nconst CUSTOM_MESSAGE_SUFFIX = `\n[end system notification]`;\n\nconst COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nconst COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nconst BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nconst BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\n/**\n * Message type for bash executions via the ! command.\n */\nexport interface BashExecutionMessage {\n\trole: \"bashExecution\";\n\tcommand: string;\n\toutput: string;\n\texitCode: number | undefined;\n\tcancelled: boolean;\n\ttruncated: boolean;\n\tfullOutputPath?: string;\n\ttimestamp: number;\n\t/** If true, this message is excluded from LLM context (!! prefix) */\n\texcludeFromContext?: boolean;\n}\n\n/**\n * Message type for extension-injected messages via sendMessage().\n * These are custom messages that extensions can inject into the conversation.\n */\nexport interface CustomMessage<T = unknown> {\n\trole: \"custom\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdisplay: boolean;\n\tdetails?: T;\n\ttimestamp: number;\n}\n\nexport interface BranchSummaryMessage {\n\trole: \"branchSummary\";\n\tsummary: string;\n\tfromId: string;\n\ttimestamp: number;\n}\n\nexport interface CompactionSummaryMessage {\n\trole: \"compactionSummary\";\n\tsummary: string;\n\ttokensBefore: number;\n\ttimestamp: number;\n}\n\n// Extend CustomAgentMessages via declaration merging\ndeclare module \"@gsd/pi-agent-core\" {\n\tinterface CustomAgentMessages {\n\t\tbashExecution: BashExecutionMessage;\n\t\tcustom: CustomMessage;\n\t\tbranchSummary: BranchSummaryMessage;\n\t\tcompactionSummary: CompactionSummaryMessage;\n\t}\n}\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nfunction bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary: summary,\n\t\ttokensBefore,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/** Convert CustomMessageEntry to AgentMessage format */\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent,\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/**\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's transormToLlm option (for prompt calls and queued messages)\n * - Compaction's generateSummary (for summarization)\n * - Custom extensions and tools\n */\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tconst prefix = CUSTOM_MESSAGE_PREFIX + m.customType + CUSTOM_MESSAGE_MIDDLE;\n\t\t\t\t\tif (typeof m.content === \"string\") {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: prefix + m.content + CUSTOM_MESSAGE_SUFFIX }],\n\t\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t// Array content: wrap the first text element with prefix, append suffix to last text element\n\t\t\t\t\tconst contentArr = m.content as Array<{ type: string; text?: string; [k: string]: unknown }>;\n\t\t\t\t\tconst lastTextIdx = contentArr.reduce((acc, c, i) => c.type === \"text\" ? i : acc, -1);\n\t\t\t\t\tconst wrapped = contentArr.map((c, i) => {\n\t\t\t\t\t\tif (c.type !== \"text\") return c;\n\t\t\t\t\t\tlet text = c.text ?? \"\";\n\t\t\t\t\t\tif (i === 0) text = prefix + text;\n\t\t\t\t\t\tif (i === lastTextIdx) text = text + CUSTOM_MESSAGE_SUFFIX;\n\t\t\t\t\t\treturn { ...c, text };\n\t\t\t\t\t});\n\t\t\t\t\t// If no text elements exist, prepend one with the wrapper\n\t\t\t\t\tif (lastTextIdx === -1) {\n\t\t\t\t\t\twrapped.unshift({ type: \"text\" as const, text: prefix + CUSTOM_MESSAGE_SUFFIX });\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: wrapped as typeof m.content,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m) => m !== undefined);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * messages.test.ts — Tests for convertToLlm custom message handling.
3
+ *
4
+ * Reproduction test for #3026: background job completion notifications
5
+ * delivered as custom messages must be clearly distinguishable from
6
+ * user-typed input when converted to LLM messages.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=messages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.d.ts","sourceRoot":"","sources":["../../src/core/messages.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}