@cjhyy/code-shell-core 0.7.0 → 0.8.0

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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -1,121 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { dirname, join, resolve } from "node:path";
3
- import { getWorktreeDiff } from "./diff.js";
4
- import { execGit, gitOutput, normalizeBranchName } from "./git-exec.js";
5
- import { isManagedWorktreeBranch } from "./slug.js";
6
- /**
7
- * Find the canonical git root (resolves worktree -> main repo).
8
- */
9
- export async function findGitRoot(cwd) {
10
- return await findMainWorktreeRoot(cwd);
11
- }
12
- export async function findMainWorktreeRoot(cwd) {
13
- const commonDir = (await execGit(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"], 5000)).trim();
14
- return dirname(commonDir);
15
- }
16
- export async function findWorktreeForBranch(cwd, branch) {
17
- const normalized = normalizeBranchName(branch);
18
- return (await listWorktreesFast(cwd)).find((entry) => entry.branch === normalized)?.path;
19
- }
20
- export async function assertBranchNotCheckedOut(cwd, branch) {
21
- const existingPath = await findWorktreeForBranch(cwd, branch);
22
- if (existingPath) {
23
- throw new Error(`branch ${normalizeBranchName(branch)} already checked out at ${existingPath}`);
24
- }
25
- }
26
- export async function branchExists(cwd, branch) {
27
- const out = await gitOutput(cwd, ["branch", "--list", normalizeBranchName(branch)], 10000);
28
- return (out?.trim().length ?? 0) > 0;
29
- }
30
- export async function isGitWorktreeRoot(cwd) {
31
- if (!existsSync(join(cwd, ".git")))
32
- return false;
33
- try {
34
- const inside = (await execGit(cwd, ["rev-parse", "--is-inside-work-tree"], 5000)).trim();
35
- if (inside !== "true")
36
- return false;
37
- const topLevel = (await execGit(cwd, ["rev-parse", "--path-format=absolute", "--show-toplevel"], 5000)).trim();
38
- return resolve(topLevel) === resolve(cwd);
39
- }
40
- catch {
41
- return false;
42
- }
43
- }
44
- export async function currentBranch(cwd) {
45
- const branch = (await gitOutput(cwd, ["branch", "--show-current"], 5000))?.trim();
46
- return branch || undefined;
47
- }
48
- export async function listWorktreesFast(cwd, opts = {}) {
49
- let raw;
50
- try {
51
- raw = (await execGit(cwd, ["worktree", "list", "--porcelain"], 10000)).trim();
52
- }
53
- catch {
54
- return [];
55
- }
56
- if (!raw)
57
- return [];
58
- const entries = [];
59
- let current = { path: "", branch: "", head: "" };
60
- for (const line of raw.split("\n")) {
61
- if (line.startsWith("worktree ")) {
62
- if (current.path)
63
- entries.push(current);
64
- current = { path: line.slice(9), branch: "", head: "" };
65
- }
66
- else if (line.startsWith("HEAD ")) {
67
- current.head = line.slice(5, 13);
68
- }
69
- else if (line.startsWith("branch ")) {
70
- current.branch = normalizeBranchName(line.slice(7));
71
- }
72
- }
73
- if (current.path)
74
- entries.push(current);
75
- let mainRoot = "";
76
- try {
77
- mainRoot = await findMainWorktreeRoot(cwd);
78
- }
79
- catch {
80
- mainRoot = entries[0]?.path ?? "";
81
- }
82
- const owners = opts.workspaceOwners ?? opts.owners ?? [];
83
- return entries.map((entry) => {
84
- const ownerIds = ownersForWorktree(entry.path, owners);
85
- return {
86
- ...entry,
87
- ...(mainRoot ? { isMain: resolve(entry.path) === resolve(mainRoot) } : {}),
88
- isManaged: Boolean(entry.branch) && isManagedWorktreeBranch(entry.branch, opts.prefix),
89
- ...(ownerIds.length > 0
90
- ? {
91
- occupiedBySessionIds: ownerIds,
92
- occupiedByOtherSession: ownerIds.some((id) => id !== opts.currentSessionId),
93
- }
94
- : {}),
95
- };
96
- });
97
- }
98
- /**
99
- * List active worktrees. Kept for internal/test compatibility; use
100
- * listWorktreesFast for UI lists that should not block on diff work.
101
- */
102
- export async function listWorktrees(cwd, opts = {}) {
103
- const entries = await listWorktreesFast(cwd, opts);
104
- if (!opts.includeDiffSummary)
105
- return entries;
106
- return Promise.all(entries.map(async (entry) => ({
107
- ...entry,
108
- diff: await getWorktreeDiff(entry.path),
109
- })));
110
- }
111
- export function ownersForWorktree(path, owners) {
112
- const target = resolve(path);
113
- return owners
114
- .filter((owner) => {
115
- const workspace = owner.workspace;
116
- if (!workspace)
117
- return false;
118
- return resolve(workspace.root) === target;
119
- })
120
- .map((owner) => owner.sessionId);
121
- }
@@ -1,11 +0,0 @@
1
- export declare const DEFAULT_WORKTREE_BRANCH_PREFIX = "worktree/";
2
- export declare const HISTORICAL_WORKTREE_BRANCH_PREFIX = "worktree/";
3
- /**
4
- * Validate worktree slug to prevent path traversal attacks.
5
- */
6
- export declare function validateWorktreeSlug(slug: string): void;
7
- export declare function normalizeWorktreeBranchPrefix(prefix?: string | undefined): string;
8
- export declare function isValidWorktreeBranchPrefix(prefix: string): boolean;
9
- export declare function applyPrefix(prefix: string | undefined, slug: string, sessionId: string): string;
10
- export declare function managedBranchPrefixes(prefix?: string): string[];
11
- export declare function isManagedWorktreeBranch(branch: string, prefix?: string): boolean;
@@ -1,58 +0,0 @@
1
- export const DEFAULT_WORKTREE_BRANCH_PREFIX = "worktree/";
2
- export const HISTORICAL_WORKTREE_BRANCH_PREFIX = "worktree/";
3
- /**
4
- * Validate worktree slug to prevent path traversal attacks.
5
- */
6
- export function validateWorktreeSlug(slug) {
7
- if (slug.trim().length === 0)
8
- throw new Error("Worktree slug cannot be empty");
9
- if (slug.length > 64)
10
- throw new Error("Worktree slug too long (max 64 chars)");
11
- if (/[^a-zA-Z0-9._-]/.test(slug))
12
- throw new Error("Worktree slug contains invalid characters");
13
- if (slug.startsWith(".") || slug.includes(".."))
14
- throw new Error("Worktree slug cannot start with '.' or contain '..'");
15
- }
16
- export function normalizeWorktreeBranchPrefix(prefix = DEFAULT_WORKTREE_BRANCH_PREFIX) {
17
- const raw = (prefix ?? DEFAULT_WORKTREE_BRANCH_PREFIX).trim();
18
- if (!isValidWorktreeBranchPrefix(raw)) {
19
- throw new Error(`Invalid worktree branch prefix: ${prefix ?? ""}`);
20
- }
21
- return raw.endsWith("/") ? raw : `${raw}/`;
22
- }
23
- export function isValidWorktreeBranchPrefix(prefix) {
24
- const raw = prefix.trim();
25
- if (!raw)
26
- return false;
27
- if (raw.startsWith("/") || raw.includes("//"))
28
- return false;
29
- if (raw.includes("..") || raw.includes("@{"))
30
- return false;
31
- if (/[\x00-\x20~^:?*[\]\\]/.test(raw))
32
- return false;
33
- const withoutTrailingSlash = raw.endsWith("/") ? raw.slice(0, -1) : raw;
34
- if (!withoutTrailingSlash)
35
- return false;
36
- return withoutTrailingSlash.split("/").every((part) => {
37
- if (!part)
38
- return false;
39
- if (part.startsWith(".") || part.endsWith("."))
40
- return false;
41
- if (part.endsWith(".lock"))
42
- return false;
43
- return true;
44
- });
45
- }
46
- export function applyPrefix(prefix, slug, sessionId) {
47
- validateWorktreeSlug(slug);
48
- return `${normalizeWorktreeBranchPrefix(prefix)}${slug}-${sessionId.slice(0, 8)}`;
49
- }
50
- export function managedBranchPrefixes(prefix) {
51
- const configured = normalizeWorktreeBranchPrefix(prefix);
52
- return configured === HISTORICAL_WORKTREE_BRANCH_PREFIX
53
- ? [configured]
54
- : [configured, HISTORICAL_WORKTREE_BRANCH_PREFIX];
55
- }
56
- export function isManagedWorktreeBranch(branch, prefix) {
57
- return managedBranchPrefixes(prefix).some((candidate) => branch.startsWith(candidate));
58
- }
@@ -1 +0,0 @@
1
- export * from "./worktree/index.js";
@@ -1,5 +0,0 @@
1
- // Compatibility barrel for the pre-split worktree module. The split made the
2
- // query/create APIs async because they now share the async git executor; all
3
- // in-repo callers await them, so this barrel intentionally does not add sync
4
- // wrappers.
5
- export * from "./worktree/index.js";
@@ -1,41 +0,0 @@
1
- /**
2
- * LSP client — JSON-RPC over stdio communication with language servers.
3
- */
4
- import { EventEmitter } from "node:events";
5
- export interface LSPRequest {
6
- method: string;
7
- params?: Record<string, unknown>;
8
- }
9
- export interface LSPResponse {
10
- id: number;
11
- result?: unknown;
12
- error?: {
13
- code: number;
14
- message: string;
15
- };
16
- }
17
- export interface LSPNotification {
18
- method: string;
19
- params?: Record<string, unknown>;
20
- }
21
- export declare class LSPClient extends EventEmitter {
22
- private readonly command;
23
- private readonly args;
24
- private readonly cwd?;
25
- private process;
26
- private nextId;
27
- private pending;
28
- private buffer;
29
- private contentLength;
30
- private initialized;
31
- constructor(command: string, args?: string[], cwd?: string | undefined);
32
- start(): Promise<void>;
33
- initialize(rootUri: string): Promise<unknown>;
34
- request(method: string, params?: Record<string, unknown>): Promise<unknown>;
35
- notify(method: string, params?: Record<string, unknown>): Promise<void>;
36
- shutdown(): Promise<void>;
37
- get isInitialized(): boolean;
38
- get isAlive(): boolean;
39
- private handleData;
40
- private rejectAll;
41
- }
@@ -1,186 +0,0 @@
1
- /**
2
- * LSP client — JSON-RPC over stdio communication with language servers.
3
- */
4
- import { spawn } from "node:child_process";
5
- import { EventEmitter } from "node:events";
6
- export class LSPClient extends EventEmitter {
7
- command;
8
- args;
9
- cwd;
10
- process;
11
- nextId = 1;
12
- pending = new Map();
13
- // The LSP framing uses byte-counted Content-Length, so we buffer bytes,
14
- // not characters. Joining chunks as strings (`data.toString()` + string
15
- // concat) can split a multibyte UTF-8 codepoint across chunks and de-
16
- // synchronize against Content-Length. Stay in Buffer-land until we've
17
- // sliced out exactly the right body length.
18
- buffer = Buffer.alloc(0);
19
- contentLength = -1;
20
- initialized = false;
21
- constructor(command, args = [], cwd) {
22
- super();
23
- this.command = command;
24
- this.args = args;
25
- this.cwd = cwd;
26
- }
27
- async start() {
28
- this.process = spawn(this.command, this.args, {
29
- cwd: this.cwd,
30
- stdio: ["pipe", "pipe", "pipe"],
31
- });
32
- this.process.stdout?.on("data", (data) => this.handleData(data));
33
- this.process.stderr?.on("data", (_data) => {
34
- // LSP servers often log to stderr — ignore
35
- });
36
- this.process.on("exit", (code) => {
37
- this.emit("exit", code);
38
- this.rejectAll(new Error(`LSP server exited with code ${code}`));
39
- });
40
- // Don't keep the event loop alive solely for the LSP child.
41
- // Call after listeners are wired so event registration doesn't re-ref.
42
- this.process.unref();
43
- }
44
- async initialize(rootUri) {
45
- const result = await this.request("initialize", {
46
- processId: process.pid,
47
- rootUri,
48
- capabilities: {
49
- textDocument: {
50
- definition: { dynamicRegistration: false },
51
- references: { dynamicRegistration: false },
52
- hover: { contentFormat: ["plaintext", "markdown"] },
53
- documentSymbol: { dynamicRegistration: false },
54
- completion: { dynamicRegistration: false },
55
- },
56
- workspace: {
57
- symbol: { dynamicRegistration: false },
58
- },
59
- },
60
- });
61
- await this.notify("initialized", {});
62
- this.initialized = true;
63
- return result;
64
- }
65
- async request(method, params) {
66
- if (!this.process?.stdin)
67
- throw new Error("LSP server not started");
68
- const id = this.nextId++;
69
- const message = { jsonrpc: "2.0", id, method, params };
70
- const content = JSON.stringify(message);
71
- const header = `Content-Length: ${Buffer.byteLength(content)}\r\n\r\n`;
72
- return new Promise((resolve, reject) => {
73
- const timer = setTimeout(() => {
74
- if (this.pending.has(id)) {
75
- this.pending.delete(id);
76
- reject(new Error(`LSP request "${method}" timed out`));
77
- }
78
- }, 30000);
79
- // Don't let the timer keep the event loop alive by itself
80
- timer.unref?.();
81
- this.pending.set(id, {
82
- resolve: (value) => { clearTimeout(timer); resolve(value); },
83
- reject: (err) => { clearTimeout(timer); reject(err); },
84
- });
85
- this.process.stdin.write(header + content);
86
- });
87
- }
88
- async notify(method, params) {
89
- if (!this.process?.stdin)
90
- throw new Error("LSP server not started");
91
- const message = { jsonrpc: "2.0", method, params };
92
- const content = JSON.stringify(message);
93
- const header = `Content-Length: ${Buffer.byteLength(content)}\r\n\r\n`;
94
- this.process.stdin.write(header + content);
95
- }
96
- async shutdown() {
97
- if (!this.process)
98
- return;
99
- try {
100
- await this.request("shutdown", {});
101
- await this.notify("exit", {});
102
- }
103
- catch {
104
- // Force kill
105
- }
106
- this.process.stdout?.removeAllListeners();
107
- this.process.stderr?.removeAllListeners();
108
- this.process.removeAllListeners();
109
- this.process.kill();
110
- this.process = undefined;
111
- // Drain pending requests
112
- for (const { reject } of this.pending.values()) {
113
- reject(new Error("LSP server shut down"));
114
- }
115
- this.pending.clear();
116
- }
117
- get isInitialized() {
118
- return this.initialized;
119
- }
120
- get isAlive() {
121
- return this.process !== undefined && !this.process.killed;
122
- }
123
- handleData(data) {
124
- // Append the new chunk as bytes. Buffer.concat avoids the UTF-8
125
- // boundary corruption that string concatenation produces — a
126
- // multibyte codepoint split across two TCP/pipe chunks decodes to
127
- // U+FFFD, mangles the buffer length count, and breaks framing.
128
- this.buffer = Buffer.concat([this.buffer, data]);
129
- while (true) {
130
- if (this.contentLength < 0) {
131
- // Search for the header terminator in bytes, not chars.
132
- const headerEnd = this.buffer.indexOf("\r\n\r\n");
133
- if (headerEnd < 0)
134
- break;
135
- // Headers are ASCII per spec, so toString("ascii") is safe and
136
- // avoids paying for a UTF-8 decode on the framing band.
137
- const header = this.buffer.slice(0, headerEnd).toString("ascii");
138
- const match = header.match(/Content-Length:\s*(\d+)/i);
139
- if (!match) {
140
- this.buffer = this.buffer.subarray(headerEnd + 4);
141
- continue;
142
- }
143
- this.contentLength = parseInt(match[1], 10);
144
- this.buffer = this.buffer.subarray(headerEnd + 4);
145
- }
146
- // Content-Length is a BYTE count — compare against the buffer's
147
- // byte length, not its character length. Pre-fix this compared
148
- // string lengths; with multibyte responses (e.g. CJK identifiers,
149
- // emoji in diagnostics) we'd block waiting for bytes that had
150
- // already arrived.
151
- if (this.buffer.length < this.contentLength)
152
- break;
153
- const bodyBytes = this.buffer.subarray(0, this.contentLength);
154
- this.buffer = this.buffer.subarray(this.contentLength);
155
- this.contentLength = -1;
156
- // Decode the full body in one shot — at this point we have the
157
- // exact byte count, so the UTF-8 boundary issue is fully gone.
158
- const content = bodyBytes.toString("utf8");
159
- try {
160
- const message = JSON.parse(content);
161
- if ("id" in message && this.pending.has(message.id)) {
162
- const { resolve, reject } = this.pending.get(message.id);
163
- this.pending.delete(message.id);
164
- if (message.error) {
165
- reject(new Error(`LSP error: ${message.error.message}`));
166
- }
167
- else {
168
- resolve(message.result);
169
- }
170
- }
171
- else if ("method" in message && !("id" in message)) {
172
- this.emit("notification", message);
173
- }
174
- }
175
- catch {
176
- // Skip malformed messages
177
- }
178
- }
179
- }
180
- rejectAll(error) {
181
- for (const { reject } of this.pending.values()) {
182
- reject(error);
183
- }
184
- this.pending.clear();
185
- }
186
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * LSP Server Manager — manages lifecycle of language server instances.
3
- * Lazy initialization: servers start only when needed.
4
- */
5
- import { LSPClient } from "./client.js";
6
- type ServerState = "stopped" | "starting" | "ready" | "error";
7
- export declare class LSPServerManager {
8
- private servers;
9
- private rootUri;
10
- constructor(cwd: string);
11
- /**
12
- * Get or start a language server by name.
13
- */
14
- getClient(serverName: string): Promise<LSPClient | undefined>;
15
- /**
16
- * Start a specific language server.
17
- */
18
- private startServer;
19
- /**
20
- * Check if any LSP server is connected.
21
- */
22
- isConnected(): boolean;
23
- /**
24
- * List server statuses.
25
- */
26
- listServers(): Array<{
27
- name: string;
28
- language: string;
29
- state: ServerState;
30
- error?: string;
31
- }>;
32
- /**
33
- * Shutdown all servers.
34
- */
35
- shutdownAll(): Promise<void>;
36
- }
37
- export declare function isCommandAvailable(command: string, env?: NodeJS.ProcessEnv): boolean;
38
- export declare function initializeLSPManager(cwd: string): LSPServerManager;
39
- export declare function getLSPManager(): LSPServerManager | undefined;
40
- export {};
@@ -1,155 +0,0 @@
1
- /**
2
- * LSP Server Manager — manages lifecycle of language server instances.
3
- * Lazy initialization: servers start only when needed.
4
- */
5
- import { LSPClient } from "./client.js";
6
- import { BUILTIN_LSP_SERVERS } from "./servers.js";
7
- import { accessSync, constants, statSync } from "node:fs";
8
- import { delimiter, join } from "node:path";
9
- import { pathToFileURL } from "node:url";
10
- import { rootUriToPath } from "./root-path.js";
11
- import { commandCandidateNames } from "../utils/exec.js";
12
- export class LSPServerManager {
13
- servers = new Map();
14
- rootUri;
15
- constructor(cwd) {
16
- this.rootUri = pathToFileURL(cwd).href;
17
- // Register all built-in servers
18
- for (const config of BUILTIN_LSP_SERVERS) {
19
- this.servers.set(config.name, { config, client: undefined, state: "stopped" });
20
- }
21
- }
22
- /**
23
- * Get or start a language server by name.
24
- */
25
- async getClient(serverName) {
26
- const managed = this.servers.get(serverName);
27
- if (!managed)
28
- return undefined;
29
- if (managed.state === "ready" && managed.client?.isAlive) {
30
- return managed.client;
31
- }
32
- if (managed.state === "starting") {
33
- // Wait for it to be ready
34
- await new Promise((r) => setTimeout(r, 2000));
35
- return managed.client;
36
- }
37
- // Try to start
38
- return this.startServer(serverName);
39
- }
40
- /**
41
- * Start a specific language server.
42
- */
43
- async startServer(name) {
44
- const managed = this.servers.get(name);
45
- if (!managed)
46
- return undefined;
47
- // Check if command is available
48
- if (!isCommandAvailable(managed.config.command)) {
49
- managed.state = "error";
50
- managed.error = `${managed.config.command} not found. Install: ${managed.config.installHint}`;
51
- return undefined;
52
- }
53
- managed.state = "starting";
54
- try {
55
- const client = new LSPClient(managed.config.command, managed.config.args, rootUriToPath(this.rootUri));
56
- await client.start();
57
- await client.initialize(this.rootUri);
58
- managed.client = client;
59
- managed.state = "ready";
60
- return client;
61
- }
62
- catch (err) {
63
- managed.state = "error";
64
- managed.error = err.message;
65
- return undefined;
66
- }
67
- }
68
- /**
69
- * Check if any LSP server is connected.
70
- */
71
- isConnected() {
72
- for (const server of this.servers.values()) {
73
- if (server.state === "ready" && server.client?.isAlive)
74
- return true;
75
- }
76
- return false;
77
- }
78
- /**
79
- * List server statuses.
80
- */
81
- listServers() {
82
- return [...this.servers.values()].map((s) => ({
83
- name: s.config.name,
84
- language: s.config.language,
85
- state: s.state,
86
- error: s.error,
87
- }));
88
- }
89
- /**
90
- * Shutdown all servers.
91
- */
92
- async shutdownAll() {
93
- for (const server of this.servers.values()) {
94
- if (server.client?.isAlive) {
95
- try {
96
- await server.client.shutdown();
97
- }
98
- catch {
99
- // Force killed
100
- }
101
- }
102
- server.state = "stopped";
103
- server.client = undefined;
104
- }
105
- }
106
- }
107
- export function isCommandAvailable(command, env = process.env) {
108
- const trimmed = command.trim();
109
- if (!trimmed)
110
- return false;
111
- const hasPathSeparator = trimmed.includes("/") || trimmed.includes("\\");
112
- // A bare command with whitespace is not executable via spawn(command, args)
113
- // anyway. Reject it up front so a configured command can never be interpreted
114
- // as shell syntax such as `pylsp; touch /tmp/pwned`.
115
- if (!hasPathSeparator && /\s/.test(trimmed))
116
- return false;
117
- if (hasPathSeparator) {
118
- return candidateCommandNames(trimmed, env).some(isExecutableFile);
119
- }
120
- for (const dir of (env.PATH ?? "").split(delimiter)) {
121
- if (!dir)
122
- continue;
123
- for (const name of candidateCommandNames(trimmed, env)) {
124
- if (isExecutableFile(join(dir, name)))
125
- return true;
126
- }
127
- }
128
- return false;
129
- }
130
- function candidateCommandNames(command, env) {
131
- return commandCandidateNames(command, env);
132
- }
133
- function isExecutableFile(filePath) {
134
- try {
135
- const st = statSync(filePath);
136
- if (!st.isFile())
137
- return false;
138
- if (process.platform !== "win32") {
139
- accessSync(filePath, constants.X_OK);
140
- }
141
- return true;
142
- }
143
- catch {
144
- return false;
145
- }
146
- }
147
- // Singleton
148
- let _manager;
149
- export function initializeLSPManager(cwd) {
150
- _manager = new LSPServerManager(cwd);
151
- return _manager;
152
- }
153
- export function getLSPManager() {
154
- return _manager;
155
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * Convert a `file://` root URI to a platform filesystem path.
3
- *
4
- * The LSP manager used `rootUri.replace("file://", "")`, which only strips the
5
- * first occurrence and leaves percent-encoding intact, and on Windows turns
6
- * `file:///C:/x` into the invalid `/C:/x`. fileURLToPath does the proper
7
- * platform conversion (drive letters, percent-decoding, UNC).
8
- */
9
- export declare function rootUriToPath(rootUri: string): string;
@@ -1,12 +0,0 @@
1
- import { fileURLToPath } from "node:url";
2
- /**
3
- * Convert a `file://` root URI to a platform filesystem path.
4
- *
5
- * The LSP manager used `rootUri.replace("file://", "")`, which only strips the
6
- * first occurrence and leaves percent-encoding intact, and on Windows turns
7
- * `file:///C:/x` into the invalid `/C:/x`. fileURLToPath does the proper
8
- * platform conversion (drive letters, percent-decoding, UNC).
9
- */
10
- export function rootUriToPath(rootUri) {
11
- return fileURLToPath(rootUri);
12
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * Built-in language server configurations.
3
- */
4
- export interface LSPServerConfig {
5
- name: string;
6
- language: string;
7
- extensions: string[];
8
- command: string;
9
- args: string[];
10
- installHint: string;
11
- }
12
- export declare const BUILTIN_LSP_SERVERS: LSPServerConfig[];
13
- /**
14
- * Detect which LSP server to use based on file extension.
15
- */
16
- export declare function detectLSPServer(filePath: string): LSPServerConfig | undefined;