whale-code 6.5.4 → 6.5.6

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 (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -7,337 +7,396 @@
7
7
  * Zero external dependencies — Node.js builtins only (child_process, Buffer).
8
8
  * Servers are lazy-spawned on first request and keyed by language + workspace root.
9
9
  */
10
+
10
11
  import { spawn, execSync } from "child_process";
11
12
  import { readFileSync, existsSync, statSync } from "fs";
12
13
  import { resolve, dirname, extname } from "path";
13
- const LANG_CONFIGS = [
14
- {
15
- id: "typescript",
16
- languageIds: ["typescript", "typescriptreact", "javascript", "javascriptreact"],
17
- binaries: ["typescript-language-server"],
18
- args: ["--stdio"],
19
- installHint: "npm i -g typescript-language-server typescript",
20
- },
21
- {
22
- id: "python",
23
- languageIds: ["python"],
24
- binaries: ["pyright-langserver", "pylsp", "python-language-server"],
25
- args: ["--stdio"],
26
- installHint: "npm i -g pyright",
27
- },
28
- {
29
- id: "rust",
30
- languageIds: ["rust"],
31
- binaries: ["rust-analyzer"],
32
- args: [],
33
- installHint: "rustup component add rust-analyzer",
34
- },
35
- {
36
- id: "go",
37
- languageIds: ["go"],
38
- binaries: ["gopls"],
39
- args: ["serve"],
40
- installHint: "go install golang.org/x/tools/gopls@latest",
41
- },
42
- {
43
- id: "clangd",
44
- languageIds: ["c", "cpp"],
45
- binaries: ["clangd"],
46
- args: [],
47
- installHint: "brew install llvm (or apt install clangd)",
48
- },
49
- {
50
- id: "java",
51
- languageIds: ["java"],
52
- binaries: ["jdtls"],
53
- args: [],
54
- installHint: "brew install jdtls",
55
- },
56
- ];
14
+
15
+ // ============================================================================
16
+ // LANGUAGE CONFIG
17
+ // ============================================================================
18
+
19
+ const LANG_CONFIGS = [{
20
+ id: "typescript",
21
+ languageIds: ["typescript", "typescriptreact", "javascript", "javascriptreact"],
22
+ binaries: ["typescript-language-server"],
23
+ args: ["--stdio"],
24
+ installHint: "npm i -g typescript-language-server typescript"
25
+ }, {
26
+ id: "python",
27
+ languageIds: ["python"],
28
+ binaries: ["pyright-langserver", "pylsp", "python-language-server"],
29
+ args: ["--stdio"],
30
+ installHint: "npm i -g pyright"
31
+ }, {
32
+ id: "rust",
33
+ languageIds: ["rust"],
34
+ binaries: ["rust-analyzer"],
35
+ args: [],
36
+ installHint: "rustup component add rust-analyzer"
37
+ }, {
38
+ id: "go",
39
+ languageIds: ["go"],
40
+ binaries: ["gopls"],
41
+ args: ["serve"],
42
+ installHint: "go install golang.org/x/tools/gopls@latest"
43
+ }, {
44
+ id: "clangd",
45
+ languageIds: ["c", "cpp"],
46
+ binaries: ["clangd"],
47
+ args: [],
48
+ installHint: "brew install llvm (or apt install clangd)"
49
+ }, {
50
+ id: "java",
51
+ languageIds: ["java"],
52
+ binaries: ["jdtls"],
53
+ args: [],
54
+ installHint: "brew install jdtls"
55
+ }];
57
56
  const EXT_TO_LANGID = {
58
- ".ts": "typescript", ".tsx": "typescriptreact",
59
- ".js": "javascript", ".jsx": "javascriptreact",
60
- ".mjs": "javascript", ".cjs": "javascript",
61
- ".py": "python", ".rs": "rust", ".go": "go",
62
- ".c": "c", ".h": "c",
63
- ".cpp": "cpp", ".cc": "cpp", ".cxx": "cpp", ".hpp": "cpp",
64
- ".java": "java",
57
+ ".ts": "typescript",
58
+ ".tsx": "typescriptreact",
59
+ ".js": "javascript",
60
+ ".jsx": "javascriptreact",
61
+ ".mjs": "javascript",
62
+ ".cjs": "javascript",
63
+ ".py": "python",
64
+ ".rs": "rust",
65
+ ".go": "go",
66
+ ".c": "c",
67
+ ".h": "c",
68
+ ".cpp": "cpp",
69
+ ".cc": "cpp",
70
+ ".cxx": "cpp",
71
+ ".hpp": "cpp",
72
+ ".java": "java"
65
73
  };
74
+
66
75
  // Build lookup: languageId → config
67
76
  const LANGID_TO_CONFIG = new Map();
68
77
  for (const cfg of LANG_CONFIGS) {
69
- for (const lid of cfg.languageIds) {
70
- LANGID_TO_CONFIG.set(lid, cfg);
71
- }
78
+ for (const lid of cfg.languageIds) {
79
+ LANGID_TO_CONFIG.set(lid, cfg);
80
+ }
72
81
  }
82
+
73
83
  // ============================================================================
74
84
  // JSON-RPC MESSAGE BUFFER
75
85
  // ============================================================================
86
+
76
87
  class MessageBuffer {
77
- buffer = Buffer.alloc(0);
78
- append(data) {
79
- this.buffer = Buffer.concat([this.buffer, data]);
80
- }
81
- tryRead() {
82
- const headerEnd = this.buffer.indexOf("\r\n\r\n");
83
- if (headerEnd === -1)
84
- return null;
85
- const header = this.buffer.subarray(0, headerEnd).toString("ascii");
86
- const match = header.match(/Content-Length:\s*(\d+)/i);
87
- if (!match) {
88
- this.buffer = this.buffer.subarray(headerEnd + 4);
89
- return null;
90
- }
91
- const contentLength = parseInt(match[1], 10);
92
- const bodyStart = headerEnd + 4;
93
- if (this.buffer.length < bodyStart + contentLength)
94
- return null;
95
- const body = this.buffer.subarray(bodyStart, bodyStart + contentLength).toString("utf-8");
96
- this.buffer = this.buffer.subarray(bodyStart + contentLength);
97
- try {
98
- return JSON.parse(body);
99
- }
100
- catch {
101
- return null;
102
- }
88
+ buffer = Buffer.alloc(0);
89
+ append(data) {
90
+ this.buffer = Buffer.concat([this.buffer, data]);
91
+ }
92
+ tryRead() {
93
+ const headerEnd = this.buffer.indexOf("\r\n\r\n");
94
+ if (headerEnd === -1) return null;
95
+ const header = this.buffer.subarray(0, headerEnd).toString("ascii");
96
+ const match = header.match(/Content-Length:\s*(\d+)/i);
97
+ if (!match) {
98
+ this.buffer = this.buffer.subarray(headerEnd + 4);
99
+ return null;
100
+ }
101
+ const contentLength = parseInt(match[1], 10);
102
+ const bodyStart = headerEnd + 4;
103
+ if (this.buffer.length < bodyStart + contentLength) return null;
104
+ const body = this.buffer.subarray(bodyStart, bodyStart + contentLength).toString("utf-8");
105
+ this.buffer = this.buffer.subarray(bodyStart + contentLength);
106
+ try {
107
+ return JSON.parse(body);
108
+ } catch {
109
+ return null;
103
110
  }
111
+ }
104
112
  }
105
113
  function encodeMessage(msg) {
106
- const body = JSON.stringify(msg);
107
- const header = `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n`;
108
- return Buffer.from(header + body, "utf-8");
114
+ const body = JSON.stringify(msg);
115
+ const header = `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n`;
116
+ return Buffer.from(header + body, "utf-8");
109
117
  }
118
+
119
+ // ============================================================================
120
+ // LSP SERVER
121
+ // ============================================================================
122
+
110
123
  const servers = new Map();
111
124
  const REQUEST_TIMEOUT = 30_000;
112
125
  let cleanupRegistered = false;
126
+
113
127
  // Simple content hash for change detection (fast, not crypto)
114
128
  function quickHash(content) {
115
- let h = 0;
116
- for (let i = 0; i < content.length; i++) {
117
- h = ((h << 5) - h + content.charCodeAt(i)) | 0;
118
- }
119
- return h.toString(36);
129
+ let h = 0;
130
+ for (let i = 0; i < content.length; i++) {
131
+ h = (h << 5) - h + content.charCodeAt(i) | 0;
132
+ }
133
+ return h.toString(36);
120
134
  }
121
135
  function findBinary(binaries) {
122
- for (const bin of binaries) {
123
- try {
124
- execSync(`which ${bin} 2>/dev/null`, { encoding: "utf-8" });
125
- return bin;
126
- }
127
- catch {
128
- continue;
129
- }
130
- }
131
- return null;
136
+ for (const bin of binaries) {
137
+ try {
138
+ execSync(`which ${bin} 2>/dev/null`, {
139
+ encoding: "utf-8"
140
+ });
141
+ return bin;
142
+ } catch {
143
+ continue;
144
+ }
145
+ }
146
+ return null;
132
147
  }
133
148
  function findWorkspaceRoot(filePath) {
134
- let dir = dirname(resolve(filePath));
135
- const markers = [".git", "package.json", "Cargo.toml", "go.mod", "pyproject.toml", "setup.py"];
136
- for (let i = 0; i < 20; i++) {
137
- for (const marker of markers) {
138
- if (existsSync(resolve(dir, marker)))
139
- return dir;
140
- }
141
- const parent = dirname(dir);
142
- if (parent === dir)
143
- break;
144
- dir = parent;
145
- }
146
- return dirname(resolve(filePath));
149
+ let dir = dirname(resolve(filePath));
150
+ const markers = [".git", "package.json", "Cargo.toml", "go.mod", "pyproject.toml", "setup.py"];
151
+ for (let i = 0; i < 20; i++) {
152
+ for (const marker of markers) {
153
+ if (existsSync(resolve(dir, marker))) return dir;
154
+ }
155
+ const parent = dirname(dir);
156
+ if (parent === dir) break;
157
+ dir = parent;
158
+ }
159
+ return dirname(resolve(filePath));
147
160
  }
148
161
  function fileUri(filePath) {
149
- const abs = resolve(filePath);
150
- return "file://" + abs.split("/").map(seg => encodeURIComponent(seg)).join("/");
162
+ const abs = resolve(filePath);
163
+ return "file://" + abs.split("/").map(seg => encodeURIComponent(seg)).join("/");
151
164
  }
152
165
  function uriToPath(uri) {
153
- if (uri.startsWith("file://"))
154
- return decodeURIComponent(uri.slice(7));
155
- return decodeURIComponent(uri);
166
+ if (uri.startsWith("file://")) return decodeURIComponent(uri.slice(7));
167
+ return decodeURIComponent(uri);
156
168
  }
169
+
157
170
  // ============================================================================
158
171
  // SERVER LIFECYCLE
159
172
  // ============================================================================
173
+
160
174
  function spawnServer(config, workspaceRoot) {
161
- const binary = findBinary(config.binaries);
162
- if (!binary) {
163
- throw new Error(`No language server found for ${config.id}. Install: ${config.installHint}`);
164
- }
165
- const child = spawn(binary, config.args, {
166
- cwd: workspaceRoot,
167
- stdio: ["pipe", "pipe", "pipe"],
168
- env: { ...process.env },
175
+ const binary = findBinary(config.binaries);
176
+ if (!binary) {
177
+ throw new Error(`No language server found for ${config.id}. Install: ${config.installHint}`);
178
+ }
179
+ const child = spawn(binary, config.args, {
180
+ cwd: workspaceRoot,
181
+ stdio: ["pipe", "pipe", "pipe"],
182
+ env: {
183
+ ...process.env
184
+ }
185
+ });
186
+ const key = `${config.id}:${workspaceRoot}`;
187
+ const server = {
188
+ process: child,
189
+ configId: config.id,
190
+ workspaceRoot,
191
+ messageBuffer: new MessageBuffer(),
192
+ nextId: 1,
193
+ pending: new Map(),
194
+ openedFiles: new Map(),
195
+ ready: false,
196
+ alive: true,
197
+ projectIndexed: false,
198
+ capabilities: null,
199
+ initPromise: Promise.resolve()
200
+ };
201
+ child.stdout.on("data", data => {
202
+ server.messageBuffer.append(data);
203
+ let msg;
204
+ while ((msg = server.messageBuffer.tryRead()) !== null) {
205
+ handleMessage(server, msg);
206
+ }
207
+ });
208
+ child.stderr.on("data", () => {/* discard */});
209
+ child.on("exit", () => {
210
+ server.alive = false;
211
+ servers.delete(key);
212
+ for (const [, req] of server.pending) {
213
+ clearTimeout(req.timer);
214
+ req.reject(new Error("Language server exited"));
215
+ }
216
+ server.pending.clear();
217
+ });
218
+
219
+ // Register cleanup on first server
220
+ if (!cleanupRegistered) {
221
+ cleanupRegistered = true;
222
+ process.on("exit", shutdownAll);
223
+ process.on("SIGINT", () => {
224
+ shutdownAll();
225
+ process.exit(0);
169
226
  });
170
- const key = `${config.id}:${workspaceRoot}`;
171
- const server = {
172
- process: child,
173
- configId: config.id,
174
- workspaceRoot,
175
- messageBuffer: new MessageBuffer(),
176
- nextId: 1,
177
- pending: new Map(),
178
- openedFiles: new Map(),
179
- ready: false,
180
- alive: true,
181
- projectIndexed: false,
182
- capabilities: null,
183
- initPromise: Promise.resolve(),
184
- };
185
- child.stdout.on("data", (data) => {
186
- server.messageBuffer.append(data);
187
- let msg;
188
- while ((msg = server.messageBuffer.tryRead()) !== null) {
189
- handleMessage(server, msg);
190
- }
191
- });
192
- child.stderr.on("data", () => { });
193
- child.on("exit", () => {
194
- server.alive = false;
195
- servers.delete(key);
196
- for (const [, req] of server.pending) {
197
- clearTimeout(req.timer);
198
- req.reject(new Error("Language server exited"));
199
- }
200
- server.pending.clear();
227
+ process.on("SIGTERM", () => {
228
+ shutdownAll();
229
+ process.exit(0);
201
230
  });
202
- // Register cleanup on first server
203
- if (!cleanupRegistered) {
204
- cleanupRegistered = true;
205
- process.on("exit", shutdownAll);
206
- process.on("SIGINT", () => { shutdownAll(); process.exit(0); });
207
- process.on("SIGTERM", () => { shutdownAll(); process.exit(0); });
208
- }
209
- server.initPromise = initializeServer(server);
210
- servers.set(key, server);
211
- return server;
231
+ }
232
+ server.initPromise = initializeServer(server);
233
+ servers.set(key, server);
234
+ return server;
212
235
  }
213
236
  async function getOrCreateServer(filePath) {
214
- const ext = extname(filePath).toLowerCase();
215
- const langId = EXT_TO_LANGID[ext];
216
- if (!langId)
217
- throw new Error(`No language server configured for ${ext} files`);
218
- const config = LANGID_TO_CONFIG.get(langId);
219
- if (!config)
220
- throw new Error(`No language config for ${langId}`);
221
- const workspaceRoot = findWorkspaceRoot(filePath);
222
- const key = `${config.id}:${workspaceRoot}`;
223
- const existing = servers.get(key);
224
- // Auto-restart: if server died, remove and respawn
225
- if (existing && !existing.alive) {
226
- servers.delete(key);
227
- }
228
- else if (existing && existing.ready) {
229
- return existing;
230
- }
231
- else if (existing) {
232
- await existing.initPromise;
233
- return existing;
234
- }
235
- const server = spawnServer(config, workspaceRoot);
236
- await server.initPromise;
237
- return server;
237
+ const ext = extname(filePath).toLowerCase();
238
+ const langId = EXT_TO_LANGID[ext];
239
+ if (!langId) throw new Error(`No language server configured for ${ext} files`);
240
+ const config = LANGID_TO_CONFIG.get(langId);
241
+ if (!config) throw new Error(`No language config for ${langId}`);
242
+ const workspaceRoot = findWorkspaceRoot(filePath);
243
+ const key = `${config.id}:${workspaceRoot}`;
244
+ const existing = servers.get(key);
245
+
246
+ // Auto-restart: if server died, remove and respawn
247
+ if (existing && !existing.alive) {
248
+ servers.delete(key);
249
+ } else if (existing && existing.ready) {
250
+ return existing;
251
+ } else if (existing) {
252
+ await existing.initPromise;
253
+ return existing;
254
+ }
255
+ const server = spawnServer(config, workspaceRoot);
256
+ await server.initPromise;
257
+ return server;
238
258
  }
259
+
239
260
  // ============================================================================
240
261
  // MESSAGE HANDLING
241
262
  // ============================================================================
263
+
242
264
  function handleMessage(server, msg) {
243
- // Response to a request we sent
244
- if ("id" in msg && "result" in msg || "id" in msg && "error" in msg) {
245
- if (server.pending.has(msg.id)) {
246
- const req = server.pending.get(msg.id);
247
- server.pending.delete(msg.id);
248
- clearTimeout(req.timer);
249
- if (msg.error) {
250
- req.reject(new Error(msg.error.message || JSON.stringify(msg.error)));
251
- }
252
- else {
253
- req.resolve(msg.result);
254
- }
255
- return;
256
- }
257
- }
258
- // Server-initiated request — respond to avoid timeouts on the server side
259
- if ("id" in msg && "method" in msg) {
260
- const response = { jsonrpc: "2.0", id: msg.id };
261
- switch (msg.method) {
262
- case "window/workDoneProgress/create":
263
- case "client/registerCapability":
264
- case "client/unregisterCapability":
265
- response.result = null;
266
- break;
267
- case "workspace/configuration":
268
- // Return empty config for each requested scope
269
- response.result = (msg.params?.items || []).map(() => ({}));
270
- break;
271
- case "window/showMessageRequest":
272
- response.result = null; // Dismiss
273
- break;
274
- default:
275
- response.result = null;
276
- break;
277
- }
278
- server.process.stdin.write(encodeMessage(response));
279
- return;
280
- }
281
- // Other notifications (diagnostics, etc.) silently ignored
265
+ // Response to a request we sent
266
+ if ("id" in msg && "result" in msg || "id" in msg && "error" in msg) {
267
+ if (server.pending.has(msg.id)) {
268
+ const req = server.pending.get(msg.id);
269
+ server.pending.delete(msg.id);
270
+ clearTimeout(req.timer);
271
+ if (msg.error) {
272
+ req.reject(new Error(msg.error.message || JSON.stringify(msg.error)));
273
+ } else {
274
+ req.resolve(msg.result);
275
+ }
276
+ return;
277
+ }
278
+ }
279
+
280
+ // Server-initiated request — respond to avoid timeouts on the server side
281
+ if ("id" in msg && "method" in msg) {
282
+ const response = {
283
+ jsonrpc: "2.0",
284
+ id: msg.id
285
+ };
286
+ switch (msg.method) {
287
+ case "window/workDoneProgress/create":
288
+ case "client/registerCapability":
289
+ case "client/unregisterCapability":
290
+ response.result = null;
291
+ break;
292
+ case "workspace/configuration":
293
+ // Return empty config for each requested scope
294
+ response.result = (msg.params?.items || []).map(() => ({}));
295
+ break;
296
+ case "window/showMessageRequest":
297
+ response.result = null; // Dismiss
298
+ break;
299
+ default:
300
+ response.result = null;
301
+ break;
302
+ }
303
+ server.process.stdin.write(encodeMessage(response));
304
+ return;
305
+ }
306
+
307
+ // Other notifications (diagnostics, etc.) silently ignored
282
308
  }
283
309
  function sendRequest(server, method, params) {
284
- if (!server.alive)
285
- return Promise.reject(new Error("Language server is not running"));
286
- return new Promise((resolve, reject) => {
287
- const id = server.nextId++;
288
- const timer = setTimeout(() => {
289
- server.pending.delete(id);
290
- reject(new Error(`LSP request timed out: ${method}`));
291
- }, REQUEST_TIMEOUT);
292
- server.pending.set(id, { resolve, reject, timer });
293
- server.process.stdin.write(encodeMessage({ jsonrpc: "2.0", id, method, params }));
310
+ if (!server.alive) return Promise.reject(new Error("Language server is not running"));
311
+ return new Promise((resolve, reject) => {
312
+ const id = server.nextId++;
313
+ const timer = setTimeout(() => {
314
+ server.pending.delete(id);
315
+ reject(new Error(`LSP request timed out: ${method}`));
316
+ }, REQUEST_TIMEOUT);
317
+ server.pending.set(id, {
318
+ resolve,
319
+ reject,
320
+ timer
294
321
  });
322
+ server.process.stdin.write(encodeMessage({
323
+ jsonrpc: "2.0",
324
+ id,
325
+ method,
326
+ params
327
+ }));
328
+ });
295
329
  }
296
330
  function sendNotification(server, method, params) {
297
- if (!server.alive)
298
- return;
299
- server.process.stdin.write(encodeMessage({ jsonrpc: "2.0", method, params }));
331
+ if (!server.alive) return;
332
+ server.process.stdin.write(encodeMessage({
333
+ jsonrpc: "2.0",
334
+ method,
335
+ params
336
+ }));
300
337
  }
301
338
  async function initializeServer(server) {
302
- const result = await sendRequest(server, "initialize", {
303
- processId: process.pid,
304
- rootUri: fileUri(server.workspaceRoot),
305
- rootPath: server.workspaceRoot,
306
- capabilities: {
307
- textDocument: {
308
- synchronization: {
309
- didOpen: true,
310
- didClose: true,
311
- didChange: 1, // Full content sync
312
- willSave: false,
313
- willSaveWaitUntil: false,
314
- didSave: false,
315
- },
316
- definition: { dynamicRegistration: false },
317
- references: { dynamicRegistration: false },
318
- hover: { dynamicRegistration: false, contentFormat: ["markdown", "plaintext"] },
319
- documentSymbol: { dynamicRegistration: false, hierarchicalDocumentSymbolSupport: true },
320
- implementation: { dynamicRegistration: false },
321
- callHierarchy: { dynamicRegistration: false },
322
- },
323
- workspace: {
324
- symbol: { dynamicRegistration: false },
325
- workspaceFolders: true,
326
- configuration: true,
327
- },
328
- window: {
329
- workDoneProgress: true,
330
- },
339
+ const result = await sendRequest(server, "initialize", {
340
+ processId: process.pid,
341
+ rootUri: fileUri(server.workspaceRoot),
342
+ rootPath: server.workspaceRoot,
343
+ capabilities: {
344
+ textDocument: {
345
+ synchronization: {
346
+ didOpen: true,
347
+ didClose: true,
348
+ didChange: 1,
349
+ // Full content sync
350
+ willSave: false,
351
+ willSaveWaitUntil: false,
352
+ didSave: false
331
353
  },
332
- workspaceFolders: [{ uri: fileUri(server.workspaceRoot), name: server.workspaceRoot.split("/").pop() }],
333
- });
334
- server.capabilities = result.capabilities;
335
- sendNotification(server, "initialized", {});
336
- server.ready = true;
354
+ definition: {
355
+ dynamicRegistration: false
356
+ },
357
+ references: {
358
+ dynamicRegistration: false
359
+ },
360
+ hover: {
361
+ dynamicRegistration: false,
362
+ contentFormat: ["markdown", "plaintext"]
363
+ },
364
+ documentSymbol: {
365
+ dynamicRegistration: false,
366
+ hierarchicalDocumentSymbolSupport: true
367
+ },
368
+ implementation: {
369
+ dynamicRegistration: false
370
+ },
371
+ callHierarchy: {
372
+ dynamicRegistration: false
373
+ }
374
+ },
375
+ workspace: {
376
+ symbol: {
377
+ dynamicRegistration: false
378
+ },
379
+ workspaceFolders: true,
380
+ configuration: true
381
+ },
382
+ window: {
383
+ workDoneProgress: true
384
+ }
385
+ },
386
+ workspaceFolders: [{
387
+ uri: fileUri(server.workspaceRoot),
388
+ name: server.workspaceRoot.split("/").pop()
389
+ }]
390
+ });
391
+ server.capabilities = result.capabilities;
392
+ sendNotification(server, "initialized", {});
393
+ server.ready = true;
337
394
  }
395
+
338
396
  // ============================================================================
339
397
  // DOCUMENT SYNC
340
398
  // ============================================================================
399
+
341
400
  /**
342
401
  * Open or re-sync a file with the language server.
343
402
  * - First open: sends didOpen + probes with documentSymbol to ensure server is ready
@@ -348,370 +407,474 @@ async function initializeServer(server) {
348
407
  * This is more reliable than waiting for diagnostics notifications.
349
408
  */
350
409
  async function ensureFileOpen(server, filePath) {
351
- const uri = fileUri(filePath);
352
- const absPath = resolve(filePath);
353
- let text;
354
- let mtimeMs;
355
- try {
356
- text = readFileSync(absPath, "utf-8");
357
- mtimeMs = statSync(absPath).mtimeMs;
358
- }
359
- catch {
360
- throw new Error(`Cannot read file: ${filePath}`);
361
- }
362
- const hash = quickHash(text);
363
- const existing = server.openedFiles.get(uri);
364
- if (existing) {
365
- // Already open check if content changed
366
- if (existing.mtimeMs === mtimeMs && existing.contentHash === hash) {
367
- return; // No changes
368
- }
369
- // File changed on disk — send didChange with full content
370
- existing.version++;
371
- existing.contentHash = hash;
372
- existing.mtimeMs = mtimeMs;
373
- sendNotification(server, "textDocument/didChange", {
374
- textDocument: { uri, version: existing.version },
375
- contentChanges: [{ text }],
376
- });
377
- // Probe: force server to re-process the file before we query it
378
- await sendRequest(server, "textDocument/documentSymbol", { textDocument: { uri } });
379
- return;
380
- }
381
- // First open
382
- const ext = extname(filePath).toLowerCase();
383
- const langId = EXT_TO_LANGID[ext] || "plaintext";
384
- const openedFile = { uri, version: 1, contentHash: hash, mtimeMs };
385
- server.openedFiles.set(uri, openedFile);
386
- sendNotification(server, "textDocument/didOpen", {
387
- textDocument: { uri, languageId: langId, version: 1, text },
410
+ const uri = fileUri(filePath);
411
+ const absPath = resolve(filePath);
412
+ let text;
413
+ let mtimeMs;
414
+ try {
415
+ text = readFileSync(absPath, "utf-8");
416
+ mtimeMs = statSync(absPath).mtimeMs;
417
+ } catch {
418
+ throw new Error(`Cannot read file: ${filePath}`);
419
+ }
420
+ const hash = quickHash(text);
421
+ const existing = server.openedFiles.get(uri);
422
+ if (existing) {
423
+ // Already open — check if content changed
424
+ if (existing.mtimeMs === mtimeMs && existing.contentHash === hash) {
425
+ return; // No changes
426
+ }
427
+
428
+ // File changed on disk — send didChange with full content
429
+ existing.version++;
430
+ existing.contentHash = hash;
431
+ existing.mtimeMs = mtimeMs;
432
+ sendNotification(server, "textDocument/didChange", {
433
+ textDocument: {
434
+ uri,
435
+ version: existing.version
436
+ },
437
+ contentChanges: [{
438
+ text
439
+ }]
388
440
  });
389
- // Probe: documentSymbol ensures the server has parsed this file's AST.
390
- await sendRequest(server, "textDocument/documentSymbol", { textDocument: { uri } });
391
- // On first file open, also probe with workspace/symbol to wait for full
392
- // project indexing (type checking, cross-file resolution). This takes ~10s
393
- // on cold start but is essential for hover/definition to work correctly.
394
- // Subsequent files skip this since the project is already indexed.
395
- if (!server.projectIndexed) {
396
- await sendRequest(server, "workspace/symbol", { query: "" });
397
- server.projectIndexed = true;
398
- }
441
+
442
+ // Probe: force server to re-process the file before we query it
443
+ await sendRequest(server, "textDocument/documentSymbol", {
444
+ textDocument: {
445
+ uri
446
+ }
447
+ });
448
+ return;
449
+ }
450
+
451
+ // First open
452
+ const ext = extname(filePath).toLowerCase();
453
+ const langId = EXT_TO_LANGID[ext] || "plaintext";
454
+ const openedFile = {
455
+ uri,
456
+ version: 1,
457
+ contentHash: hash,
458
+ mtimeMs
459
+ };
460
+ server.openedFiles.set(uri, openedFile);
461
+ sendNotification(server, "textDocument/didOpen", {
462
+ textDocument: {
463
+ uri,
464
+ languageId: langId,
465
+ version: 1,
466
+ text
467
+ }
468
+ });
469
+
470
+ // Probe: documentSymbol ensures the server has parsed this file's AST.
471
+ await sendRequest(server, "textDocument/documentSymbol", {
472
+ textDocument: {
473
+ uri
474
+ }
475
+ });
476
+
477
+ // On first file open, also probe with workspace/symbol to wait for full
478
+ // project indexing (type checking, cross-file resolution). This takes ~10s
479
+ // on cold start but is essential for hover/definition to work correctly.
480
+ // Subsequent files skip this since the project is already indexed.
481
+ if (!server.projectIndexed) {
482
+ await sendRequest(server, "workspace/symbol", {
483
+ query: ""
484
+ });
485
+ server.projectIndexed = true;
486
+ }
399
487
  }
488
+
400
489
  /**
401
490
  * Notify server that a file was modified externally (by edit_file, write_file, etc.).
402
491
  * Call this from local-tools after any file modification.
403
492
  */
404
493
  export function notifyFileChanged(filePath) {
405
- const absPath = resolve(filePath);
406
- const uri = fileUri(absPath);
407
- // Find any server that has this file open and invalidate it
408
- for (const server of servers.values()) {
409
- const opened = server.openedFiles.get(uri);
410
- if (opened) {
411
- // Force mtime to 0 so next ensureFileOpen detects the change
412
- opened.mtimeMs = 0;
413
- }
414
- }
494
+ const absPath = resolve(filePath);
495
+ const uri = fileUri(absPath);
496
+
497
+ // Find any server that has this file open and invalidate it
498
+ for (const server of servers.values()) {
499
+ const opened = server.openedFiles.get(uri);
500
+ if (opened) {
501
+ // Force mtime to 0 so next ensureFileOpen detects the change
502
+ opened.mtimeMs = 0;
503
+ }
504
+ }
415
505
  }
416
- const OPERATIONS = new Set([
417
- "goToDefinition", "findReferences", "hover",
418
- "documentSymbol", "workspaceSymbol", "goToImplementation",
419
- "prepareCallHierarchy", "incomingCalls", "outgoingCalls",
420
- ]);
506
+
507
+ // ============================================================================
508
+ // OPERATIONS
509
+ // ============================================================================
510
+
511
+ const OPERATIONS = new Set(["goToDefinition", "findReferences", "hover", "documentSymbol", "workspaceSymbol", "goToImplementation", "prepareCallHierarchy", "incomingCalls", "outgoingCalls"]);
421
512
  function toPosition(line, character) {
422
- return { line: Math.max(0, line - 1), character: Math.max(0, character - 1) };
513
+ return {
514
+ line: Math.max(0, line - 1),
515
+ character: Math.max(0, character - 1)
516
+ };
423
517
  }
424
518
  async function runOperation(operation, server, filePath, line, character, query) {
425
- const uri = fileUri(filePath);
426
- const pos = toPosition(line, character);
427
- switch (operation) {
428
- case "goToDefinition": {
429
- const result = await sendRequest(server, "textDocument/definition", {
430
- textDocument: { uri }, position: pos,
431
- });
432
- return formatLocations(result, "Definition");
433
- }
434
- case "findReferences": {
435
- const result = await sendRequest(server, "textDocument/references", {
436
- textDocument: { uri }, position: pos,
437
- context: { includeDeclaration: true },
438
- });
439
- return formatLocations(result, "References");
440
- }
441
- case "hover": {
442
- const result = await sendRequest(server, "textDocument/hover", {
443
- textDocument: { uri }, position: pos,
444
- });
445
- return formatHover(result);
446
- }
447
- case "documentSymbol": {
448
- const result = await sendRequest(server, "textDocument/documentSymbol", {
449
- textDocument: { uri },
450
- });
451
- return formatDocumentSymbols(result, filePath);
452
- }
453
- case "workspaceSymbol": {
454
- const result = await sendRequest(server, "workspace/symbol", {
455
- query: query || "",
456
- });
457
- return formatWorkspaceSymbols(result);
458
- }
459
- case "goToImplementation": {
460
- const result = await sendRequest(server, "textDocument/implementation", {
461
- textDocument: { uri }, position: pos,
462
- });
463
- return formatLocations(result, "Implementations");
464
- }
465
- case "prepareCallHierarchy": {
466
- const result = await sendRequest(server, "textDocument/prepareCallHierarchy", {
467
- textDocument: { uri }, position: pos,
468
- });
469
- return formatCallHierarchyItems(result);
470
- }
471
- case "incomingCalls": {
472
- const items = await sendRequest(server, "textDocument/prepareCallHierarchy", {
473
- textDocument: { uri }, position: pos,
474
- });
475
- if (!items || (Array.isArray(items) && items.length === 0)) {
476
- return "No call hierarchy item found at this position.";
477
- }
478
- const item = Array.isArray(items) ? items[0] : items;
479
- const result = await sendRequest(server, "callHierarchy/incomingCalls", { item });
480
- return formatIncomingCalls(result);
519
+ const uri = fileUri(filePath);
520
+ const pos = toPosition(line, character);
521
+ switch (operation) {
522
+ case "goToDefinition":
523
+ {
524
+ const result = await sendRequest(server, "textDocument/definition", {
525
+ textDocument: {
526
+ uri
527
+ },
528
+ position: pos
529
+ });
530
+ return formatLocations(result, "Definition");
531
+ }
532
+ case "findReferences":
533
+ {
534
+ const result = await sendRequest(server, "textDocument/references", {
535
+ textDocument: {
536
+ uri
537
+ },
538
+ position: pos,
539
+ context: {
540
+ includeDeclaration: true
541
+ }
542
+ });
543
+ return formatLocations(result, "References");
544
+ }
545
+ case "hover":
546
+ {
547
+ const result = await sendRequest(server, "textDocument/hover", {
548
+ textDocument: {
549
+ uri
550
+ },
551
+ position: pos
552
+ });
553
+ return formatHover(result);
554
+ }
555
+ case "documentSymbol":
556
+ {
557
+ const result = await sendRequest(server, "textDocument/documentSymbol", {
558
+ textDocument: {
559
+ uri
560
+ }
561
+ });
562
+ return formatDocumentSymbols(result, filePath);
563
+ }
564
+ case "workspaceSymbol":
565
+ {
566
+ const result = await sendRequest(server, "workspace/symbol", {
567
+ query: query || ""
568
+ });
569
+ return formatWorkspaceSymbols(result);
570
+ }
571
+ case "goToImplementation":
572
+ {
573
+ const result = await sendRequest(server, "textDocument/implementation", {
574
+ textDocument: {
575
+ uri
576
+ },
577
+ position: pos
578
+ });
579
+ return formatLocations(result, "Implementations");
580
+ }
581
+ case "prepareCallHierarchy":
582
+ {
583
+ const result = await sendRequest(server, "textDocument/prepareCallHierarchy", {
584
+ textDocument: {
585
+ uri
586
+ },
587
+ position: pos
588
+ });
589
+ return formatCallHierarchyItems(result);
590
+ }
591
+ case "incomingCalls":
592
+ {
593
+ const items = await sendRequest(server, "textDocument/prepareCallHierarchy", {
594
+ textDocument: {
595
+ uri
596
+ },
597
+ position: pos
598
+ });
599
+ if (!items || Array.isArray(items) && items.length === 0) {
600
+ return "No call hierarchy item found at this position.";
481
601
  }
482
- case "outgoingCalls": {
483
- const items = await sendRequest(server, "textDocument/prepareCallHierarchy", {
484
- textDocument: { uri }, position: pos,
485
- });
486
- if (!items || (Array.isArray(items) && items.length === 0)) {
487
- return "No call hierarchy item found at this position.";
488
- }
489
- const item = Array.isArray(items) ? items[0] : items;
490
- const result = await sendRequest(server, "callHierarchy/outgoingCalls", { item });
491
- return formatOutgoingCalls(result);
602
+ const item = Array.isArray(items) ? items[0] : items;
603
+ const result = await sendRequest(server, "callHierarchy/incomingCalls", {
604
+ item
605
+ });
606
+ return formatIncomingCalls(result);
607
+ }
608
+ case "outgoingCalls":
609
+ {
610
+ const items = await sendRequest(server, "textDocument/prepareCallHierarchy", {
611
+ textDocument: {
612
+ uri
613
+ },
614
+ position: pos
615
+ });
616
+ if (!items || Array.isArray(items) && items.length === 0) {
617
+ return "No call hierarchy item found at this position.";
492
618
  }
493
- default:
494
- return `Unknown operation: ${operation}`;
495
- }
619
+ const item = Array.isArray(items) ? items[0] : items;
620
+ const result = await sendRequest(server, "callHierarchy/outgoingCalls", {
621
+ item
622
+ });
623
+ return formatOutgoingCalls(result);
624
+ }
625
+ default:
626
+ return `Unknown operation: ${operation}`;
627
+ }
496
628
  }
629
+
497
630
  // ============================================================================
498
631
  // RESULT FORMATTERS
499
632
  // ============================================================================
633
+
500
634
  function normalizeLocations(result) {
501
- if (!result)
502
- return [];
503
- if (Array.isArray(result)) {
504
- return result.map(item => {
505
- if (item.targetUri) {
506
- return { uri: item.targetUri, range: item.targetSelectionRange || item.targetRange };
507
- }
508
- return item;
509
- });
510
- }
511
- if (result.uri)
512
- return [result];
513
- if (result.targetUri) {
514
- return [{ uri: result.targetUri, range: result.targetSelectionRange || result.targetRange }];
515
- }
516
- return [];
635
+ if (!result) return [];
636
+ if (Array.isArray(result)) {
637
+ return result.map(item => {
638
+ if (item.targetUri) {
639
+ return {
640
+ uri: item.targetUri,
641
+ range: item.targetSelectionRange || item.targetRange
642
+ };
643
+ }
644
+ return item;
645
+ });
646
+ }
647
+ if (result.uri) return [result];
648
+ if (result.targetUri) {
649
+ return [{
650
+ uri: result.targetUri,
651
+ range: result.targetSelectionRange || result.targetRange
652
+ }];
653
+ }
654
+ return [];
517
655
  }
518
656
  function formatLocations(result, label) {
519
- const locations = normalizeLocations(result);
520
- if (locations.length === 0)
521
- return `No ${label.toLowerCase()} found.`;
522
- const byFile = new Map();
523
- for (const loc of locations) {
524
- const path = uriToPath(loc.uri);
525
- if (!byFile.has(path))
526
- byFile.set(path, []);
527
- byFile.get(path).push({
528
- line: loc.range.start.line + 1,
529
- char: loc.range.start.character + 1,
530
- });
531
- }
532
- const lines = [`${label} (${locations.length}):`];
533
- for (const [path, positions] of byFile) {
534
- if (byFile.size > 1)
535
- lines.push(` ${path}`);
536
- for (const pos of positions) {
537
- const prefix = byFile.size > 1 ? " " : " ";
538
- lines.push(`${prefix}${path}:${pos.line}:${pos.char}`);
539
- }
540
- }
541
- return lines.join("\n");
657
+ const locations = normalizeLocations(result);
658
+ if (locations.length === 0) return `No ${label.toLowerCase()} found.`;
659
+ const byFile = new Map();
660
+ for (const loc of locations) {
661
+ const path = uriToPath(loc.uri);
662
+ if (!byFile.has(path)) byFile.set(path, []);
663
+ byFile.get(path).push({
664
+ line: loc.range.start.line + 1,
665
+ char: loc.range.start.character + 1
666
+ });
667
+ }
668
+ const lines = [`${label} (${locations.length}):`];
669
+ for (const [path, positions] of byFile) {
670
+ if (byFile.size > 1) lines.push(` ${path}`);
671
+ for (const pos of positions) {
672
+ const prefix = byFile.size > 1 ? " " : " ";
673
+ lines.push(`${prefix}${path}:${pos.line}:${pos.char}`);
674
+ }
675
+ }
676
+ return lines.join("\n");
542
677
  }
543
678
  function formatHover(result) {
544
- if (!result || !result.contents)
545
- return "No hover information.";
546
- const contents = result.contents;
547
- if (typeof contents === "string")
548
- return contents;
549
- if (contents.kind === "markdown" || contents.kind === "plaintext") {
550
- return contents.value || "";
551
- }
552
- if (contents.language && contents.value) {
553
- return `\`\`\`${contents.language}\n${contents.value}\n\`\`\``;
554
- }
555
- if (Array.isArray(contents)) {
556
- return contents
557
- .map((c) => {
558
- if (typeof c === "string")
559
- return c;
560
- if (c.language && c.value)
561
- return `\`\`\`${c.language}\n${c.value}\n\`\`\``;
562
- if (c.value)
563
- return c.value;
564
- return String(c);
565
- })
566
- .join("\n\n");
567
- }
568
- return JSON.stringify(contents, null, 2);
679
+ if (!result || !result.contents) return "No hover information.";
680
+ const contents = result.contents;
681
+ if (typeof contents === "string") return contents;
682
+ if (contents.kind === "markdown" || contents.kind === "plaintext") {
683
+ return contents.value || "";
684
+ }
685
+ if (contents.language && contents.value) {
686
+ return `\`\`\`${contents.language}\n${contents.value}\n\`\`\``;
687
+ }
688
+ if (Array.isArray(contents)) {
689
+ return contents.map(c => {
690
+ if (typeof c === "string") return c;
691
+ if (c.language && c.value) return `\`\`\`${c.language}\n${c.value}\n\`\`\``;
692
+ if (c.value) return c.value;
693
+ return String(c);
694
+ }).join("\n\n");
695
+ }
696
+ return JSON.stringify(contents, null, 2);
569
697
  }
570
698
  const SYMBOL_KIND_NAMES = {
571
- 1: "File", 2: "Module", 3: "Namespace", 4: "Package", 5: "Class",
572
- 6: "Method", 7: "Property", 8: "Field", 9: "Constructor", 10: "Enum",
573
- 11: "Interface", 12: "Function", 13: "Variable", 14: "Constant",
574
- 15: "String", 16: "Number", 17: "Boolean", 18: "Array", 19: "Object",
575
- 20: "Key", 21: "Null", 22: "EnumMember", 23: "Struct", 24: "Event",
576
- 25: "Operator", 26: "TypeParameter",
699
+ 1: "File",
700
+ 2: "Module",
701
+ 3: "Namespace",
702
+ 4: "Package",
703
+ 5: "Class",
704
+ 6: "Method",
705
+ 7: "Property",
706
+ 8: "Field",
707
+ 9: "Constructor",
708
+ 10: "Enum",
709
+ 11: "Interface",
710
+ 12: "Function",
711
+ 13: "Variable",
712
+ 14: "Constant",
713
+ 15: "String",
714
+ 16: "Number",
715
+ 17: "Boolean",
716
+ 18: "Array",
717
+ 19: "Object",
718
+ 20: "Key",
719
+ 21: "Null",
720
+ 22: "EnumMember",
721
+ 23: "Struct",
722
+ 24: "Event",
723
+ 25: "Operator",
724
+ 26: "TypeParameter"
577
725
  };
578
726
  function symbolKindName(kind) {
579
- return SYMBOL_KIND_NAMES[kind] || `Kind(${kind})`;
727
+ return SYMBOL_KIND_NAMES[kind] || `Kind(${kind})`;
580
728
  }
581
729
  function formatDocumentSymbols(result, filePath) {
582
- if (!result || !Array.isArray(result) || result.length === 0) {
583
- return `No symbols found in ${filePath}`;
584
- }
585
- const lines = [`Symbols in ${filePath}:`];
586
- function walk(symbols, indent) {
587
- for (const sym of symbols) {
588
- const kind = symbolKindName(sym.kind);
589
- const line = sym.range?.start?.line != null
590
- ? sym.range.start.line + 1
591
- : sym.location?.range?.start?.line != null
592
- ? sym.location.range.start.line + 1
593
- : "?";
594
- lines.push(`${" ".repeat(indent + 1)}${kind} ${sym.name} :${line}`);
595
- if (sym.children?.length)
596
- walk(sym.children, indent + 1);
597
- }
598
- }
599
- walk(result, 0);
600
- return lines.join("\n");
730
+ if (!result || !Array.isArray(result) || result.length === 0) {
731
+ return `No symbols found in ${filePath}`;
732
+ }
733
+ const lines = [`Symbols in ${filePath}:`];
734
+ function walk(symbols, indent) {
735
+ for (const sym of symbols) {
736
+ const kind = symbolKindName(sym.kind);
737
+ const line = sym.range?.start?.line != null ? sym.range.start.line + 1 : sym.location?.range?.start?.line != null ? sym.location.range.start.line + 1 : "?";
738
+ lines.push(`${" ".repeat(indent + 1)}${kind} ${sym.name} :${line}`);
739
+ if (sym.children?.length) walk(sym.children, indent + 1);
740
+ }
741
+ }
742
+ walk(result, 0);
743
+ return lines.join("\n");
601
744
  }
602
745
  function formatWorkspaceSymbols(result) {
603
- if (!result || !Array.isArray(result) || result.length === 0) {
604
- return "No workspace symbols found.";
605
- }
606
- const lines = [`Workspace symbols (${result.length}):`];
607
- for (const sym of result.slice(0, 100)) {
608
- const kind = symbolKindName(sym.kind);
609
- const path = sym.location?.uri ? uriToPath(sym.location.uri) : "?";
610
- const line = sym.location?.range?.start?.line != null ? sym.location.range.start.line + 1 : "?";
611
- lines.push(` ${kind} ${sym.name} ${path}:${line}`);
612
- }
613
- if (result.length > 100)
614
- lines.push(` ... and ${result.length - 100} more`);
615
- return lines.join("\n");
746
+ if (!result || !Array.isArray(result) || result.length === 0) {
747
+ return "No workspace symbols found.";
748
+ }
749
+ const lines = [`Workspace symbols (${result.length}):`];
750
+ for (const sym of result.slice(0, 100)) {
751
+ const kind = symbolKindName(sym.kind);
752
+ const path = sym.location?.uri ? uriToPath(sym.location.uri) : "?";
753
+ const line = sym.location?.range?.start?.line != null ? sym.location.range.start.line + 1 : "?";
754
+ lines.push(` ${kind} ${sym.name} ${path}:${line}`);
755
+ }
756
+ if (result.length > 100) lines.push(` ... and ${result.length - 100} more`);
757
+ return lines.join("\n");
616
758
  }
617
759
  function formatCallHierarchyItems(result) {
618
- if (!result || !Array.isArray(result) || result.length === 0) {
619
- return "No call hierarchy item found at this position.";
620
- }
621
- const lines = ["Call hierarchy items:"];
622
- for (const item of result) {
623
- const kind = symbolKindName(item.kind);
624
- const path = item.uri ? uriToPath(item.uri) : "?";
625
- const line = item.range?.start?.line != null ? item.range.start.line + 1 : "?";
626
- lines.push(` ${kind} ${item.name} ${path}:${line}`);
627
- }
628
- return lines.join("\n");
760
+ if (!result || !Array.isArray(result) || result.length === 0) {
761
+ return "No call hierarchy item found at this position.";
762
+ }
763
+ const lines = ["Call hierarchy items:"];
764
+ for (const item of result) {
765
+ const kind = symbolKindName(item.kind);
766
+ const path = item.uri ? uriToPath(item.uri) : "?";
767
+ const line = item.range?.start?.line != null ? item.range.start.line + 1 : "?";
768
+ lines.push(` ${kind} ${item.name} ${path}:${line}`);
769
+ }
770
+ return lines.join("\n");
629
771
  }
630
772
  function formatIncomingCalls(result) {
631
- if (!result || !Array.isArray(result) || result.length === 0) {
632
- return "No incoming calls found.";
633
- }
634
- const lines = [`Incoming calls (${result.length}):`];
635
- for (const call of result) {
636
- const from = call.from;
637
- const kind = symbolKindName(from.kind);
638
- const path = from.uri ? uriToPath(from.uri) : "?";
639
- const line = from.range?.start?.line != null ? from.range.start.line + 1 : "?";
640
- lines.push(` ${kind} ${from.name} ${path}:${line}`);
641
- }
642
- return lines.join("\n");
773
+ if (!result || !Array.isArray(result) || result.length === 0) {
774
+ return "No incoming calls found.";
775
+ }
776
+ const lines = [`Incoming calls (${result.length}):`];
777
+ for (const call of result) {
778
+ const from = call.from;
779
+ const kind = symbolKindName(from.kind);
780
+ const path = from.uri ? uriToPath(from.uri) : "?";
781
+ const line = from.range?.start?.line != null ? from.range.start.line + 1 : "?";
782
+ lines.push(` ${kind} ${from.name} ${path}:${line}`);
783
+ }
784
+ return lines.join("\n");
643
785
  }
644
786
  function formatOutgoingCalls(result) {
645
- if (!result || !Array.isArray(result) || result.length === 0) {
646
- return "No outgoing calls found.";
647
- }
648
- const lines = [`Outgoing calls (${result.length}):`];
649
- for (const call of result) {
650
- const to = call.to;
651
- const kind = symbolKindName(to.kind);
652
- const path = to.uri ? uriToPath(to.uri) : "?";
653
- const line = to.range?.start?.line != null ? to.range.start.line + 1 : "?";
654
- lines.push(` ${kind} ${to.name} ${path}:${line}`);
655
- }
656
- return lines.join("\n");
787
+ if (!result || !Array.isArray(result) || result.length === 0) {
788
+ return "No outgoing calls found.";
789
+ }
790
+ const lines = [`Outgoing calls (${result.length}):`];
791
+ for (const call of result) {
792
+ const to = call.to;
793
+ const kind = symbolKindName(to.kind);
794
+ const path = to.uri ? uriToPath(to.uri) : "?";
795
+ const line = to.range?.start?.line != null ? to.range.start.line + 1 : "?";
796
+ lines.push(` ${kind} ${to.name} ${path}:${line}`);
797
+ }
798
+ return lines.join("\n");
657
799
  }
800
+
658
801
  // ============================================================================
659
802
  // CLEANUP
660
803
  // ============================================================================
804
+
661
805
  function shutdownAll() {
662
- for (const [key, server] of servers) {
806
+ for (const [key, server] of servers) {
807
+ try {
808
+ const id = server.nextId++;
809
+ server.process.stdin.write(encodeMessage({
810
+ jsonrpc: "2.0",
811
+ id,
812
+ method: "shutdown",
813
+ params: null
814
+ }));
815
+ sendNotification(server, "exit", null);
816
+ setTimeout(() => {
663
817
  try {
664
- const id = server.nextId++;
665
- server.process.stdin.write(encodeMessage({ jsonrpc: "2.0", id, method: "shutdown", params: null }));
666
- sendNotification(server, "exit", null);
667
- setTimeout(() => {
668
- try {
669
- server.process.kill("SIGTERM");
670
- }
671
- catch { /* dead */ }
672
- }, 2000);
673
- }
674
- catch {
675
- try {
676
- server.process.kill("SIGTERM");
677
- }
678
- catch { /* dead */ }
679
- }
680
- servers.delete(key);
681
- }
818
+ server.process.kill("SIGTERM");
819
+ } catch {/* dead */}
820
+ }, 2000);
821
+ } catch {
822
+ try {
823
+ server.process.kill("SIGTERM");
824
+ } catch {/* dead */}
825
+ }
826
+ servers.delete(key);
827
+ }
682
828
  }
829
+
683
830
  // ============================================================================
684
831
  // PUBLIC API
685
832
  // ============================================================================
833
+
686
834
  export async function executeLSP(operation, input) {
687
- const op = operation;
688
- if (!OPERATIONS.has(op)) {
689
- return {
690
- success: false,
691
- output: `Unknown LSP operation: ${operation}. Valid: ${[...OPERATIONS].join(", ")}`,
692
- };
693
- }
694
- const filePath = input.filePath;
695
- const line = input.line;
696
- const character = input.character;
697
- const query = input.query;
698
- if (!filePath)
699
- return { success: false, output: "filePath is required" };
700
- if (!line || line < 1)
701
- return { success: false, output: "line is required (1-based)" };
702
- if (!character || character < 1)
703
- return { success: false, output: "character is required (1-based)" };
704
- const resolved = resolve(filePath);
705
- if (!existsSync(resolved)) {
706
- return { success: false, output: `File not found: ${resolved}` };
707
- }
708
- try {
709
- const server = await getOrCreateServer(resolved);
710
- await ensureFileOpen(server, resolved);
711
- const result = await runOperation(op, server, resolved, line, character, query);
712
- return { success: true, output: result };
713
- }
714
- catch (err) {
715
- return { success: false, output: `LSP error: ${err.message || err}` };
716
- }
835
+ const op = operation;
836
+ if (!OPERATIONS.has(op)) {
837
+ return {
838
+ success: false,
839
+ output: `Unknown LSP operation: ${operation}. Valid: ${[...OPERATIONS].join(", ")}`
840
+ };
841
+ }
842
+ const filePath = input.filePath;
843
+ const line = input.line;
844
+ const character = input.character;
845
+ const query = input.query;
846
+ if (!filePath) return {
847
+ success: false,
848
+ output: "filePath is required"
849
+ };
850
+ if (!line || line < 1) return {
851
+ success: false,
852
+ output: "line is required (1-based)"
853
+ };
854
+ if (!character || character < 1) return {
855
+ success: false,
856
+ output: "character is required (1-based)"
857
+ };
858
+ const resolved = resolve(filePath);
859
+ if (!existsSync(resolved)) {
860
+ return {
861
+ success: false,
862
+ output: `File not found: ${resolved}`
863
+ };
864
+ }
865
+ try {
866
+ const server = await getOrCreateServer(resolved);
867
+ await ensureFileOpen(server, resolved);
868
+ const result = await runOperation(op, server, resolved, line, character, query);
869
+ return {
870
+ success: true,
871
+ output: result
872
+ };
873
+ } catch (err) {
874
+ return {
875
+ success: false,
876
+ output: `LSP error: ${err.message || err}`
877
+ };
878
+ }
717
879
  }
880
+ //# sourceMappingURL=lsp-manager.js.map