whale-code 6.5.5 → 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 (847) 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 +5 -1
  73. package/dist/cli/services/agent-config.js +66 -36
  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 +976 -688
  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.js +187 -169
  107. package/dist/cli/services/error-logger.js.map +1 -0
  108. package/dist/cli/services/file-history.d.ts +1 -1
  109. package/dist/cli/services/file-history.js +50 -54
  110. package/dist/cli/services/file-history.js.map +1 -0
  111. package/dist/cli/services/format-server-response.js +332 -372
  112. package/dist/cli/services/format-server-response.js.map +1 -0
  113. package/dist/cli/services/git-context.js +61 -45
  114. package/dist/cli/services/git-context.js.map +1 -0
  115. package/dist/cli/services/hooks.d.ts +2 -2
  116. package/dist/cli/services/hooks.js +195 -180
  117. package/dist/cli/services/hooks.js.map +1 -0
  118. package/dist/cli/services/ink-incremental.d.ts +19 -0
  119. package/dist/cli/services/ink-incremental.js +59 -0
  120. package/dist/cli/services/ink-incremental.js.map +1 -0
  121. package/dist/cli/services/ink-resize-fix.js +54 -44
  122. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  123. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  124. package/dist/cli/services/ink-sync-output.js +16 -0
  125. package/dist/cli/services/ink-sync-output.js.map +1 -0
  126. package/dist/cli/services/interactive-tools.js +268 -212
  127. package/dist/cli/services/interactive-tools.js.map +1 -0
  128. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  129. package/dist/cli/services/keybinding-manager.js +126 -63
  130. package/dist/cli/services/keybinding-manager.js.map +1 -0
  131. package/dist/cli/services/local-tools.d.ts +1 -1
  132. package/dist/cli/services/local-tools.js +939 -656
  133. package/dist/cli/services/local-tools.js.map +1 -0
  134. package/dist/cli/services/lsp-manager.js +757 -594
  135. package/dist/cli/services/lsp-manager.js.map +1 -0
  136. package/dist/cli/services/mcp-client.d.ts +1 -1
  137. package/dist/cli/services/mcp-client.js +173 -134
  138. package/dist/cli/services/mcp-client.js.map +1 -0
  139. package/dist/cli/services/memory-manager.js +53 -40
  140. package/dist/cli/services/memory-manager.js.map +1 -0
  141. package/dist/cli/services/model-manager.js +55 -40
  142. package/dist/cli/services/model-manager.js.map +1 -0
  143. package/dist/cli/services/model-router.js +115 -85
  144. package/dist/cli/services/model-router.js.map +1 -0
  145. package/dist/cli/services/paths.d.ts +30 -0
  146. package/dist/cli/services/paths.js +81 -0
  147. package/dist/cli/services/paths.js.map +1 -0
  148. package/dist/cli/services/permission-modes.js +32 -25
  149. package/dist/cli/services/permission-modes.js.map +1 -0
  150. package/dist/cli/services/rewind.js +182 -168
  151. package/dist/cli/services/rewind.js.map +1 -0
  152. package/dist/cli/services/ripgrep.js +115 -115
  153. package/dist/cli/services/ripgrep.js.map +1 -0
  154. package/dist/cli/services/sandbox.d.ts +1 -1
  155. package/dist/cli/services/sandbox.js +58 -37
  156. package/dist/cli/services/sandbox.js.map +1 -0
  157. package/dist/cli/services/server-tools.js +738 -565
  158. package/dist/cli/services/server-tools.js.map +1 -0
  159. package/dist/cli/services/session-persistence.js +69 -74
  160. package/dist/cli/services/session-persistence.js.map +1 -0
  161. package/dist/cli/services/subagent-worker.js +42 -27
  162. package/dist/cli/services/subagent-worker.js.map +1 -0
  163. package/dist/cli/services/subagent.d.ts +2 -0
  164. package/dist/cli/services/subagent.js +605 -433
  165. package/dist/cli/services/subagent.js.map +1 -0
  166. package/dist/cli/services/system-prompt.js +86 -78
  167. package/dist/cli/services/system-prompt.js.map +1 -0
  168. package/dist/cli/services/task-decomposer.d.ts +1 -1
  169. package/dist/cli/services/task-decomposer.js +172 -139
  170. package/dist/cli/services/task-decomposer.js.map +1 -0
  171. package/dist/cli/services/team-lead.d.ts +2 -2
  172. package/dist/cli/services/team-lead.js +727 -529
  173. package/dist/cli/services/team-lead.js.map +1 -0
  174. package/dist/cli/services/team-state.js +319 -319
  175. package/dist/cli/services/team-state.js.map +1 -0
  176. package/dist/cli/services/teammate.d.ts +8 -2
  177. package/dist/cli/services/teammate.js +857 -569
  178. package/dist/cli/services/teammate.js.map +1 -0
  179. package/dist/cli/services/telemetry.d.ts +6 -1
  180. package/dist/cli/services/telemetry.js +180 -157
  181. package/dist/cli/services/telemetry.js.map +1 -0
  182. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  183. package/dist/cli/services/tools/agent-tools.js +480 -322
  184. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  185. package/dist/cli/services/tools/file-ops.js +563 -450
  186. package/dist/cli/services/tools/file-ops.js.map +1 -0
  187. package/dist/cli/services/tools/search-tools.js +231 -162
  188. package/dist/cli/services/tools/search-tools.js.map +1 -0
  189. package/dist/cli/services/tools/shell-exec.js +197 -151
  190. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  191. package/dist/cli/services/tools/task-manager.js +206 -173
  192. package/dist/cli/services/tools/task-manager.js.map +1 -0
  193. package/dist/cli/services/tools/web-tools.js +388 -341
  194. package/dist/cli/services/tools/web-tools.js.map +1 -0
  195. package/dist/cli/setup/SetupApp.d.ts +2 -2
  196. package/dist/cli/setup/SetupApp.js +608 -160
  197. package/dist/cli/setup/SetupApp.js.map +1 -0
  198. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  199. package/dist/cli/shared/ErrorBoundary.js +73 -0
  200. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  201. package/dist/cli/shared/MatrixIntro.js +66 -69
  202. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  203. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  204. package/dist/cli/shared/SpinnerSlot.js +63 -0
  205. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  206. package/dist/cli/shared/Theme.d.ts +1 -1
  207. package/dist/cli/shared/Theme.js +136 -92
  208. package/dist/cli/shared/Theme.js.map +1 -0
  209. package/dist/cli/shared/WhaleBanner.js +99 -11
  210. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  211. package/dist/cli/shared/markdown.d.ts +3 -1
  212. package/dist/cli/shared/markdown.js +736 -674
  213. package/dist/cli/shared/markdown.js.map +1 -0
  214. package/dist/cli/shared/marked-terminal.d.js +2 -0
  215. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  216. package/dist/cli/shared/theme-manager.js +99 -90
  217. package/dist/cli/shared/theme-manager.js.map +1 -0
  218. package/dist/cli/shared/theme-presets.js +256 -254
  219. package/dist/cli/shared/theme-presets.js.map +1 -0
  220. package/dist/cli/status/StatusApp.js +235 -86
  221. package/dist/cli/status/StatusApp.js.map +1 -0
  222. package/dist/cli/stores/StoreApp.js +275 -65
  223. package/dist/cli/stores/StoreApp.js.map +1 -0
  224. package/dist/index.d.ts +2 -2
  225. package/dist/index.js +509 -396
  226. package/dist/index.js.map +1 -0
  227. package/dist/local-agent/connection.d.ts +2 -2
  228. package/dist/local-agent/connection.js +352 -293
  229. package/dist/local-agent/connection.js.map +1 -0
  230. package/dist/local-agent/discovery.js +259 -122
  231. package/dist/local-agent/discovery.js.map +1 -0
  232. package/dist/local-agent/executor.js +216 -193
  233. package/dist/local-agent/executor.js.map +1 -0
  234. package/dist/local-agent/index.d.ts +2 -2
  235. package/dist/local-agent/index.js +156 -156
  236. package/dist/local-agent/index.js.map +1 -0
  237. package/dist/node/adapters/base.js +18 -8
  238. package/dist/node/adapters/base.js.map +1 -0
  239. package/dist/node/adapters/discord.js +286 -275
  240. package/dist/node/adapters/discord.js.map +1 -0
  241. package/dist/node/adapters/email.js +189 -202
  242. package/dist/node/adapters/email.js.map +1 -0
  243. package/dist/node/adapters/imessage.js +145 -142
  244. package/dist/node/adapters/imessage.js.map +1 -0
  245. package/dist/node/adapters/slack.js +237 -236
  246. package/dist/node/adapters/slack.js.map +1 -0
  247. package/dist/node/adapters/sms.js +149 -151
  248. package/dist/node/adapters/sms.js.map +1 -0
  249. package/dist/node/adapters/telegram.js +88 -92
  250. package/dist/node/adapters/telegram.js.map +1 -0
  251. package/dist/node/adapters/webchat.js +160 -136
  252. package/dist/node/adapters/webchat.js.map +1 -0
  253. package/dist/node/adapters/whatsapp.js +212 -215
  254. package/dist/node/adapters/whatsapp.js.map +1 -0
  255. package/dist/node/cli.js +884 -653
  256. package/dist/node/cli.js.map +1 -0
  257. package/dist/node/config.js +20 -18
  258. package/dist/node/config.js.map +1 -0
  259. package/dist/node/gateway-client.js +191 -181
  260. package/dist/node/gateway-client.js.map +1 -0
  261. package/dist/node/portal/clipboard.js +161 -130
  262. package/dist/node/portal/clipboard.js.map +1 -0
  263. package/dist/node/portal/discovery.js +51 -45
  264. package/dist/node/portal/discovery.js.map +1 -0
  265. package/dist/node/portal/forward.js +64 -58
  266. package/dist/node/portal/forward.js.map +1 -0
  267. package/dist/node/portal/index.js +246 -221
  268. package/dist/node/portal/index.js.map +1 -0
  269. package/dist/node/portal/multiplexer.js +192 -182
  270. package/dist/node/portal/multiplexer.js.map +1 -0
  271. package/dist/node/portal/permissions.js +102 -70
  272. package/dist/node/portal/permissions.js.map +1 -0
  273. package/dist/node/portal/protocol.js +153 -116
  274. package/dist/node/portal/protocol.js.map +1 -0
  275. package/dist/node/portal/screen.js +80 -69
  276. package/dist/node/portal/screen.js.map +1 -0
  277. package/dist/node/portal/session.js +124 -117
  278. package/dist/node/portal/session.js.map +1 -0
  279. package/dist/node/portal/shell.js +140 -113
  280. package/dist/node/portal/shell.js.map +1 -0
  281. package/dist/node/portal/stream.js +77 -75
  282. package/dist/node/portal/stream.js.map +1 -0
  283. package/dist/node/portal/transfer.js +190 -167
  284. package/dist/node/portal/transfer.js.map +1 -0
  285. package/dist/node/portal/ui.js +124 -99
  286. package/dist/node/portal/ui.js.map +1 -0
  287. package/dist/node/remote-desktop/compile-helper.js +50 -45
  288. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  289. package/dist/node/remote-desktop/index.js +215 -187
  290. package/dist/node/remote-desktop/index.js.map +1 -0
  291. package/dist/node/remote-desktop/protocol.js +45 -29
  292. package/dist/node/remote-desktop/protocol.js.map +1 -0
  293. package/dist/node/runtime.js +493 -410
  294. package/dist/node/runtime.js.map +1 -0
  295. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  296. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  297. package/dist/server/handlers/analytics.js +467 -261
  298. package/dist/server/handlers/analytics.js.map +1 -0
  299. package/dist/server/handlers/api-docs.js +1030 -895
  300. package/dist/server/handlers/api-docs.js.map +1 -0
  301. package/dist/server/handlers/api-keys.js +291 -242
  302. package/dist/server/handlers/api-keys.js.map +1 -0
  303. package/dist/server/handlers/billing.js +330 -239
  304. package/dist/server/handlers/billing.js.map +1 -0
  305. package/dist/server/handlers/browser.js +468 -395
  306. package/dist/server/handlers/browser.js.map +1 -0
  307. package/dist/server/handlers/catalog.js +1377 -978
  308. package/dist/server/handlers/catalog.js.map +1 -0
  309. package/dist/server/handlers/clickhouse.js +157 -109
  310. package/dist/server/handlers/clickhouse.js.map +1 -0
  311. package/dist/server/handlers/comms.js +1439 -984
  312. package/dist/server/handlers/comms.js.map +1 -0
  313. package/dist/server/handlers/creations.js +461 -394
  314. package/dist/server/handlers/creations.js.map +1 -0
  315. package/dist/server/handlers/crm.js +1082 -791
  316. package/dist/server/handlers/crm.js.map +1 -0
  317. package/dist/server/handlers/discovery.js +251 -232
  318. package/dist/server/handlers/discovery.js.map +1 -0
  319. package/dist/server/handlers/embeddings.js +241 -164
  320. package/dist/server/handlers/embeddings.js.map +1 -0
  321. package/dist/server/handlers/enrichment.js +887 -718
  322. package/dist/server/handlers/enrichment.js.map +1 -0
  323. package/dist/server/handlers/image-gen.js +467 -376
  324. package/dist/server/handlers/image-gen.js.map +1 -0
  325. package/dist/server/handlers/inventory.js +797 -424
  326. package/dist/server/handlers/inventory.js.map +1 -0
  327. package/dist/server/handlers/kali.js +272 -230
  328. package/dist/server/handlers/kali.js.map +1 -0
  329. package/dist/server/handlers/llm-providers.js +803 -580
  330. package/dist/server/handlers/llm-providers.js.map +1 -0
  331. package/dist/server/handlers/local-agent.js +133 -105
  332. package/dist/server/handlers/local-agent.js.map +1 -0
  333. package/dist/server/handlers/media.js +1179 -857
  334. package/dist/server/handlers/media.js.map +1 -0
  335. package/dist/server/handlers/meta-ads.js +2669 -2093
  336. package/dist/server/handlers/meta-ads.js.map +1 -0
  337. package/dist/server/handlers/nodes.js +1321 -913
  338. package/dist/server/handlers/nodes.js.map +1 -0
  339. package/dist/server/handlers/operations.js +183 -157
  340. package/dist/server/handlers/operations.js.map +1 -0
  341. package/dist/server/handlers/platform.js +346 -210
  342. package/dist/server/handlers/platform.js.map +1 -0
  343. package/dist/server/handlers/remove-bg.js +118 -86
  344. package/dist/server/handlers/remove-bg.js.map +1 -0
  345. package/dist/server/handlers/storefront.js +586 -446
  346. package/dist/server/handlers/storefront.js.map +1 -0
  347. package/dist/server/handlers/supply-chain.js +546 -326
  348. package/dist/server/handlers/supply-chain.js.map +1 -0
  349. package/dist/server/handlers/transcription.js +106 -97
  350. package/dist/server/handlers/transcription.js.map +1 -0
  351. package/dist/server/handlers/video-gen.js +593 -424
  352. package/dist/server/handlers/video-gen.js.map +1 -0
  353. package/dist/server/handlers/voice.js +1458 -1039
  354. package/dist/server/handlers/voice.js.map +1 -0
  355. package/dist/server/handlers/workflow-steps.js +2837 -2116
  356. package/dist/server/handlers/workflow-steps.js.map +1 -0
  357. package/dist/server/handlers/workflows.js +1630 -933
  358. package/dist/server/handlers/workflows.js.map +1 -0
  359. package/dist/server/index.js +3167 -2422
  360. package/dist/server/index.js.map +1 -0
  361. package/dist/server/lib/batch-client.js +471 -409
  362. package/dist/server/lib/batch-client.js.map +1 -0
  363. package/dist/server/lib/clickhouse-buffer.js +118 -104
  364. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  365. package/dist/server/lib/clickhouse-client.js +107 -107
  366. package/dist/server/lib/clickhouse-client.js.map +1 -0
  367. package/dist/server/lib/coa-renderer.js +1786 -356
  368. package/dist/server/lib/coa-renderer.js.map +1 -0
  369. package/dist/server/lib/code-worker-pool.js +227 -177
  370. package/dist/server/lib/code-worker-pool.js.map +1 -0
  371. package/dist/server/lib/code-worker.js +174 -164
  372. package/dist/server/lib/code-worker.js.map +1 -0
  373. package/dist/server/lib/compaction-service.d.ts +2 -12
  374. package/dist/server/lib/compaction-service.js +74 -184
  375. package/dist/server/lib/compaction-service.js.map +1 -0
  376. package/dist/server/lib/logger.js +36 -24
  377. package/dist/server/lib/logger.js.map +1 -0
  378. package/dist/server/lib/otel.js +101 -80
  379. package/dist/server/lib/otel.js.map +1 -0
  380. package/dist/server/lib/pdf-renderer.js +952 -788
  381. package/dist/server/lib/pdf-renderer.js.map +1 -0
  382. package/dist/server/lib/prompt-sanitizer.js +188 -108
  383. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  384. package/dist/server/lib/provider-capabilities.js +136 -138
  385. package/dist/server/lib/provider-capabilities.js.map +1 -0
  386. package/dist/server/lib/provider-failover.js +190 -168
  387. package/dist/server/lib/provider-failover.js.map +1 -0
  388. package/dist/server/lib/rate-limiter.js +186 -117
  389. package/dist/server/lib/rate-limiter.js.map +1 -0
  390. package/dist/server/lib/react-pdf-layout.js +551 -382
  391. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  392. package/dist/server/lib/server-agent-loop.d.ts +4 -1
  393. package/dist/server/lib/server-agent-loop.js +906 -634
  394. package/dist/server/lib/server-agent-loop.js.map +1 -0
  395. package/dist/server/lib/server-subagent.js +260 -164
  396. package/dist/server/lib/server-subagent.js.map +1 -0
  397. package/dist/server/lib/session-checkpoint.js +105 -96
  398. package/dist/server/lib/session-checkpoint.js.map +1 -0
  399. package/dist/server/lib/ssrf-guard.js +193 -184
  400. package/dist/server/lib/ssrf-guard.js.map +1 -0
  401. package/dist/server/lib/supabase-client.js +94 -82
  402. package/dist/server/lib/supabase-client.js.map +1 -0
  403. package/dist/server/lib/template-resolver.js +154 -176
  404. package/dist/server/lib/template-resolver.js.map +1 -0
  405. package/dist/server/lib/utils.js +242 -133
  406. package/dist/server/lib/utils.js.map +1 -0
  407. package/dist/server/local-agent-gateway.d.ts +2 -2
  408. package/dist/server/local-agent-gateway.js +785 -627
  409. package/dist/server/local-agent-gateway.js.map +1 -0
  410. package/dist/server/providers/anthropic.js +250 -172
  411. package/dist/server/providers/anthropic.js.map +1 -0
  412. package/dist/server/providers/bedrock.js +217 -158
  413. package/dist/server/providers/bedrock.js.map +1 -0
  414. package/dist/server/providers/gemini.js +548 -418
  415. package/dist/server/providers/gemini.js.map +1 -0
  416. package/dist/server/providers/openai.js +571 -437
  417. package/dist/server/providers/openai.js.map +1 -0
  418. package/dist/server/providers/registry.js +23 -18
  419. package/dist/server/providers/registry.js.map +1 -0
  420. package/dist/server/providers/shared.js +123 -95
  421. package/dist/server/providers/shared.js.map +1 -0
  422. package/dist/server/providers/types.js +1 -11
  423. package/dist/server/providers/types.js.map +1 -0
  424. package/dist/server/proxy-handlers.js +209 -165
  425. package/dist/server/proxy-handlers.js.map +1 -0
  426. package/dist/server/tool-router.js +959 -599
  427. package/dist/server/tool-router.js.map +1 -0
  428. package/dist/server/validation.js +248 -188
  429. package/dist/server/validation.js.map +1 -0
  430. package/dist/server/worker.js +202 -133
  431. package/dist/server/worker.js.map +1 -0
  432. package/dist/setup.d.ts +2 -2
  433. package/dist/setup.js +151 -147
  434. package/dist/setup.js.map +1 -0
  435. package/dist/shared/agent-core.d.ts +115 -26
  436. package/dist/shared/agent-core.js +956 -522
  437. package/dist/shared/agent-core.js.map +1 -0
  438. package/dist/shared/anthropic-types.js +1 -6
  439. package/dist/shared/anthropic-types.js.map +1 -0
  440. package/dist/shared/api-client.d.ts +16 -9
  441. package/dist/shared/api-client.js +419 -327
  442. package/dist/shared/api-client.js.map +1 -0
  443. package/dist/shared/compaction.d.ts +36 -0
  444. package/dist/shared/compaction.js +138 -0
  445. package/dist/shared/compaction.js.map +1 -0
  446. package/dist/shared/constants.js +67 -64
  447. package/dist/shared/constants.js.map +1 -0
  448. package/dist/shared/sse-parser.js +221 -219
  449. package/dist/shared/sse-parser.js.map +1 -0
  450. package/dist/shared/tool-dispatch.d.ts +4 -0
  451. package/dist/shared/tool-dispatch.js +226 -165
  452. package/dist/shared/tool-dispatch.js.map +1 -0
  453. package/dist/shared/types.js +1 -6
  454. package/dist/shared/types.js.map +1 -0
  455. package/dist/types/cli-highlight.d.js +2 -0
  456. package/dist/types/cli-highlight.d.js.map +1 -0
  457. package/dist/types/diff.d.js +2 -0
  458. package/dist/types/diff.d.js.map +1 -0
  459. package/dist/types/pdf-parse.d.js +2 -0
  460. package/dist/types/pdf-parse.d.js.map +1 -0
  461. package/dist/updater.d.ts +1 -1
  462. package/dist/updater.js +118 -92
  463. package/dist/updater.js.map +1 -0
  464. package/dist/webchat/widget.js +227 -380
  465. package/dist/webchat/widget.js.map +1 -0
  466. package/package.json +22 -10
  467. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  468. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  469. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  470. package/vendor/ink/build/apply-styles.js +175 -0
  471. package/vendor/ink/build/build-layout.js +77 -0
  472. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  473. package/vendor/ink/build/colorize.d.ts +3 -0
  474. package/vendor/ink/build/colorize.js +48 -0
  475. package/vendor/ink/build/colorize.js.map +1 -0
  476. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  477. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  478. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  479. package/vendor/ink/build/components/App.d.ts +18 -0
  480. package/vendor/ink/build/components/App.js +351 -0
  481. package/vendor/ink/build/components/App.js.map +1 -0
  482. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  483. package/vendor/ink/build/components/AppContext.js +11 -0
  484. package/vendor/ink/build/components/AppContext.js.map +1 -0
  485. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  486. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  487. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  488. package/vendor/ink/build/components/Box.d.ts +117 -0
  489. package/vendor/ink/build/components/Box.js +34 -0
  490. package/vendor/ink/build/components/Box.js.map +1 -0
  491. package/vendor/ink/build/components/Color.js +62 -0
  492. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  493. package/vendor/ink/build/components/Cursor.js +53 -0
  494. package/vendor/ink/build/components/Cursor.js.map +1 -0
  495. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  496. package/vendor/ink/build/components/CursorContext.js +8 -0
  497. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  498. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  499. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  500. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  501. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  502. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  503. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  504. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  505. package/vendor/ink/build/components/FocusContext.js +17 -0
  506. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  507. package/vendor/ink/build/components/Newline.d.ts +13 -0
  508. package/vendor/ink/build/components/Newline.js +8 -0
  509. package/vendor/ink/build/components/Newline.js.map +1 -0
  510. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  511. package/vendor/ink/build/components/Spacer.js +11 -0
  512. package/vendor/ink/build/components/Spacer.js.map +1 -0
  513. package/vendor/ink/build/components/Static.d.ts +24 -0
  514. package/vendor/ink/build/components/Static.js +28 -0
  515. package/vendor/ink/build/components/Static.js.map +1 -0
  516. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  517. package/vendor/ink/build/components/StderrContext.js +13 -0
  518. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  519. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  520. package/vendor/ink/build/components/StdinContext.js +19 -0
  521. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  522. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StdoutContext.js +13 -0
  524. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  525. package/vendor/ink/build/components/Text.d.ts +55 -0
  526. package/vendor/ink/build/components/Text.js +50 -0
  527. package/vendor/ink/build/components/Text.js.map +1 -0
  528. package/vendor/ink/build/components/Transform.d.ts +16 -0
  529. package/vendor/ink/build/components/Transform.js +15 -0
  530. package/vendor/ink/build/components/Transform.js.map +1 -0
  531. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  532. package/vendor/ink/build/cursor-helpers.js +56 -0
  533. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  534. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  535. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  536. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  537. package/vendor/ink/build/devtools.d.ts +1 -0
  538. package/vendor/ink/build/devtools.js +11 -0
  539. package/vendor/ink/build/devtools.js.map +1 -0
  540. package/vendor/ink/build/dom.d.ts +56 -0
  541. package/vendor/ink/build/dom.js +124 -0
  542. package/vendor/ink/build/dom.js.map +1 -0
  543. package/vendor/ink/build/experimental/apply-style.js +140 -0
  544. package/vendor/ink/build/experimental/dom.js +123 -0
  545. package/vendor/ink/build/experimental/output.js +91 -0
  546. package/vendor/ink/build/experimental/reconciler.js +141 -0
  547. package/vendor/ink/build/experimental/renderer.js +81 -0
  548. package/vendor/ink/build/get-max-width.d.ts +3 -0
  549. package/vendor/ink/build/get-max-width.js +10 -0
  550. package/vendor/ink/build/get-max-width.js.map +1 -0
  551. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  552. package/vendor/ink/build/hooks/use-app.js +8 -0
  553. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  554. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  555. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  556. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  558. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  559. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  561. package/vendor/ink/build/hooks/use-focus.js +42 -0
  562. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  564. package/vendor/ink/build/hooks/use-input.js +124 -0
  565. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  567. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  568. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  570. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  571. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  574. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  577. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  578. package/vendor/ink/build/hooks/useInput.js +38 -0
  579. package/vendor/ink/build/index.d.ts +34 -0
  580. package/vendor/ink/build/index.js +20 -0
  581. package/vendor/ink/build/index.js.map +1 -0
  582. package/vendor/ink/build/ink.d.ts +90 -0
  583. package/vendor/ink/build/ink.js +654 -0
  584. package/vendor/ink/build/ink.js.map +1 -0
  585. package/vendor/ink/build/input-parser.d.ts +7 -0
  586. package/vendor/ink/build/input-parser.js +154 -0
  587. package/vendor/ink/build/input-parser.js.map +1 -0
  588. package/vendor/ink/build/instance.js +205 -0
  589. package/vendor/ink/build/instances.d.ts +3 -0
  590. package/vendor/ink/build/instances.js +8 -0
  591. package/vendor/ink/build/instances.js.map +1 -0
  592. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  593. package/vendor/ink/build/kitty-keyboard.js +32 -0
  594. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  595. package/vendor/ink/build/layout.d.ts +7 -0
  596. package/vendor/ink/build/layout.js +33 -0
  597. package/vendor/ink/build/layout.js.map +1 -0
  598. package/vendor/ink/build/log-update.d.ts +19 -0
  599. package/vendor/ink/build/log-update.js +243 -0
  600. package/vendor/ink/build/log-update.js.map +1 -0
  601. package/vendor/ink/build/measure-element.d.ts +16 -0
  602. package/vendor/ink/build/measure-element.js +9 -0
  603. package/vendor/ink/build/measure-element.js.map +1 -0
  604. package/vendor/ink/build/measure-text.d.ts +6 -0
  605. package/vendor/ink/build/measure-text.js +21 -0
  606. package/vendor/ink/build/measure-text.js.map +1 -0
  607. package/vendor/ink/build/options.d.ts +52 -0
  608. package/vendor/ink/build/options.js +2 -0
  609. package/vendor/ink/build/options.js.map +1 -0
  610. package/vendor/ink/build/output.d.ts +35 -0
  611. package/vendor/ink/build/output.js +183 -0
  612. package/vendor/ink/build/output.js.map +1 -0
  613. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  614. package/vendor/ink/build/parse-keypress.js +493 -0
  615. package/vendor/ink/build/parse-keypress.js.map +1 -0
  616. package/vendor/ink/build/reconciler.d.ts +4 -0
  617. package/vendor/ink/build/reconciler.js +274 -0
  618. package/vendor/ink/build/reconciler.js.map +1 -0
  619. package/vendor/ink/build/render-background.d.ts +4 -0
  620. package/vendor/ink/build/render-background.js +25 -0
  621. package/vendor/ink/build/render-background.js.map +1 -0
  622. package/vendor/ink/build/render-border.d.ts +4 -0
  623. package/vendor/ink/build/render-border.js +73 -0
  624. package/vendor/ink/build/render-border.js.map +1 -0
  625. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  626. package/vendor/ink/build/render-node-to-output.js +147 -0
  627. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  628. package/vendor/ink/build/render-to-string.d.ts +38 -0
  629. package/vendor/ink/build/render-to-string.js +115 -0
  630. package/vendor/ink/build/render-to-string.js.map +1 -0
  631. package/vendor/ink/build/render.d.ts +121 -0
  632. package/vendor/ink/build/render.js +55 -0
  633. package/vendor/ink/build/render.js.map +1 -0
  634. package/vendor/ink/build/renderer.d.ts +8 -0
  635. package/vendor/ink/build/renderer.js +55 -0
  636. package/vendor/ink/build/renderer.js.map +1 -0
  637. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  638. package/vendor/ink/build/sanitize-ansi.js +27 -0
  639. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  640. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  641. package/vendor/ink/build/screen-reader-update.js +38 -0
  642. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  643. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  644. package/vendor/ink/build/squash-text-nodes.js +36 -0
  645. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  646. package/vendor/ink/build/styles.d.ts +240 -0
  647. package/vendor/ink/build/styles.js +232 -0
  648. package/vendor/ink/build/styles.js.map +1 -0
  649. package/vendor/ink/build/utils.d.ts +2 -0
  650. package/vendor/ink/build/utils.js +4 -0
  651. package/vendor/ink/build/utils.js.map +1 -0
  652. package/vendor/ink/build/wrap-text.d.ts +3 -0
  653. package/vendor/ink/build/wrap-text.js +31 -0
  654. package/vendor/ink/build/wrap-text.js.map +1 -0
  655. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  656. package/vendor/ink/build/write-synchronized.js +7 -0
  657. package/vendor/ink/build/write-synchronized.js.map +1 -0
  658. package/vendor/ink/license +10 -0
  659. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  660. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  661. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  662. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  663. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  664. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  665. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  666. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  667. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  668. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  669. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  670. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  671. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  672. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  673. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  674. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  675. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  676. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  677. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  678. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  679. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  680. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  681. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  682. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  683. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  684. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  685. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  686. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  687. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  688. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  689. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  690. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  691. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  692. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  693. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  694. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  695. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  696. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  697. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  698. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  699. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  700. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  701. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  702. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  703. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  704. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  705. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  706. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  707. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  708. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  709. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  710. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  711. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  712. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  713. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  714. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  715. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  716. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  717. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  718. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  719. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  720. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  721. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  722. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  723. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  724. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  725. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  726. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  727. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  728. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  729. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  730. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  731. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  732. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  733. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  734. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  735. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  746. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  747. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  748. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  749. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  750. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  751. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  752. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  753. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  754. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  755. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  756. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  757. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  758. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  759. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  760. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  761. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  762. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  763. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  764. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  765. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  766. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  767. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  768. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  769. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  770. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  784. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  785. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  786. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  787. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  788. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  789. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  790. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  791. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  792. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  793. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  794. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  795. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  796. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  797. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  798. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  799. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  800. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  801. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  802. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  803. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  804. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  805. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  806. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  807. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  808. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  809. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  810. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  811. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  812. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  813. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  814. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  815. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  816. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  817. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  818. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  819. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  820. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  821. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  822. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  823. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  824. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  825. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  826. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  827. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  828. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  829. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  830. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  831. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  832. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  833. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  834. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  835. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  836. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  837. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  838. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  839. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  840. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  841. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  842. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  843. package/vendor/ink/package.json +201 -0
  844. package/vendor/ink/readme.md +2636 -0
  845. package/bin/swag-agent.js +0 -9
  846. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  847. 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