@greppleai/grip 0.1.4 → 0.1.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 (569) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +2 -2
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/embedded-assets.d.ts.map +1 -1
  6. package/dist/bun/embedded-assets.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  9. package/dist/bun/restore-sandbox-env.js.map +1 -1
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +27 -0
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +117 -152
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/auth-guidance.d.ts.map +1 -1
  32. package/dist/core/auth-guidance.js.map +1 -1
  33. package/dist/core/auth-storage.d.ts +4 -0
  34. package/dist/core/auth-storage.d.ts.map +1 -1
  35. package/dist/core/auth-storage.js +6 -11
  36. package/dist/core/auth-storage.js.map +1 -1
  37. package/dist/core/bash-executor.d.ts.map +1 -1
  38. package/dist/core/bash-executor.js +19 -23
  39. package/dist/core/bash-executor.js.map +1 -1
  40. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  41. package/dist/core/compaction/branch-summarization.js.map +1 -1
  42. package/dist/core/compaction/compaction.d.ts.map +1 -1
  43. package/dist/core/compaction/compaction.js.map +1 -1
  44. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
  45. package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
  46. package/dist/core/compaction/compression-detector.d.ts +1 -0
  47. package/dist/core/compaction/compression-detector.d.ts.map +1 -1
  48. package/dist/core/compaction/compression-detector.js +10 -21
  49. package/dist/core/compaction/compression-detector.js.map +1 -1
  50. package/dist/core/compaction/compression-economics.d.ts.map +1 -1
  51. package/dist/core/compaction/compression-economics.js.map +1 -1
  52. package/dist/core/compaction/utils.d.ts.map +1 -1
  53. package/dist/core/compaction/utils.js.map +1 -1
  54. package/dist/core/defaults.d.ts.map +1 -1
  55. package/dist/core/diagnostics.d.ts.map +1 -1
  56. package/dist/core/event-bus.d.ts.map +1 -1
  57. package/dist/core/event-bus.js.map +1 -1
  58. package/dist/core/exec.d.ts.map +1 -1
  59. package/dist/core/exec.js.map +1 -1
  60. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  61. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  62. package/dist/core/export-html/index.d.ts.map +1 -1
  63. package/dist/core/export-html/index.js.map +1 -1
  64. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/loader.d.ts.map +1 -1
  67. package/dist/core/extensions/loader.js.map +1 -1
  68. package/dist/core/extensions/runner.d.ts.map +1 -1
  69. package/dist/core/extensions/runner.js +18 -30
  70. package/dist/core/extensions/runner.js.map +1 -1
  71. package/dist/core/extensions/types.d.ts.map +1 -1
  72. package/dist/core/extensions/types.js.map +1 -1
  73. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  74. package/dist/core/extensions/wrapper.js.map +1 -1
  75. package/dist/core/footer-data-provider.d.ts.map +1 -1
  76. package/dist/core/footer-data-provider.js +15 -16
  77. package/dist/core/footer-data-provider.js.map +1 -1
  78. package/dist/core/grip-agent.d.ts.map +1 -1
  79. package/dist/core/grip-agent.js +11 -23
  80. package/dist/core/grip-agent.js.map +1 -1
  81. package/dist/core/grip-manifest.d.ts.map +1 -1
  82. package/dist/core/grip-manifest.js.map +1 -1
  83. package/dist/core/hooks/aggregate.d.ts.map +1 -1
  84. package/dist/core/hooks/aggregate.js.map +1 -1
  85. package/dist/core/hooks/config.d.ts.map +1 -1
  86. package/dist/core/hooks/config.js.map +1 -1
  87. package/dist/core/hooks/executor.d.ts.map +1 -1
  88. package/dist/core/hooks/executor.js.map +1 -1
  89. package/dist/core/hooks/index.d.ts.map +1 -1
  90. package/dist/core/hooks/index.js.map +1 -1
  91. package/dist/core/hooks/matcher.d.ts.map +1 -1
  92. package/dist/core/hooks/matcher.js.map +1 -1
  93. package/dist/core/hooks/trust-store.d.ts.map +1 -1
  94. package/dist/core/hooks/trust-store.js +0 -3
  95. package/dist/core/hooks/trust-store.js.map +1 -1
  96. package/dist/core/hooks/types.d.ts.map +1 -1
  97. package/dist/core/hooks/types.js.map +1 -1
  98. package/dist/core/http-dispatcher.d.ts.map +1 -1
  99. package/dist/core/http-dispatcher.js.map +1 -1
  100. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  101. package/dist/core/instruction-resource-loader.js +0 -3
  102. package/dist/core/instruction-resource-loader.js.map +1 -1
  103. package/dist/core/keybindings.d.ts.map +1 -1
  104. package/dist/core/keybindings.js +0 -1
  105. package/dist/core/keybindings.js.map +1 -1
  106. package/dist/core/lsp/abort.d.ts.map +1 -1
  107. package/dist/core/lsp/abort.js.map +1 -1
  108. package/dist/core/lsp/client.d.ts.map +1 -1
  109. package/dist/core/lsp/client.js +8 -22
  110. package/dist/core/lsp/client.js.map +1 -1
  111. package/dist/core/lsp/config-loader.d.ts.map +1 -1
  112. package/dist/core/lsp/config-loader.js.map +1 -1
  113. package/dist/core/lsp/config.d.ts.map +1 -1
  114. package/dist/core/lsp/config.js.map +1 -1
  115. package/dist/core/lsp/diagnostics.d.ts.map +1 -1
  116. package/dist/core/lsp/diagnostics.js.map +1 -1
  117. package/dist/core/lsp/file-sync.d.ts.map +1 -1
  118. package/dist/core/lsp/file-sync.js +7 -9
  119. package/dist/core/lsp/file-sync.js.map +1 -1
  120. package/dist/core/lsp/integration.d.ts.map +1 -1
  121. package/dist/core/lsp/integration.js.map +1 -1
  122. package/dist/core/lsp/language-map.d.ts.map +1 -1
  123. package/dist/core/lsp/language-map.js +2 -7
  124. package/dist/core/lsp/language-map.js.map +1 -1
  125. package/dist/core/lsp/manager.d.ts.map +1 -1
  126. package/dist/core/lsp/manager.js +18 -29
  127. package/dist/core/lsp/manager.js.map +1 -1
  128. package/dist/core/lsp/navigation.d.ts.map +1 -1
  129. package/dist/core/lsp/navigation.js.map +1 -1
  130. package/dist/core/lsp/portable-path.d.ts.map +1 -1
  131. package/dist/core/lsp/portable-path.js.map +1 -1
  132. package/dist/core/lsp/refactor.d.ts.map +1 -1
  133. package/dist/core/lsp/refactor.js.map +1 -1
  134. package/dist/core/lsp/transport.d.ts.map +1 -1
  135. package/dist/core/lsp/transport.js.map +1 -1
  136. package/dist/core/messages.d.ts.map +1 -1
  137. package/dist/core/messages.js.map +1 -1
  138. package/dist/core/model-registry.d.ts.map +1 -1
  139. package/dist/core/model-registry.js +5 -7
  140. package/dist/core/model-registry.js.map +1 -1
  141. package/dist/core/model-resolver.d.ts.map +1 -1
  142. package/dist/core/model-resolver.js.map +1 -1
  143. package/dist/core/output-guard.d.ts.map +1 -1
  144. package/dist/core/output-guard.js.map +1 -1
  145. package/dist/core/package-manager.d.ts.map +1 -1
  146. package/dist/core/package-manager.js +0 -6
  147. package/dist/core/package-manager.js.map +1 -1
  148. package/dist/core/prompt-templates.d.ts.map +1 -1
  149. package/dist/core/prompt-templates.js.map +1 -1
  150. package/dist/core/provider-display-names.d.ts.map +1 -1
  151. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  152. package/dist/core/remote-workspace-protocol/contract.js +4 -2
  153. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  154. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
  155. package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
  156. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
  157. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
  158. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
  159. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
  160. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
  161. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
  162. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
  163. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
  164. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
  165. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
  166. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
  167. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  168. package/dist/core/remote-workspace-protocol/session.js +27 -65
  169. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  170. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
  171. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
  172. package/dist/core/resolve-config-value.d.ts.map +1 -1
  173. package/dist/core/resolve-config-value.js.map +1 -1
  174. package/dist/core/resource-loader.d.ts.map +1 -1
  175. package/dist/core/resource-loader.js +0 -48
  176. package/dist/core/resource-loader.js.map +1 -1
  177. package/dist/core/rules.d.ts.map +1 -1
  178. package/dist/core/rules.js.map +1 -1
  179. package/dist/core/sandbox/command.d.ts.map +1 -1
  180. package/dist/core/sandbox/command.js.map +1 -1
  181. package/dist/core/sandbox/config.d.ts.map +1 -1
  182. package/dist/core/sandbox/config.js.map +1 -1
  183. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
  184. package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
  185. package/dist/core/sandbox/lima.d.ts +2 -0
  186. package/dist/core/sandbox/lima.d.ts.map +1 -1
  187. package/dist/core/sandbox/lima.js +9 -15
  188. package/dist/core/sandbox/lima.js.map +1 -1
  189. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
  190. package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
  191. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
  192. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
  193. package/dist/core/session/constants.d.ts.map +1 -1
  194. package/dist/core/session/context-metadata.d.ts.map +1 -1
  195. package/dist/core/session/context-metadata.js.map +1 -1
  196. package/dist/core/session/context.d.ts.map +1 -1
  197. package/dist/core/session/context.js.map +1 -1
  198. package/dist/core/session/ids.d.ts.map +1 -1
  199. package/dist/core/session/ids.js.map +1 -1
  200. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  201. package/dist/core/session/in-memory-session-manager.js +0 -1
  202. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  203. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  204. package/dist/core/session/in-memory-session.js.map +1 -1
  205. package/dist/core/session/jsonl-errors.d.ts.map +1 -1
  206. package/dist/core/session/jsonl-errors.js +0 -11
  207. package/dist/core/session/jsonl-errors.js.map +1 -1
  208. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  209. package/dist/core/session/jsonl-helpers.js.map +1 -1
  210. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  211. package/dist/core/session/local-session-manager.js +4 -6
  212. package/dist/core/session/local-session-manager.js.map +1 -1
  213. package/dist/core/session/local-session.d.ts.map +1 -1
  214. package/dist/core/session/local-session.js.map +1 -1
  215. package/dist/core/session/migrations.d.ts.map +1 -1
  216. package/dist/core/session/migrations.js.map +1 -1
  217. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  218. package/dist/core/session/remote-session-client.js +0 -6
  219. package/dist/core/session/remote-session-client.js.map +1 -1
  220. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  221. package/dist/core/session/remote-session-manager.js +0 -3
  222. package/dist/core/session/remote-session-manager.js.map +1 -1
  223. package/dist/core/session/remote-session.d.ts.map +1 -1
  224. package/dist/core/session/remote-session.js +0 -1
  225. package/dist/core/session/remote-session.js.map +1 -1
  226. package/dist/core/session/session-manager.d.ts.map +1 -1
  227. package/dist/core/session/session.d.ts.map +1 -1
  228. package/dist/core/session/session.js +1 -5
  229. package/dist/core/session/session.js.map +1 -1
  230. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  231. package/dist/core/session/stores/in-memory-session-store.js +7 -6
  232. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  233. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  234. package/dist/core/session/stores/jsonl-session-store.js +6 -14
  235. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  236. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  237. package/dist/core/session/stores/remote-session-store.js +3 -8
  238. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  239. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  240. package/dist/core/session/types.d.ts.map +1 -1
  241. package/dist/core/session/usage-ledger.d.ts.map +1 -1
  242. package/dist/core/session/usage-ledger.js.map +1 -1
  243. package/dist/core/session-cwd.d.ts.map +1 -1
  244. package/dist/core/session-cwd.js +0 -1
  245. package/dist/core/session-cwd.js.map +1 -1
  246. package/dist/core/settings-manager.d.ts.map +1 -1
  247. package/dist/core/settings-manager.js +9 -17
  248. package/dist/core/settings-manager.js.map +1 -1
  249. package/dist/core/skills.d.ts.map +1 -1
  250. package/dist/core/skills.js.map +1 -1
  251. package/dist/core/slash-commands.d.ts.map +1 -1
  252. package/dist/core/source-info.d.ts.map +1 -1
  253. package/dist/core/source-info.js.map +1 -1
  254. package/dist/core/system-prompt.d.ts.map +1 -1
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/telemetry.d.ts.map +1 -1
  257. package/dist/core/telemetry.js.map +1 -1
  258. package/dist/core/timings.d.ts.map +1 -1
  259. package/dist/core/timings.js.map +1 -1
  260. package/dist/core/tools/bash.d.ts.map +1 -1
  261. package/dist/core/tools/bash.js +8 -5
  262. package/dist/core/tools/bash.js.map +1 -1
  263. package/dist/core/tools/compress-context.d.ts.map +1 -1
  264. package/dist/core/tools/compress-context.js.map +1 -1
  265. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  266. package/dist/core/tools/edit-diff.js.map +1 -1
  267. package/dist/core/tools/edit.d.ts.map +1 -1
  268. package/dist/core/tools/edit.js.map +1 -1
  269. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  270. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  271. package/dist/core/tools/find.d.ts.map +1 -1
  272. package/dist/core/tools/find.js.map +1 -1
  273. package/dist/core/tools/grep.d.ts.map +1 -1
  274. package/dist/core/tools/grep.js.map +1 -1
  275. package/dist/core/tools/hash-store.d.ts.map +1 -1
  276. package/dist/core/tools/hash-store.js.map +1 -1
  277. package/dist/core/tools/hashline/apply.d.ts.map +1 -1
  278. package/dist/core/tools/hashline/apply.js.map +1 -1
  279. package/dist/core/tools/hashline/hash.d.ts.map +1 -1
  280. package/dist/core/tools/hashline/hash.js.map +1 -1
  281. package/dist/core/tools/hashline/parse.d.ts.map +1 -1
  282. package/dist/core/tools/hashline/parse.js.map +1 -1
  283. package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
  284. package/dist/core/tools/hashline/resolve.js.map +1 -1
  285. package/dist/core/tools/hashline-utils.d.ts.map +1 -1
  286. package/dist/core/tools/hashline-utils.js.map +1 -1
  287. package/dist/core/tools/index.d.ts.map +1 -1
  288. package/dist/core/tools/index.js.map +1 -1
  289. package/dist/core/tools/ls.d.ts.map +1 -1
  290. package/dist/core/tools/ls.js.map +1 -1
  291. package/dist/core/tools/operations.d.ts +5 -0
  292. package/dist/core/tools/operations.d.ts.map +1 -1
  293. package/dist/core/tools/operations.js +26 -24
  294. package/dist/core/tools/operations.js.map +1 -1
  295. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  296. package/dist/core/tools/output-accumulator.js +12 -18
  297. package/dist/core/tools/output-accumulator.js.map +1 -1
  298. package/dist/core/tools/path-utils.d.ts.map +1 -1
  299. package/dist/core/tools/path-utils.js.map +1 -1
  300. package/dist/core/tools/read.d.ts.map +1 -1
  301. package/dist/core/tools/read.js.map +1 -1
  302. package/dist/core/tools/render-utils.d.ts.map +1 -1
  303. package/dist/core/tools/render-utils.js.map +1 -1
  304. package/dist/core/tools/replace-diff.d.ts.map +1 -1
  305. package/dist/core/tools/replace-diff.js.map +1 -1
  306. package/dist/core/tools/replace-normalize.d.ts.map +1 -1
  307. package/dist/core/tools/replace-normalize.js.map +1 -1
  308. package/dist/core/tools/replace-render.d.ts +1 -1
  309. package/dist/core/tools/replace-render.d.ts.map +1 -1
  310. package/dist/core/tools/replace-render.js.map +1 -1
  311. package/dist/core/tools/runtime.d.ts.map +1 -1
  312. package/dist/core/tools/runtime.js.map +1 -1
  313. package/dist/core/tools/session-history.d.ts.map +1 -1
  314. package/dist/core/tools/session-history.js.map +1 -1
  315. package/dist/core/tools/subagent-agents.d.ts.map +1 -1
  316. package/dist/core/tools/subagent-agents.js.map +1 -1
  317. package/dist/core/tools/subagent.d.ts.map +1 -1
  318. package/dist/core/tools/subagent.js.map +1 -1
  319. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  320. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  321. package/dist/core/tools/truncate.d.ts.map +1 -1
  322. package/dist/core/tools/truncate.js.map +1 -1
  323. package/dist/core/tools/websearch.d.ts.map +1 -1
  324. package/dist/core/tools/websearch.js.map +1 -1
  325. package/dist/core/tools/workspace-tool-host.d.ts +1 -0
  326. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
  327. package/dist/core/tools/workspace-tool-host.js +36 -22
  328. package/dist/core/tools/workspace-tool-host.js.map +1 -1
  329. package/dist/core/tools/write.d.ts.map +1 -1
  330. package/dist/core/tools/write.js +0 -1
  331. package/dist/core/tools/write.js.map +1 -1
  332. package/dist/core/workspace-identity.d.ts.map +1 -1
  333. package/dist/daemon/activity-budget.d.ts.map +1 -1
  334. package/dist/daemon/activity-budget.js +2 -3
  335. package/dist/daemon/activity-budget.js.map +1 -1
  336. package/dist/daemon/command.d.ts.map +1 -1
  337. package/dist/daemon/command.js.map +1 -1
  338. package/dist/daemon/config.d.ts +2 -0
  339. package/dist/daemon/config.d.ts.map +1 -1
  340. package/dist/daemon/config.js +4 -0
  341. package/dist/daemon/config.js.map +1 -1
  342. package/dist/daemon/help.d.ts.map +1 -1
  343. package/dist/daemon/help.js +4 -3
  344. package/dist/daemon/help.js.map +1 -1
  345. package/dist/daemon/lsp-config.d.ts.map +1 -1
  346. package/dist/daemon/lsp-config.js.map +1 -1
  347. package/dist/daemon/outbound-budget.d.ts.map +1 -1
  348. package/dist/daemon/outbound-budget.js +2 -4
  349. package/dist/daemon/outbound-budget.js.map +1 -1
  350. package/dist/daemon/security.d.ts.map +1 -1
  351. package/dist/daemon/security.js.map +1 -1
  352. package/dist/daemon/server.d.ts.map +1 -1
  353. package/dist/daemon/server.js.map +1 -1
  354. package/dist/daemon/shared-connection.d.ts.map +1 -1
  355. package/dist/daemon/shared-connection.js +10 -15
  356. package/dist/daemon/shared-connection.js.map +1 -1
  357. package/dist/daemon/shared-revision.d.ts.map +1 -1
  358. package/dist/daemon/shared-revision.js +2 -1
  359. package/dist/daemon/shared-revision.js.map +1 -1
  360. package/dist/daemon/shared-roots.d.ts.map +1 -1
  361. package/dist/daemon/shared-roots.js +0 -1
  362. package/dist/daemon/shared-roots.js.map +1 -1
  363. package/dist/daemon/workspace-runtime.d.ts +2 -0
  364. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  365. package/dist/daemon/workspace-runtime.js +43 -15
  366. package/dist/daemon/workspace-runtime.js.map +1 -1
  367. package/dist/index.d.ts.map +1 -1
  368. package/dist/main.d.ts.map +1 -1
  369. package/dist/main.js.map +1 -1
  370. package/dist/migrations.d.ts.map +1 -1
  371. package/dist/migrations.js.map +1 -1
  372. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/assistant-message.js +21 -17
  374. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  375. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/bash-execution.js +4 -9
  377. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  378. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  379. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  380. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  381. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  383. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  384. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  386. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  387. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/config-selector.js +6 -16
  389. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  390. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  391. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  392. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  393. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  394. package/dist/modes/interactive/components/custom-editor.js +1 -8
  395. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  396. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  397. package/dist/modes/interactive/components/custom-message.js +1 -6
  398. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  399. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/diff.js.map +1 -1
  401. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  403. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  404. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  405. package/dist/modes/interactive/components/extension-editor.js +1 -7
  406. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  407. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  408. package/dist/modes/interactive/components/extension-input.js +2 -8
  409. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  410. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  411. package/dist/modes/interactive/components/extension-selector.js +1 -9
  412. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  413. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  414. package/dist/modes/interactive/components/footer.js +1 -3
  415. package/dist/modes/interactive/components/footer.js.map +1 -1
  416. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  417. package/dist/modes/interactive/components/hook-execution.js +2 -5
  418. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  419. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  421. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  422. package/dist/modes/interactive/components/login-dialog.js +3 -9
  423. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  424. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  425. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  426. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  428. package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/message-card.js +0 -1
  430. package/dist/modes/interactive/components/message-card.js.map +1 -1
  431. package/dist/modes/interactive/components/model-selector.d.ts +26 -18
  432. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/model-selector.js +223 -210
  434. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  435. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  436. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  437. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  438. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  440. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  441. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  443. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  444. package/dist/modes/interactive/components/session-selector.js +33 -58
  445. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  446. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  447. package/dist/modes/interactive/components/settings-selector.js +0 -4
  448. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  449. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  451. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  452. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  454. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  455. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/theme-selector.js +0 -2
  457. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  460. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  461. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/tool-execution.js +9 -24
  463. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  464. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/tree-selector.js +18 -34
  466. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  467. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  469. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  470. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/user-message.js +0 -4
  472. package/dist/modes/interactive/components/user-message.js.map +1 -1
  473. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  475. package/dist/modes/interactive/interactive-mode.d.ts +14 -0
  476. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.js +223 -137
  478. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  479. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  480. package/dist/modes/interactive/theme/theme.js +0 -7
  481. package/dist/modes/interactive/theme/theme.js.map +1 -1
  482. package/dist/modes/json-event.d.ts.map +1 -1
  483. package/dist/modes/json-event.js.map +1 -1
  484. package/dist/modes/print-mode.d.ts.map +1 -1
  485. package/dist/modes/print-mode.js.map +1 -1
  486. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  487. package/dist/modes/rpc/jsonl.js.map +1 -1
  488. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  489. package/dist/modes/rpc/rpc-client.js +10 -11
  490. package/dist/modes/rpc/rpc-client.js.map +1 -1
  491. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  492. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  493. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  494. package/dist/package-manager-cli.d.ts.map +1 -1
  495. package/dist/package-manager-cli.js.map +1 -1
  496. package/dist/utils/ansi.d.ts.map +1 -1
  497. package/dist/utils/ansi.js.map +1 -1
  498. package/dist/utils/changelog.d.ts.map +1 -1
  499. package/dist/utils/changelog.js.map +1 -1
  500. package/dist/utils/child-process.d.ts.map +1 -1
  501. package/dist/utils/child-process.js.map +1 -1
  502. package/dist/utils/clipboard-image.d.ts.map +1 -1
  503. package/dist/utils/clipboard-image.js.map +1 -1
  504. package/dist/utils/clipboard-native.d.ts.map +1 -1
  505. package/dist/utils/clipboard-native.js.map +1 -1
  506. package/dist/utils/clipboard.d.ts.map +1 -1
  507. package/dist/utils/clipboard.js.map +1 -1
  508. package/dist/utils/deprecation.d.ts.map +1 -1
  509. package/dist/utils/deprecation.js.map +1 -1
  510. package/dist/utils/directory-completions.d.ts.map +1 -1
  511. package/dist/utils/directory-completions.js.map +1 -1
  512. package/dist/utils/exif-orientation.d.ts.map +1 -1
  513. package/dist/utils/exif-orientation.js.map +1 -1
  514. package/dist/utils/frontmatter.d.ts.map +1 -1
  515. package/dist/utils/frontmatter.js.map +1 -1
  516. package/dist/utils/fs-watch.d.ts.map +1 -1
  517. package/dist/utils/fs-watch.js.map +1 -1
  518. package/dist/utils/git.d.ts.map +1 -1
  519. package/dist/utils/git.js.map +1 -1
  520. package/dist/utils/grip-user-agent.d.ts.map +1 -1
  521. package/dist/utils/grip-user-agent.js +1 -1
  522. package/dist/utils/grip-user-agent.js.map +1 -1
  523. package/dist/utils/html.d.ts.map +1 -1
  524. package/dist/utils/html.js.map +1 -1
  525. package/dist/utils/image-convert.d.ts.map +1 -1
  526. package/dist/utils/image-convert.js.map +1 -1
  527. package/dist/utils/image-process.d.ts.map +1 -1
  528. package/dist/utils/image-process.js.map +1 -1
  529. package/dist/utils/image-resize-core.d.ts.map +1 -1
  530. package/dist/utils/image-resize-core.js.map +1 -1
  531. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  532. package/dist/utils/image-resize-worker.js.map +1 -1
  533. package/dist/utils/image-resize.d.ts.map +1 -1
  534. package/dist/utils/image-resize.js.map +1 -1
  535. package/dist/utils/json.d.ts.map +1 -1
  536. package/dist/utils/json.js.map +1 -1
  537. package/dist/utils/mime.d.ts.map +1 -1
  538. package/dist/utils/mime.js.map +1 -1
  539. package/dist/utils/open-browser.d.ts.map +1 -1
  540. package/dist/utils/open-browser.js.map +1 -1
  541. package/dist/utils/paths.d.ts.map +1 -1
  542. package/dist/utils/paths.js.map +1 -1
  543. package/dist/utils/photon.d.ts.map +1 -1
  544. package/dist/utils/photon.js +10 -5
  545. package/dist/utils/photon.js.map +1 -1
  546. package/dist/utils/shell.d.ts.map +1 -1
  547. package/dist/utils/shell.js.map +1 -1
  548. package/dist/utils/sleep.d.ts.map +1 -1
  549. package/dist/utils/sleep.js.map +1 -1
  550. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  551. package/dist/utils/syntax-highlight.js +1 -1
  552. package/dist/utils/syntax-highlight.js.map +1 -1
  553. package/dist/utils/tools-manager.d.ts.map +1 -1
  554. package/dist/utils/tools-manager.js.map +1 -1
  555. package/dist/utils/version-check.d.ts.map +1 -1
  556. package/dist/utils/version-check.js.map +1 -1
  557. package/dist/utils/windows-self-update.d.ts.map +1 -1
  558. package/dist/utils/windows-self-update.js.map +1 -1
  559. package/docs/keybindings.md +3 -1
  560. package/docs/providers.md +3 -1
  561. package/docs/sandbox.md +7 -1
  562. package/docs/sessions.md +1 -1
  563. package/docs/usage.md +39 -2
  564. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  565. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  566. package/examples/extensions/sandbox/package.json +2 -2
  567. package/examples/extensions/with-deps/package.json +1 -1
  568. package/npm-shrinkwrap.json +601 -833
  569. package/package.json +20 -21
@@ -1 +1 @@
1
- {"version":3,"file":"keybindings.js","sourceRoot":"","sources":["../../src/core/keybindings.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Keybinding,\n\ttype KeybindingDefinitions,\n\ttype KeybindingsConfig,\n\ttype KeyId,\n\tTUI_KEYBINDINGS,\n\tKeybindingsManager as TuiKeybindingsManager,\n} from \"@greppleai/grip-tui\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport interface AppKeybindings {\n\t\"app.interrupt\": true;\n\t\"app.clear\": true;\n\t\"app.exit\": true;\n\t\"app.suspend\": true;\n\t\"app.thinking.cycle\": true;\n\t\"app.model.cycleForward\": true;\n\t\"app.model.cycleBackward\": true;\n\t\"app.model.select\": true;\n\t\"app.tools.expand\": true;\n\t\"app.thinking.toggle\": true;\n\t\"app.session.toggleNamedFilter\": true;\n\t\"app.editor.external\": true;\n\t\"app.message.copy\": true;\n\t\"app.message.followUp\": true;\n\t\"app.message.dequeue\": true;\n\t\"app.clipboard.pasteImage\": true;\n\t\"app.session.new\": true;\n\t\"app.session.tree\": true;\n\t\"app.session.fork\": true;\n\t\"app.session.resume\": true;\n\t\"app.tree.foldOrUp\": true;\n\t\"app.tree.unfoldOrDown\": true;\n\t\"app.tree.editLabel\": true;\n\t\"app.tree.toggleLabelTimestamp\": true;\n\t\"app.session.togglePath\": true;\n\t\"app.session.toggleSort\": true;\n\t\"app.session.rename\": true;\n\t\"app.session.delete\": true;\n\t\"app.session.deleteNoninvasive\": true;\n\t\"app.models.save\": true;\n\t\"app.models.enableAll\": true;\n\t\"app.models.clearAll\": true;\n\t\"app.models.toggleProvider\": true;\n\t\"app.models.reorderUp\": true;\n\t\"app.models.reorderDown\": true;\n\t\"app.tree.filter.default\": true;\n\t\"app.tree.filter.noTools\": true;\n\t\"app.tree.filter.userOnly\": true;\n\t\"app.tree.filter.labeledOnly\": true;\n\t\"app.tree.filter.all\": true;\n\t\"app.tree.filter.cycleForward\": true;\n\t\"app.tree.filter.cycleBackward\": true;\n}\n\nexport type AppKeybinding = keyof AppKeybindings;\n\ndeclare module \"@greppleai/grip-tui\" {\n\tinterface Keybindings extends AppKeybindings {}\n}\n\nexport const KEYBINDINGS = {\n\t...TUI_KEYBINDINGS,\n\t\"app.interrupt\": { defaultKeys: \"escape\", description: \"Cancel or abort\" },\n\t\"app.clear\": { defaultKeys: \"ctrl+c\", description: \"Clear editor\" },\n\t\"app.exit\": { defaultKeys: \"ctrl+d\", description: \"Exit when editor is empty\" },\n\t\"app.suspend\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? [] : \"ctrl+z\",\n\t\tdescription: \"Suspend to background\",\n\t},\n\t\"app.thinking.cycle\": {\n\t\tdefaultKeys: \"shift+tab\",\n\t\tdescription: \"Cycle thinking level\",\n\t},\n\t\"app.model.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Cycle to next model\",\n\t},\n\t\"app.model.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+p\",\n\t\tdescription: \"Cycle to previous model\",\n\t},\n\t\"app.model.select\": { defaultKeys: \"ctrl+l\", description: \"Open model selector\" },\n\t\"app.tools.expand\": { defaultKeys: \"ctrl+o\", description: \"Toggle tool output\" },\n\t\"app.thinking.toggle\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Toggle thinking blocks\",\n\t},\n\t\"app.session.toggleNamedFilter\": {\n\t\tdefaultKeys: \"ctrl+n\",\n\t\tdescription: \"Toggle named session filter\",\n\t},\n\t\"app.editor.external\": {\n\t\tdefaultKeys: \"ctrl+g\",\n\t\tdescription: \"Open external editor\",\n\t},\n\t\"app.message.copy\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Copy message to clipboard\",\n\t},\n\t\"app.message.followUp\": {\n\t\tdefaultKeys: \"alt+enter\",\n\t\tdescription: \"Queue follow-up message\",\n\t},\n\t\"app.message.dequeue\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Restore queued messages\",\n\t},\n\t\"app.clipboard.pasteImage\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? \"alt+v\" : \"ctrl+v\",\n\t\tdescription: \"Paste image from clipboard (text fallback)\",\n\t},\n\t\"app.session.new\": { defaultKeys: [], description: \"Start a new session\" },\n\t\"app.session.tree\": { defaultKeys: [], description: \"Open session tree\" },\n\t\"app.session.fork\": { defaultKeys: [], description: \"Fork current session\" },\n\t\"app.session.resume\": { defaultKeys: [], description: \"Resume a session\" },\n\t\"app.tree.foldOrUp\": {\n\t\tdefaultKeys: [\"ctrl+left\", \"alt+left\"],\n\t\tdescription: \"Fold tree branch or move up\",\n\t},\n\t\"app.tree.unfoldOrDown\": {\n\t\tdefaultKeys: [\"ctrl+right\", \"alt+right\"],\n\t\tdescription: \"Unfold tree branch or move down\",\n\t},\n\t\"app.tree.editLabel\": {\n\t\tdefaultKeys: \"shift+l\",\n\t\tdescription: \"Edit tree label\",\n\t},\n\t\"app.tree.toggleLabelTimestamp\": {\n\t\tdefaultKeys: \"shift+t\",\n\t\tdescription: \"Toggle tree label timestamps\",\n\t},\n\t\"app.session.togglePath\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle session path display\",\n\t},\n\t\"app.session.toggleSort\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Toggle session sort mode\",\n\t},\n\t\"app.session.rename\": {\n\t\tdefaultKeys: \"ctrl+r\",\n\t\tdescription: \"Rename session\",\n\t},\n\t\"app.session.delete\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Delete session\",\n\t},\n\t\"app.session.deleteNoninvasive\": {\n\t\tdefaultKeys: \"ctrl+backspace\",\n\t\tdescription: \"Delete session when query is empty\",\n\t},\n\t\"app.models.save\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Save model selection\",\n\t},\n\t\"app.models.enableAll\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Enable all models\",\n\t},\n\t\"app.models.clearAll\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Clear all models\",\n\t},\n\t\"app.models.toggleProvider\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle all models for provider\",\n\t},\n\t\"app.models.reorderUp\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Move model up in order\",\n\t},\n\t\"app.models.reorderDown\": {\n\t\tdefaultKeys: \"alt+down\",\n\t\tdescription: \"Move model down in order\",\n\t},\n\t\"app.tree.filter.default\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Tree filter: default view\",\n\t},\n\t\"app.tree.filter.noTools\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Tree filter: hide tool results\",\n\t},\n\t\"app.tree.filter.userOnly\": {\n\t\tdefaultKeys: \"ctrl+u\",\n\t\tdescription: \"Tree filter: user messages only\",\n\t},\n\t\"app.tree.filter.labeledOnly\": {\n\t\tdefaultKeys: \"ctrl+l\",\n\t\tdescription: \"Tree filter: labeled entries only\",\n\t},\n\t\"app.tree.filter.all\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Tree filter: show all entries\",\n\t},\n\t\"app.tree.filter.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+o\",\n\t\tdescription: \"Tree filter: cycle forward\",\n\t},\n\t\"app.tree.filter.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+o\",\n\t\tdescription: \"Tree filter: cycle backward\",\n\t},\n} as const satisfies KeybindingDefinitions;\n\nconst KEYBINDING_NAME_MIGRATIONS = {\n\tcursorUp: \"tui.editor.cursorUp\",\n\tcursorDown: \"tui.editor.cursorDown\",\n\tcursorLeft: \"tui.editor.cursorLeft\",\n\tcursorRight: \"tui.editor.cursorRight\",\n\tcursorWordLeft: \"tui.editor.cursorWordLeft\",\n\tcursorWordRight: \"tui.editor.cursorWordRight\",\n\tcursorLineStart: \"tui.editor.cursorLineStart\",\n\tcursorLineEnd: \"tui.editor.cursorLineEnd\",\n\tjumpForward: \"tui.editor.jumpForward\",\n\tjumpBackward: \"tui.editor.jumpBackward\",\n\tpageUp: \"tui.editor.pageUp\",\n\tpageDown: \"tui.editor.pageDown\",\n\tdeleteCharBackward: \"tui.editor.deleteCharBackward\",\n\tdeleteCharForward: \"tui.editor.deleteCharForward\",\n\tdeleteWordBackward: \"tui.editor.deleteWordBackward\",\n\tdeleteWordForward: \"tui.editor.deleteWordForward\",\n\tdeleteToLineStart: \"tui.editor.deleteToLineStart\",\n\tdeleteToLineEnd: \"tui.editor.deleteToLineEnd\",\n\tyank: \"tui.editor.yank\",\n\tyankPop: \"tui.editor.yankPop\",\n\tundo: \"tui.editor.undo\",\n\tnewLine: \"tui.input.newLine\",\n\tsubmit: \"tui.input.submit\",\n\ttab: \"tui.input.tab\",\n\tcopy: \"tui.input.copy\",\n\tselectUp: \"tui.select.up\",\n\tselectDown: \"tui.select.down\",\n\tselectPageUp: \"tui.select.pageUp\",\n\tselectPageDown: \"tui.select.pageDown\",\n\tselectConfirm: \"tui.select.confirm\",\n\tselectCancel: \"tui.select.cancel\",\n\tinterrupt: \"app.interrupt\",\n\tclear: \"app.clear\",\n\texit: \"app.exit\",\n\tsuspend: \"app.suspend\",\n\tcycleThinkingLevel: \"app.thinking.cycle\",\n\tcycleModelForward: \"app.model.cycleForward\",\n\tcycleModelBackward: \"app.model.cycleBackward\",\n\tselectModel: \"app.model.select\",\n\texpandTools: \"app.tools.expand\",\n\ttoggleThinking: \"app.thinking.toggle\",\n\ttoggleSessionNamedFilter: \"app.session.toggleNamedFilter\",\n\texternalEditor: \"app.editor.external\",\n\tfollowUp: \"app.message.followUp\",\n\tdequeue: \"app.message.dequeue\",\n\tpasteImage: \"app.clipboard.pasteImage\",\n\tnewSession: \"app.session.new\",\n\ttree: \"app.session.tree\",\n\tfork: \"app.session.fork\",\n\tresume: \"app.session.resume\",\n\ttreeFoldOrUp: \"app.tree.foldOrUp\",\n\ttreeUnfoldOrDown: \"app.tree.unfoldOrDown\",\n\ttreeEditLabel: \"app.tree.editLabel\",\n\ttreeToggleLabelTimestamp: \"app.tree.toggleLabelTimestamp\",\n\ttoggleSessionPath: \"app.session.togglePath\",\n\ttoggleSessionSort: \"app.session.toggleSort\",\n\trenameSession: \"app.session.rename\",\n\tdeleteSession: \"app.session.delete\",\n\tdeleteSessionNoninvasive: \"app.session.deleteNoninvasive\",\n} as const satisfies Record<string, Keybinding>;\n\ninterface KeybindingsMigrationResult {\n\tconfig: Record<string, unknown>;\n\tmigrated: boolean;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLegacyKeybindingName(key: string): key is keyof typeof KEYBINDING_NAME_MIGRATIONS {\n\treturn key in KEYBINDING_NAME_MIGRATIONS;\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n\tif (!isRecord(value)) return {};\n\n\tconst config: KeybindingsConfig = {};\n\tfor (const [key, binding] of Object.entries(value)) {\n\t\tif (typeof binding === \"string\") {\n\t\t\tconfig[key] = binding as KeyId;\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(binding) && binding.every((entry) => typeof entry === \"string\")) {\n\t\t\tconfig[key] = binding as KeyId[];\n\t\t}\n\t}\n\treturn config;\n}\n\nexport function migrateKeybindingsConfig(rawConfig: Record<string, unknown>): KeybindingsMigrationResult {\n\tconst config: Record<string, unknown> = {};\n\tlet migrated = false;\n\n\tfor (const [key, value] of Object.entries(rawConfig)) {\n\t\tconst nextKey = isLegacyKeybindingName(key) ? KEYBINDING_NAME_MIGRATIONS[key] : key;\n\t\tif (nextKey !== key) {\n\t\t\tmigrated = true;\n\t\t}\n\t\tif (key !== nextKey && Object.hasOwn(rawConfig, nextKey)) {\n\t\t\tmigrated = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconfig[nextKey] = value;\n\t}\n\n\treturn { config: orderKeybindingsConfig(config), migrated };\n}\n\nfunction orderKeybindingsConfig(config: Record<string, unknown>): Record<string, unknown> {\n\tconst ordered: Record<string, unknown> = {};\n\tfor (const keybinding of Object.keys(KEYBINDINGS)) {\n\t\tif (Object.hasOwn(config, keybinding)) {\n\t\t\tordered[keybinding] = config[keybinding];\n\t\t}\n\t}\n\n\tconst extras = Object.keys(config)\n\t\t.filter((key) => !Object.hasOwn(ordered, key))\n\t\t.sort();\n\tfor (const key of extras) {\n\t\tordered[key] = config[key];\n\t}\n\n\treturn ordered;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n\t\treturn isRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport class KeybindingsManager extends TuiKeybindingsManager {\n\tprivate configPath: string | undefined;\n\n\tconstructor(userBindings: KeybindingsConfig = {}, configPath?: string) {\n\t\tsuper(KEYBINDINGS, userBindings);\n\t\tthis.configPath = configPath;\n\t}\n\n\tstatic create(agentDir: string = getAgentDir()): KeybindingsManager {\n\t\tconst configPath = join(agentDir, \"keybindings.json\");\n\t\tconst userBindings = KeybindingsManager.loadFromFile(configPath);\n\t\treturn new KeybindingsManager(userBindings, configPath);\n\t}\n\n\treload(): void {\n\t\tif (!this.configPath) return;\n\t\tthis.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));\n\t}\n\n\tgetEffectiveConfig(): KeybindingsConfig {\n\t\treturn this.getResolvedBindings();\n\t}\n\n\tprivate static loadFromFile(path: string): KeybindingsConfig {\n\t\tconst rawConfig = loadRawConfig(path);\n\t\tif (!rawConfig) return {};\n\t\treturn toKeybindingsConfig(migrateKeybindingsConfig(rawConfig).config);\n\t}\n}\n\nexport type { Keybinding, KeybindingsConfig, KeyId };\n"]}
1
+ {"version":3,"file":"keybindings.js","sourceRoot":"","sources":["../../src/core/keybindings.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Keybinding,\n\ttype KeybindingDefinitions,\n\ttype KeybindingsConfig,\n\ttype KeyId,\n\tTUI_KEYBINDINGS,\n\tKeybindingsManager as TuiKeybindingsManager,\n} from \"@greppleai/grip-tui\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport interface AppKeybindings {\n\t\"app.interrupt\": true;\n\t\"app.clear\": true;\n\t\"app.exit\": true;\n\t\"app.suspend\": true;\n\t\"app.thinking.cycle\": true;\n\t\"app.model.cycleForward\": true;\n\t\"app.model.cycleBackward\": true;\n\t\"app.model.select\": true;\n\t\"app.tools.expand\": true;\n\t\"app.thinking.toggle\": true;\n\t\"app.session.toggleNamedFilter\": true;\n\t\"app.editor.external\": true;\n\t\"app.message.copy\": true;\n\t\"app.message.followUp\": true;\n\t\"app.message.dequeue\": true;\n\t\"app.clipboard.pasteImage\": true;\n\t\"app.session.new\": true;\n\t\"app.session.tree\": true;\n\t\"app.session.fork\": true;\n\t\"app.session.resume\": true;\n\t\"app.tree.foldOrUp\": true;\n\t\"app.tree.unfoldOrDown\": true;\n\t\"app.tree.editLabel\": true;\n\t\"app.tree.toggleLabelTimestamp\": true;\n\t\"app.session.togglePath\": true;\n\t\"app.session.toggleSort\": true;\n\t\"app.session.rename\": true;\n\t\"app.session.delete\": true;\n\t\"app.session.deleteNoninvasive\": true;\n\t\"app.models.save\": true;\n\t\"app.models.enableAll\": true;\n\t\"app.models.clearAll\": true;\n\t\"app.models.toggleProvider\": true;\n\t\"app.models.reorderUp\": true;\n\t\"app.models.reorderDown\": true;\n\t\"app.tree.filter.default\": true;\n\t\"app.tree.filter.noTools\": true;\n\t\"app.tree.filter.userOnly\": true;\n\t\"app.tree.filter.labeledOnly\": true;\n\t\"app.tree.filter.all\": true;\n\t\"app.tree.filter.cycleForward\": true;\n\t\"app.tree.filter.cycleBackward\": true;\n}\n\nexport type AppKeybinding = keyof AppKeybindings;\n\ndeclare module \"@greppleai/grip-tui\" {\n\tinterface Keybindings extends AppKeybindings {}\n}\n\nexport const KEYBINDINGS = {\n\t...TUI_KEYBINDINGS,\n\t\"app.interrupt\": { defaultKeys: \"escape\", description: \"Cancel or abort\" },\n\t\"app.clear\": { defaultKeys: \"ctrl+c\", description: \"Clear editor\" },\n\t\"app.exit\": { defaultKeys: \"ctrl+d\", description: \"Exit when editor is empty\" },\n\t\"app.suspend\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? [] : \"ctrl+z\",\n\t\tdescription: \"Suspend to background\",\n\t},\n\t\"app.thinking.cycle\": {\n\t\tdefaultKeys: \"shift+tab\",\n\t\tdescription: \"Cycle thinking level\",\n\t},\n\t\"app.model.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Cycle to next model\",\n\t},\n\t\"app.model.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+p\",\n\t\tdescription: \"Cycle to previous model\",\n\t},\n\t\"app.model.select\": { defaultKeys: \"ctrl+l\", description: \"Open model selector\" },\n\t\"app.tools.expand\": { defaultKeys: \"ctrl+o\", description: \"Toggle tool output\" },\n\t\"app.thinking.toggle\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Toggle thinking blocks\",\n\t},\n\t\"app.session.toggleNamedFilter\": {\n\t\tdefaultKeys: \"ctrl+n\",\n\t\tdescription: \"Toggle named session filter\",\n\t},\n\t\"app.editor.external\": {\n\t\tdefaultKeys: \"ctrl+g\",\n\t\tdescription: \"Open external editor\",\n\t},\n\t\"app.message.copy\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Copy message to clipboard\",\n\t},\n\t\"app.message.followUp\": {\n\t\tdefaultKeys: \"alt+enter\",\n\t\tdescription: \"Queue follow-up message\",\n\t},\n\t\"app.message.dequeue\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Restore queued messages\",\n\t},\n\t\"app.clipboard.pasteImage\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? \"alt+v\" : \"ctrl+v\",\n\t\tdescription: \"Paste image from clipboard (text fallback)\",\n\t},\n\t\"app.session.new\": { defaultKeys: [], description: \"Start a new session\" },\n\t\"app.session.tree\": { defaultKeys: [], description: \"Open session tree\" },\n\t\"app.session.fork\": { defaultKeys: [], description: \"Fork current session\" },\n\t\"app.session.resume\": { defaultKeys: [], description: \"Resume a session\" },\n\t\"app.tree.foldOrUp\": {\n\t\tdefaultKeys: [\"ctrl+left\", \"alt+left\"],\n\t\tdescription: \"Fold tree branch or move up\",\n\t},\n\t\"app.tree.unfoldOrDown\": {\n\t\tdefaultKeys: [\"ctrl+right\", \"alt+right\"],\n\t\tdescription: \"Unfold tree branch or move down\",\n\t},\n\t\"app.tree.editLabel\": {\n\t\tdefaultKeys: \"shift+l\",\n\t\tdescription: \"Edit tree label\",\n\t},\n\t\"app.tree.toggleLabelTimestamp\": {\n\t\tdefaultKeys: \"shift+t\",\n\t\tdescription: \"Toggle tree label timestamps\",\n\t},\n\t\"app.session.togglePath\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle session path display\",\n\t},\n\t\"app.session.toggleSort\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Toggle session sort mode\",\n\t},\n\t\"app.session.rename\": {\n\t\tdefaultKeys: \"ctrl+r\",\n\t\tdescription: \"Rename session\",\n\t},\n\t\"app.session.delete\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Delete session\",\n\t},\n\t\"app.session.deleteNoninvasive\": {\n\t\tdefaultKeys: \"ctrl+backspace\",\n\t\tdescription: \"Delete session when query is empty\",\n\t},\n\t\"app.models.save\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Save model selection\",\n\t},\n\t\"app.models.enableAll\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Enable all models\",\n\t},\n\t\"app.models.clearAll\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Clear all models\",\n\t},\n\t\"app.models.toggleProvider\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle all models for provider\",\n\t},\n\t\"app.models.reorderUp\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Move model up in order\",\n\t},\n\t\"app.models.reorderDown\": {\n\t\tdefaultKeys: \"alt+down\",\n\t\tdescription: \"Move model down in order\",\n\t},\n\t\"app.tree.filter.default\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Tree filter: default view\",\n\t},\n\t\"app.tree.filter.noTools\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Tree filter: hide tool results\",\n\t},\n\t\"app.tree.filter.userOnly\": {\n\t\tdefaultKeys: \"ctrl+u\",\n\t\tdescription: \"Tree filter: user messages only\",\n\t},\n\t\"app.tree.filter.labeledOnly\": {\n\t\tdefaultKeys: \"ctrl+l\",\n\t\tdescription: \"Tree filter: labeled entries only\",\n\t},\n\t\"app.tree.filter.all\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Tree filter: show all entries\",\n\t},\n\t\"app.tree.filter.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+o\",\n\t\tdescription: \"Tree filter: cycle forward\",\n\t},\n\t\"app.tree.filter.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+o\",\n\t\tdescription: \"Tree filter: cycle backward\",\n\t},\n} as const satisfies KeybindingDefinitions;\n\nconst KEYBINDING_NAME_MIGRATIONS = {\n\tcursorUp: \"tui.editor.cursorUp\",\n\tcursorDown: \"tui.editor.cursorDown\",\n\tcursorLeft: \"tui.editor.cursorLeft\",\n\tcursorRight: \"tui.editor.cursorRight\",\n\tcursorWordLeft: \"tui.editor.cursorWordLeft\",\n\tcursorWordRight: \"tui.editor.cursorWordRight\",\n\tcursorLineStart: \"tui.editor.cursorLineStart\",\n\tcursorLineEnd: \"tui.editor.cursorLineEnd\",\n\tjumpForward: \"tui.editor.jumpForward\",\n\tjumpBackward: \"tui.editor.jumpBackward\",\n\tpageUp: \"tui.editor.pageUp\",\n\tpageDown: \"tui.editor.pageDown\",\n\tdeleteCharBackward: \"tui.editor.deleteCharBackward\",\n\tdeleteCharForward: \"tui.editor.deleteCharForward\",\n\tdeleteWordBackward: \"tui.editor.deleteWordBackward\",\n\tdeleteWordForward: \"tui.editor.deleteWordForward\",\n\tdeleteToLineStart: \"tui.editor.deleteToLineStart\",\n\tdeleteToLineEnd: \"tui.editor.deleteToLineEnd\",\n\tyank: \"tui.editor.yank\",\n\tyankPop: \"tui.editor.yankPop\",\n\tundo: \"tui.editor.undo\",\n\tnewLine: \"tui.input.newLine\",\n\tsubmit: \"tui.input.submit\",\n\ttab: \"tui.input.tab\",\n\tcopy: \"tui.input.copy\",\n\tselectUp: \"tui.select.up\",\n\tselectDown: \"tui.select.down\",\n\tselectPageUp: \"tui.select.pageUp\",\n\tselectPageDown: \"tui.select.pageDown\",\n\tselectConfirm: \"tui.select.confirm\",\n\tselectCancel: \"tui.select.cancel\",\n\tinterrupt: \"app.interrupt\",\n\tclear: \"app.clear\",\n\texit: \"app.exit\",\n\tsuspend: \"app.suspend\",\n\tcycleThinkingLevel: \"app.thinking.cycle\",\n\tcycleModelForward: \"app.model.cycleForward\",\n\tcycleModelBackward: \"app.model.cycleBackward\",\n\tselectModel: \"app.model.select\",\n\texpandTools: \"app.tools.expand\",\n\ttoggleThinking: \"app.thinking.toggle\",\n\ttoggleSessionNamedFilter: \"app.session.toggleNamedFilter\",\n\texternalEditor: \"app.editor.external\",\n\tfollowUp: \"app.message.followUp\",\n\tdequeue: \"app.message.dequeue\",\n\tpasteImage: \"app.clipboard.pasteImage\",\n\tnewSession: \"app.session.new\",\n\ttree: \"app.session.tree\",\n\tfork: \"app.session.fork\",\n\tresume: \"app.session.resume\",\n\ttreeFoldOrUp: \"app.tree.foldOrUp\",\n\ttreeUnfoldOrDown: \"app.tree.unfoldOrDown\",\n\ttreeEditLabel: \"app.tree.editLabel\",\n\ttreeToggleLabelTimestamp: \"app.tree.toggleLabelTimestamp\",\n\ttoggleSessionPath: \"app.session.togglePath\",\n\ttoggleSessionSort: \"app.session.toggleSort\",\n\trenameSession: \"app.session.rename\",\n\tdeleteSession: \"app.session.delete\",\n\tdeleteSessionNoninvasive: \"app.session.deleteNoninvasive\",\n} as const satisfies Record<string, Keybinding>;\n\ninterface KeybindingsMigrationResult {\n\tconfig: Record<string, unknown>;\n\tmigrated: boolean;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLegacyKeybindingName(key: string): key is keyof typeof KEYBINDING_NAME_MIGRATIONS {\n\treturn key in KEYBINDING_NAME_MIGRATIONS;\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n\tif (!isRecord(value)) return {};\n\n\tconst config: KeybindingsConfig = {};\n\tfor (const [key, binding] of Object.entries(value)) {\n\t\tif (typeof binding === \"string\") {\n\t\t\tconfig[key] = binding as KeyId;\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(binding) && binding.every((entry) => typeof entry === \"string\")) {\n\t\t\tconfig[key] = binding as KeyId[];\n\t\t}\n\t}\n\treturn config;\n}\n\nexport function migrateKeybindingsConfig(rawConfig: Record<string, unknown>): KeybindingsMigrationResult {\n\tconst config: Record<string, unknown> = {};\n\tlet migrated = false;\n\n\tfor (const [key, value] of Object.entries(rawConfig)) {\n\t\tconst nextKey = isLegacyKeybindingName(key) ? KEYBINDING_NAME_MIGRATIONS[key] : key;\n\t\tif (nextKey !== key) {\n\t\t\tmigrated = true;\n\t\t}\n\t\tif (key !== nextKey && Object.hasOwn(rawConfig, nextKey)) {\n\t\t\tmigrated = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconfig[nextKey] = value;\n\t}\n\n\treturn { config: orderKeybindingsConfig(config), migrated };\n}\n\nfunction orderKeybindingsConfig(config: Record<string, unknown>): Record<string, unknown> {\n\tconst ordered: Record<string, unknown> = {};\n\tfor (const keybinding of Object.keys(KEYBINDINGS)) {\n\t\tif (Object.hasOwn(config, keybinding)) {\n\t\t\tordered[keybinding] = config[keybinding];\n\t\t}\n\t}\n\n\tconst extras = Object.keys(config)\n\t\t.filter((key) => !Object.hasOwn(ordered, key))\n\t\t.sort();\n\tfor (const key of extras) {\n\t\tordered[key] = config[key];\n\t}\n\n\treturn ordered;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n\t\treturn isRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport class KeybindingsManager extends TuiKeybindingsManager {\n\tprivate configPath: string | undefined;\n\n\tconstructor(userBindings: KeybindingsConfig = {}, configPath?: string) {\n\t\tsuper(KEYBINDINGS, userBindings);\n\t\tthis.configPath = configPath;\n\t}\n\n\tstatic create(agentDir: string = getAgentDir()): KeybindingsManager {\n\t\tconst configPath = join(agentDir, \"keybindings.json\");\n\t\tconst userBindings = KeybindingsManager.loadFromFile(configPath);\n\t\treturn new KeybindingsManager(userBindings, configPath);\n\t}\n\n\treload(): void {\n\t\tif (!this.configPath) return;\n\t\tthis.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));\n\t}\n\n\tgetEffectiveConfig(): KeybindingsConfig {\n\t\treturn this.getResolvedBindings();\n\t}\n\n\tprivate static loadFromFile(path: string): KeybindingsConfig {\n\t\tconst rawConfig = loadRawConfig(path);\n\t\tif (!rawConfig) return {};\n\t\treturn toKeybindingsConfig(migrateKeybindingsConfig(rawConfig).config);\n\t}\n}\n\nexport type { Keybinding, KeybindingsConfig, KeyId };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/abort.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAa5G","sourcesContent":["function abortReason(signal: AbortSignal): unknown {\n\tif (signal.reason !== undefined) return signal.reason;\n\tconst error = new Error(\"Operation aborted\");\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw abortReason(signal);\n}\n\nexport async function waitForAbort<T>(operation: PromiseLike<T>, signal: AbortSignal | undefined): Promise<T> {\n\tif (!signal) return operation;\n\tthrowIfAborted(signal);\n\tlet onAbort!: () => void;\n\tconst aborted = new Promise<never>((_resolve, reject) => {\n\t\tonAbort = () => reject(abortReason(signal));\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n\ttry {\n\t\treturn await Promise.race([operation, aborted]);\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
1
+ {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/abort.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAa5G"}
@@ -1 +1 @@
1
- {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../../src/core/lsp/abort.ts"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,MAAmB,EAAW;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,cAAc,CAAC,MAA+B,EAAQ;IACrE,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAAA,CAC/C;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,SAAyB,EAAE,MAA+B,EAAc;IAC7G,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,OAAoB,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;QACxD,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAAA,CAC1D,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;AAAA,CACD","sourcesContent":["function abortReason(signal: AbortSignal): unknown {\n\tif (signal.reason !== undefined) return signal.reason;\n\tconst error = new Error(\"Operation aborted\");\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw abortReason(signal);\n}\n\nexport async function waitForAbort<T>(operation: PromiseLike<T>, signal: AbortSignal | undefined): Promise<T> {\n\tif (!signal) return operation;\n\tthrowIfAborted(signal);\n\tlet onAbort!: () => void;\n\tconst aborted = new Promise<never>((_resolve, reject) => {\n\t\tonAbort = () => reject(abortReason(signal));\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n\ttry {\n\t\treturn await Promise.race([operation, aborted]);\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../../src/core/lsp/abort.ts"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,MAAmB;IACvC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC7D,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,SAAyB,EAAE,MAA+B;IAC/F,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,OAAoB,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACvD,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;AACF,CAAC","sourcesContent":["function abortReason(signal: AbortSignal): unknown {\n\tif (signal.reason !== undefined) return signal.reason;\n\tconst error = new Error(\"Operation aborted\");\n\terror.name = \"AbortError\";\n\treturn error;\n}\n\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) throw abortReason(signal);\n}\n\nexport async function waitForAbort<T>(operation: PromiseLike<T>, signal: AbortSignal | undefined): Promise<T> {\n\tif (!signal) return operation;\n\tthrowIfAborted(signal);\n\tlet onAbort!: () => void;\n\tconst aborted = new Promise<never>((_resolve, reject) => {\n\t\tonAbort = () => reject(abortReason(signal));\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n\ttry {\n\t\treturn await Promise.race([operation, aborted]);\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport type {\n\tConfigurationParams,\n\tDiagnostic,\n\tInitializeParams,\n\tInitializeResult,\n\tPublishDiagnosticsParams,\n\tRange,\n\tServerCapabilities,\n\tWorkspaceFolder,\n} from \"vscode-languageserver-protocol\";\nimport { CodeActionKind, ResourceOperationKind, TextDocumentSyncKind } from \"vscode-languageserver-protocol\";\nimport {\n\tCancellationTokenSource,\n\tcreateMessageConnection,\n\ttype MessageConnection,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { waitForAbort } from \"./abort.ts\";\nimport type { LspClientInfo, LspJsonValue, LspTraceValue } from \"./config.ts\";\nimport { pathApi, pathFlavor, portablePathToFileUri } from \"./portable-path.ts\";\nimport type { LspConnectionEndpoint, LspConnectionFactory, LspConnectionHandle } from \"./transport.ts\";\n\nexport type LspShutdownMode = \"protocol\" | \"disconnect\";\nexport type LspClientOwnership = \"managed\" | \"attached\";\n\nexport interface LspClientOptions {\n\tserverId: string;\n\trootDir: string;\n\t/** Server-visible workspace URI; defaults to the local rootDir file URI. */\n\trootUri?: string;\n\tlanguageId: string;\n\tconnectionFactory: LspConnectionFactory;\n\tconnectTimeoutMs?: number;\n\tinitializeTimeoutMs?: number;\n\trequestTimeoutMs?: number;\n\tshutdownTimeoutMs?: number;\n\tshutdownMode?: LspShutdownMode;\n\townership?: LspClientOwnership;\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tonUnexpectedClose?: (error?: Error) => void;\n\tonTransportError?: (error: Error) => void;\n\tonRequestError?: (error: Error) => void;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionState = \"idle\" | \"connecting\" | \"initializing\" | \"running\" | \"closed\" | \"failed\" | \"disposed\";\nexport interface LspDocumentSyncCapabilities {\n\topenClose: boolean;\n\tchange: TextDocumentSyncKind;\n\tsave: boolean;\n\tsaveIncludeText: boolean;\n}\n\nexport interface LspClientStartResult {\n\tcapabilities: ServerCapabilities;\n\tendpoint: LspConnectionEndpoint;\n}\n\ntype ToolContent = TextContent | ImageContent;\n\ninterface OperationDeadline {\n\ttimeoutMs: number | undefined;\n\texpiresAt: number | undefined;\n}\n\ninterface OperationWaitOptions {\n\tsignal?: AbortSignal;\n\tonTimeout?: () => void;\n\tonAbort?: () => void;\n\tabortMessage?: string;\n}\n\nconst MAX_INVALIDATION_CLOSE_MS = 3000;\n\nfunction createDeadline(timeoutMs: number | undefined): OperationDeadline {\n\treturn {\n\t\ttimeoutMs,\n\t\texpiresAt: timeoutMs !== undefined && timeoutMs > 0 ? Date.now() + timeoutMs : undefined,\n\t};\n}\n\nasync function waitForOperation<T>(\n\tpromise: Promise<T>,\n\tdeadline: OperationDeadline,\n\tdescription: string,\n\toptions: OperationWaitOptions = {},\n): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", abort);\n\t\t};\n\t\tconst succeed = (value: T): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(value);\n\t\t};\n\t\tconst fail = (error: unknown): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst abort = (): void => {\n\t\t\tfail(new Error(options.abortMessage ?? `${description} was aborted`));\n\t\t\toptions.onAbort?.();\n\t\t};\n\t\tpromise.then(succeed, fail);\n\t\toptions.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\tif (options.signal?.aborted) abort();\n\t\tif (!settled && deadline.expiresAt !== undefined) {\n\t\t\tconst remainingMs = deadline.expiresAt - Date.now();\n\t\t\tif (remainingMs <= 0) {\n\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\tfail(timeoutError);\n\t\t\t\toptions.onTimeout?.();\n\t\t\t} else {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\t\tfail(timeoutError);\n\t\t\t\t\toptions.onTimeout?.();\n\t\t\t\t}, remainingMs);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction withTimeout<T>(\n\tpromise: Promise<T>,\n\ttimeoutMs: number | undefined,\n\tdescription: string,\n\tonTimeout?: () => void,\n): Promise<T> {\n\treturn waitForOperation(promise, createDeadline(timeoutMs), description, { onTimeout });\n}\n\nfunction settingsForSection(settings: LspJsonValue | undefined, section: string | undefined): LspJsonValue {\n\tif (settings === undefined) return null;\n\tif (!section) return settings;\n\tlet current: LspJsonValue = settings;\n\tfor (const segment of section.split(\".\")) {\n\t\tif (\n\t\t\ttypeof current !== \"object\" ||\n\t\t\tcurrent === null ||\n\t\t\tArray.isArray(current) ||\n\t\t\t!Object.hasOwn(current, segment)\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = current[segment];\n\t}\n\treturn current;\n}\n\nexport class LspClient {\n\treadonly serverId: string;\n\treadonly languageId: string;\n\treadonly rootDir: string;\n\treadonly rootUri: string;\n\n\tprivate readonly options: LspClientOptions;\n\tprivate connectionHandle: LspConnectionHandle | undefined;\n\tprivate connection: MessageConnection | undefined;\n\tprivate capabilities: ServerCapabilities | undefined;\n\tprivate diagnostics = new Map<string, Diagnostic[]>();\n\tprivate initialized = false;\n\tprivate disposed = false;\n\tprivate closing = false;\n\tprivate startController: AbortController | undefined;\n\tprivate startPromise: Promise<LspClientStartResult> | undefined;\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate lifecycleGeneration = 0;\n\tprivate readonly handleClosePromises = new WeakMap<LspConnectionHandle, Promise<void>>();\n\tprivate endpoint: LspConnectionEndpoint | undefined;\n\tprivate transportError: Error | undefined;\n\tprivate requestError: Error | undefined;\n\tprivate stderr = \"\";\n\tprivate state: LspConnectionState = \"idle\";\n\n\tconstructor(options: LspClientOptions) {\n\t\tthis.options = options;\n\t\tthis.serverId = options.serverId;\n\t\tthis.languageId = options.languageId;\n\t\tthis.rootDir = options.rootDir;\n\t\tthis.rootUri = options.rootUri ?? portablePathToFileUri(options.rootDir);\n\t}\n\n\tget isInitialized(): boolean {\n\t\treturn this.initialized;\n\t}\n\n\tget isDisposed(): boolean {\n\t\treturn this.disposed;\n\t}\n\n\tget serverCapabilities(): ServerCapabilities | undefined {\n\t\treturn this.capabilities;\n\t}\n\n\tget documentSyncCapabilities(): LspDocumentSyncCapabilities {\n\t\tconst synchronization = this.serverCapabilities?.textDocumentSync;\n\t\tif (typeof synchronization === \"number\") {\n\t\t\treturn {\n\t\t\t\topenClose: synchronization !== TextDocumentSyncKind.None,\n\t\t\t\tchange: synchronization,\n\t\t\t\tsave: false,\n\t\t\t\tsaveIncludeText: false,\n\t\t\t};\n\t\t}\n\t\tif (!synchronization) {\n\t\t\treturn { openClose: false, change: TextDocumentSyncKind.None, save: false, saveIncludeText: false };\n\t\t}\n\t\tconst save = synchronization.save;\n\t\treturn {\n\t\t\topenClose: synchronization.openClose === true,\n\t\t\tchange: synchronization.change ?? TextDocumentSyncKind.None,\n\t\t\tsave: save === true || typeof save === \"object\",\n\t\t\tsaveIncludeText: typeof save === \"object\" && save.includeText === true,\n\t\t};\n\t}\n\n\tget connectionEndpoint(): LspConnectionEndpoint | undefined {\n\t\treturn this.endpoint;\n\t}\n\n\tget lastTransportError(): Error | undefined {\n\t\treturn this.transportError;\n\t}\n\n\tget lastRequestError(): Error | undefined {\n\t\treturn this.requestError;\n\t}\n\n\tget stderrOutput(): string {\n\t\treturn this.stderr;\n\t}\n\n\tget connectionState(): LspConnectionState {\n\t\treturn this.state;\n\t}\n\n\tget ownership(): LspClientOwnership {\n\t\treturn this.options.ownership ?? \"managed\";\n\t}\n\n\tprivate get workspaceFolder(): WorkspaceFolder {\n\t\treturn { uri: this.rootUri, name: pathApi(pathFlavor(this.rootDir)).basename(this.rootDir) || this.rootDir };\n\t}\n\n\tgetDiagnostics(uri: string): Diagnostic[] {\n\t\treturn this.diagnostics.get(uri) ?? [];\n\t}\n\n\tgetAllDiagnostics(): Map<string, Diagnostic[]> {\n\t\treturn new Map(this.diagnostics);\n\t}\n\n\tstart(): Promise<LspClientStartResult> {\n\t\tif (this.startPromise) return this.startPromise;\n\t\tthis.startPromise = (async () => {\n\t\t\ttry {\n\t\t\t\treturn await this.startInternal();\n\t\t\t} finally {\n\t\t\t\tthis.startPromise = undefined;\n\t\t\t}\n\t\t})();\n\t\treturn this.startPromise;\n\t}\n\n\tprivate async connectForStartup(controller: AbortController): Promise<LspConnectionHandle> {\n\t\tlet resolvedHandle: LspConnectionHandle | undefined;\n\t\tlet discardHandle = false;\n\t\tconst handlePromise = Promise.resolve().then(() =>\n\t\t\tthis.options.connectionFactory({\n\t\t\t\tserverId: this.serverId,\n\t\t\t\tworkspaceRoot: this.rootDir,\n\t\t\t\tworkspaceUri: this.rootUri,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tconnectTimeoutMs: this.options.connectTimeoutMs,\n\t\t\t\tonStderr: (text) => {\n\t\t\t\t\tthis.stderr = `${this.stderr}${text}`.slice(-16_384);\n\t\t\t\t\tthis.options.onStderr?.(text);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvoid handlePromise.then(\n\t\t\t(handle) => {\n\t\t\t\tresolvedHandle = handle;\n\t\t\t\tif (discardHandle) void this.closeConnectionHandle(handle);\n\t\t\t},\n\t\t\t() => undefined,\n\t\t);\n\t\ttry {\n\t\t\treturn await waitForOperation(\n\t\t\t\thandlePromise,\n\t\t\t\tcreateDeadline(this.options.connectTimeoutMs),\n\t\t\t\t`Connecting to LSP server ${this.serverId}`,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => controller.abort(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tdiscardHandle = true;\n\t\t\tcontroller.abort();\n\t\t\tif (resolvedHandle) void this.closeConnectionHandle(resolvedHandle);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate attachConnectionHandle(handle: LspConnectionHandle): void {\n\t\tthis.connectionHandle = handle;\n\t\tthis.state = \"initializing\";\n\t\tthis.endpoint = handle.endpoint;\n\t\thandle.onError((error) => {\n\t\t\tif (this.connectionHandle === handle) this.recordTransportError(error);\n\t\t});\n\t\thandle.onClose(() => {\n\t\t\tif (this.connectionHandle !== handle) return;\n\t\t\tthis.initialized = false;\n\t\t\tvoid this.closeHandle();\n\t\t\tif (!this.closing) this.state = this.disposed ? \"disposed\" : \"closed\";\n\t\t\tthis.disposeConnection();\n\t\t\tif (!this.disposed && !this.closing) this.options.onUnexpectedClose?.(this.transportError);\n\t\t});\n\t\tthis.connection = createMessageConnection(handle.reader, handle.writer);\n\t\tthis.registerConnectionHandlers();\n\t\tthis.connection.listen();\n\t}\n\n\tprivate createInitializeParams(): InitializeParams {\n\t\treturn {\n\t\t\tprocessId: this.ownership === \"attached\" ? null : process.pid,\n\t\t\trootUri: this.rootUri,\n\t\t\tworkspaceFolders: [this.workspaceFolder],\n\t\t\tcapabilities: {\n\t\t\t\ttextDocument: {\n\t\t\t\t\tsynchronization: { didSave: true, dynamicRegistration: false },\n\t\t\t\t\thover: { contentFormat: [\"plaintext\", \"markdown\"] },\n\t\t\t\t\tdefinition: {},\n\t\t\t\t\treferences: {},\n\t\t\t\t\trename: { prepareSupport: false },\n\t\t\t\t\tpublishDiagnostics: { relatedInformation: true },\n\t\t\t\t\tcodeAction: {\n\t\t\t\t\t\tdynamicRegistration: false,\n\t\t\t\t\t\tcodeActionLiteralSupport: {\n\t\t\t\t\t\t\tcodeActionKind: {\n\t\t\t\t\t\t\t\tvalueSet: [\n\t\t\t\t\t\t\t\t\tCodeActionKind.Empty,\n\t\t\t\t\t\t\t\t\tCodeActionKind.QuickFix,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Refactor,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorExtract,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorInline,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorRewrite,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Source,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceOrganizeImports,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceFixAll,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisPreferredSupport: true,\n\t\t\t\t\t\tdataSupport: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tworkspace: {\n\t\t\t\t\tconfiguration: true,\n\t\t\t\t\tworkspaceFolders: true,\n\t\t\t\t\tworkspaceEdit: {\n\t\t\t\t\t\tdocumentChanges: true,\n\t\t\t\t\t\tresourceOperations: [\n\t\t\t\t\t\t\tResourceOperationKind.Create,\n\t\t\t\t\t\t\tResourceOperationKind.Rename,\n\t\t\t\t\t\t\tResourceOperationKind.Delete,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tclientInfo: this.options.clientInfo ?? { name: \"@greppleai/grip\" },\n\t\t\t...(this.options.initializationOptions === undefined\n\t\t\t\t? {}\n\t\t\t\t: { initializationOptions: this.options.initializationOptions }),\n\t\t\t...(this.options.locale === undefined ? {} : { locale: this.options.locale }),\n\t\t\t...(this.options.trace === undefined ? {} : { trace: this.options.trace }),\n\t\t};\n\t}\n\n\tprivate async initializeConnection(\n\t\tgeneration: number,\n\t\tcontroller: AbortController,\n\t\thandle: LspConnectionHandle,\n\t): Promise<InitializeResult> {\n\t\tif (!this.connection) throw new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\tconst deadline = createDeadline(this.options.initializeTimeoutMs);\n\t\tconst description = `Initializing LSP server ${this.serverId}`;\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet result: InitializeResult;\n\t\ttry {\n\t\t\tresult = await waitForOperation(\n\t\t\t\tthis.connection.sendRequest<InitializeResult>(\n\t\t\t\t\t\"initialize\",\n\t\t\t\t\tthis.createInitializeParams(),\n\t\t\t\t\tcancellation.token,\n\t\t\t\t),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => cancellation.cancel(),\n\t\t\t\t\tonAbort: () => cancellation.cancel(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tawait waitForOperation(this.connection.sendNotification(\"initialized\", {}), deadline, description, {\n\t\t\tsignal: controller.signal,\n\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t});\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tif (this.options.settings !== undefined) {\n\t\t\tawait waitForOperation(\n\t\t\t\tthis.connection.sendNotification(\"workspace/didChangeConfiguration\", { settings: this.options.settings }),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{ signal: controller.signal, abortMessage: `LSP client startup for ${this.serverId} was aborted` },\n\t\t\t);\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\treturn result;\n\t}\n\n\tprivate async recordStartupFailure(error: unknown): Promise<Error> {\n\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\tif (!this.disposed) {\n\t\t\tthis.state = \"failed\";\n\t\t\tthis.recordTransportError(failure);\n\t\t}\n\t\tthis.closing = true;\n\t\tthis.disposeConnection();\n\t\ttry {\n\t\t\tawait this.closeHandle(\n\t\t\t\tcreateDeadline(this.options.shutdownTimeoutMs ?? 3000),\n\t\t\t\t`Closing connection to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t} catch (closeError) {\n\t\t\tthis.recordTransportError(closeError instanceof Error ? closeError : new Error(String(closeError)));\n\t\t} finally {\n\t\t\tthis.closing = false;\n\t\t}\n\t\treturn failure;\n\t}\n\n\tprivate async startInternal(): Promise<LspClientStartResult> {\n\t\tif (this.disposed) throw new Error(`LSP client for ${this.serverId} is disposed`);\n\t\tif (this.initialized && this.capabilities && this.endpoint) {\n\t\t\treturn { capabilities: this.capabilities, endpoint: this.endpoint };\n\t\t}\n\t\tconst generation = ++this.lifecycleGeneration;\n\t\tthis.state = \"connecting\";\n\t\tconst controller = new AbortController();\n\t\tthis.startController = controller;\n\t\tthis.transportError = undefined;\n\t\ttry {\n\t\t\tconst handle = await this.connectForStartup(controller);\n\t\t\tthis.assertStartupCurrent(generation, controller);\n\t\t\tthis.attachConnectionHandle(handle);\n\t\t\tconst result = await this.initializeConnection(generation, controller, handle);\n\t\t\tthis.capabilities = result.capabilities;\n\t\t\tthis.initialized = true;\n\t\t\tthis.state = \"running\";\n\t\t\treturn { capabilities: result.capabilities, endpoint: handle.endpoint };\n\t\t} catch (error) {\n\t\t\tthrow await this.recordStartupFailure(error);\n\t\t} finally {\n\t\t\tif (this.startController === controller) this.startController = undefined;\n\t\t}\n\t}\n\n\tprivate assertStartupCurrent(generation: number, controller: AbortController, handle?: LspConnectionHandle): void {\n\t\tif (this.disposed || controller.signal.aborted || this.lifecycleGeneration !== generation) {\n\t\t\tthrow new Error(`LSP client startup for ${this.serverId} was aborted`);\n\t\t}\n\t\tif (handle !== undefined && (this.connectionHandle !== handle || !this.connection)) {\n\t\t\tthrow new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\t}\n\t}\n\n\tasync sendRequest<TResult>(method: string, params: unknown, signal?: AbortSignal): Promise<TResult> {\n\t\tif (!this.connection || !this.initialized) throw new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\tif (signal?.aborted) throw new Error(`LSP request ${method} was aborted`);\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet rejectAbort: ((error: Error) => void) | undefined;\n\t\tconst abortPromise = new Promise<never>((_resolve, reject) => {\n\t\t\trejectAbort = reject;\n\t\t});\n\t\tconst onAbort = (): void => {\n\t\t\tcancellation.cancel();\n\t\t\trejectAbort?.(new Error(`LSP request ${method} was aborted`));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal?.aborted) onAbort();\n\t\ttry {\n\t\t\treturn await withTimeout(\n\t\t\t\tPromise.race([this.connection.sendRequest<TResult>(method, params, cancellation.token), abortPromise]),\n\t\t\t\tthis.options.requestTimeoutMs,\n\t\t\t\t`LSP request ${method} to ${this.serverId}`,\n\t\t\t\t() => cancellation.cancel(),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.requestError = failure;\n\t\t\tthis.options.onRequestError?.(failure);\n\t\t\tthrow failure;\n\t\t} finally {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tasync sendNotification(method: string, params: unknown, signal?: AbortSignal): Promise<void> {\n\t\tif (!this.connection || !this.initialized) {\n\t\t\tthrow new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\t}\n\t\ttry {\n\t\t\tawait waitForAbort(this.connection.sendNotification(method, params), signal);\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) throw error;\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.recordTransportError(failure);\n\t\t\tthrow failure;\n\t\t}\n\t}\n\n\tasync didOpen(uri: string, languageId: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didOpen\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, languageId, version, text },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChange(uri: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChangeIncremental(\n\t\turi: string,\n\t\tversion: number,\n\t\trange: Range,\n\t\ttext: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ range, text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didSave(uri: string, text?: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didSave\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\t...(text === undefined ? {} : { text }),\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didClose(uri: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\"textDocument/didClose\", { textDocument: { uri } }, signal);\n\t}\n\n\tinvalidate(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tthis.disposeConnection();\n\t\tconst configuredTimeout = this.options.shutdownTimeoutMs;\n\t\tconst timeoutMs =\n\t\t\tconfiguredTimeout !== undefined && configuredTimeout > 0\n\t\t\t\t? Math.min(configuredTimeout, MAX_INVALIDATION_CLOSE_MS)\n\t\t\t\t: MAX_INVALIDATION_CLOSE_MS;\n\t\tconst invalidation = this.closeHandle(\n\t\t\tcreateDeadline(timeoutMs),\n\t\t\t`Invalidating connection to LSP server ${this.serverId}`,\n\t\t)\n\t\t\t.catch((error) => {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.closing = false;\n\t\t\t});\n\t\tthis.shutdownPromise = invalidation;\n\t\treturn invalidation;\n\t}\n\n\tshutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tif (this.disposed) return Promise.resolve();\n\t\tconst shutdown = this.shutdownInternal();\n\t\tthis.shutdownPromise = shutdown;\n\t\treturn shutdown;\n\t}\n\n\tprivate async requestServerShutdown(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\tconst cancellation = new CancellationTokenSource();\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendRequest(\"shutdown\", undefined, cancellation.token),\n\t\t\t\tdeadline,\n\t\t\t\t`Shutting down LSP server ${this.serverId}`,\n\t\t\t\t{ onTimeout: () => cancellation.cancel() },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tprivate async notifyServerExit(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendNotification(\"exit\"),\n\t\t\t\tdeadline,\n\t\t\t\t`Sending exit to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t}\n\n\tprivate async shutdownInternal(): Promise<void> {\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tconst deadline = createDeadline(this.options.shutdownTimeoutMs ?? 3000);\n\t\ttry {\n\t\t\tconst connection = this.connection;\n\t\t\tif (connection && this.options.shutdownMode !== \"disconnect\") {\n\t\t\t\tawait this.requestServerShutdown(connection, deadline);\n\t\t\t\tawait this.notifyServerExit(connection, deadline);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.disposeConnection();\n\t\t\ttry {\n\t\t\t\tawait this.closeHandle(deadline, `Closing connection to LSP server ${this.serverId}`);\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t\tthis.closing = false;\n\t\t}\n\t}\n\n\tprivate registerConnectionHandlers(): void {\n\t\tthis.connection?.onNotification(\"textDocument/publishDiagnostics\", (params: PublishDiagnosticsParams) => {\n\t\t\tthis.diagnostics.set(params.uri, params.diagnostics);\n\t\t});\n\t\tthis.connection?.onRequest(\"workspace/configuration\", (params: ConfigurationParams) =>\n\t\t\tparams.items.map((item) => settingsForSection(this.options.settings, item.section)),\n\t\t);\n\t\tthis.connection?.onRequest(\"workspace/workspaceFolders\", () => [this.workspaceFolder]);\n\t\tthis.connection?.onError((data) => {\n\t\t\tconst candidate = data[0];\n\t\t\tthis.recordTransportError(candidate instanceof Error ? candidate : new Error(String(candidate)));\n\t\t});\n\t\tthis.connection?.onClose(() => {\n\t\t\tthis.initialized = false;\n\t\t\tif (!this.disposed && !this.closing) this.state = \"closed\";\n\t\t});\n\t}\n\n\tprivate recordTransportError(error: Error): void {\n\t\tthis.transportError = error;\n\t\tthis.options.onTransportError?.(error);\n\t}\n\n\tprivate closeConnectionHandle(handle: LspConnectionHandle): Promise<void> {\n\t\tconst existing = this.handleClosePromises.get(handle);\n\t\tif (existing) return existing;\n\t\tconst close = (async () => {\n\t\t\ttry {\n\t\t\t\tawait handle.close();\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t})();\n\t\tthis.handleClosePromises.set(handle, close);\n\t\treturn close;\n\t}\n\n\tprivate closeHandle(deadline?: OperationDeadline, description?: string): Promise<void> {\n\t\tconst handle = this.connectionHandle;\n\t\tthis.connectionHandle = undefined;\n\t\tif (!handle) return Promise.resolve();\n\t\tconst close = this.closeConnectionHandle(handle);\n\t\treturn deadline && description ? waitForOperation(close, deadline, description) : close;\n\t}\n\n\tprivate disposeConnection(): void {\n\t\ttry {\n\t\t\tthis.connection?.dispose();\n\t\t} catch {\n\t\t\t// Already disposed.\n\t\t}\n\t\tthis.connection = undefined;\n\t}\n}\n\nexport function getTextFromToolContent(content: ToolContent): string | undefined {\n\treturn content.type === \"text\" ? content.text : undefined;\n}\n"]}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"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"}
@@ -78,29 +78,15 @@ function settingsForSection(settings, section) {
78
78
  return current;
79
79
  }
80
80
  export class LspClient {
81
- serverId;
82
- languageId;
83
- rootDir;
84
- rootUri;
85
- options;
86
- connectionHandle;
87
- connection;
88
- capabilities;
89
- diagnostics = new Map();
90
- initialized = false;
91
- disposed = false;
92
- closing = false;
93
- startController;
94
- startPromise;
95
- shutdownPromise;
96
- lifecycleGeneration = 0;
97
- handleClosePromises = new WeakMap();
98
- endpoint;
99
- transportError;
100
- requestError;
101
- stderr = "";
102
- state = "idle";
103
81
  constructor(options) {
82
+ this.diagnostics = new Map();
83
+ this.initialized = false;
84
+ this.disposed = false;
85
+ this.closing = false;
86
+ this.lifecycleGeneration = 0;
87
+ this.handleClosePromises = new WeakMap();
88
+ this.stderr = "";
89
+ this.state = "idle";
104
90
  this.options = options;
105
91
  this.serverId = options.serverId;
106
92
  this.languageId = options.languageId;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport type {\n\tConfigurationParams,\n\tDiagnostic,\n\tInitializeParams,\n\tInitializeResult,\n\tPublishDiagnosticsParams,\n\tRange,\n\tServerCapabilities,\n\tWorkspaceFolder,\n} from \"vscode-languageserver-protocol\";\nimport { CodeActionKind, ResourceOperationKind, TextDocumentSyncKind } from \"vscode-languageserver-protocol\";\nimport {\n\tCancellationTokenSource,\n\tcreateMessageConnection,\n\ttype MessageConnection,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { waitForAbort } from \"./abort.ts\";\nimport type { LspClientInfo, LspJsonValue, LspTraceValue } from \"./config.ts\";\nimport { pathApi, pathFlavor, portablePathToFileUri } from \"./portable-path.ts\";\nimport type { LspConnectionEndpoint, LspConnectionFactory, LspConnectionHandle } from \"./transport.ts\";\n\nexport type LspShutdownMode = \"protocol\" | \"disconnect\";\nexport type LspClientOwnership = \"managed\" | \"attached\";\n\nexport interface LspClientOptions {\n\tserverId: string;\n\trootDir: string;\n\t/** Server-visible workspace URI; defaults to the local rootDir file URI. */\n\trootUri?: string;\n\tlanguageId: string;\n\tconnectionFactory: LspConnectionFactory;\n\tconnectTimeoutMs?: number;\n\tinitializeTimeoutMs?: number;\n\trequestTimeoutMs?: number;\n\tshutdownTimeoutMs?: number;\n\tshutdownMode?: LspShutdownMode;\n\townership?: LspClientOwnership;\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tonUnexpectedClose?: (error?: Error) => void;\n\tonTransportError?: (error: Error) => void;\n\tonRequestError?: (error: Error) => void;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionState = \"idle\" | \"connecting\" | \"initializing\" | \"running\" | \"closed\" | \"failed\" | \"disposed\";\nexport interface LspDocumentSyncCapabilities {\n\topenClose: boolean;\n\tchange: TextDocumentSyncKind;\n\tsave: boolean;\n\tsaveIncludeText: boolean;\n}\n\nexport interface LspClientStartResult {\n\tcapabilities: ServerCapabilities;\n\tendpoint: LspConnectionEndpoint;\n}\n\ntype ToolContent = TextContent | ImageContent;\n\ninterface OperationDeadline {\n\ttimeoutMs: number | undefined;\n\texpiresAt: number | undefined;\n}\n\ninterface OperationWaitOptions {\n\tsignal?: AbortSignal;\n\tonTimeout?: () => void;\n\tonAbort?: () => void;\n\tabortMessage?: string;\n}\n\nconst MAX_INVALIDATION_CLOSE_MS = 3000;\n\nfunction createDeadline(timeoutMs: number | undefined): OperationDeadline {\n\treturn {\n\t\ttimeoutMs,\n\t\texpiresAt: timeoutMs !== undefined && timeoutMs > 0 ? Date.now() + timeoutMs : undefined,\n\t};\n}\n\nasync function waitForOperation<T>(\n\tpromise: Promise<T>,\n\tdeadline: OperationDeadline,\n\tdescription: string,\n\toptions: OperationWaitOptions = {},\n): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", abort);\n\t\t};\n\t\tconst succeed = (value: T): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(value);\n\t\t};\n\t\tconst fail = (error: unknown): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst abort = (): void => {\n\t\t\tfail(new Error(options.abortMessage ?? `${description} was aborted`));\n\t\t\toptions.onAbort?.();\n\t\t};\n\t\tpromise.then(succeed, fail);\n\t\toptions.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\tif (options.signal?.aborted) abort();\n\t\tif (!settled && deadline.expiresAt !== undefined) {\n\t\t\tconst remainingMs = deadline.expiresAt - Date.now();\n\t\t\tif (remainingMs <= 0) {\n\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\tfail(timeoutError);\n\t\t\t\toptions.onTimeout?.();\n\t\t\t} else {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\t\tfail(timeoutError);\n\t\t\t\t\toptions.onTimeout?.();\n\t\t\t\t}, remainingMs);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction withTimeout<T>(\n\tpromise: Promise<T>,\n\ttimeoutMs: number | undefined,\n\tdescription: string,\n\tonTimeout?: () => void,\n): Promise<T> {\n\treturn waitForOperation(promise, createDeadline(timeoutMs), description, { onTimeout });\n}\n\nfunction settingsForSection(settings: LspJsonValue | undefined, section: string | undefined): LspJsonValue {\n\tif (settings === undefined) return null;\n\tif (!section) return settings;\n\tlet current: LspJsonValue = settings;\n\tfor (const segment of section.split(\".\")) {\n\t\tif (\n\t\t\ttypeof current !== \"object\" ||\n\t\t\tcurrent === null ||\n\t\t\tArray.isArray(current) ||\n\t\t\t!Object.hasOwn(current, segment)\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = current[segment];\n\t}\n\treturn current;\n}\n\nexport class LspClient {\n\treadonly serverId: string;\n\treadonly languageId: string;\n\treadonly rootDir: string;\n\treadonly rootUri: string;\n\n\tprivate readonly options: LspClientOptions;\n\tprivate connectionHandle: LspConnectionHandle | undefined;\n\tprivate connection: MessageConnection | undefined;\n\tprivate capabilities: ServerCapabilities | undefined;\n\tprivate diagnostics = new Map<string, Diagnostic[]>();\n\tprivate initialized = false;\n\tprivate disposed = false;\n\tprivate closing = false;\n\tprivate startController: AbortController | undefined;\n\tprivate startPromise: Promise<LspClientStartResult> | undefined;\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate lifecycleGeneration = 0;\n\tprivate readonly handleClosePromises = new WeakMap<LspConnectionHandle, Promise<void>>();\n\tprivate endpoint: LspConnectionEndpoint | undefined;\n\tprivate transportError: Error | undefined;\n\tprivate requestError: Error | undefined;\n\tprivate stderr = \"\";\n\tprivate state: LspConnectionState = \"idle\";\n\n\tconstructor(options: LspClientOptions) {\n\t\tthis.options = options;\n\t\tthis.serverId = options.serverId;\n\t\tthis.languageId = options.languageId;\n\t\tthis.rootDir = options.rootDir;\n\t\tthis.rootUri = options.rootUri ?? portablePathToFileUri(options.rootDir);\n\t}\n\n\tget isInitialized(): boolean {\n\t\treturn this.initialized;\n\t}\n\n\tget isDisposed(): boolean {\n\t\treturn this.disposed;\n\t}\n\n\tget serverCapabilities(): ServerCapabilities | undefined {\n\t\treturn this.capabilities;\n\t}\n\n\tget documentSyncCapabilities(): LspDocumentSyncCapabilities {\n\t\tconst synchronization = this.serverCapabilities?.textDocumentSync;\n\t\tif (typeof synchronization === \"number\") {\n\t\t\treturn {\n\t\t\t\topenClose: synchronization !== TextDocumentSyncKind.None,\n\t\t\t\tchange: synchronization,\n\t\t\t\tsave: false,\n\t\t\t\tsaveIncludeText: false,\n\t\t\t};\n\t\t}\n\t\tif (!synchronization) {\n\t\t\treturn { openClose: false, change: TextDocumentSyncKind.None, save: false, saveIncludeText: false };\n\t\t}\n\t\tconst save = synchronization.save;\n\t\treturn {\n\t\t\topenClose: synchronization.openClose === true,\n\t\t\tchange: synchronization.change ?? TextDocumentSyncKind.None,\n\t\t\tsave: save === true || typeof save === \"object\",\n\t\t\tsaveIncludeText: typeof save === \"object\" && save.includeText === true,\n\t\t};\n\t}\n\n\tget connectionEndpoint(): LspConnectionEndpoint | undefined {\n\t\treturn this.endpoint;\n\t}\n\n\tget lastTransportError(): Error | undefined {\n\t\treturn this.transportError;\n\t}\n\n\tget lastRequestError(): Error | undefined {\n\t\treturn this.requestError;\n\t}\n\n\tget stderrOutput(): string {\n\t\treturn this.stderr;\n\t}\n\n\tget connectionState(): LspConnectionState {\n\t\treturn this.state;\n\t}\n\n\tget ownership(): LspClientOwnership {\n\t\treturn this.options.ownership ?? \"managed\";\n\t}\n\n\tprivate get workspaceFolder(): WorkspaceFolder {\n\t\treturn { uri: this.rootUri, name: pathApi(pathFlavor(this.rootDir)).basename(this.rootDir) || this.rootDir };\n\t}\n\n\tgetDiagnostics(uri: string): Diagnostic[] {\n\t\treturn this.diagnostics.get(uri) ?? [];\n\t}\n\n\tgetAllDiagnostics(): Map<string, Diagnostic[]> {\n\t\treturn new Map(this.diagnostics);\n\t}\n\n\tstart(): Promise<LspClientStartResult> {\n\t\tif (this.startPromise) return this.startPromise;\n\t\tthis.startPromise = (async () => {\n\t\t\ttry {\n\t\t\t\treturn await this.startInternal();\n\t\t\t} finally {\n\t\t\t\tthis.startPromise = undefined;\n\t\t\t}\n\t\t})();\n\t\treturn this.startPromise;\n\t}\n\n\tprivate async connectForStartup(controller: AbortController): Promise<LspConnectionHandle> {\n\t\tlet resolvedHandle: LspConnectionHandle | undefined;\n\t\tlet discardHandle = false;\n\t\tconst handlePromise = Promise.resolve().then(() =>\n\t\t\tthis.options.connectionFactory({\n\t\t\t\tserverId: this.serverId,\n\t\t\t\tworkspaceRoot: this.rootDir,\n\t\t\t\tworkspaceUri: this.rootUri,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tconnectTimeoutMs: this.options.connectTimeoutMs,\n\t\t\t\tonStderr: (text) => {\n\t\t\t\t\tthis.stderr = `${this.stderr}${text}`.slice(-16_384);\n\t\t\t\t\tthis.options.onStderr?.(text);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvoid handlePromise.then(\n\t\t\t(handle) => {\n\t\t\t\tresolvedHandle = handle;\n\t\t\t\tif (discardHandle) void this.closeConnectionHandle(handle);\n\t\t\t},\n\t\t\t() => undefined,\n\t\t);\n\t\ttry {\n\t\t\treturn await waitForOperation(\n\t\t\t\thandlePromise,\n\t\t\t\tcreateDeadline(this.options.connectTimeoutMs),\n\t\t\t\t`Connecting to LSP server ${this.serverId}`,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => controller.abort(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tdiscardHandle = true;\n\t\t\tcontroller.abort();\n\t\t\tif (resolvedHandle) void this.closeConnectionHandle(resolvedHandle);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate attachConnectionHandle(handle: LspConnectionHandle): void {\n\t\tthis.connectionHandle = handle;\n\t\tthis.state = \"initializing\";\n\t\tthis.endpoint = handle.endpoint;\n\t\thandle.onError((error) => {\n\t\t\tif (this.connectionHandle === handle) this.recordTransportError(error);\n\t\t});\n\t\thandle.onClose(() => {\n\t\t\tif (this.connectionHandle !== handle) return;\n\t\t\tthis.initialized = false;\n\t\t\tvoid this.closeHandle();\n\t\t\tif (!this.closing) this.state = this.disposed ? \"disposed\" : \"closed\";\n\t\t\tthis.disposeConnection();\n\t\t\tif (!this.disposed && !this.closing) this.options.onUnexpectedClose?.(this.transportError);\n\t\t});\n\t\tthis.connection = createMessageConnection(handle.reader, handle.writer);\n\t\tthis.registerConnectionHandlers();\n\t\tthis.connection.listen();\n\t}\n\n\tprivate createInitializeParams(): InitializeParams {\n\t\treturn {\n\t\t\tprocessId: this.ownership === \"attached\" ? null : process.pid,\n\t\t\trootUri: this.rootUri,\n\t\t\tworkspaceFolders: [this.workspaceFolder],\n\t\t\tcapabilities: {\n\t\t\t\ttextDocument: {\n\t\t\t\t\tsynchronization: { didSave: true, dynamicRegistration: false },\n\t\t\t\t\thover: { contentFormat: [\"plaintext\", \"markdown\"] },\n\t\t\t\t\tdefinition: {},\n\t\t\t\t\treferences: {},\n\t\t\t\t\trename: { prepareSupport: false },\n\t\t\t\t\tpublishDiagnostics: { relatedInformation: true },\n\t\t\t\t\tcodeAction: {\n\t\t\t\t\t\tdynamicRegistration: false,\n\t\t\t\t\t\tcodeActionLiteralSupport: {\n\t\t\t\t\t\t\tcodeActionKind: {\n\t\t\t\t\t\t\t\tvalueSet: [\n\t\t\t\t\t\t\t\t\tCodeActionKind.Empty,\n\t\t\t\t\t\t\t\t\tCodeActionKind.QuickFix,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Refactor,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorExtract,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorInline,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorRewrite,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Source,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceOrganizeImports,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceFixAll,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisPreferredSupport: true,\n\t\t\t\t\t\tdataSupport: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tworkspace: {\n\t\t\t\t\tconfiguration: true,\n\t\t\t\t\tworkspaceFolders: true,\n\t\t\t\t\tworkspaceEdit: {\n\t\t\t\t\t\tdocumentChanges: true,\n\t\t\t\t\t\tresourceOperations: [\n\t\t\t\t\t\t\tResourceOperationKind.Create,\n\t\t\t\t\t\t\tResourceOperationKind.Rename,\n\t\t\t\t\t\t\tResourceOperationKind.Delete,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tclientInfo: this.options.clientInfo ?? { name: \"@greppleai/grip\" },\n\t\t\t...(this.options.initializationOptions === undefined\n\t\t\t\t? {}\n\t\t\t\t: { initializationOptions: this.options.initializationOptions }),\n\t\t\t...(this.options.locale === undefined ? {} : { locale: this.options.locale }),\n\t\t\t...(this.options.trace === undefined ? {} : { trace: this.options.trace }),\n\t\t};\n\t}\n\n\tprivate async initializeConnection(\n\t\tgeneration: number,\n\t\tcontroller: AbortController,\n\t\thandle: LspConnectionHandle,\n\t): Promise<InitializeResult> {\n\t\tif (!this.connection) throw new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\tconst deadline = createDeadline(this.options.initializeTimeoutMs);\n\t\tconst description = `Initializing LSP server ${this.serverId}`;\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet result: InitializeResult;\n\t\ttry {\n\t\t\tresult = await waitForOperation(\n\t\t\t\tthis.connection.sendRequest<InitializeResult>(\n\t\t\t\t\t\"initialize\",\n\t\t\t\t\tthis.createInitializeParams(),\n\t\t\t\t\tcancellation.token,\n\t\t\t\t),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => cancellation.cancel(),\n\t\t\t\t\tonAbort: () => cancellation.cancel(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tawait waitForOperation(this.connection.sendNotification(\"initialized\", {}), deadline, description, {\n\t\t\tsignal: controller.signal,\n\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t});\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tif (this.options.settings !== undefined) {\n\t\t\tawait waitForOperation(\n\t\t\t\tthis.connection.sendNotification(\"workspace/didChangeConfiguration\", { settings: this.options.settings }),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{ signal: controller.signal, abortMessage: `LSP client startup for ${this.serverId} was aborted` },\n\t\t\t);\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\treturn result;\n\t}\n\n\tprivate async recordStartupFailure(error: unknown): Promise<Error> {\n\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\tif (!this.disposed) {\n\t\t\tthis.state = \"failed\";\n\t\t\tthis.recordTransportError(failure);\n\t\t}\n\t\tthis.closing = true;\n\t\tthis.disposeConnection();\n\t\ttry {\n\t\t\tawait this.closeHandle(\n\t\t\t\tcreateDeadline(this.options.shutdownTimeoutMs ?? 3000),\n\t\t\t\t`Closing connection to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t} catch (closeError) {\n\t\t\tthis.recordTransportError(closeError instanceof Error ? closeError : new Error(String(closeError)));\n\t\t} finally {\n\t\t\tthis.closing = false;\n\t\t}\n\t\treturn failure;\n\t}\n\n\tprivate async startInternal(): Promise<LspClientStartResult> {\n\t\tif (this.disposed) throw new Error(`LSP client for ${this.serverId} is disposed`);\n\t\tif (this.initialized && this.capabilities && this.endpoint) {\n\t\t\treturn { capabilities: this.capabilities, endpoint: this.endpoint };\n\t\t}\n\t\tconst generation = ++this.lifecycleGeneration;\n\t\tthis.state = \"connecting\";\n\t\tconst controller = new AbortController();\n\t\tthis.startController = controller;\n\t\tthis.transportError = undefined;\n\t\ttry {\n\t\t\tconst handle = await this.connectForStartup(controller);\n\t\t\tthis.assertStartupCurrent(generation, controller);\n\t\t\tthis.attachConnectionHandle(handle);\n\t\t\tconst result = await this.initializeConnection(generation, controller, handle);\n\t\t\tthis.capabilities = result.capabilities;\n\t\t\tthis.initialized = true;\n\t\t\tthis.state = \"running\";\n\t\t\treturn { capabilities: result.capabilities, endpoint: handle.endpoint };\n\t\t} catch (error) {\n\t\t\tthrow await this.recordStartupFailure(error);\n\t\t} finally {\n\t\t\tif (this.startController === controller) this.startController = undefined;\n\t\t}\n\t}\n\n\tprivate assertStartupCurrent(generation: number, controller: AbortController, handle?: LspConnectionHandle): void {\n\t\tif (this.disposed || controller.signal.aborted || this.lifecycleGeneration !== generation) {\n\t\t\tthrow new Error(`LSP client startup for ${this.serverId} was aborted`);\n\t\t}\n\t\tif (handle !== undefined && (this.connectionHandle !== handle || !this.connection)) {\n\t\t\tthrow new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\t}\n\t}\n\n\tasync sendRequest<TResult>(method: string, params: unknown, signal?: AbortSignal): Promise<TResult> {\n\t\tif (!this.connection || !this.initialized) throw new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\tif (signal?.aborted) throw new Error(`LSP request ${method} was aborted`);\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet rejectAbort: ((error: Error) => void) | undefined;\n\t\tconst abortPromise = new Promise<never>((_resolve, reject) => {\n\t\t\trejectAbort = reject;\n\t\t});\n\t\tconst onAbort = (): void => {\n\t\t\tcancellation.cancel();\n\t\t\trejectAbort?.(new Error(`LSP request ${method} was aborted`));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal?.aborted) onAbort();\n\t\ttry {\n\t\t\treturn await withTimeout(\n\t\t\t\tPromise.race([this.connection.sendRequest<TResult>(method, params, cancellation.token), abortPromise]),\n\t\t\t\tthis.options.requestTimeoutMs,\n\t\t\t\t`LSP request ${method} to ${this.serverId}`,\n\t\t\t\t() => cancellation.cancel(),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.requestError = failure;\n\t\t\tthis.options.onRequestError?.(failure);\n\t\t\tthrow failure;\n\t\t} finally {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tasync sendNotification(method: string, params: unknown, signal?: AbortSignal): Promise<void> {\n\t\tif (!this.connection || !this.initialized) {\n\t\t\tthrow new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\t}\n\t\ttry {\n\t\t\tawait waitForAbort(this.connection.sendNotification(method, params), signal);\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) throw error;\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.recordTransportError(failure);\n\t\t\tthrow failure;\n\t\t}\n\t}\n\n\tasync didOpen(uri: string, languageId: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didOpen\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, languageId, version, text },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChange(uri: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChangeIncremental(\n\t\turi: string,\n\t\tversion: number,\n\t\trange: Range,\n\t\ttext: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ range, text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didSave(uri: string, text?: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didSave\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\t...(text === undefined ? {} : { text }),\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didClose(uri: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\"textDocument/didClose\", { textDocument: { uri } }, signal);\n\t}\n\n\tinvalidate(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tthis.disposeConnection();\n\t\tconst configuredTimeout = this.options.shutdownTimeoutMs;\n\t\tconst timeoutMs =\n\t\t\tconfiguredTimeout !== undefined && configuredTimeout > 0\n\t\t\t\t? Math.min(configuredTimeout, MAX_INVALIDATION_CLOSE_MS)\n\t\t\t\t: MAX_INVALIDATION_CLOSE_MS;\n\t\tconst invalidation = this.closeHandle(\n\t\t\tcreateDeadline(timeoutMs),\n\t\t\t`Invalidating connection to LSP server ${this.serverId}`,\n\t\t)\n\t\t\t.catch((error) => {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.closing = false;\n\t\t\t});\n\t\tthis.shutdownPromise = invalidation;\n\t\treturn invalidation;\n\t}\n\n\tshutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tif (this.disposed) return Promise.resolve();\n\t\tconst shutdown = this.shutdownInternal();\n\t\tthis.shutdownPromise = shutdown;\n\t\treturn shutdown;\n\t}\n\n\tprivate async requestServerShutdown(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\tconst cancellation = new CancellationTokenSource();\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendRequest(\"shutdown\", undefined, cancellation.token),\n\t\t\t\tdeadline,\n\t\t\t\t`Shutting down LSP server ${this.serverId}`,\n\t\t\t\t{ onTimeout: () => cancellation.cancel() },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tprivate async notifyServerExit(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendNotification(\"exit\"),\n\t\t\t\tdeadline,\n\t\t\t\t`Sending exit to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t}\n\n\tprivate async shutdownInternal(): Promise<void> {\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tconst deadline = createDeadline(this.options.shutdownTimeoutMs ?? 3000);\n\t\ttry {\n\t\t\tconst connection = this.connection;\n\t\t\tif (connection && this.options.shutdownMode !== \"disconnect\") {\n\t\t\t\tawait this.requestServerShutdown(connection, deadline);\n\t\t\t\tawait this.notifyServerExit(connection, deadline);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.disposeConnection();\n\t\t\ttry {\n\t\t\t\tawait this.closeHandle(deadline, `Closing connection to LSP server ${this.serverId}`);\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t\tthis.closing = false;\n\t\t}\n\t}\n\n\tprivate registerConnectionHandlers(): void {\n\t\tthis.connection?.onNotification(\"textDocument/publishDiagnostics\", (params: PublishDiagnosticsParams) => {\n\t\t\tthis.diagnostics.set(params.uri, params.diagnostics);\n\t\t});\n\t\tthis.connection?.onRequest(\"workspace/configuration\", (params: ConfigurationParams) =>\n\t\t\tparams.items.map((item) => settingsForSection(this.options.settings, item.section)),\n\t\t);\n\t\tthis.connection?.onRequest(\"workspace/workspaceFolders\", () => [this.workspaceFolder]);\n\t\tthis.connection?.onError((data) => {\n\t\t\tconst candidate = data[0];\n\t\t\tthis.recordTransportError(candidate instanceof Error ? candidate : new Error(String(candidate)));\n\t\t});\n\t\tthis.connection?.onClose(() => {\n\t\t\tthis.initialized = false;\n\t\t\tif (!this.disposed && !this.closing) this.state = \"closed\";\n\t\t});\n\t}\n\n\tprivate recordTransportError(error: Error): void {\n\t\tthis.transportError = error;\n\t\tthis.options.onTransportError?.(error);\n\t}\n\n\tprivate closeConnectionHandle(handle: LspConnectionHandle): Promise<void> {\n\t\tconst existing = this.handleClosePromises.get(handle);\n\t\tif (existing) return existing;\n\t\tconst close = (async () => {\n\t\t\ttry {\n\t\t\t\tawait handle.close();\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t})();\n\t\tthis.handleClosePromises.set(handle, close);\n\t\treturn close;\n\t}\n\n\tprivate closeHandle(deadline?: OperationDeadline, description?: string): Promise<void> {\n\t\tconst handle = this.connectionHandle;\n\t\tthis.connectionHandle = undefined;\n\t\tif (!handle) return Promise.resolve();\n\t\tconst close = this.closeConnectionHandle(handle);\n\t\treturn deadline && description ? waitForOperation(close, deadline, description) : close;\n\t}\n\n\tprivate disposeConnection(): void {\n\t\ttry {\n\t\t\tthis.connection?.dispose();\n\t\t} catch {\n\t\t\t// Already disposed.\n\t\t}\n\t\tthis.connection = undefined;\n\t}\n}\n\nexport function getTextFromToolContent(content: ToolContent): string | undefined {\n\treturn content.type === \"text\" ? content.text : undefined;\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@greppleai/grip-ai\";\nimport type {\n\tConfigurationParams,\n\tDiagnostic,\n\tInitializeParams,\n\tInitializeResult,\n\tPublishDiagnosticsParams,\n\tRange,\n\tServerCapabilities,\n\tWorkspaceFolder,\n} from \"vscode-languageserver-protocol\";\nimport { CodeActionKind, ResourceOperationKind, TextDocumentSyncKind } from \"vscode-languageserver-protocol\";\nimport {\n\tCancellationTokenSource,\n\tcreateMessageConnection,\n\ttype MessageConnection,\n} from \"vscode-languageserver-protocol/node.js\";\nimport { waitForAbort } from \"./abort.ts\";\nimport type { LspClientInfo, LspJsonValue, LspTraceValue } from \"./config.ts\";\nimport { pathApi, pathFlavor, portablePathToFileUri } from \"./portable-path.ts\";\nimport type { LspConnectionEndpoint, LspConnectionFactory, LspConnectionHandle } from \"./transport.ts\";\n\nexport type LspShutdownMode = \"protocol\" | \"disconnect\";\nexport type LspClientOwnership = \"managed\" | \"attached\";\n\nexport interface LspClientOptions {\n\tserverId: string;\n\trootDir: string;\n\t/** Server-visible workspace URI; defaults to the local rootDir file URI. */\n\trootUri?: string;\n\tlanguageId: string;\n\tconnectionFactory: LspConnectionFactory;\n\tconnectTimeoutMs?: number;\n\tinitializeTimeoutMs?: number;\n\trequestTimeoutMs?: number;\n\tshutdownTimeoutMs?: number;\n\tshutdownMode?: LspShutdownMode;\n\townership?: LspClientOwnership;\n\tinitializationOptions?: LspJsonValue;\n\tsettings?: LspJsonValue;\n\tclientInfo?: LspClientInfo;\n\tlocale?: string;\n\ttrace?: LspTraceValue;\n\tonUnexpectedClose?: (error?: Error) => void;\n\tonTransportError?: (error: Error) => void;\n\tonRequestError?: (error: Error) => void;\n\tonStderr?: (text: string) => void;\n}\n\nexport type LspConnectionState = \"idle\" | \"connecting\" | \"initializing\" | \"running\" | \"closed\" | \"failed\" | \"disposed\";\nexport interface LspDocumentSyncCapabilities {\n\topenClose: boolean;\n\tchange: TextDocumentSyncKind;\n\tsave: boolean;\n\tsaveIncludeText: boolean;\n}\n\nexport interface LspClientStartResult {\n\tcapabilities: ServerCapabilities;\n\tendpoint: LspConnectionEndpoint;\n}\n\ntype ToolContent = TextContent | ImageContent;\n\ninterface OperationDeadline {\n\ttimeoutMs: number | undefined;\n\texpiresAt: number | undefined;\n}\n\ninterface OperationWaitOptions {\n\tsignal?: AbortSignal;\n\tonTimeout?: () => void;\n\tonAbort?: () => void;\n\tabortMessage?: string;\n}\n\nconst MAX_INVALIDATION_CLOSE_MS = 3000;\n\nfunction createDeadline(timeoutMs: number | undefined): OperationDeadline {\n\treturn {\n\t\ttimeoutMs,\n\t\texpiresAt: timeoutMs !== undefined && timeoutMs > 0 ? Date.now() + timeoutMs : undefined,\n\t};\n}\n\nasync function waitForOperation<T>(\n\tpromise: Promise<T>,\n\tdeadline: OperationDeadline,\n\tdescription: string,\n\toptions: OperationWaitOptions = {},\n): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tconst cleanup = (): void => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", abort);\n\t\t};\n\t\tconst succeed = (value: T): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(value);\n\t\t};\n\t\tconst fail = (error: unknown): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\t\tconst abort = (): void => {\n\t\t\tfail(new Error(options.abortMessage ?? `${description} was aborted`));\n\t\t\toptions.onAbort?.();\n\t\t};\n\t\tpromise.then(succeed, fail);\n\t\toptions.signal?.addEventListener(\"abort\", abort, { once: true });\n\t\tif (options.signal?.aborted) abort();\n\t\tif (!settled && deadline.expiresAt !== undefined) {\n\t\t\tconst remainingMs = deadline.expiresAt - Date.now();\n\t\t\tif (remainingMs <= 0) {\n\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\tfail(timeoutError);\n\t\t\t\toptions.onTimeout?.();\n\t\t\t} else {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tconst timeoutError = new Error(`${description} timed out after ${deadline.timeoutMs}ms`);\n\t\t\t\t\tfail(timeoutError);\n\t\t\t\t\toptions.onTimeout?.();\n\t\t\t\t}, remainingMs);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction withTimeout<T>(\n\tpromise: Promise<T>,\n\ttimeoutMs: number | undefined,\n\tdescription: string,\n\tonTimeout?: () => void,\n): Promise<T> {\n\treturn waitForOperation(promise, createDeadline(timeoutMs), description, { onTimeout });\n}\n\nfunction settingsForSection(settings: LspJsonValue | undefined, section: string | undefined): LspJsonValue {\n\tif (settings === undefined) return null;\n\tif (!section) return settings;\n\tlet current: LspJsonValue = settings;\n\tfor (const segment of section.split(\".\")) {\n\t\tif (\n\t\t\ttypeof current !== \"object\" ||\n\t\t\tcurrent === null ||\n\t\t\tArray.isArray(current) ||\n\t\t\t!Object.hasOwn(current, segment)\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = current[segment];\n\t}\n\treturn current;\n}\n\nexport class LspClient {\n\treadonly serverId: string;\n\treadonly languageId: string;\n\treadonly rootDir: string;\n\treadonly rootUri: string;\n\n\tprivate readonly options: LspClientOptions;\n\tprivate connectionHandle: LspConnectionHandle | undefined;\n\tprivate connection: MessageConnection | undefined;\n\tprivate capabilities: ServerCapabilities | undefined;\n\tprivate diagnostics = new Map<string, Diagnostic[]>();\n\tprivate initialized = false;\n\tprivate disposed = false;\n\tprivate closing = false;\n\tprivate startController: AbortController | undefined;\n\tprivate startPromise: Promise<LspClientStartResult> | undefined;\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate lifecycleGeneration = 0;\n\tprivate readonly handleClosePromises = new WeakMap<LspConnectionHandle, Promise<void>>();\n\tprivate endpoint: LspConnectionEndpoint | undefined;\n\tprivate transportError: Error | undefined;\n\tprivate requestError: Error | undefined;\n\tprivate stderr = \"\";\n\tprivate state: LspConnectionState = \"idle\";\n\n\tconstructor(options: LspClientOptions) {\n\t\tthis.options = options;\n\t\tthis.serverId = options.serverId;\n\t\tthis.languageId = options.languageId;\n\t\tthis.rootDir = options.rootDir;\n\t\tthis.rootUri = options.rootUri ?? portablePathToFileUri(options.rootDir);\n\t}\n\n\tget isInitialized(): boolean {\n\t\treturn this.initialized;\n\t}\n\n\tget isDisposed(): boolean {\n\t\treturn this.disposed;\n\t}\n\n\tget serverCapabilities(): ServerCapabilities | undefined {\n\t\treturn this.capabilities;\n\t}\n\n\tget documentSyncCapabilities(): LspDocumentSyncCapabilities {\n\t\tconst synchronization = this.serverCapabilities?.textDocumentSync;\n\t\tif (typeof synchronization === \"number\") {\n\t\t\treturn {\n\t\t\t\topenClose: synchronization !== TextDocumentSyncKind.None,\n\t\t\t\tchange: synchronization,\n\t\t\t\tsave: false,\n\t\t\t\tsaveIncludeText: false,\n\t\t\t};\n\t\t}\n\t\tif (!synchronization) {\n\t\t\treturn { openClose: false, change: TextDocumentSyncKind.None, save: false, saveIncludeText: false };\n\t\t}\n\t\tconst save = synchronization.save;\n\t\treturn {\n\t\t\topenClose: synchronization.openClose === true,\n\t\t\tchange: synchronization.change ?? TextDocumentSyncKind.None,\n\t\t\tsave: save === true || typeof save === \"object\",\n\t\t\tsaveIncludeText: typeof save === \"object\" && save.includeText === true,\n\t\t};\n\t}\n\n\tget connectionEndpoint(): LspConnectionEndpoint | undefined {\n\t\treturn this.endpoint;\n\t}\n\n\tget lastTransportError(): Error | undefined {\n\t\treturn this.transportError;\n\t}\n\n\tget lastRequestError(): Error | undefined {\n\t\treturn this.requestError;\n\t}\n\n\tget stderrOutput(): string {\n\t\treturn this.stderr;\n\t}\n\n\tget connectionState(): LspConnectionState {\n\t\treturn this.state;\n\t}\n\n\tget ownership(): LspClientOwnership {\n\t\treturn this.options.ownership ?? \"managed\";\n\t}\n\n\tprivate get workspaceFolder(): WorkspaceFolder {\n\t\treturn { uri: this.rootUri, name: pathApi(pathFlavor(this.rootDir)).basename(this.rootDir) || this.rootDir };\n\t}\n\n\tgetDiagnostics(uri: string): Diagnostic[] {\n\t\treturn this.diagnostics.get(uri) ?? [];\n\t}\n\n\tgetAllDiagnostics(): Map<string, Diagnostic[]> {\n\t\treturn new Map(this.diagnostics);\n\t}\n\n\tstart(): Promise<LspClientStartResult> {\n\t\tif (this.startPromise) return this.startPromise;\n\t\tthis.startPromise = (async () => {\n\t\t\ttry {\n\t\t\t\treturn await this.startInternal();\n\t\t\t} finally {\n\t\t\t\tthis.startPromise = undefined;\n\t\t\t}\n\t\t})();\n\t\treturn this.startPromise;\n\t}\n\n\tprivate async connectForStartup(controller: AbortController): Promise<LspConnectionHandle> {\n\t\tlet resolvedHandle: LspConnectionHandle | undefined;\n\t\tlet discardHandle = false;\n\t\tconst handlePromise = Promise.resolve().then(() =>\n\t\t\tthis.options.connectionFactory({\n\t\t\t\tserverId: this.serverId,\n\t\t\t\tworkspaceRoot: this.rootDir,\n\t\t\t\tworkspaceUri: this.rootUri,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tconnectTimeoutMs: this.options.connectTimeoutMs,\n\t\t\t\tonStderr: (text) => {\n\t\t\t\t\tthis.stderr = `${this.stderr}${text}`.slice(-16_384);\n\t\t\t\t\tthis.options.onStderr?.(text);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvoid handlePromise.then(\n\t\t\t(handle) => {\n\t\t\t\tresolvedHandle = handle;\n\t\t\t\tif (discardHandle) void this.closeConnectionHandle(handle);\n\t\t\t},\n\t\t\t() => undefined,\n\t\t);\n\t\ttry {\n\t\t\treturn await waitForOperation(\n\t\t\t\thandlePromise,\n\t\t\t\tcreateDeadline(this.options.connectTimeoutMs),\n\t\t\t\t`Connecting to LSP server ${this.serverId}`,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => controller.abort(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tdiscardHandle = true;\n\t\t\tcontroller.abort();\n\t\t\tif (resolvedHandle) void this.closeConnectionHandle(resolvedHandle);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate attachConnectionHandle(handle: LspConnectionHandle): void {\n\t\tthis.connectionHandle = handle;\n\t\tthis.state = \"initializing\";\n\t\tthis.endpoint = handle.endpoint;\n\t\thandle.onError((error) => {\n\t\t\tif (this.connectionHandle === handle) this.recordTransportError(error);\n\t\t});\n\t\thandle.onClose(() => {\n\t\t\tif (this.connectionHandle !== handle) return;\n\t\t\tthis.initialized = false;\n\t\t\tvoid this.closeHandle();\n\t\t\tif (!this.closing) this.state = this.disposed ? \"disposed\" : \"closed\";\n\t\t\tthis.disposeConnection();\n\t\t\tif (!this.disposed && !this.closing) this.options.onUnexpectedClose?.(this.transportError);\n\t\t});\n\t\tthis.connection = createMessageConnection(handle.reader, handle.writer);\n\t\tthis.registerConnectionHandlers();\n\t\tthis.connection.listen();\n\t}\n\n\tprivate createInitializeParams(): InitializeParams {\n\t\treturn {\n\t\t\tprocessId: this.ownership === \"attached\" ? null : process.pid,\n\t\t\trootUri: this.rootUri,\n\t\t\tworkspaceFolders: [this.workspaceFolder],\n\t\t\tcapabilities: {\n\t\t\t\ttextDocument: {\n\t\t\t\t\tsynchronization: { didSave: true, dynamicRegistration: false },\n\t\t\t\t\thover: { contentFormat: [\"plaintext\", \"markdown\"] },\n\t\t\t\t\tdefinition: {},\n\t\t\t\t\treferences: {},\n\t\t\t\t\trename: { prepareSupport: false },\n\t\t\t\t\tpublishDiagnostics: { relatedInformation: true },\n\t\t\t\t\tcodeAction: {\n\t\t\t\t\t\tdynamicRegistration: false,\n\t\t\t\t\t\tcodeActionLiteralSupport: {\n\t\t\t\t\t\t\tcodeActionKind: {\n\t\t\t\t\t\t\t\tvalueSet: [\n\t\t\t\t\t\t\t\t\tCodeActionKind.Empty,\n\t\t\t\t\t\t\t\t\tCodeActionKind.QuickFix,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Refactor,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorExtract,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorInline,\n\t\t\t\t\t\t\t\t\tCodeActionKind.RefactorRewrite,\n\t\t\t\t\t\t\t\t\tCodeActionKind.Source,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceOrganizeImports,\n\t\t\t\t\t\t\t\t\tCodeActionKind.SourceFixAll,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tisPreferredSupport: true,\n\t\t\t\t\t\tdataSupport: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tworkspace: {\n\t\t\t\t\tconfiguration: true,\n\t\t\t\t\tworkspaceFolders: true,\n\t\t\t\t\tworkspaceEdit: {\n\t\t\t\t\t\tdocumentChanges: true,\n\t\t\t\t\t\tresourceOperations: [\n\t\t\t\t\t\t\tResourceOperationKind.Create,\n\t\t\t\t\t\t\tResourceOperationKind.Rename,\n\t\t\t\t\t\t\tResourceOperationKind.Delete,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tclientInfo: this.options.clientInfo ?? { name: \"@greppleai/grip\" },\n\t\t\t...(this.options.initializationOptions === undefined\n\t\t\t\t? {}\n\t\t\t\t: { initializationOptions: this.options.initializationOptions }),\n\t\t\t...(this.options.locale === undefined ? {} : { locale: this.options.locale }),\n\t\t\t...(this.options.trace === undefined ? {} : { trace: this.options.trace }),\n\t\t};\n\t}\n\n\tprivate async initializeConnection(\n\t\tgeneration: number,\n\t\tcontroller: AbortController,\n\t\thandle: LspConnectionHandle,\n\t): Promise<InitializeResult> {\n\t\tif (!this.connection) throw new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\tconst deadline = createDeadline(this.options.initializeTimeoutMs);\n\t\tconst description = `Initializing LSP server ${this.serverId}`;\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet result: InitializeResult;\n\t\ttry {\n\t\t\tresult = await waitForOperation(\n\t\t\t\tthis.connection.sendRequest<InitializeResult>(\n\t\t\t\t\t\"initialize\",\n\t\t\t\t\tthis.createInitializeParams(),\n\t\t\t\t\tcancellation.token,\n\t\t\t\t),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tonTimeout: () => cancellation.cancel(),\n\t\t\t\t\tonAbort: () => cancellation.cancel(),\n\t\t\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tawait waitForOperation(this.connection.sendNotification(\"initialized\", {}), deadline, description, {\n\t\t\tsignal: controller.signal,\n\t\t\tabortMessage: `LSP client startup for ${this.serverId} was aborted`,\n\t\t});\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\tif (this.options.settings !== undefined) {\n\t\t\tawait waitForOperation(\n\t\t\t\tthis.connection.sendNotification(\"workspace/didChangeConfiguration\", { settings: this.options.settings }),\n\t\t\t\tdeadline,\n\t\t\t\tdescription,\n\t\t\t\t{ signal: controller.signal, abortMessage: `LSP client startup for ${this.serverId} was aborted` },\n\t\t\t);\n\t\t}\n\t\tthis.assertStartupCurrent(generation, controller, handle);\n\t\treturn result;\n\t}\n\n\tprivate async recordStartupFailure(error: unknown): Promise<Error> {\n\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\tif (!this.disposed) {\n\t\t\tthis.state = \"failed\";\n\t\t\tthis.recordTransportError(failure);\n\t\t}\n\t\tthis.closing = true;\n\t\tthis.disposeConnection();\n\t\ttry {\n\t\t\tawait this.closeHandle(\n\t\t\t\tcreateDeadline(this.options.shutdownTimeoutMs ?? 3000),\n\t\t\t\t`Closing connection to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t} catch (closeError) {\n\t\t\tthis.recordTransportError(closeError instanceof Error ? closeError : new Error(String(closeError)));\n\t\t} finally {\n\t\t\tthis.closing = false;\n\t\t}\n\t\treturn failure;\n\t}\n\n\tprivate async startInternal(): Promise<LspClientStartResult> {\n\t\tif (this.disposed) throw new Error(`LSP client for ${this.serverId} is disposed`);\n\t\tif (this.initialized && this.capabilities && this.endpoint) {\n\t\t\treturn { capabilities: this.capabilities, endpoint: this.endpoint };\n\t\t}\n\t\tconst generation = ++this.lifecycleGeneration;\n\t\tthis.state = \"connecting\";\n\t\tconst controller = new AbortController();\n\t\tthis.startController = controller;\n\t\tthis.transportError = undefined;\n\t\ttry {\n\t\t\tconst handle = await this.connectForStartup(controller);\n\t\t\tthis.assertStartupCurrent(generation, controller);\n\t\t\tthis.attachConnectionHandle(handle);\n\t\t\tconst result = await this.initializeConnection(generation, controller, handle);\n\t\t\tthis.capabilities = result.capabilities;\n\t\t\tthis.initialized = true;\n\t\t\tthis.state = \"running\";\n\t\t\treturn { capabilities: result.capabilities, endpoint: handle.endpoint };\n\t\t} catch (error) {\n\t\t\tthrow await this.recordStartupFailure(error);\n\t\t} finally {\n\t\t\tif (this.startController === controller) this.startController = undefined;\n\t\t}\n\t}\n\n\tprivate assertStartupCurrent(generation: number, controller: AbortController, handle?: LspConnectionHandle): void {\n\t\tif (this.disposed || controller.signal.aborted || this.lifecycleGeneration !== generation) {\n\t\t\tthrow new Error(`LSP client startup for ${this.serverId} was aborted`);\n\t\t}\n\t\tif (handle !== undefined && (this.connectionHandle !== handle || !this.connection)) {\n\t\t\tthrow new Error(`Connection to LSP server ${this.serverId} closed during initialization`);\n\t\t}\n\t}\n\n\tasync sendRequest<TResult>(method: string, params: unknown, signal?: AbortSignal): Promise<TResult> {\n\t\tif (!this.connection || !this.initialized) throw new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\tif (signal?.aborted) throw new Error(`LSP request ${method} was aborted`);\n\t\tconst cancellation = new CancellationTokenSource();\n\t\tlet rejectAbort: ((error: Error) => void) | undefined;\n\t\tconst abortPromise = new Promise<never>((_resolve, reject) => {\n\t\t\trejectAbort = reject;\n\t\t});\n\t\tconst onAbort = (): void => {\n\t\t\tcancellation.cancel();\n\t\t\trejectAbort?.(new Error(`LSP request ${method} was aborted`));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal?.aborted) onAbort();\n\t\ttry {\n\t\t\treturn await withTimeout(\n\t\t\t\tPromise.race([this.connection.sendRequest<TResult>(method, params, cancellation.token), abortPromise]),\n\t\t\t\tthis.options.requestTimeoutMs,\n\t\t\t\t`LSP request ${method} to ${this.serverId}`,\n\t\t\t\t() => cancellation.cancel(),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.requestError = failure;\n\t\t\tthis.options.onRequestError?.(failure);\n\t\t\tthrow failure;\n\t\t} finally {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tasync sendNotification(method: string, params: unknown, signal?: AbortSignal): Promise<void> {\n\t\tif (!this.connection || !this.initialized) {\n\t\t\tthrow new Error(`LSP client for ${this.serverId} is not initialized`);\n\t\t}\n\t\ttry {\n\t\t\tawait waitForAbort(this.connection.sendNotification(method, params), signal);\n\t\t} catch (error) {\n\t\t\tif (signal?.aborted) throw error;\n\t\t\tconst failure = error instanceof Error ? error : new Error(String(error));\n\t\t\tthis.recordTransportError(failure);\n\t\t\tthrow failure;\n\t\t}\n\t}\n\n\tasync didOpen(uri: string, languageId: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didOpen\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, languageId, version, text },\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChange(uri: string, version: number, text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didChangeIncremental(\n\t\turi: string,\n\t\tversion: number,\n\t\trange: Range,\n\t\ttext: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didChange\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri, version },\n\t\t\t\tcontentChanges: [{ range, text }],\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didSave(uri: string, text?: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\n\t\t\t\"textDocument/didSave\",\n\t\t\t{\n\t\t\t\ttextDocument: { uri },\n\t\t\t\t...(text === undefined ? {} : { text }),\n\t\t\t},\n\t\t\tsignal,\n\t\t);\n\t}\n\n\tasync didClose(uri: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.sendNotification(\"textDocument/didClose\", { textDocument: { uri } }, signal);\n\t}\n\n\tinvalidate(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tthis.disposeConnection();\n\t\tconst configuredTimeout = this.options.shutdownTimeoutMs;\n\t\tconst timeoutMs =\n\t\t\tconfiguredTimeout !== undefined && configuredTimeout > 0\n\t\t\t\t? Math.min(configuredTimeout, MAX_INVALIDATION_CLOSE_MS)\n\t\t\t\t: MAX_INVALIDATION_CLOSE_MS;\n\t\tconst invalidation = this.closeHandle(\n\t\t\tcreateDeadline(timeoutMs),\n\t\t\t`Invalidating connection to LSP server ${this.serverId}`,\n\t\t)\n\t\t\t.catch((error) => {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.closing = false;\n\t\t\t});\n\t\tthis.shutdownPromise = invalidation;\n\t\treturn invalidation;\n\t}\n\n\tshutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tif (this.disposed) return Promise.resolve();\n\t\tconst shutdown = this.shutdownInternal();\n\t\tthis.shutdownPromise = shutdown;\n\t\treturn shutdown;\n\t}\n\n\tprivate async requestServerShutdown(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\tconst cancellation = new CancellationTokenSource();\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendRequest(\"shutdown\", undefined, cancellation.token),\n\t\t\t\tdeadline,\n\t\t\t\t`Shutting down LSP server ${this.serverId}`,\n\t\t\t\t{ onTimeout: () => cancellation.cancel() },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t} finally {\n\t\t\tcancellation.dispose();\n\t\t}\n\t}\n\n\tprivate async notifyServerExit(connection: MessageConnection, deadline: OperationDeadline): Promise<void> {\n\t\ttry {\n\t\t\tawait waitForOperation(\n\t\t\t\tconnection.sendNotification(\"exit\"),\n\t\t\t\tdeadline,\n\t\t\t\t`Sending exit to LSP server ${this.serverId}`,\n\t\t\t);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t} catch (error) {\n\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t}\n\n\tprivate async shutdownInternal(): Promise<void> {\n\t\tthis.disposed = true;\n\t\tthis.lifecycleGeneration++;\n\t\tthis.state = \"disposed\";\n\t\tthis.closing = true;\n\t\tthis.initialized = false;\n\t\tthis.startController?.abort();\n\t\tconst deadline = createDeadline(this.options.shutdownTimeoutMs ?? 3000);\n\t\ttry {\n\t\t\tconst connection = this.connection;\n\t\t\tif (connection && this.options.shutdownMode !== \"disconnect\") {\n\t\t\t\tawait this.requestServerShutdown(connection, deadline);\n\t\t\t\tawait this.notifyServerExit(connection, deadline);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.disposeConnection();\n\t\t\ttry {\n\t\t\t\tawait this.closeHandle(deadline, `Closing connection to LSP server ${this.serverId}`);\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t\tthis.closing = false;\n\t\t}\n\t}\n\n\tprivate registerConnectionHandlers(): void {\n\t\tthis.connection?.onNotification(\"textDocument/publishDiagnostics\", (params: PublishDiagnosticsParams) => {\n\t\t\tthis.diagnostics.set(params.uri, params.diagnostics);\n\t\t});\n\t\tthis.connection?.onRequest(\"workspace/configuration\", (params: ConfigurationParams) =>\n\t\t\tparams.items.map((item) => settingsForSection(this.options.settings, item.section)),\n\t\t);\n\t\tthis.connection?.onRequest(\"workspace/workspaceFolders\", () => [this.workspaceFolder]);\n\t\tthis.connection?.onError((data) => {\n\t\t\tconst candidate = data[0];\n\t\t\tthis.recordTransportError(candidate instanceof Error ? candidate : new Error(String(candidate)));\n\t\t});\n\t\tthis.connection?.onClose(() => {\n\t\t\tthis.initialized = false;\n\t\t\tif (!this.disposed && !this.closing) this.state = \"closed\";\n\t\t});\n\t}\n\n\tprivate recordTransportError(error: Error): void {\n\t\tthis.transportError = error;\n\t\tthis.options.onTransportError?.(error);\n\t}\n\n\tprivate closeConnectionHandle(handle: LspConnectionHandle): Promise<void> {\n\t\tconst existing = this.handleClosePromises.get(handle);\n\t\tif (existing) return existing;\n\t\tconst close = (async () => {\n\t\t\ttry {\n\t\t\t\tawait handle.close();\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordTransportError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t})();\n\t\tthis.handleClosePromises.set(handle, close);\n\t\treturn close;\n\t}\n\n\tprivate closeHandle(deadline?: OperationDeadline, description?: string): Promise<void> {\n\t\tconst handle = this.connectionHandle;\n\t\tthis.connectionHandle = undefined;\n\t\tif (!handle) return Promise.resolve();\n\t\tconst close = this.closeConnectionHandle(handle);\n\t\treturn deadline && description ? waitForOperation(close, deadline, description) : close;\n\t}\n\n\tprivate disposeConnection(): void {\n\t\ttry {\n\t\t\tthis.connection?.dispose();\n\t\t} catch {\n\t\t\t// Already disposed.\n\t\t}\n\t\tthis.connection = undefined;\n\t}\n}\n\nexport function getTextFromToolContent(content: ToolContent): string | undefined {\n\treturn content.type === \"text\" ? content.text : undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACN,KAAK,qBAAqB,EAG1B,KAAK,wBAAwB,EAE7B,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,0BAA0B,GAAG,KAAK,GAAG,MAAM,CAAC;AACxD,MAAM,MAAM,wCAAwC,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E,MAAM,MAAM,qBAAqB,GAC9B;IACA,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,qBAAqB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,CAAC;CAClC,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,gCAAgC;IAChD,QAAQ,EAAE,wCAAwC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC3C,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC1C,2FAA2F;IAC3F,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,aAAa,EAAE,wBAAwB,CAAC;IACxC,WAAW,EAAE,gCAAgC,EAAE,CAAC;CAChD;AA2KD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAgBpH;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,MAAM,GACb,qBAAqB,CAQvB","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\nimport type { SettingsManager } from \"../settings-manager.ts\";\nimport {\n\ttype LspConfigurationLayer,\n\ttype LspConfiguredServer,\n\tparseLspConfiguration,\n\ttype ResolvedLspConfiguration,\n\tresolveLspConfiguration,\n} from \"./config.ts\";\nimport { dirnamePortablePath, joinPortablePath, resolvePortablePath } from \"./portable-path.ts\";\n\nexport type LspConfigurationInputScope = \"cli\" | \"host\";\nexport type LspConfigurationSourceDiagnosticSeverity = \"warning\" | \"error\";\n\nexport type LspConfigurationInput =\n\t| {\n\t\t\ttype: \"configuration\";\n\t\t\tconfiguration: LspConfigurationLayer;\n\t\t\tbaseDir?: string;\n\t\t\tsource?: string;\n\t\t\tscope?: LspConfigurationInputScope;\n\t }\n\t| { type: \"file\"; path: string; scope?: LspConfigurationInputScope }\n\t| { type: \"disabled\"; source?: string; scope?: LspConfigurationInputScope };\n\nexport interface LspConfigurationSourceDiagnostic {\n\tseverity: LspConfigurationSourceDiagnosticSeverity;\n\tsource: string;\n\tpath: string;\n\tmessage: string;\n}\n\nexport interface LoadLspConfigurationOptions {\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\tagentDir: string;\n\tinputs?: readonly LspConfigurationInput[];\n\t/** Host-controlled grant. Project settings cannot grant trust to active LSP transports. */\n\ttrustProjectLspTransports?: boolean;\n}\n\nexport interface LoadLspConfigurationResult {\n\tconfiguration: ResolvedLspConfiguration;\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n}\n\ntype SourceScope = \"global\" | \"project\" | LspConfigurationInputScope;\n\ninterface ConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n\torder: number;\n}\n\nconst SCOPE_PRECEDENCE: Record<SourceScope, number> = {\n\tglobal: 0,\n\tproject: 1,\n\tcli: 2,\n\thost: 3,\n};\n\ninterface PendingConfigurationSource {\n\tscope: SourceScope;\n\tsource: string;\n\tbaseDir: string;\n\tvalue: unknown;\n}\n\ninterface ConfigurationSourceCollection {\n\tsources: ConfigurationSource[];\n\tdiagnostics: LspConfigurationSourceDiagnostic[];\n\tnextOrder: number;\n\tsettingsLoadFailed: boolean;\n}\n\ninterface ConfigurationFileLoadResult {\n\tloaded: boolean;\n\tvalue?: unknown;\n}\n\nfunction appendConfigurationSource(\n\tcollection: ConfigurationSourceCollection,\n\tsource: PendingConfigurationSource,\n): void {\n\tcollection.sources.push({ ...source, order: collection.nextOrder++ });\n}\n\nfunction collectSettingsConfigurationSources(options: LoadLspConfigurationOptions): ConfigurationSourceCollection {\n\tconst collection: ConfigurationSourceCollection = {\n\t\tsources: [],\n\t\tdiagnostics: [],\n\t\tnextOrder: 0,\n\t\tsettingsLoadFailed: false,\n\t};\n\tconst globalSettingsPath = joinPortablePath(options.agentDir, \"settings.json\");\n\tconst projectSettingsPath = joinPortablePath(options.cwd, CONFIG_DIR_NAME, \"settings.json\");\n\tconst globalConfiguration = options.settingsManager.getGlobalLspConfiguration();\n\tconst projectConfiguration = options.settingsManager.getProjectLspConfiguration();\n\tfor (const [scope, source] of [\n\t\t[\"global\", globalSettingsPath],\n\t\t[\"project\", projectSettingsPath],\n\t] as const) {\n\t\tconst error = options.settingsManager.getLoadError(scope);\n\t\tif (!error) continue;\n\t\tcollection.settingsLoadFailed = true;\n\t\tcollection.diagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `settings could not be loaded; LSP is disabled to avoid using stale configuration: ${error.message}`,\n\t\t});\n\t}\n\n\tif (globalConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"global\",\n\t\t\tsource: globalSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(globalSettingsPath),\n\t\t\tvalue: globalConfiguration,\n\t\t});\n\t}\n\tif (projectConfiguration !== undefined) {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope: \"project\",\n\t\t\tsource: projectSettingsPath,\n\t\t\tbaseDir: dirnamePortablePath(projectSettingsPath),\n\t\t\tvalue: projectConfiguration,\n\t\t});\n\t}\n\treturn collection;\n}\n\nasync function loadConfigurationFile(\n\tfilePath: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): Promise<ConfigurationFileLoadResult> {\n\tlet content: string;\n\ttry {\n\t\tcontent = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n\ttry {\n\t\treturn { loaded: true, value: JSON.parse(content) as unknown };\n\t} catch (error) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"error\",\n\t\t\tsource: filePath,\n\t\t\tpath: \"$\",\n\t\t\tmessage: `invalid JSON: ${error instanceof Error ? error.message : String(error)}`,\n\t\t});\n\t\treturn { loaded: false };\n\t}\n}\n\nasync function appendConfigurationInput(\n\tinput: LspConfigurationInput,\n\toptions: LoadLspConfigurationOptions,\n\tcollection: ConfigurationSourceCollection,\n): Promise<void> {\n\tconst scope = input.scope ?? \"host\";\n\tif (input.type === \"disabled\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"--no-lsp\" : \"host LSP override\"),\n\t\t\tbaseDir: options.cwd,\n\t\t\tvalue: { enabled: false },\n\t\t});\n\t\treturn;\n\t}\n\tif (input.type === \"configuration\") {\n\t\tappendConfigurationSource(collection, {\n\t\t\tscope,\n\t\t\tsource: input.source ?? (scope === \"cli\" ? \"CLI LSP configuration\" : \"host LSP configuration\"),\n\t\t\tbaseDir: resolvePortablePath(options.cwd, input.baseDir ?? \".\"),\n\t\t\tvalue: input.configuration,\n\t\t});\n\t\treturn;\n\t}\n\n\tconst filePath = resolvePortablePath(options.cwd, input.path);\n\tconst loaded = await loadConfigurationFile(filePath, collection.diagnostics);\n\tif (!loaded.loaded) return;\n\tappendConfigurationSource(collection, {\n\t\tscope,\n\t\tsource: filePath,\n\t\tbaseDir: dirnamePortablePath(filePath),\n\t\tvalue: loaded.value,\n\t});\n}\n\nfunction resolveConfigurationSource(\n\tsource: ConfigurationSource,\n\ttrustProjectLspTransports: boolean | undefined,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer | undefined {\n\tconst parsed = parseLspConfiguration(source.value);\n\tfor (const diagnostic of parsed.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!parsed.configuration) return undefined;\n\tconst resolvedLayer = resolveLspConfigurationLayerPaths(parsed.configuration, source.baseDir);\n\tconst resolved = parseLspConfiguration(resolvedLayer);\n\tfor (const diagnostic of resolved.diagnostics) diagnostics.push({ ...diagnostic, source: source.source });\n\tif (!resolved.configuration) return undefined;\n\treturn source.scope === \"project\" && !trustProjectLspTransports\n\t\t? blockUntrustedProjectTransports(resolved.configuration, source.source, diagnostics)\n\t\t: resolved.configuration;\n}\n/**\n * Load and resolve LSP configuration in deterministic order:\n * global settings < project settings < CLI inputs < SDK/host inputs.\n */\nexport async function loadLspConfiguration(options: LoadLspConfigurationOptions): Promise<LoadLspConfigurationResult> {\n\tconst collection = collectSettingsConfigurationSources(options);\n\tfor (const input of options.inputs ?? []) await appendConfigurationInput(input, options, collection);\n\tcollection.sources.sort(\n\t\t(left, right) => SCOPE_PRECEDENCE[left.scope] - SCOPE_PRECEDENCE[right.scope] || left.order - right.order,\n\t);\n\n\tconst layers: LspConfigurationLayer[] = [];\n\tfor (const source of collection.sources) {\n\t\tconst layer = resolveConfigurationSource(source, options.trustProjectLspTransports, collection.diagnostics);\n\t\tif (layer) layers.push(layer);\n\t}\n\tconst hasErrors = collection.diagnostics.some((diagnostic) => diagnostic.severity === \"error\");\n\tconst configuration =\n\t\tcollection.settingsLoadFailed || hasErrors ? { enabled: false, servers: [] } : resolveLspConfiguration(layers);\n\treturn { configuration, diagnostics: collection.diagnostics };\n}\n\nexport function resolveLspConfigurationLayerPaths(\n\tlayer: LspConfigurationLayer,\n\tbaseDir: string,\n): LspConfigurationLayer {\n\treturn {\n\t\t...layer,\n\t\tservers: layer.servers?.map((server) => {\n\t\t\tif (server.enabled === false) return server;\n\t\t\treturn resolveServerPaths(server, baseDir);\n\t\t}),\n\t};\n}\n\nfunction resolveServerPaths(server: LspConfiguredServer, baseDir: string): LspConfiguredServer {\n\tconst transport =\n\t\tserver.transport.type === \"spawn\"\n\t\t\t? {\n\t\t\t\t\t...server.transport,\n\t\t\t\t\tcommand: isPathLikeCommand(server.transport.command)\n\t\t\t\t\t\t? resolvePortablePath(baseDir, server.transport.command)\n\t\t\t\t\t\t: server.transport.command,\n\t\t\t\t\t...(server.transport.cwd ? { cwd: resolveIfRelative(baseDir, server.transport.cwd) } : {}),\n\t\t\t\t}\n\t\t\t: server.transport.type === \"unix\"\n\t\t\t\t? { ...server.transport, path: resolveIfRelative(baseDir, server.transport.path) }\n\t\t\t\t: server.transport;\n\tconst workspace =\n\t\tserver.workspace.type === \"fixed\"\n\t\t\t? { ...server.workspace, path: resolveIfRelative(baseDir, server.workspace.path) }\n\t\t\t: server.workspace.type === \"markers\" && server.workspace.stopAt\n\t\t\t\t? { ...server.workspace, stopAt: resolveIfRelative(baseDir, server.workspace.stopAt) }\n\t\t\t\t: server.workspace;\n\n\treturn {\n\t\t...server,\n\t\ttransport,\n\t\tworkspace,\n\t\tpathMappings: server.pathMappings?.map((mapping) => ({\n\t\t\t...mapping,\n\t\t\tagentRoot: resolveIfRelative(baseDir, mapping.agentRoot),\n\t\t})),\n\t};\n}\n\nfunction blockUntrustedProjectTransports(\n\tlayer: LspConfigurationLayer,\n\tsource: string,\n\tdiagnostics: LspConfigurationSourceDiagnostic[],\n): LspConfigurationLayer {\n\tif (layer.enabled === true) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource,\n\t\t\tpath: \"$.enabled\",\n\t\t\tmessage: \"blocked project LSP activation; the host must set trustProjectLspTransports to allow it\",\n\t\t});\n\t}\n\treturn {\n\t\t...(layer.enabled === false ? { enabled: false } : {}),\n\t\t...(layer.mode === undefined ? {} : { mode: layer.mode }),\n\t\t...(layer.servers === undefined\n\t\t\t? {}\n\t\t\t: {\n\t\t\t\t\tservers: layer.servers.filter((server, index) => {\n\t\t\t\t\t\tif (server.enabled === false) return true;\n\t\t\t\t\t\tdiagnostics.push({\n\t\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tpath: `$.servers[${index}].transport`,\n\t\t\t\t\t\t\tmessage: `blocked project LSP ${server.transport.type} transport for server ${JSON.stringify(server.id)}; the host must set trustProjectLspTransports to allow it`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t};\n}\n\nfunction resolveIfRelative(baseDir: string, value: string): string {\n\treturn resolvePortablePath(baseDir, value);\n}\n\nfunction isPathLikeCommand(command: string): boolean {\n\treturn command.startsWith(\".\") || command.includes(\"/\") || command.includes(\"\\\\\");\n}\n"]}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACN,KAAK,qBAAqB,EAG1B,KAAK,wBAAwB,EAE7B,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,0BAA0B,GAAG,KAAK,GAAG,MAAM,CAAC;AACxD,MAAM,MAAM,wCAAwC,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E,MAAM,MAAM,qBAAqB,GAC9B;IACA,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,qBAAqB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,CAAC;CAClC,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,gCAAgC;IAChD,QAAQ,EAAE,wCAAwC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC3C,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC1C,2FAA2F;IAC3F,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,aAAa,EAAE,wBAAwB,CAAC;IACxC,WAAW,EAAE,gCAAgC,EAAE,CAAC;CAChD;AA2KD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAgBpH;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,MAAM,GACb,qBAAqB,CAQvB"}